2. 可观测性三大支柱:指标、日志、链路的核心概念与数据模型对比

在可观测性工程实践中,指标(Metrics)、日志(Logs)、链路(Traces) 被公认为三大数据支柱。它们各自从不同维度描述系统状态,只有理解其核心概念与数据模型差异,才能有效构建告警降噪与 SLO 监控体系。

2.1 三大支柱核心概念

支柱 核心定义 典型用途 数据形态
指标(Metrics) 可聚合的数值型时间序列数据,描述系统在某一时刻或时段内的状态 CPU 使用率、请求延迟 P99、错误率、QPS 时间戳 + 数值 + 标签(Label)
日志(Logs) 离散的、带时间戳的文本或结构化事件记录 错误堆栈、访问记录、审计日志、业务事件 时间戳 + 消息体 + 元数据(Severity/Module)
链路(Traces) 端到端请求在分布式系统中的完整调用路径与各阶段耗时 慢请求根因定位、服务依赖分析、拓扑发现 TraceID + SpanID + ParentSpanID + 时间戳 + 属性
关键认知:三大支柱并非孤立存在。在告警降噪场景中,指标用于触发告警,链路用于定位根因,日志用于补充上下文。三者联动才能实现“告警 → 定位 → 修复”的闭环。

2.2 数据模型深度对比

三大支柱的数据模型在设计哲学上存在本质差异,直接影响存储、查询与告警策略。

对比维度 指标(Metrics) 日志(Logs) 链路(Traces)
数据模型 时间序列(Time Series) 半结构化/结构化事件 有向无环图(DAG)
存储引擎 TSDB(Prometheus、VictoriaMetrics) 全文检索引擎(Elasticsearch、Loki) Trace 专用存储(Jaeger、Tempo)
查询方式 PromQL / SQL 聚合查询 全文搜索 + 结构化过滤 TraceID 检索 + 服务拓扑遍历
数据量级 低(固定标签基数) 高(每条请求都可能产生日志) 中(采样后可控)
告警适用性 强(天然适合阈值/趋势告警) 弱(适合事件告警,易产生风暴) 中(适合慢调用/错误链路告警)
降噪能力 高(聚合、降采样、标签过滤) 低(需大量规则去重) 中(采样率影响完整性)
实践建议:在告警降噪设计中,优先使用指标作为告警信号源,链路作为根因分析入口,日志作为最终排查证据。避免直接用原始日志触发告警,否则极易产生告警风暴。

2.3 三大支柱联动关系

下图展示了三大支柱在可观测性平台中的典型联动流程:指标触发告警 → 链路定位故障服务 → 日志提供详细错误上下文。

三大支柱联动关系图 三大支柱联动关系图 指标(Metrics) 告警触发源 链路(Traces) 根因定位 日志(Logs) 上下文证据 告警触发 TraceID 关联 Span 定位 日志检索 反馈闭环:日志分析优化告警规则 联动核心 指标提供“发生了什么”,链路提供“在哪里发生”,日志提供“为什么发生” 告警降噪 SLO 监控 自动化运维

2.4 数据模型关键差异详解

2.4.1 指标:时间序列模型

指标数据以 时间戳 + 标签(Label) + 数值 为核心结构。每个时间序列由一组唯一标签标识。例如 Prometheus 中的 http_requests_total{method="GET", status="200"} 就是一个独立的时间序列。

# 指标数据示例(Prometheus 格式)
http_requests_total{method="GET", endpoint="/api/v1/users", status="200"} 1024 1700000000
http_requests_total{method="POST", endpoint="/api/v1/users", status="201"} 256 1700000000

2.4.2 日志:事件模型

日志是离散事件记录,通常包含 时间戳、日志级别、模块名、消息体。现代可观测性平台推荐使用结构化日志(JSON 格式)以提升查询效率。

// 结构化日志示例(JSON 格式)
{
  "timestamp": "2024-11-15T10:30:00.123Z",
  "level": "ERROR",
  "service": "user-service",
  "trace_id": "abc123def456",
  "message": "数据库连接超时",
  "error_stack": "java.sql.SQLTimeoutException: ..."
}

2.4.3 链路:Span 树模型

链路数据由多个 Span 组成,每个 Span 代表一次操作单元。Span 通过 TraceID 关联,通过 ParentSpanID 构建父子关系,形成有向无环图(DAG)。

// Span 数据模型核心字段
{
  "trace_id": "abc123def456",
  "span_id": "span-001",
  "parent_span_id": "span-000",  // 根 Span 的 parent_span_id 为空
  "operation_name": "HTTP GET /api/users",
  "start_time": 1700000000123456,  // 微秒级时间戳
  "duration": 150000,              // 微秒
  "status": {"code": "ERROR", "message": "timeout"},
  "tags": {"http.method": "GET", "http.status_code": "500"}
}
常见误区:不要试图用日志模拟链路。日志缺乏 Span 之间的父子关系和精确的耗时计算能力,无法替代 Trace 在分布式调用链分析中的核心地位。同样,指标无法提供单次请求的完整上下文。

2.5 三大支柱在告警降噪中的角色分配

  • 指标:作为告警的第一道防线。通过聚合(如 P99 延迟、错误率)消除单点噪音,适合设置静态阈值或动态基线告警。
  • 链路:作为告警的第二道防线。当指标告警触发后,通过 Trace 快速定位到故障服务或慢调用,避免逐台服务器排查。
  • 日志:作为告警的最终证据。提供详细的错误堆栈、请求参数、数据库 SQL 等上下文信息,帮助工程师确认根因。