3. 指标与日志的关系:Metrics、Logs、Traces 三者的关联,Golden Signals 如何从日志中提取

3.1 可观测性三大支柱:Metrics、Logs、Traces 的关联模型

在 SRE 和可观测性工程中,Metrics(指标)、Logs(日志)、Traces(链路追踪) 并非孤立的数据孤岛,而是构成系统可观测性的三个互补维度。理解它们之间的关联,是构建高效存储策略和提取 Golden Signals 的前提。

维度 核心特征 数据形态 典型用途 存储特点
Metrics 聚合、数值、时间序列 计数器、直方图、仪表盘 告警、趋势分析、容量规划 高基数、低延迟写入、降采样
Logs 离散、文本、结构化/非结构化 单行事件、JSON、多行堆栈 故障根因定位、审计、调试 高吞吐、全文索引、冷热分层
Traces 请求级、有向无环图、Span Trace ID + Span 树 延迟分析、依赖拓扑、瓶颈识别 采样存储、关联索引、短生命周期
关键关联原则:Metrics 回答“发生了什么”,Logs 回答“为什么发生”,Traces 回答“在哪里发生”。三者通过 时间戳、请求 ID、标签(Labels/Tags) 实现关联。
可观测性三大支柱关联模型 Metrics 聚合数值 / 时间序列 Logs 离散事件 / 结构化文本 Traces 请求链路 / Span 树 关联纽带:时间戳 + Trace ID + 标签(Labels) 例如:通过 Trace ID 关联日志行,通过聚合日志生成延迟指标 告警触发 Metrics 驱动 根因定位 Logs + Traces 容量规划 Metrics 趋势

3.2 Golden Signals 与日志的映射关系

Google SRE 定义的 Golden Signals(黄金信号) 包括:延迟(Latency)、流量(Traffic)、错误(Errors)、饱和度(Saturation)。这些信号虽然通常以指标形式呈现,但其原始数据大量来源于日志。

Golden Signal 日志中的原始数据 提取方式 典型指标名称
延迟(Latency) 请求开始/结束时间戳、处理耗时字段 计算时间差,聚合为 p50/p90/p99 http_request_duration_seconds
流量(Traffic) 请求行、URL、方法、字节数 计数 + 按维度分组 http_requests_total
错误(Errors) HTTP 状态码、异常堆栈、错误码 按状态码范围过滤计数 http_requests_errors_total
饱和度(Saturation) 连接池耗尽、队列深度、内存/CPU 使用日志 提取数值字段,按时间序列聚合 queue_depth、connection_pool_usage
实践要点:日志中提取 Golden Signals 的关键在于 结构化日志。非结构化日志需要正则解析,性能开销大且易出错。推荐使用 JSON 格式日志,字段名统一,便于 Logstash/Fluentd/Vector 等采集器直接提取。

3.3 从日志中提取 Golden Signals 的工程流程

将日志转化为 Golden Signals 指标,需要经过采集、解析、聚合、存储四个阶段。以下是一个标准流程:

  1. 日志采集:通过 Filebeat/Fluentd 等 Agent 采集应用日志,确保包含关键字段(时间戳、请求 ID、状态码、耗时)。
  2. 日志解析:使用 Grok 或 JSON 解析器提取结构化字段,丢弃无关信息。
  3. 指标聚合:在流处理引擎(如 Kafka Streams、Flink)或时序数据库写入端,按时间窗口(如 1 分钟)和标签(如 method、path、status)聚合计数、直方图。
  4. 指标存储:将聚合后的指标写入 Prometheus/VictoriaMetrics 等时序数据库,保留原始日志用于回溯。
日志 → Golden Signals 提取流程 日志采集 Filebeat / Fluentd 日志解析 Grok / JSON 解析 指标聚合 窗口计数 / 直方图 指标存储 Prometheus / VM 输出 Golden Signals 延迟 / 流量 / 错误 / 饱和度 原始日志保留 冷存储 / 回溯分析

3.4 实战案例:从 Nginx 访问日志提取 Golden Signals

以最常见的 Nginx 访问日志为例,展示如何从一行日志中提取四个 Golden Signals。

原始日志行(JSON 格式):

{
  "time_local": "2025-03-21T10:15:30+08:00",
  "remote_addr": "10.0.0.1",
  "request": "GET /api/users HTTP/1.1",
  "status": 200,
  "body_bytes_sent": 1234,
  "request_time": 0.045,
  "http_referer": "-",
  "http_user_agent": "curl/7.68.0"
}

提取映射表:

Golden Signal 日志字段 提取逻辑 生成的指标
延迟 request_time 直接取值,按 method+path 聚合直方图 nginx_request_duration_seconds_bucket{method="GET",path="/api/users"}
流量 request、body_bytes_sent 计数请求数,累加字节数 nginx_http_requests_total{method="GET",path="/api/users"}
错误 status 判断 status >= 500 或 status == 4xx 特定场景 nginx_http_requests_errors_total{status="5xx"}
饱和度 需结合 upstream 日志 提取 upstream 响应时间、连接数 nginx_upstream_queue_depth
避坑提示:不要将所有日志字段都转为指标标签(Labels)。高基数标签(如 remote_addr、http_user_agent)会导致时序数据库性能急剧下降。只保留 method、path、status 范围 等有限维度。

3.5 关联存储策略建议

基于 Metrics、Logs、Traces 的关联关系,存储策略应遵循以下原则:

  • 统一时间戳精度:所有数据使用毫秒级时间戳,确保关联时无偏差。
  • 共享标签体系:在日志中注入 service、environment、trace_id 等标签,与 Metrics 和 Traces 的标签一致。
  • 分层存储:高频查询的 Metrics 使用 SSD 存储,低频回溯的原始日志使用 HDD 或对象存储。
  • 采样与聚合结合:Traces 采用头部采样(Head-based Sampling),日志采用尾部采样(Tail-based Sampling)结合聚合指标,平衡成本与可观测性。
总结:Golden Signals 的提取本质上是将日志中的离散事件转化为聚合指标的过程。理解 Metrics、Logs、Traces 的关联关系,并设计合理的提取和存储策略,是构建高效可观测性平台的基础。下一节将深入讨论指标存储的基数问题与优化方案。