C# 如何在ETW EventSource中定义名称层次结构?
在我的项目中,我使用System.Diagnostics.Tracing.EventSource,如下所示:C# 如何在ETW EventSource中定义名称层次结构?,c#,etw,etw-eventsource,perfview,C#,Etw,Etw Eventsource,Perfview,在我的项目中,我使用System.Diagnostics.Tracing.EventSource,如下所示: namespace kafka4net.Tracing { [EventSource(Name = "kafka4net")] public class ConnectionTrace : EventSource { public static ConnectionTrace Log = new ConnectionTrace();
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属性,该属性可以是顶级“产品”,函数名用作事件名称层次结构中的最低级别。如何在事件名称层次结构中插入中间元素“subsystem”?这无法做到,因为
ProviderName/event/OpCode
是在PerfView中显示事件的惯例
Microsoft Windows DotNETRuntime/GC/Start
也遵循这一点Microsoft Windows DotNETRuntime是
提供程序,GC
是事件,Start
是操作码
您可以使用任务获得更好的输出:
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中,您可以获得更好的输出:
我看不到Tasks.Connect和输出之间的关系。@FrankHileman
Tasks.Connect
只是将两个事件连接在一起EventSource
似乎采用它找到的第一个连接方法的名称,并将其作为清单中的任务
输出。因此,这两种方法有一个任务
。与操作码
s相结合,将产生/Connecting/Start
和/Connecting/Stop
的PerfView事件名称。两者都作为事件存在于清单中,但链接到单个任务。