c# - 如何使用 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 方面的经验
解决方案
首先允许追踪:
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 = "" }
推荐阅读
- vba - 用于在另一张表中查找单元格数据并更新它的 VBA 代码
- wordpress - docker-compose 在安装 wordpress 时锁定我的本地文件夹
- r - 当我在 R 中使用 Rcpp 时,包含 boost 的编译错误
- nginx - 用于 SEO 的 nginx 条件预渲染页面(if + try_files)
- android - Android 媒体播放器、数据源 api、三星 s8+
- android - Android 启动画面显示在系统栏后面
- glsl - GLSL 问题:坐标偏移和后退在不同的机器上产生不同的结果
- c++ - 中间部分不同的两个功能如何组织
- angular - 使用弹性座椅和角度 4 出现“找不到 geo_point 字段 [pin.location]”错误
- c++ - c++ 程序返回对象的一半