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 三大支柱联动关系
下图展示了三大支柱在可观测性平台中的典型联动流程:指标触发告警 → 链路定位故障服务 → 日志提供详细错误上下文。
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 等上下文信息,帮助工程师确认根因。