Prometheus 3.16.0(官方 changelog 记为 2026-11-04,GitHub Release 发布于 2026-11-05)起,exemplar 的 label 名必须唯一。带两个同名 trace_id 的 exemplar 不再入库,/api/v1/query_exemplars 对该序列直接回空;3.15.1 仍会存下来,并在 JSON 里吐出重复键。

官方 PR #19896 把变更标成 [CHANGE]:旧行为会让 /api/v1/query_exemplars 给出 "labels":{"trace_id":"aaaa","trace_id":"bbbb"} 这种含重复成员名、不同解析器处理结果可能不一致的对象。下面用官方镜像 prom/prometheus:v3.15.1 对照 v3.16.0,再以 Spring Boot 4.1.2 的 RestClient 读同一条接口。两边都开 --enable-feature=exemplar-storage,用 OpenMetrics 文本暴露带 exemplar 的计数器。

3.15.1:重复 label 名照样进库

抓取端返回这样一段 OpenMetrics(Content-Type: application/openmetrics-text),exemplar 里故意写两个 trace_id:

# TYPE demo_requests_total counter
demo_requests_total 42 # {trace_id="aaaa",trace_id="bbbb"} 1 1793924081
# EOF

对照组用合法 exemplar:{trace_id="cccc"}。scrape 起来后查 /api/v1/query_exemplars:

===== curl 3.15.1 =====
VERSION=3.15.1
V315_BAD_TRACE_ID_COUNT=6
V315_BAD_SERIES=1
V315_OK_TRACE_ID_COUNT=3
V315_OK_SERIES=1

坏样本的原始响应里能看到重复键(节选):

"labels":{"trace_id":"aaaa","trace_id":"bbbb"}

合法样本正常只有一个 trace_id。注意:多数 JSON 库会把重复键折叠成最后一个值,业务侧若直接反序列化成 Map,只会看到 bbbb,重复键本身被吞掉。

3.16.0:同名 label 直接拒收

同一套指标换到 3.16.0:

===== curl 3.16.0 =====
VERSION=3.16.0
V316_BAD_RAW={"status":"success","data":[]}
V316_BAD_TRACE_ID_COUNT=0
V316_BAD_SERIES=0
V316_OK_TRACE_ID_COUNT=4
V316_OK_SERIES=1

坏 exemplar 整段不进 circular storage,查询该序列的 exemplar 结果是空数组。合法 exemplar 仍按秒级 scrape 正常追加。指标样本本身(demo_requests_total 的数值)两边都能 scrape 到,变的只是 exemplar 入库规则。

Boot 4.1.2 RestClient:原始响应对照

业务侧常见是 Spring Boot 去查 Prometheus 的 query API。演示用 Boot 4.1.2 RestClient,不启 Web 端口,按字符串读 body,避免 JSON 库折叠重复键:

===== boot RestClient 3.15.1 =====
BOOT=4.1.2
BAD_TRACE_ID_COUNT=10
BAD_DATA_EMPTY=false
OK_TRACE_ID_COUNT=4

===== boot RestClient 3.16.0 =====
BOOT=4.1.2
BAD_TRACE_ID_COUNT=0
BAD_DATA_EMPTY=true
OK_TRACE_ID_COUNT=5

升到 3.16.0 后,原先能查到、却带着重复键的 exemplar 会变成稳定的空结果。本次验证的是 OpenMetrics 抓取路径,未实测 OTLP 接收。若 OTLP 链路给 exemplar 既写了 trace_id/span_id,又把同名属性再塞进 labels,升级后这些 exemplar 会被拒;需要先去掉重复名,或让 trace 上下文与属性合并时保留一份。抓取侧要保证走 OpenMetrics,否则文本格式根本带不上 exemplar。

参考来源

Prometheus 3.16.0 发布说明

PR #19896:拒绝重复 exemplar 标签名

— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。