# Explore 与关联 · 桥在 UI 上落地

> 前面讲的所有「桥」——exemplar、trace_id 关联——最终要在界面上变成一次点击。这一章讲 Explore 为什么和看板互补、数据源关联怎么配，以及那个把整个专栏串起来的画面：一次真实排障的完整点击路径。

- 作者：David（道雾轩）
- 专栏：指标采集与观测（https://daiw.org/manual/observability.md）
- 最后更新：2026-07-15
- 原文：https://daiw.org/manual/observability/grafana-explore
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# Explore 与关联 · 桥在 UI 上落地

[看板](https://daiw.org/manual/observability/grafana-dashboards)回答“**已知该看什么**”的问题。但[第 0 部分说过](https://daiw.org/manual/observability/why-observability)，可观测性的价值是回答“**你没想到的问题**”——**而看板天生做不到这个**（它是预先做好的）。

这一章讲 **Explore**，以及前面所有“[桥](https://daiw.org/manual/observability/exemplars)”怎么在界面上变成**一次点击**。这也是第 8 部分的收尾。

## Explore：为“未知的未知”而生

<Callout type="info">
  **看板和 Explore 是**互补**的，对应[第 0 部分那对概念](https://daiw.org/manual/observability/why-observability)：**

  | | **看板** | **Explore** |
  | --- | --- | --- |
  | **回答** | “[已知的未知](https://daiw.org/manual/observability/why-observability)” | “[**未知的未知**](https://daiw.org/manual/observability/why-observability)” |
  | **形态** | 预先做好的固定视图 | **临时查询，随时改** |
  | **用于** | 日常巡检、值班第一眼 | **顺着线索往下挖** |
  | **典型动作** | 看 | **改查询、加标签、换维度、跳数据源** |

  **Explore 就是[第 0 部分那个“按任意维度追问下去”](https://daiw.org/manual/observability/why-observability)的 UI 化身**：

  ```
  看板告诉你:P99 涨了
       ↓ 点进 Explore
  改查询:按 instance 切一下 → 只有 3 个 pod 慢
       ↓ 再改
  这 3 个有什么共同点?→ 都在 node-7
       ↓ 换个数据源
  node-7 的磁盘 IO → 饱和了
  ```

  **每一步都是“临时想到的”，没有任何看板预先准备了它们。** 这就是为什么**光有看板不够**——**看板是地图，Explore 是你的腿**。
</Callout>

## 关联配置：让桥变成一次点击

[第 7 部分讲了四座桥](https://daiw.org/manual/observability/exemplars)，它们在 Grafana 里都要**显式配置**才能生效：

<Callout type="info">
  **① 指标 → 追踪（[exemplar](https://daiw.org/manual/observability/exemplars)）**

  Prometheus 数据源配置里：
  ```yaml
  jsonData:
    exemplarTraceIdDestinations:
      - name: trace_id          # exemplar 里的哪个字段
        datasourceUid: tempo    # 跳到哪个数据源
  ```
  配好后，**曲线旁边会出现小菱形点，点它 → 直接打开那条 trace**。[这就是“用聚合的便宜换个案入口”在 UI 上的样子](https://daiw.org/manual/observability/exemplars)。

  **② 追踪 → 日志**

  Tempo 数据源配置 `tracesToLogs`（现在叫 `tracesToLogsV2`）：
  ```yaml
  jsonData:
    tracesToLogsV2:
      datasourceUid: loki
      tags: [{ key: 'service.name', value: 'service' }]   # span 属性 → 日志标签的映射
      filterByTraceID: true      # ← 关键:只看这条 trace 的日志
  ```
  **在 trace 的火焰图上，每个 span 旁边有个“Logs”按钮** → 点开就是**那一跳、那个时刻、那条 trace 的日志**。

  **`filterByTraceID: true` 是精髓**——它把“[在几万条日志里翻](https://daiw.org/manual/observability/logs-pillar)”变成“就看这一个请求的几条”。**前提是[你的日志里真的有 trace_id](https://daiw.org/manual/observability/logs-pillar)。**

  **③ 日志 → 追踪**

  Loki 数据源配置 `derivedFields`：
  ```yaml
  derivedFields:
    - name: TraceID
      matcherRegex: 'trace_id=(\w+)'    # 从日志里提取
      datasourceUid: tempo
      url: '$${__value.raw}'
  ```
  **于是日志里的 trace_id 变成一个可点的链接。**

  **④ 追踪 → 指标** —— [靠 spanmetrics connector 生成的指标](https://daiw.org/manual/observability/exemplars)，在 Tempo 里配 `tracesToMetrics`。
</Callout>

<Callout type="warn">
  **一个残酷的现实：这些桥**都要手工配置**，而且配置分散在各个数据源里。**

  **“我配了 exemplar 但点不了”的排查顺序：**
  1. **应用真的吐 exemplar 了吗？** → `curl /metrics` 看有没有 `# {trace_id=...}`。
  2. **[格式协商到 OpenMetrics 了吗？](https://daiw.org/manual/observability/exemplars)** → **最常见的失败点**，经典文本格式会静默丢弃 exemplar。
  3. **Prometheus 开了 `--enable-feature=exemplar-storage` 吗？**
  4. **Grafana 数据源配了 `exemplarTraceIdDestinations` 吗？**
  5. **那条 trace 真的存在吗？** → [被采样丢了？](https://daiw.org/manual/observability/sampling)

  **五个环节，少一个就没有，而且大多是静默失败。** 这是可观测性工程的真实写照：**理念优雅，落地琐碎。**
</Callout>

## 一次完整排障：把整个专栏串起来

<Callout type="info">
  **现在把这个专栏的所有东西串成一个画面——[第 0 部分那个 P99 变慢的例子](https://daiw.org/manual/observability/why-observability)，完整的点击路径：**

  ```mermaid
  flowchart TD
      A["① 手机响了<br/>ErrorBudgetBurnFast(燃烧率 14.4)"] --> B["② 打开 runbook 里的看板链接"]
      B --> C["③ 第一层:成功率掉到 97%,P99 从 200ms → 2s"]
      C --> D["④ 展开第二层 RED:本服务正常,<br/>下游'库存服务'那一跳 P99 = 1.8s"]
      D --> E["⑤ 点 P99 曲线上的 exemplar 小点<br/>→ 跳到那条真实的慢 trace"]
      E --> F["⑥ 火焰图:1.8s 全在'查库存'这个 span"]
      F --> G["⑦ 点那个 span 旁的 'Logs'<br/>→ 那一刻那个请求的日志"]
      G --> H["⑧ 日志:'connection pool timeout'"]
      H --> I["⑨ 回 Explore:查库存服务的连接池饱和度<br/>→ 等待连接的线程数飙升"]
      I --> J["⑩ 根因:连接池太小 / 有慢查询占着连接"]
      style A fill:#ef4444,color:#fff
      style E fill:#a855f7,color:#fff
      style J fill:#22c55e,color:#fff
  ```

  **数一数这条路径用到了这个专栏的多少东西：**

  | 步骤 | 用到了 |
  | --- | --- |
  | ① | [SLO 燃烧率告警](https://daiw.org/manual/observability/slo-burn-rate)、[runbook](https://daiw.org/manual/observability/alerting-philosophy) |
  | ③ | [黄金信号](https://daiw.org/manual/observability/four-golden-signals)、[分层看板](https://daiw.org/manual/observability/grafana-dashboards) |
  | ④ | [RED 方法](https://daiw.org/manual/observability/red-method)、[histogram 分位数](https://daiw.org/manual/observability/promql-histograms) |
  | ⑤ | **[exemplar](https://daiw.org/manual/observability/exemplars)**（桥 ①） |
  | ⑥ | [trace / span 模型](https://daiw.org/manual/observability/traces-basics) |
  | ⑦ | **[trace→日志关联](https://daiw.org/manual/observability/logs-pillar)**（桥 ②） |
  | ⑧ | [结构化日志](https://daiw.org/manual/observability/logs-pillar) |
  | ⑨ | **[USE 的饱和度](https://daiw.org/manual/observability/use-method)**（应用层资源！） |
  | 全程 | [基数控制](https://daiw.org/manual/observability/defining-metrics)让这一切查得动、[Collector](https://daiw.org/manual/observability/collector-architecture) 把数据运过来、[TSDB](https://daiw.org/manual/observability/tsdb-overview) 让它存得下 |

  **这就是整个专栏的意义：让这条路径**从 10 分钟压缩到 5 分钟，并且不依赖“恰好有个老师傅知道该看哪”**。**

  **而如果缺了任何一环——没有 SLO 告警（不知道出事）、没有分层看板（不知道看哪）、没有 exemplar（跳不过去）、没有 trace_id（日志捞不着）、[基数爆了](https://daiw.org/manual/observability/defining-metrics)（查询超时）——这条路径就断了，你就回到了“[猜](https://daiw.org/manual/observability/why-observability)”。**
</Callout>

## 小结与下一部分

**Explore 为“[未知的未知](https://daiw.org/manual/observability/why-observability)”而生**，和看板互补：[看板是预先做好的固定视图（答已知的未知），Explore 是临时查询、随时改（答你没想到的问题）](https://daiw.org/manual/observability/why-observability)——**看板是地图，Explore 是你的腿**。[第 7 部分那四座桥](https://daiw.org/manual/observability/exemplars)在 Grafana 里都要**显式配置**：[`exemplarTraceIdDestinations`（指标→追踪）、`tracesToLogsV2` + **`filterByTraceID`**（追踪→日志，把“翻几万条”变成“看这几条”）、Loki 的 `derivedFields`（日志→追踪）、`tracesToMetrics`](https://daiw.org/manual/observability/logs-pillar)。**残酷的现实：这些桥要手工配、配置分散、且大多静默失败**——exemplar 点不了要查五个环节（[最常见是格式没协商到 OpenMetrics](https://daiw.org/manual/observability/exemplars)）；**理念优雅，落地琐碎**。最后我们用**一次完整排障的点击路径**把整个专栏串了起来——[从燃烧率告警 → 分层看板 → exemplar 跳 trace → span 跳日志 → USE 查连接池饱和](https://daiw.org/manual/observability/use-method)；**缺任何一环，路径就断，你就回到“猜”**。

技术都讲完了。最后一部分回到最现实的问题：**这一切要花多少钱、怎么不失控。** 👉 第 9 部分 · 工程实践与收尾。

## 参考资料

- [1] Grafana 官方文档：Explore、Exemplars、Trace to logs、Derived fields。
- [2] 关联[三支柱的桥](https://daiw.org/manual/observability/exemplars)、[结构化日志](https://daiw.org/manual/observability/logs-pillar)、[分层看板](https://daiw.org/manual/observability/grafana-dashboards)。
- [3] Grafana 源码 `pkg/services/datasources/`（数据源配置模型）。
