Exemplars 在可观测性中有什么作用?
简化版
Exemplar 是附着在指标样本或直方图桶上的代表性事件,通常携带 traceId,用来从“某个时间段 P99 变高”直接跳到一条具体 Trace。它连接聚合指标与请求明细,但只是样本,不代表完整分布。
详细版
应用记录延迟直方图时,从当前带采样 Trace 的请求中选择 exemplar,保存时间、值和受控标签。后端在图表峰值或 bucket 上展示链接,用户再从 Trace 下钻日志。
选择策略应偏向长尾、错误和稀有样本,同时限制每序列数量、保留期和敏感属性。traceId 本身不应成为普通指标标签;若对应 Trace 未被保留,链接会失效,因此采样策略需要协调。
完整版教学
一、为什么需要桥梁
指标告诉你 10:05 的 P99 是 1.8s,却不能说明是哪次请求;Trace 有明细,但在海量请求中搜索昂贵。Exemplar 把聚合异常位置与少量代表请求连接起来。
记忆钩子:指标找时间和范围,Exemplar 给样本入口,Trace 解释具体路径。
二、数据长什么样
metric: http_server_duration_bucket{route="/pay",le="2"}
value: 1.73s
timestamp: 10:05:21
exemplar: {trace_id="abc..."}
traceId 是 exemplar 元数据,不会为每个 traceId 创建独立时间序列。
三、与标签的区别
| 项目 | 普通标签 | Exemplar |
|---|---|---|
| 作用 | 聚合和筛选 | 指向代表样本 |
| 数量 | 每序列固定维度 | 稀疏附着 |
| 高基数 | 会创建新序列 | 不改变序列身份 |
| 典型值 | route/status | traceId |
把 traceId 放标签会造成高基数爆炸,不能用 exemplar 的名字掩盖错误埋点。
四、怎样选择样本
均匀随机样本可能全部来自健康请求。可对最慢 bucket、错误状态和高价值业务提高候选概率,并保留每个时间窗口有限数量。
例如每分钟 /pay 各延迟桶保留 1 个 exemplar,同时错误请求优先覆盖成功样本;它仍不是统计抽样,不能据此计算错误率。
五、与 Trace 采样协调
若入口创建 exemplar 后,Tail Sampler 最终丢掉该 Trace,图表链接会找不到。可以让 exemplar 候选 trace 带采样提示,或在 Tail Sampling 规则中保留被引用 Trace。
跨后端保留期也要协调:指标保留 30 天、Trace 只留 3 天时,旧 exemplar 自然无法下钻。
六、安全与运维
只携带 traceId 和少量安全上下文,不附 userId、订单号或原始 URL。监控 exemplar 写入率、链接命中率和 Trace 缺失率;命中率下降可能是采样或传播故障。
仪表盘应允许无 exemplar 时回退到按时间、服务和 route 查询,而非让排障完全依赖链接。
后端不支持 exemplar 时,可用版本、时间窗和 route 组合查询 Trace,但不能把 traceId 退化为普通高基数标签。
七、常见误区与追问
- 误区:Exemplar 能代表整个延迟分布。 它只是少量样本入口。
- 误区:traceId 可以直接做指标标签。 会创建海量时间序列。
- 误区:有 Exemplar 就不需要 Trace 搜索。 链接可能过期或缺失。
- 误区:随机选择总能抓到异常。 稀有错误需要偏置策略。
- 追问:为何链接会失效? Trace 被采样丢弃、过期或上下文传播失败。
- 追问:保存多少合适? 按桶和时间窗设置预算,以定位收益压测决定。
- 追问:能放业务 ID 吗? 通常不放敏感高基数字段,改在受控 Trace 中查询。
八、加强记忆
Exemplar 是 Metrics→Trace 的稀疏桥梁:不改变时间序列身份,只在异常桶附近留下代表 traceId。样本选择偏向长尾与错误,采样和保留策略保证链接可用,安全上仅放最小元数据;它提升下钻速度,但不承担统计代表性。