如何将.NET知名EventCounters暴露至Open Telemetry收集器
将EventCounters暴露给OpenTelemetry(Prometheus导出实现)
OpenTelemetry .NET SDK原生提供了EventCounters的采集能力,配合官方Prometheus导出器即可快速实现指标暴露,不需要额外第三方组件,具体实现步骤如下:
1. 安装依赖NuGet包
根据你的项目类型安装对应包:
# 通用核心依赖 dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Instrumentation.EventCounters # ASP.NET Core项目用这个Prometheus导出器 dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore # 非Web控制台/服务项目用这个Prometheus导出器 # dotnet add package OpenTelemetry.Exporter.Prometheus.HttpListener
2. 配置指标采集管道
ASP.NET Core 项目配置
在Program.cs中注册OpenTelemetry服务,并配置EventCounters采集规则和Prometheus导出端点:
var builder = WebApplication.CreateBuilder(args); // 注册OpenTelemetry指标服务 builder.Services.AddOpenTelemetry() .WithMetrics(metrics => { // 添加EventCounters采集器 metrics.AddEventCounters(counterOptions => { // 添加需要采集的EventSource名称,对应官方文档列出的知名计数器源 // 常用系统预置源: counterOptions.EventSourceNames.Add("System.Runtime"); // 运行时CPU、内存、GC、线程等核心指标 counterOptions.EventSourceNames.Add("Microsoft.AspNetCore.Hosting"); // ASP.NET Core请求指标 counterOptions.EventSourceNames.Add("System.Net.Http"); // HttpClient出站请求指标 // 可选:调整指标采集刷新间隔,单位秒,默认值为60 counterOptions.RefreshIntervalSecs = 15; }); // 添加Prometheus导出器 metrics.AddPrometheusExporter(); }); var app = builder.Build(); // 注册Prometheus抓取端点中间件,默认路径为/metrics app.UseOpenTelemetryPrometheusScrapingEndpoint(); // 其余业务中间件配置... app.Run();
非Web项目配置
如果是控制台或者后台服务,可以用HttpListener版本的Prometheus导出器直接暴露抓取端口:
using OpenTelemetry; using OpenTelemetry.Metrics; // 构建MeterProvider using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddEventCounters(counterOptions => { counterOptions.EventSourceNames.Add("System.Runtime"); counterOptions.RefreshIntervalSecs = 15; }) .AddPrometheusHttpListener(listenerOptions => { // 配置监听地址前缀和抓取路径 listenerOptions.UriPrefixes = new[] { "http://*:9464/" }; listenerOptions.ScrapeEndpointPath = "/metrics"; }) .Build(); // 保持程序运行 Console.WriteLine("Prometheus metrics endpoint live at http://localhost:9464/metrics"); Console.ReadKey();
3. 验证与对接
- 启动应用后,访问配置的metrics端点,就能看到以
ec_为前缀的EventCounters指标,指标名和官方列出的计数器一一对应 - 直接配置Prometheus抓取该端点即可完成采集;如果需要对接OpenTelemetry Collector,既可以让Collector通过Prometheus receiver抓该端点,也可以把Prometheus导出器替换为OTLP导出器直接推送指标到Collector,EventCounters的采集配置不需要做任何修改
注意:请使用1.0及以上正式版本的
OpenTelemetry.Instrumentation.EventCounters包,低版本预览包存在部分计数器名称映射错误、采集漏报的问题。如果是自定义EventSource实现的业务计数器,只需要把自定义EventSource的名称加入EventSourceNames列表即可自动采集导出,不需要额外适配。
内容的提问来源于stack exchange,提问作者Moose Morals
相关产品推荐
相关产品推荐

