写在前面
为了实现轻量级、跨平台、准确实时的性能指标收集,从 .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 应用
使用 dotnet-counters ps 查看进程号
如果之前没有安装dotnet-counters 可以在控制台中使用以下指令进行安装:
dotnet tool install --global dotnet-counters
获取到对应的进程号,本例为[22936];再执行以下命令,监控标签名称为Sample.EventCounter.Minimal 的EventSource
dotnet-counters monitor --process-id 22936 --counters Sample.EventCounter.Minimal
当命令行窗口进入监控模式后,访问Web API
一个监控心跳后,监控窗口输出了刚刚的请求参数