Span(追踪)、Metric(指标)和Log(日志)是可观测性的三大支柱,它们在数据特点、处理方式和存储需求上存在显著差异,具体对比如下:
一、数据特点对比
| 维度 | Span(追踪) | Metric(指标) | Log(日志) | 
|---|---|---|---|
| 数据类型 | 结构化的离散事件(树状结构) | 聚合的时间序列数据(数值) | 半结构化或非结构化文本 | 
| 数据量 | 高基数(每个请求生成唯一Span),存储成本高 | 低基数(按指标名和标签聚合),存储成本低 | 高吞吐量(每秒数万条),存储成本高 | 
| 时效性 | 短期分析(故障排查后可丢弃) | 长期趋势分析(需保留历史数据) | 短期高频访问,长期归档 | 
| 核心价值 | 全链路请求路径,定位单点故障 | 系统宏观状态,趋势分析和告警 | 详细上下文,问题根因定位 | 
二、处理方式对比
1. 采集阶段
- 
Span:
- 通过 Agent/SDK 自动埋点(如 Java Agent、OpenTelemetry SDK)。
 - 需记录完整调用链(Trace ID、Span ID、父子关系),对性能有一定影响(通常 <5% 额外开销)。
 
 - 
Metric:
- 通过采样(如每 10 秒采集一次 CPU 使用率)或聚合(如每分钟统计请求数)。
 - 支持预聚合(如计算 p95 响应时间),降低传输和存储压力。
 
 - 
Log:
- 通过日志框架(如 Logback、Log4j)或文件收集器(如 Fluentd、Filebeat)采集。
 - 支持过滤敏感信息(如正则替换密码)和结构化处理(JSON 格式)。
 
 
2. 处理阶段
- 
Span:
- 关联分析:通过 Trace ID 关联同一请求的所有 Span。
 - 聚合计算:统计 Span 耗时分布、错误率等。
 - 问题:高基数导致存储和查询压力大,需定期清理历史数据。
 
 - 
Metric:
- 时间窗口聚合:按分钟/小时计算平均值、最大值、分位数。
 - 降采样:长期数据降低精度(如 1 天数据保留分钟级,1 年数据保留小时级)。
 - 告警触发:基于阈值或机器学习算法检测异常。
 
 - 
Log:
- 解析与结构化:提取关键字段(如时间戳、级别、用户 ID)。
 - 全文索引:支持关键词搜索(如通过错误堆栈快速定位)。
 - 关联分析:通过 Trace ID 关联日志与 Span/Metric。
 
 
3. 分析阶段
- 
Span:
- 调用链可视化:展示请求在服务间的传递路径。
 - 性能瓶颈分析:通过火焰图、耗时分布找出慢节点。
 
 - 
Metric:
- 多维分析:按标签分组(如服务名、环境)对比指标。
 - 趋势预测:基于历史数据预测资源使用趋势。
 
 - 
Log:
- 异常检测:通过关键词匹配(如 
ERROR、Exception)发现问题。 - 模式识别:分析日志序列(如登录失败 → 数据库连接异常)。
 
 - 异常检测:通过关键词匹配(如 
 
三、存储方案对比
1. 存储系统选型
| 类型 | 推荐存储系统 | 关键特性 | 
|---|---|---|
| Span | Elasticsearch、Jaeger、Apache Cassandra | 支持高基数查询、全文搜索、快速写入 | 
| Metric | 时序数据库(InfluxDB、Prometheus) | 高效时间序列存储、聚合查询、降采样 | 
| Log | ELK Stack(Elasticsearch + Logstash + Kibana)、Grafana Loki | 全文索引、高吞吐量写入、可视化展示 | 
2. 存储结构与优化
- 
Span:
- 存储结构:按 Trace ID 聚合,每个 Trace 包含多个 Span。
 - 优化:
 - 冷热分离:近期数据存高性能存储(如 Elasticsearch),历史数据归档到低成本存储(如 S3)。
 - 采样策略:对高频请求采样(如只存储 1% 的请求)。
 
 - 
Metric:
- 存储结构:键值对(指标名 + 标签 → 时间序列)。
 - 优化:
 - 预计算聚合值(如每日平均值),减少实时查询压力。
 - 按时间分区(如每天一个文件),提升查询效率。
 
 - 
Log:
- 存储结构:文档形式(JSON 或文本)。
 - 优化:
 - 压缩存储(如使用 LZ4 压缩)。
 - 按重要性分级存储(核心业务日志保留更久)。
 
 
3. 存储成本与时效
- 
Span:
- 保留时间:通常 7-30 天(取决于业务需求和存储成本)。
 - 成本:高(每条请求生成大量数据)。
 
 - 
Metric:
- 保留时间:短期(如 2 周)明细数据 + 长期(如 1 年)聚合数据。
 - 成本:中(通过降采样控制)。
 
 - 
Log:
- 保留时间:关键日志(如错误日志)保留 30-90 天,普通日志保留 7-14 天。
 - 成本:高(需处理和存储大量文本)。
 
 
四、典型技术栈对比
| 场景 | Span 解决方案 | Metric 解决方案 | Log 解决方案 | 
|---|---|---|---|
| 开源方案 | OpenTelemetry + Jaeger/Elasticsearch | Prometheus + Grafana | ELK Stack(Elasticsearch + Kibana) | 
| 云厂商方案 | AWS X-Ray、Google Cloud Trace | AWS CloudWatch、Azure Monitor | AWS CloudWatch Logs、Google Cloud Logging | 
| 混合方案 | OpenTelemetry + 自定义存储 | Prometheus + Thanos(长期存储) | Fluentd + S3(归档) + Elasticsearch(查询) | 
五、集成与联动
虽然三者存储和处理方式不同,但需通过 Trace ID 实现联动:
- Span → Metric:从 Span 提取指标(如请求耗时),生成性能指标。
 - Span → Log:在 Span 中记录关键日志事件(如数据库查询参数)。
 - Metric → Span:当指标异常时,关联查询对应时间窗口的 Span 链。
 - Log → Span:通过日志中的 Trace ID 快速定位完整调用链。
 
通过这种联动,可构建完整的可观测性体系:从宏观指标发现问题 → 通过调用链定位故障点 → 通过日志获取详细上下文。