首页 > 解决方案 > 如何使用 lttng 过滤 EventSource 事件

问题描述

使用:Linux UST 跟踪/lttng 上的 .NET Core 2.2。

我试图只监听我在我的应用程序中生成的自定义 EventSource 事件(以及我特别感兴趣的一些其他事件,但它们不包含在此讨论中)。我正在将这些消息发送到一个 lttng-relayd 守护程序,并且我希望将事件数据的数量保持在我的控制范围内。打开 EventSource 提供程序会生成大量我不想要或不需要的信息,并且有时会淹没我的频道。

lttng enable-event --userspace --tracepoint DotNETRuntime:EventSource

当我查看正在推送的数据时,我看到了各种内置事件,我想完全避免采样:

=== DotNETRuntime:EventSource__System.Diagnostics.Eventing.FrameworkEventSource - ThreadTransferSend:11542 - ThreadTransferReceive:6480 - ThreadPoolEnqueueWork:21437 - ThreadPoolDequeueWork:21437 === DotNETRuntime:EventSource__Microsoft-System-Net-Sockets - Enter:22771 - Info:27463 - Exit :20145 - 已连接:1 - 已接受:1 === DotNETRuntime:EventSource__Microsoft-System-Net-NameResolution - 输入:41924 - 信息:41922 - 退出:27950

这些都是由 .NET 生成的,我对捕获这些事件几乎没有兴趣,只有我的应用程序特定的事件集。

我试图找出我可能用来过滤我的一组自定义事件的 --filter 语法:

--filter='$app.EventSourceName==MyEventSourceName'

我可以在网上找到的示例引用了静态事件:

$ctx.procname=='dotnet'

这不是那么有用。

或者使用 $app 的动态事件,但是我需要用来按 EventSourceName 过滤的语法不是很清楚。

有没有人有这方面 lttng 方面的经验

标签: c#linux.net-corelttng

解决方案


首先允许追踪:

export COMPlus_PerfMapEnabled=1
export COMPlus_EnableEventLog=1

或使用 PowerShell

$env:COMPlus_PerfMapEnabled=1
$env:COMPlus_EnableEventLog=1

根据以下代码:

using System.Diagnostics.Tracing;
using System.Collections.Generic;
using System;

namespace Demo1
{
    [EventSource(Name = "JPBLog")]
    class MyCompanyEventSource : EventSource
    {
        public static MyCompanyEventSource Log = new MyCompanyEventSource();

        [Event(1, Message="{0} -> {1}", Channel = EventChannel.Admin)]
        public void Startup() { WriteEvent(1); }

        [Event(2, Message="{0}", Channel = EventChannel.Admin)]
        public void OpenFileStart(string fileName) { WriteEvent(2, fileName); }

        [Event(3, Message="OpenFileStop", Channel = EventChannel.Admin)]
        public void OpenFileStop() { WriteEvent(3); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string name = MyCompanyEventSource.GetName(typeof(MyCompanyEventSource));
            Console.WriteLine(name);
            IEnumerable<EventSource> eventSources = MyCompanyEventSource.GetSources();
            foreach(EventSource iS in eventSources){
              Console.WriteLine(iS);
            }
            MyCompanyEventSource.Log.Startup();
            // ...
            MyCompanyEventSource.Log.OpenFileStart("SomeFile");
            // ...
            MyCompanyEventSource.Log.OpenFileStop();
        }
    }
}

这是我只过滤我的事件的方法:

lttng create my-trace -o ./my-trace
lttng enable-channel --userspace DotNetCoreChannel
lttng enable-event --userspace --tracepoint DotNETRuntime:EventSource --channel=DotNetCoreChannel --filter "EventSourceName=='JPBLog'"
lttng start
dotnet run # here I run the code
lttng stop
lttng view

您将收到 :

[17:24:45.219954500] (+?.?????????) cd9a097f0904 DotNETRuntime:EventSource: { cpu_id = 0 }, { EventID = 1, EventName = "Startup", EventSourceName = "JPBLog", Payload = "" }
[17:24:45.223259100] (+0.003304600) cd9a097f0904 DotNETRuntime:EventSource: { cpu_id = 0 }, { EventID = 2, EventName = "OpenFileStart", EventSourceName = "JPBLog", Payload = "{\"EventSource_Message\":\"{0}\", \"fileName\":\"SomeFile\"}" }
[17:24:45.223417300] (+0.000158200) cd9a097f0904 DotNETRuntime:EventSource: { cpu_id = 0 }, { EventID = 3, EventName = "OpenFileStop", EventSourceName = "JPBLog", Payload = "" }

推荐阅读