写在前面

为了实现轻量级、跨平台、准确实时的性能指标收集,从 .NET Core 3.0 版本开始引入 EventCounters API。除了 .NET 运行时提供的 EventCounters 外,还可以实现自定义的 EventCounters。 以便跟踪各种指标,EventCounters 作为 EventSource 的一部分,可以实时自动定期推送到侦听器工具。

代码实现


var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();
app.MapGet("/counters/{count}", (int count) =>
{
    MinimalEventCounterSource.Log.Request("counters", count);
    return $"count:{count}";
});
app.Run();

自定义的继承之 EventSource 类的实现代码:

using System.Diagnostics.Tracing;

[EventSource(Name = "Sample.EventCounter.Minimal")]
public sealed class MinimalEventCounterSource : EventSource
{
    public static readonly MinimalEventCounterSource Log = new MinimalEventCounterSource();

    private EventCounter _requestCounter;

    private MinimalEventCounterSource() =>
        _requestCounter = new EventCounter("request-time", this)
        {
            DisplayName = "Request Processing Time",
            DisplayUnits = "ms"
        };

    public void Request(string url, long elapsedMilliseconds)
    {
        //WriteEvent(1, url, elapsedMilliseconds);
        _requestCounter?.WriteMetric(elapsedMilliseconds);
    }

    protected override void Dispose(bool disposing)
    {
        _requestCounter?.Dispose();
        _requestCounter = null;

        base.Dispose(disposing);
    }
}

调用示例

启动asp.net core 应用

使用.NET API 中的 EventCounters进行指标监控-LMLPHP 

使用 dotnet-counters ps 查看进程号

使用.NET API 中的 EventCounters进行指标监控-LMLPHP

如果之前没有安装dotnet-counters 可以在控制台中使用以下指令进行安装:

获取到对应的进程号,本例为[22936];再执行以下命令,监控标签名称为Sample.EventCounter.Minimal 的EventSource

当命令行窗口进入监控模式后,访问Web API

使用.NET API 中的 EventCounters进行指标监控-LMLPHP

一个监控心跳后,监控窗口输出了刚刚的请求参数

使用.NET API 中的 EventCounters进行指标监控-LMLPHP

01-24 10:12