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) 实现关联。
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 指标,需要经过采集、解析、聚合、存储四个阶段。以下是一个标准流程:
- 日志采集:通过 Filebeat/Fluentd 等 Agent 采集应用日志,确保包含关键字段(时间戳、请求 ID、状态码、耗时)。
- 日志解析:使用 Grok 或 JSON 解析器提取结构化字段,丢弃无关信息。
- 指标聚合:在流处理引擎(如 Kafka Streams、Flink)或时序数据库写入端,按时间窗口(如 1 分钟)和标签(如 method、path、status)聚合计数、直方图。
- 指标存储:将聚合后的指标写入 Prometheus/VictoriaMetrics 等时序数据库,保留原始日志用于回溯。
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 的关联关系,并设计合理的提取和存储策略,是构建高效可观测性平台的基础。下一节将深入讨论指标存储的基数问题与优化方案。