Metrics、Logs、Traces 到底是什么?
当线上服务突然变慢、接口错误率升高,或者用户反馈“网站偶尔打不开”时,只查看 CPU、内存和服务器负载通常是不够的。
一个完整的故障可能涉及 Nginx、应用程序、数据库、缓存以及第三方 API。真正困难的地方并不是发现“系统出了问题”,而是回答三个问题:
哪里出现了异常?发生了什么?问题究竟出在哪一个环节?
这正是可观测性(Observability)需要解决的问题。
Metrics、Logs 和 Traces 是可观测性体系中三个非常重要的组成部分。它们并不是三套互相替代的监控方案,而是从不同角度观察同一个系统。
简单理解:Metrics 负责发现异常,Logs 负责解释发生了什么,Traces 负责还原请求经过的完整路径。
Metrics、Logs、Traces 有什么区别?
Metrics:告诉你系统是否异常
Metrics(指标)是一组随时间变化的数值。
常见指标包括:
- CPU 使用率
- 内存占用
- QPS / 请求数量
- HTTP 5xx 错误率
- P95 / P99 响应时间
- 数据库连接数量
- 缓存命中率
假设一个 API 平时的 P95 响应时间约为 180ms,某天突然出现下面的变化:
HTTP P95:180ms → 1.8s
Error Rate:0.2% → 4.7%
QPS:320 → 335
CPU Usage:42% → 45%
通过 Metrics 可以很快发现:服务确实出现了异常,但是访问量和 CPU 并没有明显增加。
这时候可以初步排除服务器因为流量突然增加而导致性能不足的情况。
但是 Metrics 只能告诉我们“出现异常”,还不能直接告诉我们“为什么出现异常”。这时候就需要 Logs。
Logs:告诉你具体发生了什么
Logs(日志)用于记录系统运行过程中发生的事件。
例如应用日志可能出现:
2026-10-21 10:32:18 ERROR
database connection timeout
request_id=req_20261021_001
user_service=queryUser
elapsed=1582ms
看到这些日志以后,我们获得了新的线索:接口变慢可能与数据库连接超时有关。
日志特别适合调查:
- 程序异常
- 数据库错误
- 登录失败
- API 调用失败
- 权限问题
- Nginx 4xx / 5xx
- 业务逻辑错误
Traces:告诉你请求在哪里变慢
Traces(链路追踪)用于记录一次请求从进入系统到最终完成所经过的完整调用路径。
例如一次请求可能经过:
用户请求
↓
CDN:8ms
↓
Nginx:12ms
↓
API Gateway:35ms
↓
User Service:92ms
↓
MySQL:1620ms ← 异常
整个请求的响应时间约为 1.8 秒。
看到这条调用链以后,问题就非常直观了:真正的性能瓶颈并不是 CDN、Nginx 或 API Gateway,而是 MySQL 查询。
Traces 特别适合分析:
- 微服务调用链
- API 延迟
- 跨服务故障
- 数据库慢查询
- 第三方接口超时
- 分布式系统性能问题
Metrics、Logs、Traces 如何一起定位线上故障?
假设网站监控突然报警:/api/user 接口 P95 latency > 1500ms。
第一步:通过 Metrics 判断异常范围
首先查看 API 响应时间、HTTP 错误率、CPU 使用率、内存使用率、QPS 和数据库指标。假设 API P95 与 Error Rate 明显升高,但 CPU、Memory、QPS 正常,这时候可以初步排除因为访问流量突然暴增导致服务器资源不足。
第二步:通过 Logs 查找具体错误
根据发生异常的时间范围搜索日志,例如发现 database connection timeout、request_id=req_20261021_001、trace_id=7d98a41。现在已经可以判断异常很可能发生在数据库相关环节。
第三步:使用 Traces 确认性能瓶颈
根据日志中的 trace_id=7d98a41 打开对应调用链。如果发现 MySQL Span 占用了整个请求 90% 以上的时间,就可以继续检查慢 SQL、数据库索引、锁等待、数据库连接池、网络延迟或数据库服务器负载。
整个故障排查过程:Metrics → 发现 API 延迟异常 → Logs → 找到数据库超时 → Traces → 定位具体慢查询。
Metrics、Logs、Traces 怎么关联起来?
如果 Metrics、Logs 和 Traces 三套数据完全独立,那么发生故障以后,运维人员仍然需要不断切换平台,并手动根据时间进行比对。
因此实际部署可观测性系统时,应该尽可能建立统一的上下文。常见的关联字段包括 timestamp、service_name、environment、trace_id、span_id、request_id。
例如:timestamp=2026-10-21T10:32:18+08:00,service_name=user-api,environment=production,trace_id=7d98a41,request_id=req_20261021_001。
当监控系统发现异常以后,可以通过相同的 trace_id 或 request_id,从指标找到异常时间,再从日志找到错误,最后从日志继续定位 Trace。
OpenTelemetry 在可观测性体系中有什么作用?
OpenTelemetry(OTel)并不是传统意义上的监控面板,而是一套开放的可观测性标准和工具。
OpenTelemetry 可以帮助应用采集、处理和导出 Metrics、Logs 和 Traces。
一个常见的数据流程:应用程序 → OpenTelemetry SDK → OpenTelemetry Collector → Metrics / Logs / Traces。
Metrics 可以进入 Prometheus 等指标监控系统,Logs 可以进入日志分析平台,Traces 可以发送到兼容 OpenTelemetry 的链路追踪后端。
这样应用程序不需要与某一家监控平台深度绑定,以后即使更换后端监控平台,也不一定需要重新改造整个应用的遥测数据采集逻辑。
Prometheus、日志系统和 Tracing 应该先部署哪个?
并不是所有网站都需要一开始就部署完整的 Metrics、Logs 和 Traces 系统。如果只是普通网站或者规模较小的应用,可以先从基础 Metrics + 应用日志开始。
- 阶段 1:基础服务器监控 + Nginx / 应用日志
- 阶段 2:Prometheus Metrics + 告警
- 阶段 3:结构化日志 + request_id
- 阶段 4:OpenTelemetry + Traces
- 阶段 5:Metrics / Logs / Traces 联动
真正重要的并不是安装了多少监控工具,而是发生故障以后能不能快速回答:什么时候开始异常?哪些用户受到影响?异常发生在哪里?为什么发生?
Metrics 能代替 Logs 吗?
不能。Metrics 非常适合发现趋势和异常,但是通常保存的是经过聚合的数值。例如 HTTP 5xx 错误率达到 5%,这个指标可以告诉我们服务出现了大量错误,但是不能完整解释每一次请求为什么失败。
Logs 和 Traces 有什么区别?
Logs 主要记录系统中发生的事件;Traces 主要记录一次请求在不同服务之间的完整调用路径和耗时。在复杂系统中,两者通常通过 trace_id、span_id 或 request_id 建立关联。
小网站需要部署 Traces 吗?
不一定。如果只有一个 WordPress 网站或者普通单体应用,服务器指标、Nginx 日志以及应用日志通常已经能够解决大多数问题。系统逐渐出现多个 API、微服务、消息队列、多个数据库或第三方服务调用以后,Traces 的价值会越来越明显。
Prometheus 属于 Metrics、Logs 还是 Traces?
Prometheus 的核心用途是采集、存储和查询时间序列 Metrics,因此主要属于 Metrics 体系。
OpenTelemetry 能替代 Prometheus 吗?
两者解决的问题并不完全相同。OpenTelemetry 更侧重遥测数据的标准化采集、处理和传输;Prometheus 则拥有成熟的指标采集、时间序列存储和查询体系,实际项目中两者可以配合使用。
总结
Metrics、Logs 和 Traces 最重要的区别,可以概括成三个问题:
Metrics:哪里出现了异常?
Logs:发生了什么?
Traces:异常发生在哪一段调用链?
三者并不是互相替代,而是互相补充。一个真正成熟的可观测性体系,也不是简单安装三个监控工具,而是让不同数据通过时间、service_name、request_id、trace_id 等上下文关联起来。
这样当线上故障发生以后,就可以从“发现异常 → 找到错误 → 定位调用链 → 找到根本原因”形成完整的排查路径。
对于普通网站,没有必要一开始就建设非常复杂的可观测性平台;先做好基础 Metrics 和 Logs,在系统复杂度增加以后,再逐步引入 OpenTelemetry 和分布式 Traces,通常会更加合理。