Skip to content
返回运维与 SRE

日志关联

用 trace_id 把日志与 trace 和指标关联在事件中看全请求路径。

为什么

结账失败涉 4 服务:网关、cart、checkout、payment — 错误在 payment 但用户请求从网关开始。无关联值班看 checkout ERROR 日志、查 payment、见无(payment 调用尚未日志)并结论"checkout 坏"— 错。有 trace_id 关联值班看 checkout ERROR、点 trace_id、见全路径:网关 → cart → checkout → payment(500)→ DB(超时)。根因是 DB 超时,3 击可见。这是可观测三柱协:指标告诉你错误率高、日志告诉你错误消息、trace 告诉你全路径和延迟在哪。关联三者的团队报根因识别快 70% 因他们看全请求非一服务视图。

何时使用

当你有结构化日志、分布式追踪和指标。把 trace_id 接入三者。

如何做

1. 在边缘生成 trace_id 并到处传播
   - 网关入请求生成 trace_id → 放请求上下文
   - 所有下游调用(HTTP、gRPC、DB)头/元数据含 trace_id
   - 所有日志含 trace_id 字段;trace span 含日志链接

2. 把日志链到 trace 且 trace 链到日志
   - 每日志条有 trace_id 和 span_id;trace span 链回日志
   - UI 中:点日志 → 见其 trace;点 trace → 见其日志
   - 这内建于 OpenTelemetry、Jaeger、Datadog、Honeycomb

3. 经 exemplar 把指标链到 trace
   - 直方图桶可含 exemplar:该桶中一请求的 trace_id
   - "p99 延迟 2s" → 点 exemplar → 见 2s 请求的 trace → 见时间去了哪
   - 这把指标从数变可调试实例

4. 为事件建关联工作流
   - 告警触发(指标)→ 值班开告警 → 见失败请求的 trace_id
   - 点 trace_id → 见全路径、失败服务、错误日志
   - 全 3 击,无 grep、无猜下个查哪个服务

5. 也为非事件用关联(性能)
   - "checkout p99 延迟 2s" → exemplar → trace → 见 DB 查询花 1.8s
   - 关联非仅错误;它是关于特定请求的任何问题

示例

# 关联流(事件):
1. 告警触发:CheckoutErrorRateHigh(指标:错误率 5%)
2. 值班开告警 → 见 exemplar trace_id:"abc123"
3. 点 trace_id → Jaeger 显全 trace:
   gateway(200,50ms)
     └─ cart(200,30ms)
         └─ checkout(500,1200ms)
             └─ payment(500,1180ms)
                 └─ db.query(超时,1150ms)  ← 根因
4. 点 db.query span → 见日志:
   {trace_id:"abc123",service:"payment",msg:"DB query timeout",
    query:"SELECT * FROM charges WHERE...",latency_ms:11500}
5. 4 击根因:charges 表 DB 查询超时。
   → 跑 DB runbook → 索引 charges 表 → 解决。

# 指标中 exemplar(Prometheus):
histogram_quantile(0.99,checkout_latency_seconds_bucket)
#   = 2.0s
# 带 exemplar:
#   = 2.0s  (exemplar trace_id:"xyz789")
# 点"xyz789"→ 见 2s 请求的 trace → 见 DB 查询花 1.8s
# 指标告诉你"p99 慢";exemplar 给你看为什么。

常见问题

  • ⚠无 trace_id 日志 — 值班看 checkout 错但无法链到 payment 日志;分别查每服务按时间戳关联(慢、错)。
  • ⚠无日志链的 trace — trace 显路径非错误消息;值班须按时间戳 grep 日志找错。
  • ⚠无 exemplar 指标 — "p99 2s"是数;无 exemplar trace_id 值班无法看哪个请求慢或为什么。
  • ⚠仅错误关联 — 同关联找性能瓶颈(2s 请求中慢 DB 查询);为任何按请求问题用它。

最佳实践

  • ✓在边缘生成 trace_id 并传播到所有日志、trace 和下游调用;OpenTelemetry 自动做此。
  • ✓把日志链到 trace(每日志 trace_id + span_id)且指标链到 trace(exemplar);点指标 → 见 trace、点 trace → 见日志。
  • ✓围绕关联建事件工作流:告警 → exemplar → trace → 失败 span → 错误日志 → 根因,3-4 击。
  • ✓为性能用关联非仅错误;"p99 2s" + exemplar → trace → 慢 DB 查询是任何按请求问题的同流。