Prometheus无法抓取.NET 9 Web应用指标的问题求助
.NET 9 Web应用与Prometheus集成后指标无法正常同步的问题
我按照微软官方指南将Prometheus与.NET 9 Web应用集成,但指标数据无法正常同步到Prometheus中。已补充指南缺失的关键配置(如app.UseOpenTelemetryPrometheusScrapingEndpoint();),当前访问应用的/metrics端点可正常查看指标,控制台也能显示追踪数据,但Prometheus仅返回少量无效指标,未达到预期数量。
Prometheus Docker配置
global: scrape_interval: 60s # 默认每15秒抓取一次目标 # 与外部系统通信时,将这些标签附加到任何时间序列或警报(联邦、远程存储、Alertmanager) external_labels: monitor: 'rackemapp-monitor' scrape_configs: # 作业名将作为标签`job=<job_name>`添加到从此配置抓取的任何时间序列中 - job_name: 'rackemapp-web' scheme: https scrape_interval: 5s tls_config: insecure_skip_verify: true static_configs: - targets: ['localhost:44368']
.NET 9应用Startup.cs配置
// 应用自定义指标 var homeMeter = new Meter("RackEmAppWeb.HomePageCounter", "1.0.0"); var countHomePageVisits = homeMeter.CreateCounter<int>("homepage.count", description: "统计首页访问次数"); // 应用自定义ActivitySource var homeActivitySource = new ActivitySource("RackEmAppWeb.HomePageCounter"); var tracingOtlpEndpoint = "http://localhost:4317"; var otel = services.AddOpenTelemetry(); // 配置OpenTelemetry资源,设置应用名称 otel.ConfigureResource(resource => resource .AddService(serviceName: "Web Platform")); // 添加ASP.NET Core指标和自定义指标,并导出到Prometheus otel.WithMetrics(metrics => metrics // OpenTelemetry提供的指标 .AddAspNetCoreInstrumentation() .AddMeter(homeMeter.Name) // .NET 8中ASP.NET Core提供的指标 .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") // System.Net库提供的指标 .AddMeter("System.Net.Http") .AddMeter("System.Net.NameResolution") .AddSqlClientInstrumentation() .AddConsoleExporter() .AddPrometheusExporter()); countHomePageVisits.Add(1); // 添加ASP.NET Core追踪和自定义ActivitySource,并导出到Jaeger otel.WithTracing(tracing => { tracing.AddAspNetCoreInstrumentation(); tracing.AddHttpClientInstrumentation(); tracing.AddSource(homeActivitySource.Name); tracing.AddSqlClientInstrumentation(); if (tracingOtlpEndpoint != null) { tracing.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri(tracingOtlpEndpoint); }); } else { tracing.AddConsoleExporter(); } });
排查方向
- Docker网络映射问题:容器内的
localhost指向容器自身,而非宿主机。将targets改为宿主机IP(如host.docker.internal:44368,适用于Windows/macOS),或启动Prometheus容器时添加--network host参数使用宿主机网络。 - HTTPS连接异常:即便开启了
insecure_skip_verify,仍可能存在SSL握手问题。临时将应用切换为HTTP,修改Prometheus配置的scheme: http并对应调整端口,测试是否能正常抓取。 - 指标未触发:部分ASP.NET Core指标(如请求计数)需要实际请求触发,确保已访问过应用接口生成指标数据。
- 查看Prometheus日志:执行
docker logs <prometheus容器ID>,检查是否存在抓取目标的错误(如连接超时、证书错误)。 - 中间件顺序验证:确认
app.UseOpenTelemetryPrometheusScrapingEndpoint()放在app.UseRouting()之后、app.UseEndpoints()之前,保证端点可被正常访问。
内容的提问来源于stack exchange,提问作者Matthew Warr
相关产品推荐
相关产品推荐

