EventCounters性能指标监视器如何正确的在.NET项目中使用
创始人
2024-11-27 09:01:58
0次

在.NET我们对于性能指标监控,其实常见的有两个方法,一个是CLI工具dotnet-counters而另一个是代码级别的EventListener.

使用dotnet-counters

dotnet-counters是一个性能指标监视工具,用于临时运行状态监视和初级性能调查。它可以观察通过 EventCounter API发布的性能计数器值。例如,可以快速监视 CPU 使用情况或 .NET Core 应用程序中引发的异常率,以了解在使用 PerfView 或 dotnet-trace 深入调查更严重的性能问题之前是否有任何可疑操作。

-- 摘自 dotnet-counters

命令

dotnet-counters collect

dotnet-counters list

dotnet-counters monitor

dotnet-counters ps

安装dotnet-counters CLI工具,可通过如下命令:

dotnet tool install --global dotnet-counters

更新命令如下所示:

dotnet tool update dotnet-counters --global

安装完工具之后,我们可以进行查看可监视的进程:

dotnet-counters ps
  12268 dotnet C:\Program Files\dotnet\dotnet.exe
  16324 dotnet C:\Program Files\dotnet\dotnet.exe

获取到进程ID后,我们可以通过如下命令进行监视:

dotnet-counters monitor -p 12268

监视特定的EventSources,可以提供以一个空格分隔开的EventSources列表,如下所示:

dotnet-counters monitor -p 12268 System.Runtime MyEventSource

在默认的情况下,我们对于EventSource监视时,它捕获的是所有的计数器。如果我们想单独跟踪某几个计数器那么可通过如下方式进行指定:

dotnet-counters monitor -p 12268 System.Runtime[cpu-usage,gc-heap-size]

对于监视器我们可以设置刷新频率,可以通过--refresh-interval参数来设置:

dotnet-counters monitor -p 12268 --refresh-interval 3 System.Runtime[cpu-usage,gc-heap-size]

代码中的EventCounters

EventListener提供了进程内(In-Process)订阅和消费日志事件的方式,EventListener可以接收到来自EventSource分发的日志事件。 这些事件内涵盖了GC、JIT、ThreadPool和interop的行为。

创建EventListener

在下面我们进行重写OnEventSourceCreated方法,该方法会在调用时接收一个EventSource对象,我们可以通过EventSource对象的Name属性去筛选我们感兴趣的日志事件,筛选后我们需要显示的调用EnableEvents方法向感兴趣的日志事件发起订阅。

 internal sealed class MyEventListener : EventListener
 {
  protected override void OnEventSourceCreated(EventSource eventSource)
  {
   if (eventSource.Name.Equals("Microsoft-Windows-DotNETRuntime"))
   {
    EnableEvents(eventSource, EventLevel.Verbose, (EventKeywords)(-1));
   }
  }
 }

事件消费

接下来我们需要进行重写OnEventWritten,关于日志事件相关的信息会被封装成一个EventWrittenEventArgs对象,我们不仅可以通过它获取当前日志事件的所有信息,而且我们还可以进行获取到EventSource对象。Payload包含了不同属性的值ReadOnlyCollection, 而PayLoadNames ReadOnlyCollection中包含了不同的属性名称,我们现在可以通过如下方式进行获取这些属性:

 protected override void OnEventWritten(EventWrittenEventArgs eventData)
  {
   Console.WriteLine($"ThreadID = {eventData.OSThreadId} ID = {eventData.EventId} Name = {eventData.EventName}");
   for (int i = 0; i < eventData.Payload.Count; i++)
   {
    string payloadString = eventData.Payload[i]?.ToString() ?? string.Empty;
    Console.WriteLine($"\tName = \"{eventData.PayloadNames[i]}\" Value = \"{payloadString}\"");
   }
   Console.WriteLine("\n");
  }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...