摘要:EventCounters 是.NET 平台中一套重要的运行时性能监控机制,它为开发者提供了了解应用程序运行时行为的能力。本文将围绕 EventCounters 的作用、优缺点、适用场景及其示例代码进行详细介绍。
EventCounters 是.NET 平台中一套重要的运行时性能监控机制,它为开发者提供了了解应用程序运行时行为的能力。本文将围绕 EventCounters 的作用、优缺点、适用场景及其示例代码进行详细介绍。
EventCounters 是.NET Core 2.2 及 .NET Framework 4.7.1 起引入的一项性能计数器方案,设计用于替代早期的 Windows 性能计数器(Performance Counters),同时提供更为现代化、跨平台的应用性能监控支持。
主要作用:
实时采集应用程序自定义或运行时内置的性能指标,如请求数、处理延迟、内存用量等。
便捷集成诸如 dotnet-counters、dotnet-monitor、Azure Application Insights 等监控工具。
简化诊断,通过代码内置便捷 API 提供定制化性能数据输出。
支持 分布式云原生场景,便于通过 Prometheus、Grafana 等工具进行可视化。
优点跨平台兼容支持 Windows、Linux、macOS 等多系统环境。
低性能开销对应用程序运行时影响较小,默认采样频率可配置。
丰富的内置和自定义能力.NET 运行时和框架自带大量 Counters,开发者也可自定义自己的性能指标。
与主流监控系统无缝衔接原生支持多种采集/展示工具,便于线上云原生部署监控。
缺点粒度有限主要适合中高层次指标,缺乏对方法级、对象级详细跟踪。
频率限制基于采样机制(通常 1s 一次),不适用于毫秒级峰值采集需求。
易用性有门槛自定义 Counter 需要理解 EventSource 的用法。[EventSource 编写不熟悉者上手有一定难度。]
依赖工具展示消费 Counter 数据需借助如 dotnet-counters、Visual Studio、监控平台等第三方工具。
Web应用和微服务性能监控实时收集请求吞吐量、延迟、错误率等关键指标。
业务指标自定义度量如队列长度、缓存命中率、自定义业务事件计数等。
现场问题诊断与性能瓶颈分析结合监控平台或命令行工具现场捕获关键信息,辅助问题定位。
可观测性建设、SLI/SLO追踪作为构建健康检查、服务治理、自动弹性伸缩决策数据来源。
以下是一个自定义 EventCounter 实现和简单的监控工具示例。
1. 自定义 EventSource 及 Counterusing System.Diagnostics.Tracing;[EventSource(Name ="SampleApp-PerformanceCounters")]
public sealed class PerformanceCountersEventSource : EventSource
{
public staticreadonlyPerformanceCountersEventSource Log = new PerformanceCountersEventSource;
privatereadonlyEventCounter _RequestCounter;
privatereadonlyPollingCounter _queueLengthCounter;
// 假设你的业务有一个请求数和一个队列长度需要统计
private int _queueLength = 0;
private PerformanceCountersEventSource :base
{
_requestCounter = new EventCounter("requests-total", this)
{
DisplayName ="总请求数"
DisplayUnits ="次"
};
_queueLengthCounter = new PollingCounter("queue-length", this, => _queueLength)
{
DisplayName ="队列长度"
DisplayUnits ="个"
};
}
public voidRequestHandled
{
_requestCounter.WriteMetric(1); // 每处理一次请求发送一个增量
}
// 供业务操作队列长度
public void SetQueueLength(int len)
{
_queueLength = len;
}
protected override void Dispose(bool disposing)
{
_requestCounter?.Dispose;
_queueLengthCounter?.Dispose;
base.Dispose(disposing);
}
}
说明:
EventCounter适合主动累加/均值采样,如请求数、延迟等。
PollingCounter适合实时采集某个状态值,如队列长度等。
2. 业务代码中写入 Counterpublic class SampleService{
public voidHandleRequest
{
// 业务逻辑 ...
PerformanceCountersEventSource.Log.RequestHandled;
}
public void UpdateQueueLength(int len)
{
// 修改队列长度
PerformanceCountersEventSource.Log.SetQueueLength(len);
}
}
命令行工具(以 dotnet-counters 为例)
在终端查找你的进程 ID(PID):
采集指标数据:
dotnet-counters monitor -p --counters SampleApp-PerformanceCounters你会看到类似如下的数据输出:
[SampleApp-PerformanceCounters]requests-total 5
queue-length 3
C# 的 EventCounters 为.NET 应用提供了代码层级的自定义监控能力,对提升系统可观测性和快速诊断问题极为有用。它集成简单、开销小,适用于中高层次的性能与业务指标跟踪,且能无缝对接现代化监控平台。不过,过细粒度或特定时效性需求还需配合其他 Profiling 或 tracing 技术。
官方文档:Monitoring and diagnostics with EventCounters
dotnet-counters 工具介绍
来源:opendotnet