00.2、三大支柱 Traces Metrics Logs
三大支柱:Traces、Metrics、Logs
可观察性建立在三大支柱之上:Traces(链路追踪)、Metrics(指标)、Logs(日志)。
第一个支柱是 Traces(链路追踪)。它记录分布式系统中的请求路径,展示请求经过的服务。
第二个支柱是 Metrics(指标)。它量化系统性能和资源使用,反映系统状态。
第三个支柱是 Logs(日志)。它记录详细的事件信息,描述具体发生的事件。
这三个支柱并非孤立存在,它们通过 Trace ID 关联在一起,形成完整的可观察性体系。本节将深入介绍每个支柱的定义、结构、类型和应用场景。
Traces(链路追踪)
定义和核心概念
Traces,也称为分布式请求路径,定义为:一个用户请求在分布式系统中,从进入系统到完成响应,所经过的所有服务、组件和节点的完整执行路径。
理解 Traces 需要掌握三个核心概念:
Trace:Trace 表示一次完整的请求过程,包含该请求在系统中经过的所有操作。例如,用户请求"查询订单",整个流程构成一个 Trace。
Span:Trace 由多个 Span 组成。每个 Span 代表一次具体的操作或处理单元。在查询订单的 Trace 中,可能包含"调用 API Gateway"的 Span、"查询用户服务"的 Span、"查询数据库"的 Span。每个 Span 都是 Trace 的一部分。
Trace ID:Trace ID 是一个唯一标识符,在整个请求生命周期中保持不变。无论请求经过多少个服务,Trace ID 都保持一致。Trace ID 用于关联同一请求的所有 Span。
结构示例
以用户请求"查询订单"为例,Trace ID 为 5b8aa5a2d2c872e8321cf37308d69df2,总耗时为 500 毫秒。
该 Trace 包含以下 Span:
- API Gateway Span,耗时 50 毫秒(请求入口)
- User Service Span,耗时 120 毫秒,包含子 Span:Database Query,耗时 80 毫秒
- Product Service Span,耗时 200 毫秒,包含两个子 Span:Cache Lookup(5 毫秒)和 Database Query(180 毫秒)
- Payment Service Span,耗时 300 毫秒,包含子 Span:External API Call,耗时 250 毫秒
通过 Trace,开发者可以:
- 清楚地看到请求经过的服务
- 了解每个服务的耗时
- 快速识别性能瓶颈(如 Payment Service 耗时最长)
应用场景
Traces 在分布式系统中有广泛的应用场景:
故障排查与调试:通过 Trace ID 快速找到相关 Span,查看状态码、错误信息、耗时等,识别问题的服务、操作和具体原因。
性能优化:分析每个 Span 的耗时,识别慢操作(如数据库查询、外部 API 调用),优化这些慢操作。
服务依赖分析:理解服务间的调用关系,发现服务依赖模式。这对于系统架构设计和优化非常重要。
用户体验优化:追踪端到端的用户体验,从用户点击到系统响应,优化慢请求,提升用户体验。
实际案例:某电商平台在双 11 期间,订单处理失败率从 0.1% 激增至 5%。使用 Traces,仅需 15 分钟即可定位问题:
- 通过失败订单找到 Trace ID
- 查看 Trace 发现 Payment Service 的 Span 显示错误
- 进一步查看发现 External API Call 超时
- 定位到第三方支付接口响应慢的问题
- 快速切换到备用支付通道
这体现了 Traces 的价值:将故障排查时间缩短 60-80%。
Metrics(指标)
定义和核心概念
Metrics(指标)是系统或应用程序在特定时间点的量化测量值,用于描述系统的性能、资源使用和业务状态。
理解 Metrics 需要掌握三个核心概念:
时间序列数据:指标是随时间变化的数据点序列。例如,CPU 使用率每分钟记录一次,形成时间序列,类似股票价格的变化。
指标类型:OpenTelemetry 定义了四种主要的指标类型:Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。每种类型有不同的用途。
标签(Labels):标签用于区分和分组指标。例如,
http_requests_total{path="/api/orders", status="200"}pathstatus指标类型详解
Counter(计数器):Counter 只能递增,不能递减,用于统计累计值,如请求总数、错误总数。Counter 的值随时间单调递增。例如,
http_requests_total{path="/api/orders"}Gauge(仪表盘):Gauge 可以增加或减少,反映当前状态。例如 CPU 使用率、内存使用量,这些值会上下波动。例如,
cpu_usage_percentHistogram(直方图):Histogram 用于统计数据分布,如请求延迟的分布情况。它可以显示有多少请求的延迟在 0-100ms、100-200ms、200-300ms 等区间。例如,
http_request_duration_seconds_bucket{le="0.1"}Summary(摘要):Summary 用于计算分位数,如 P50、P95、P99 延迟。这些分位数对性能分析非常重要。例如,
http_request_duration_seconds{quantile="0.95"}应用场景
Metrics 的应用场景包括:
性能监控:监控 CPU、内存、网络、磁盘使用率,监控 API 响应时间,监控请求吞吐量。这些指标反映系统的健康状态。
业务指标:监控订单量、用户数、收入等业务指标,监控转化率、完成率等业务流程指标。这些指标反映业务的运行状况。
告警触发:当指标超过预设阈值时,系统自动触发告警。例如,CPU 使用率超过 90%,或错误率超过 1%,都可以触发告警。
容量规划:基于历史 Metrics 数据,预测未来资源需求,优化资源配置,避免资源浪费或资源不足。
通过综合多个指标,开发者可以全面了解系统状态。
Logs(日志)
定义和核心概念
Logs(日志)是系统或应用程序在运行过程中记录的详细事件信息,用于记录系统行为、错误和状态变化。
理解 Logs 需要掌握三个核心概念:
结构化日志:结构化日志使用 JSON 等格式记录,便于解析和查询。例如:
{ "timestamp": "2026-01-15T10:30:00Z", "level": "ERROR", "message": "Database connection failed", "trace_id": "abc123", "user_id": "user-456", "service": "order-service" }
该日志包含时间、级别、消息,以及 trace_id、user_id 等关联字段。
日志级别:日志有不同的级别:DEBUG(调试)、INFO(信息)、WARN(警告)、ERROR(错误)、FATAL(致命)。不同级别用于不同场景。
关联字段:日志中包含 Trace ID、Span ID、用户 ID 等关联字段,用于关联 Traces 和 Metrics。开发者可通过 Trace ID 找到相关的所有数据。
日志类型和应用场景
应用日志:应用日志记录业务逻辑的执行情况,如"用户登录"、"订单创建"、"支付成功"。它也记录错误和异常信息,如"数据库连接失败"、"第三方 API 调用超时"。
系统日志:系统日志记录操作系统的事件,如系统资源使用情况、服务启停记录。这对系统运维非常重要。
访问日志:访问日志记录 HTTP 请求、API 调用、用户访问轨迹。这对分析用户行为和系统访问模式很有用。
Logs 的应用场景包括:
错误诊断:当系统出现错误时,查看错误日志快速定位问题。例如,看到"Database connection failed"的日志,开发者知道数据库连接出现问题。
行为分析:分析日志,了解用户行为和系统行为。例如,分析用户访问日志,了解用户的使用习惯。
审计追踪:记录关键操作和变更,用于审计和合规。例如,记录"用户权限变更"、"系统配置修改"。
调试开发:在开发过程中,通过日志定位问题,了解代码的执行流程。
三者的关系和互补性
Traces、Metrics、Logs 并非孤立存在,它们通过 Trace ID 关联在一起,形成完整的可观察性体系。
Metrics 告诉开发者"是什么"。Metrics 提供系统状态的概览、性能趋势、异常检测。当 Metrics 显示错误率上升时,开发者知道有问题,但不知道问题位置。
Traces 告诉开发者"在哪里"。Traces 展示问题发生的位置、服务调用路径、性能瓶颈点。当 Traces 显示某个服务的 Span 有错误时,开发者知道问题在该服务,但不知道原因。
Logs 告诉开发者"为什么"。Logs 提供错误的详细信息、上下文信息、执行过程记录。当 Logs 显示"Database connection timeout"时,开发者了解问题原因。
典型的排查流程:
- Metrics 显示错误率上升(发现问题)
- 通过 Trace ID 查看相关的 Traces,定位到某个服务(定位位置)
- 通过 Trace ID 查看相关的 Logs,找到错误原因(了解原因)
这体现了三者的互补性:Metrics 发现异常,Traces 定位问题,Logs 分析原因。三者结合,才能实现完整的可观察性。
本节小结
在本节中,我们学习了可观察性的三大支柱:
第一个是 Traces(链路追踪)。Traces 记录分布式系统中的请求路径,帮助开发者快速定位问题位置,识别性能瓶颈。
第二个是 Metrics(指标)。Metrics 量化系统性能,监控业务指标,触发告警,提供系统状态的概览。
第三个是 Logs(日志)。Logs 记录详细的事件信息,用于错误诊断和行为分析。
三者的关系是:
- Metrics 发现异常
- Traces 定位问题
- Logs 分析原因
- 三者通过 Trace ID 关联
只有将三者结合使用,才能实现完整的可观察性。
在下一节,我们将深入了解信号关联:为什么需要关联?如何实现关联?Trace ID 是如何工作的?