2. 监控体系架构

监控体系不是“装一个采集器 + 配一个告警”就能成立的。它更像一条从被监控对象到运维人员的完整信号链:采集层负责把设备、系统、应用的真实状态变成可传输的数据;传输层负责把这些数据可靠、低延迟地送到后端;存储层负责按时间序列保存并支撑查询;分析层负责把原始数据变成有意义的判断;告警层负责把判断结果以合适的方式送达正确的人。五层各司其职,又必须协同,任何一层职责错位,都会表现为“监控不准、告警不灵、排障不快”。

一、五层职责划分

采集层是监控体系的“感官”。它的核心职责是把被监控对象的状态转换为结构化数据,包括指标(Metrics)、日志(Logs)、链路追踪(Traces)和事件(Events)。采集方式主要有三类:一是 Agent 主动采集,例如在 Linux 主机上部署 node_exporter,暴露 /metrics 接口;二是无 Agent 的远程探测,例如 SNMP 轮询交换机、ICMP 探测、HTTP 探活;三是应用内埋点,例如通过 OpenTelemetry SDK 上报调用链。采集层的关键参数是采集周期和超时时间。例如主机指标 15s 一次、端口探活 30s 一次、日志实时推送,都是常见配置。采集层不负责判断“是否异常”,它只负责“如实上报”。

传输层是监控体系的“神经”。它负责把采集数据从边缘送到中心,常见协议包括 Prometheus 的 remote_write、Kafka 消息队列、Fluentd/Filebeat 日志转发、gRPC/HTTP 上报。传输层要解决三个问题:可靠性(断点续传、本地缓存、重试)、吞吐与延迟(批量、压缩、分区)、安全(TLS、鉴权、网络隔离)。例如在跨机房场景中,采集端先写入本地 Kafka,再由 MirrorMaker 同步到中心集群,可以避免网络抖动导致数据丢失。传输层一旦积压,分析层看到的就是“延迟的数据”,告警就会滞后。

存储层是监控体系的“记忆”。它按数据类型选择不同存储:时序指标通常进入 Prometheus、VictoriaMetrics、InfluxDB;日志进入 Elasticsearch、Loki;链路进入 Jaeger、Tempo。存储层的核心职责是按时间维度高效写入与查询,并通过保留策略(Retention)控制成本。例如原始指标保留 15 天、降采样后的 5 分钟粒度保留 1 年,是常见做法。存储层还要处理标签基数(Cardinality)问题:如果给每个请求都打上唯一 ID 作为标签,时序数量会爆炸,写入和查询都会崩溃。

分析层是监控体系的“大脑”。它把存储层的数据转化为判断,包括阈值判断、同比环比、基线检测、多指标关联、日志聚类、根因分析。分析层的输出不是“数据”,而是“结论”:某服务错误率超过 5%、某主机磁盘 4 小时内将写满、某接口 P99 延迟较昨日同时段上升 3 倍。分析层要明确判断窗口和聚合维度。例如 rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05,表示 5 分钟窗口内 5xx 占比超过 5%。窗口太短会抖动,太长会迟钝。

告警层是监控体系的“手脚”。它负责把分析层的结论转化为可送达、可处理、可闭环的通知。告警层要处理去重、抑制、静默、分组、升级、路由。例如同一台主机 100 个指标同时异常,应聚合成一条“主机异常”告警,而不是发 100 条;维护窗口内应静默;核心交易告警应电话升级,普通告警走 IM 群。告警层还要记录告警产生、认领、处理、恢复的全过程,否则无法复盘。

监控体系五层协同关系 数据自左向右流动,告警自右向左反馈,形成闭环 采集层 感官 · 如实上报 Agent 指标采集 SNMP / ICMP 探测 日志 / Trace 埋点 HTTP 探活 周期:15s / 30s 超时:3s / 5s 不判断异常 传输层 神经 · 可靠送达 remote_write Kafka 消息队列 Filebeat / Fluentd gRPC / HTTP TLS + 鉴权 批量 + 压缩 积压 → 告警滞后 存储层 记忆 · 按时间保存 Prometheus / VM Elasticsearch / Loki Jaeger / Tempo 保留策略 原始 15 天 降采样 1 年 标签基数爆炸 分析层 大脑 · 数据变结论 阈值 / 同比环比 基线 / 异常检测 多指标关联 日志聚类 / 根因 窗口:5m / 1h 聚合:服务 / 实例 窗口不当 → 抖动 告警层 手脚 · 送达与闭环 去重 / 抑制 / 静默 分组 / 路由 升级 / 电话 认领 / 处理 / 恢复 IM / 邮件 / 电话 值班表 / 排班 风暴 → 疲劳 告警反馈:调整采集周期 / 传输策略 / 存储保留 / 分析窗口 / 告警规则

二、协同关系:数据流与反馈闭环

五层之间不是简单的串联,而是“正向数据流 + 反向反馈流”的双向协同。正向流是:采集层产生数据 → 传输层搬运 → 存储层落盘 → 分析层计算 → 告警层通知。反向流是:告警层的结果和运维人员的处置经验,反过来调整采集周期、传输策略、存储保留、分析窗口和告警规则。没有反向流,监控体系就会僵化:采集周期永远 15s,但业务已经变成秒级交易;告警规则永远 5 分钟,但故障已经要求 30 秒内发现。

举一个具体的协同示例。某电商系统在大促期间出现“订单创建接口 P99 延迟升高”。采集层每 15s 采集一次 JVM 指标和 HTTP 指标;传输层通过 Kafka 将数据送到中心;存储层写入 VictoriaMetrics;分析层用 histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{path="/order/create"}[5m])) 计算 P99;告警层在 P99 超过 800ms 持续 2 分钟时触发告警。运维人员收到告警后,发现是数据库连接池耗尽,于是扩容连接池,同时把采集周期从 15s 调整为 5s,把分析窗口从 5m 调整为 2m,以便更快发现同类问题。这就是一次完整的协同闭环。

三、常见职责错位与判断依据

实际运维中,五层职责错位非常常见,识别这些错位是排障的关键。

  • 采集层做了分析层的事:在 Agent 里写复杂判断逻辑,导致采集端 CPU 升高、规则难以统一管理。判断依据:Agent 配置中出现大量 if-else 阈值判断,而不是单纯暴露指标。
  • 传输层做了存储层的事:在 Kafka 中长期保留原始数据,把消息队列当数据库用。判断依据:Kafka 磁盘持续增长,且消费延迟与保留策略无关。
  • 存储层做了分析层的事:在 Prometheus 中配置大量 recording rules 做复杂聚合,导致查询变慢。判断依据:recording rules 数量超过 200 条,且规则计算耗时占 CPU 比例过高。
  • 分析层做了告警层的事:在分析脚本里直接发邮件、发短信,绕过告警层的去重和抑制。判断依据:同一故障收到多条重复通知,且无法统一静默。
  • 告警层做了分析层的事:在告警规则里写复杂 SQL 或长表达式,导致告警评估超时。判断依据:告警规则评估时间超过采集周期,出现漏报。
判断监控体系是否健康的三个快速检查:
  1. 从数据产生到告警送达,端到端延迟是否小于业务可容忍的发现时间?例如核心交易要求 1 分钟内发现,则采集 15s + 传输 5s + 分析 30s + 告警 10s,合计约 60s,刚好达标。
  2. 告警是否可去重、可抑制、可静默?如果同一故障产生超过 5 条通知,说明告警层分组策略缺失。
  3. 存储层标签基数是否可控?如果单指标时序数超过 100 万,查询和写入都会明显变慢。

四、分层设计的一个可参考参数基线

以下参数基线适用于中等规模(约 500 台主机、50 个服务)的监控体系,可作为初始配置参考,实际需根据业务容忍度和资源情况调整。

层级 关键参数 参考值 调整依据
采集层 主机指标采集周期 15s 业务发现时间要求 < 1min
采集层 端口探活周期 30s 避免频繁探测影响业务
传输层 Kafka 分区数 6~12 按峰值写入吞吐估算
传输层 本地缓存上限 2GB / 2h 网络中断时可续传
存储层 原始指标保留 15 天 满足近期排障与对比
存储层 降采样粒度 5 分钟 长期趋势分析
分析层 错误率判断窗口 5 分钟 平衡抖动与灵敏度
分析层 P99 延迟判断窗口 5 分钟 避免单点毛刺误报
告警层 告警聚合分组 按主机 + 服务 减少告警风暴
告警层 核心告警升级时间 5 分钟未认领 确保关键故障有人响应

需要强调的是,这张表不是“标准答案”,而是帮助理解各层参数如何相互制约的示例。例如采集周期从 15s 改为 5s,传输层吞吐会变为原来的 3 倍,存储层写入压力也会同步上升,分析层的窗口如果仍保持 5 分钟,则灵敏度提升有限。因此,任何一层的参数调整,都要评估对上下游的影响,而不是孤立地改一个数字。

五、协同关系的核心结论

采集层要“准”,传输层要“稳”,存储层要“省”,分析层要“灵”,告警层要“准而少”。五层之间通过正向数据流和反向反馈流形成闭环。判断一个监控体系是否成熟,不看它有多少个仪表盘,而看它能否在故障发生时,用最短的路径把正确的信息送到正确的人手里,并且在故障结束后,能把经验沉淀为规则和参数的调整。这才是五层架构真正的协同价值。