Explore 与关联 · 桥在 UI 上落地
前面讲的所有「桥」——exemplar、trace_id 关联——最终要在界面上变成一次点击。这一章讲 Explore 为什么和看板互补、数据源关联怎么配,以及那个把整个专栏串起来的画面:一次真实排障的完整点击路径。
Explore 与关联 · 桥在 UI 上落地
看板回答“已知该看什么”的问题。但第 0 部分说过,可观测性的价值是回答“你没想到的问题”——而看板天生做不到这个(它是预先做好的)。
这一章讲 Explore,以及前面所有“桥”怎么在界面上变成一次点击。这也是第 8 部分的收尾。
Explore:为“未知的未知”而生
看板和 Explore 是互补的,对应第 0 部分那对概念:
Explore 就是第 0 部分那个“按任意维度追问下去”的 UI 化身:
看板告诉你:P99 涨了
↓ 点进 Explore
改查询:按 instance 切一下 → 只有 3 个 pod 慢
↓ 再改
这 3 个有什么共同点?→ 都在 node-7
↓ 换个数据源
node-7 的磁盘 IO → 饱和了每一步都是“临时想到的”,没有任何看板预先准备了它们。 这就是为什么光有看板不够——看板是地图,Explore 是你的腿。
关联配置:让桥变成一次点击
第 7 部分讲了四座桥,它们在 Grafana 里都要显式配置才能生效:
① 指标 → 追踪(exemplar)
Prometheus 数据源配置里:
jsonData:
exemplarTraceIdDestinations:
- name: trace_id # exemplar 里的哪个字段
datasourceUid: tempo # 跳到哪个数据源配好后,曲线旁边会出现小菱形点,点它 → 直接打开那条 trace。这就是“用聚合的便宜换个案入口”在 UI 上的样子。
② 追踪 → 日志
Tempo 数据源配置 tracesToLogs(现在叫 tracesToLogsV2):
jsonData:
tracesToLogsV2:
datasourceUid: loki
tags: [{ key: 'service.name', value: 'service' }] # span 属性 → 日志标签的映射
filterByTraceID: true # ← 关键:只看这条 trace 的日志在 trace 的火焰图上,每个 span 旁边有个“Logs”按钮 → 点开就是那一跳、那个时刻、那条 trace 的日志。
filterByTraceID: true 是精髓——它把“在几万条日志里翻”变成“就看这一个请求的几条”。前提是你的日志里真的有 trace_id。
③ 日志 → 追踪
Loki 数据源配置 derivedFields:
derivedFields:
- name: TraceID
matcherRegex: 'trace_id=(\w+)' # 从日志里提取
datasourceUid: tempo
url: '$${__value.raw}'于是日志里的 trace_id 变成一个可点的链接。
④ 追踪 → 指标 —— 靠 spanmetrics connector 生成的指标,在 Tempo 里配 tracesToMetrics。
一个残酷的现实:这些桥都要手工配置**,而且配置分散在各个数据源里。**
“我配了 exemplar 但点不了”的排查顺序:
- 应用真的吐 exemplar 了吗? →
curl /metrics看有没有# {trace_id=...}。 - 格式协商到 OpenMetrics 了吗? → 最常见的失败点,经典文本格式会静默丢弃 exemplar。
- Prometheus 开了
--enable-feature=exemplar-storage吗? - Grafana 数据源配了
exemplarTraceIdDestinations吗? - 那条 trace 真的存在吗? → 被采样丢了?
五个环节,少一个就没有,而且大多是静默失败。 这是可观测性工程的真实写照:理念优雅,落地琐碎。
一次完整排障:把整个专栏串起来
现在把这个专栏的所有东西串成一个画面——第 0 部分那个 P99 变慢的例子,完整的点击路径:
数一数这条路径用到了这个专栏的多少东西:
| 步骤 | 用到了 |
|---|---|
| ① | SLO 燃烧率告警、runbook |
| ③ | 黄金信号、分层看板 |
| ④ | RED 方法、histogram 分位数 |
| ⑤ | exemplar(桥 ①) |
| ⑥ | trace / span 模型 |
| ⑦ | trace→日志关联(桥 ②) |
| ⑧ | 结构化日志 |
| ⑨ | USE 的饱和度(应用层资源!) |
| 全程 | 基数控制让这一切查得动、Collector 把数据运过来、TSDB 让它存得下 |
这就是整个专栏的意义:让这条路径从 10 分钟压缩到 5 分钟,并且不依赖“恰好有个老师傅知道该看哪”。
而如果缺了任何一环——没有 SLO 告警(不知道出事)、没有分层看板(不知道看哪)、没有 exemplar(跳不过去)、没有 trace_id(日志捞不着)、基数爆了(查询超时)——这条路径就断了,你就回到了“猜”。
小结与下一部分
Explore 为“未知的未知”而生,和看板互补:看板是预先做好的固定视图(答已知的未知),Explore 是临时查询、随时改(答你没想到的问题)——看板是地图,Explore 是你的腿。第 7 部分那四座桥在 Grafana 里都要显式配置:exemplarTraceIdDestinations(指标→追踪)、tracesToLogsV2 + filterByTraceID(追踪→日志,把“翻几万条”变成“看这几条”)、Loki 的 derivedFields(日志→追踪)、tracesToMetrics。残酷的现实:这些桥要手工配、配置分散、且大多静默失败——exemplar 点不了要查五个环节(最常见是格式没协商到 OpenMetrics);理念优雅,落地琐碎。最后我们用一次完整排障的点击路径把整个专栏串了起来——从燃烧率告警 → 分层看板 → exemplar 跳 trace → span 跳日志 → USE 查连接池饱和;缺任何一环,路径就断,你就回到“猜”。
技术都讲完了。最后一部分回到最现实的问题:这一切要花多少钱、怎么不失控。 👉 第 9 部分 · 工程实践与收尾。