第 10 章 · 可观测性与监控 系统上线后,一切正常吗?出问题时,到底发生了什么?响应变慢,慢在哪一环?这是可观测性要回答的三个问题。本节从"监控"到"可观测性"的认知升级讲起,建立三大支柱与 SLI/SLO/错误预算的量化框架,再进入 Prometheus、Grafana、日志与 APM 的工程实践。 学习目标 区分监控与可观测性,说出三大支柱各自回答的问题 用 SLI/SLO/错误预算量化可靠性,判断发布是否应冻结 描述 Prometheus 拉取模型、四种指标类型与告警链路 说清 Grafana 的定位与局限,理解 ELK 与 APM 的组成 一、从监控到可观测性 监控(Monitoring)
系统上线后,一切正常吗?出问题时,到底发生了什么?响应变慢,慢在哪一环?这是可观测性要回答的三个问题。本节从"监控"到"可观测性"的认知升级讲起,建立三大支柱与 SLI/SLO/错误预算的量化框架,再进入 Prometheus、Grafana、日志与 APM 的工程实践。
监控(Monitoring) 是"你提前知道要问什么问题,然后持续检查答案":预先定义一组指标(CPU、错误率、延迟),盯着仪表盘看它们是否越界。可观测性(Observability) 则允许你提出事先不知道的问题——通过系统对外暴露的信号(指标、日志、链路追踪),在任何异常发生后反向推断出内部状态。
一句话区分:监控回答"它是否坏了",可观测性回答"它为什么坏、坏在哪里"。监控是手段,可观测性是能力。
可观测性的三大支柱各有分工,通常协同使用:
| 支柱 | 数据形态 | 回答的问题 | 典型工具 |
|---|---|---|---|
| 指标 Metrics | 数值序列(时间序列) | 是否正常?趋势如何? | Prometheus、Graphite |
| 日志 Logs | 带时间戳的文本记录 | 具体发生了什么? | ELK、Loki、Splunk |
| 链路追踪 Traces | 跨服务的调用链与耗时 | 慢在哪里?哪一环出错? | Jaeger、Zipkin、SkyWalking |
定位故障的标准打法:先看指标发现异常("错误率上升"),再看日志找到报错细节("数据库连接超时"),最后用链路追踪定位慢调用发生在哪个服务("订单服务 → 库存服务耗时 3 秒")。三大支柱是互补关系,不是互相替代。
要让可靠性可度量、可管理,需要一套量化体系:
错误预算的工程价值在于它把"可靠性"变成了可花的预算:只要预算还有剩余,团队就可以大胆发布新功能;一旦预算耗尽,立即冻结发布,优先修复稳定性。这化解了"开发要快"与"运维要稳"的天然矛盾——用同一个数字说话,而不是靠争吵。
实践中注意:SLA(Service Level Agreement)是对外签署的合同承诺,通常比内部 SLO 更宽松(SLA ≥ SLO 才有缓冲),违反 SLA 要承担赔偿等后果。SLO 是内部的工程目标,SLA 是外部的契约。
Prometheus 是云原生领域的事实标准监控系统,核心设计是拉取模型(Pull):Prometheus 服务器主动、周期性地从目标(应用暴露的 /metrics 端点)抓取指标,而不是应用主动上报。拉取模型的好处:监控端掌控节奏、目标宕机立刻可见(数据消失本身就是告警信号)、无需在应用侧维护推送通道。
四种指标类型是面试与实操的高频考点:
| 类型 | 语义 | 典型场景 | 易错点 |
|---|---|---|---|
| Counter | 只增不减的计数器,重启归零 | 请求总数、错误总数 | 计算速率时用 rate() 而非直接除 |
| Gauge | 可增可减的当前值 | CPU 使用率、内存占用、在线人数 | 直接取值,无需 rate |
| Histogram | 服务端聚合的分布桶 + 累计计数 | 请求延迟分布 | 可计算近似分位数(如 histogram_quantile),有误差 |
| Summary | 客户端计算的分位数 | 延迟分位数 | 分位数在客户端算好,不可跨实例聚合 |
Prometheus 与告警的完整链路:exporter/应用 /metrics → Prometheus 拉取并存储 → 告警规则(Alerting Rules)在 Prometheus 内评估 → 触发时发给 Alertmanager → Alertmanager 去重、分组、抑制、静默后按路由发给接收方(邮件、钉钉、Slack、Webhook 等)。
Alertmanager 的四项核心能力:分组(同类告警合并成一条通知,避免告警风暴)、抑制(上级故障时抑制下级冗余告警)、静默(维护窗口内主动屏蔽某类告警)、路由(按标签把不同告警分发到不同接收方)。
场景题:短任务(批处理、定时 Job)在拉取模型下可能"活不到下一次被抓取",此时用 Pushgateway 让任务结束后主动推送一次指标。它只适合这种生命周期短暂的任务,不适合常规服务。
Grafana 是流行的可视化平台,最关键的认知是:Grafana 不存储数据。它只负责连接数据源(Data Source)、查询并渲染图表。常见数据源包括 Prometheus(指标)、Loki(日志)、Elasticsearch、MySQL、InfluxDB 等。
界面题常问的组件流:数据源 → 查询(PromQL)→ 面板 → 仪表盘。
日志解决"发生了什么"的问题。经典方案是 ELK 栈:Elasticsearch(存储与检索)+ Logstash(采集、解析、转换)+ Kibana(可视化)。云原生场景更轻量的替代是 Loki:只索引日志的标签与元数据,不全文索引日志内容,成本低得多,与 Grafana 无缝集成。采集侧常用 Filebeat、Fluentd、Fluent Bit 等轻量 agent。
APM(Application Performance Monitoring,应用性能监控) 聚焦应用层性能,典型代表是 Datadog、New Relic、SkyWalking。APM 通常采集四类数据:Metrics(性能指标)、Logs(日志)、Events(部署、配置变更等事件)、Traces(链路追踪)。其中 Events 常被忽略但价值很高——"为什么性能突然下降?因为 10 分钟前发了一次新版本"。
以 Datadog 为例的部署形态:每台主机上运行 Datadog Agent,agent 采集宿主机指标与日志,应用通过 SDK 上报自定义指标与链路,所有数据打上 Tags(如 env:prod、service:orders)便于按维度聚合过滤。它本质上是"托管的 Prometheus + Grafana + 日志 + 追踪"全家桶,按主机数与用量计费。
可观测性解决了"看得见",接下来要解决"存得下":数据库的核心概念——SQL 与 NoSQL 如何选型?ACID 与 CAP 到底在讲什么?索引、分片、范式这些高频概念背后的取舍是什么?下一节《数据库核心概念》将建立数据侧的完整认知地图。