Prometheus未抓取Exemplars问题排查及解决方案预告
我正在尝试启用Prometheus的Exemplars内存存储,日志显示已成功启用:
time=2025-02-16T14:52:15.866Z level=INFO source=main.go:225 msg="Experimental in-memory exemplar storage enabled"
即使开启了--log.level=debug,也未捕获到抓取错误,仅当otel/opentelemetry-collector-contrib:0.118.0容器离线时才会报错。
我的Prometheus版本为prom/prometheus:v3.1.0,使用.NET 8 Web API搭配1.11.x版本的OpenTelemetry系列NuGet包及自动插桩功能,当前功能运行正常。Docker容器暴露了9091端口,访问/metrics端点可看到指标行中带有span_id和trace_id的Exemplars,但Prometheus仅成功抓取到指标,Exemplars疑似被丢弃,怀疑是Prometheus未使用Accept: application/openmetrics-text请求头导致。
同时存在疑问:指标+Exemplars应推送给Prometheus还是通过抓取获取?
1. 配置Prometheus抓取请求头
Prometheus默认抓取时不会自动携带Accept: application/openmetrics-text请求头,需手动在抓取配置中添加。修改prometheus.yml的scrape_configs节点:
scrape_configs: - job_name: 'dotnet-api' static_configs: - targets: ['你的dotnet服务地址:9091'] scrape_interval: 15s headers: Accept: application/openmetrics-text; version=1.0.0,text/plain; version=0.0.4;q=0.5,*/*;q=0.1
该请求头会触发目标端点返回符合OpenMetrics规范的内容,包含Exemplars数据。
2. 确认Prometheus的Exemplars存储启用状态
确保Prometheus启动命令中包含实验特性启用参数:
--enable-feature=exemplar-storage
虽日志显示已启用,但需再次核对启动配置,避免参数遗漏。
3. 明确Exemplars的传输模式
Exemplars支持**抓取(Pull)和推送(Push)**两种模式,主流且推荐使用抓取模式:
- 抓取模式:Prometheus主动从
/metrics端点拉取带Exemplars的指标,只要端点返回格式合规,且Prometheus配置了正确请求头,即可正常获取Exemplars。 - 推送模式:需借助PushGateway,但PushGateway不持久化Exemplars,并非Prometheus原生推荐方案,优先选择抓取模式。
4. 验证抓取结果
修改配置后重启Prometheus,等待一次抓取周期完成,在Prometheus UI中查询目标指标(如http_requests_total),查看指标详情是否包含Exemplars信息。若未生效,可通过curl模拟Prometheus请求,检查返回内容:
curl -H "Accept: application/openmetrics-text; version=1.0.0" http://你的dotnet服务地址:9091/metrics
确认返回内容中存在类似格式的Exemplars行:
http_requests_total{method="GET",path="/api/values"} 123 # {trace_id="abc123",span_id="def456"} 1739674335
内容的提问来源于stack exchange,提问作者IbrarMumtaz

