You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 10:25:05