【问题标题】:How to filter EventSource events with lttng如何使用 lttng 过滤 EventSource 事件
【发布时间】:2019-09-24 13:53:06
【问题描述】:

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

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

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

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

=== DotNETRuntime:EventSource__System.Diagnostics.Eventing.FrameworkEventSource - 线程传输发送:11542 - 线程传输接收:6480 - 线程池入队工作:21437 - 线程池出队工作:21437 === DotNETRuntime:EventSource__Microsoft-System-Net-Sockets - 输入:22771 - 信息:27463 - 出口: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-core lttng


    【解决方案1】:

    首先允许追踪:

    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 = "" }
    

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多