2

在我的项目中,我像这样使用 System.Diagnostics.Tracing.EventSource:

namespace kafka4net.Tracing
{
    [EventSource(Name = "kafka4net")]
    public class ConnectionTrace : EventSource
    {
        public static ConnectionTrace Log = new ConnectionTrace();

        public void Connecting(string host, int port)
        {
            Log.WriteEvent(1, host, port);
        }

        public void Connected(string host, int port)
        {
            Log.WriteEvent(2, host, port);
        }
    }
}

我通过在“附加提供者”字段中定义“*kafka4net”来使用具有动态提供者功能的 PerfView。这将通过其名称解析提供者。工作得很好。除了一个例外。我看到的事件是 kafka4net/Connecting,而我想看到 kafka4net/ConnectionTrace/Connecting。

一般来说,我希望事件是产品/子系统/事件。我可以看到一些系统组件具有这种结构,例如“Microsoft-Windows-DotNETRuntime/GC/Start”。

我尝试输入 [EventSource(Name = "kafka4net-Connection")],但我不能在 PerfView 中将其用作动态事件,因为我必须枚举我的所有子系统,如“kafka4net-Connection、kafka4net-Fetcher”等.而这是不行的。

EventSource 具有 Name 属性,可以是顶级“产品”,函数名称用作事件名称层次结构中的最低级别。如何在事件名称层次结构中插入中间元素“子系统”?

4

1 回答 1

2

这是无法做到的,因为ProviderName/Event/OpCode在 PerfView 中显示事件的惯例是。

Microsoft-Windows-DotNETRuntime/GC/Start也遵循这个。Microsoft-Windows-DotNETRuntime is提供者,GC是事件并且Start是操作码。

您可以使用 Tasks 获得更好的输出:

public class Tasks
{
    public const EventTask Connect = (EventTask)0x1;
}

[EventSource(Name = "kafka4net")]
public sealed class ConnectionTrace : EventSource
{
    public static ConnectionTrace Log = new ConnectionTrace();

    [Event(1, Task = Tasks.Connect, Opcode = EventOpcode.Start)]
    public void Connecting(string host, int port)
    {
        if (Log.IsEnabled())
        {
            Log.WriteEvent(1, host, port);
        }
    }

    [Event(2, Task = Tasks.Connect, Opcode = EventOpcode.Stop)]
    public void Connected(string host, int port)
    {
        if (Log.IsEnabled())
        {
            Log.WriteEvent(2, host, port);
        }
    }
}

在这里,您可以在 PerfView 中获得更好的输出:

在此处输入图像描述

于 2014-12-27T16:15:01.800 回答