凌晨3点,某电商公司的运维工程师小张被电话叫醒:"网站打不开了,用户都在投诉。"他睡眼惺忪地打开电脑,看到一堆告警信息,但毫无头绪——服务器CPU正常、内存正常、网络带宽正常,但用户就是访问不了。
15分钟后他发现,是某个第三方支付接口响应超时,导致整个订单服务阻塞。如果监控系统能更早告诉他"支付接口的P99延迟从200ms飙升到了5秒",他就能在用户感知之前解决问题。
这个故事揭示了一个关键问题:监控不是"堆指标",而是"给问题定位的能力"。好的监控系统不仅告诉你"出事了",还要告诉你"哪儿出事了"和"为什么出事"。
在云原生时代,监控已经演变为"可观测性(Observability)"。它由三个核心维度构成:
支柱 | 含义 | 类比 |
|---|---|---|
指标(Metrics) | 数值型数据,随时间变化 | 体温、血压——知道在发烧 |
日志(Logs) | 事件发生的详细记录 | 病历本——知道发生了什么 |
追踪(Traces) | 请求在系统中的完整路径 | CT扫描——知道病灶在哪儿 |
三者缺一不可。只有指标,你知道"系统慢了"但不知道为什么;只有日志,你看到大量错误但找不到根因;只有追踪,你知道路径但不知道整体健康状况。
# 可观测性的核心:结构化数据
# 一个好的监控事件应该包含这三个维度的信息
monitoring_event = {
"timestamp": "2026-08-17T14:32:18Z",
"metric": {
"name": "http_request_duration_ms",
"value": 2350,
"labels": {"endpoint": "/api/order", "method": "POST"}
},
"logs": [
{"level": "error", "message": "Payment gateway timeout"}
],
"trace": {
"trace_id": "abc-123-def",
"span_id": "span-001",
"parent_id": "span-000",
"duration": 2350
}
}这个结构化事件同时记录了三个维度的信息,为后续定位问题提供了完整的上下文。
指标是最基础的可观测性数据。业界遵循Google SRE的四个黄金指标:
这四个维度涵盖了系统健康和用户体验的各个方面。当你不知道需要监控什么时,就从这四个黄金指标开始。
指标类型 | 含义 | 典型用途 |
|---|---|---|
Counter(计数器) | 只增不减 | 请求总数、错误次数 |
Gauge(瞬时值) | 可增可减 | CPU使用率、在线用户数 |
Histogram(直方图) | 分桶统计 | 请求延迟分布、响应大小分布 |
# Prometheus风格的指标定义
from prometheus_client import Counter, Gauge, Histogram
# 计数器:累加请求总数
requests_total = Counter('http_requests_total', 'Total requests')
# 瞬时值:实时CPU使用率
cpu_usage = Gauge('cpu_usage_percent', 'CPU usage percentage')
# 直方图:P50/P95/P99延迟
request_duration = Histogram(
'http_request_duration_seconds',
'Request duration distribution',
buckets=[0.1, 0.5, 1.0, 2.0, 5.0] # 分桶边界
)这段代码定义了三种最常用的指标类型,它们共同构成了系统性能监控的基础。
如果说指标是"体检报告",那日志就是"飞行记录仪"。当系统出现异常时,日志是排查问题的第一手资料。
传统日志是一行行的纯文本,难以解析和查询。结构化日志(JSON格式)则让日志变得可搜索、可分析:
{
"timestamp": "2026-08-17T14:32:18.123Z",
"level": "ERROR",
"service": "order-service",
"trace_id": "abc-123-def",
"message": "Payment gateway timeout",
"context": {
"order_id": "ORD-2026-001",
"payment_method": "credit_card",
"retry_count": 2
}
}这种日志格式让工程师可以快速过滤、聚合和分析,而不需要逐行读文本。
日志虽然重要,但过多的日志会成为性能负担。合理的分级策略:
对于高流量服务,错误日志全量记录,INFO级别的日志采样记录,是控制成本和保留信息之间的平衡策略。
在微服务架构中,一个用户请求可能穿越数十个服务。追踪(Tracing)的目的就是还原这次"旅行"的完整路线。
用户请求 → API网关 → 订单服务 → 支付服务 → 数据库
↑ ↑ ↑ ↑
Span1 Span2 Span3 Span4
\__________|__________|_________/
同一Trace ID每个Span记录了自己的耗时、状态和元数据。当需要分析慢请求时,可以在追踪系统里看到每个环节的具体耗时,快速定位瓶颈。
Prometheus和Grafana是目前开源监控领域的事实标准。它们的分工是:
# PromQL查询示例
# 计算最近5分钟的请求错误率
rate(http_requests_total{status_code=~"5.."}[5m])
/
rate(http_requests_total[5m])
* 100这段PromQL语句计算了错误率——通过查询语言的组合能力,你可以从海量指标中提取出洞察。Grafana则将这些查询结果渲染成图表,让趋势一目了然。
监控的最终目的是在用户感知之前发现问题。告警系统要做到:
告警分级:
告警原则:
好的告警是"定制的",不是"通用的"。与其设置"CPU超过80%就告警",不如设置"CPU持续超过90%且错误率同步上升时告警"。
从系统层面看,监控应该覆盖从基础设施到业务的完整分层:
┌─────────────────────────────┐
│ 业务层:订单量/转化率/营收 │ ← 对业务方有价值
├─────────────────────────────┤
│ 应用层:响应时间/错误率/流量 │ ← 开发团队关注
├─────────────────────────────┤
│ 中间件层:数据库/消息队列/缓存│ ← 运维团队关注
├─────────────────────────────┤
│ 基础设施层:CPU/内存/网络/磁盘│ ← 基础运维关注
└─────────────────────────────┘每一层都需要监控,但不同层级监控的受众和目的不同。 别只盯着最底层的CPU,而忽视了业务指标——CEO关心的是"今天的成交额",而不是"CPU使用率"。
误区一:监控=收集数据 收集数据只是第一步。如果没有好的可视化和告警机制,数据只是数字的堆积。
误区二:日志越多越好 过多无用的日志增加了存储成本,也让真正重要的日志被淹没。记录的日志应该是可理解的、可操作的。
误区三:以为有了监控就万事大吉 监控系统本身也需要监控。比如Prometheus的磁盘满了,没人知道,因为告警系统就依赖Prometheus本身。
误区四:追求完美的监控覆盖率 20%的关键路径覆盖,胜过80%的边缘覆盖。先让核心业务流程可观测,再逐步扩展。
监控系统是软件系统的"神经末梢"。没有监控的系统,就像闭着眼睛开高速——出事之前没有任何预警。但有了监控只是第一步,真正重要的是:
好的监控系统不是为了让你"看到问题",而是为了让你"不用半夜被叫醒"。当告警越来越少、越来越精准,才是监控做好的真正标志。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。