第2章 监控系统与告警源:三大主流系统与数据采集原理
聊告警响应流程,绕不开数据从哪里来。你想想看,告警的本质是对监控数据的判断。如果底层的监控系统都搭错了,后面的流程再漂亮也是白搭。我个人习惯,先把数据采集这层搞清楚,再往下走流程设计。
这一章我们聚焦三个主流玩家:Prometheus、Zabbix、Datadog。它们代表了不同的架构思路和运维哲学。
2.1 数据采集的两种哲学:Pull 与 Push
先说个基本概念。监控系统怎么拿到业务数据?主要有两种思路。
- Pull 模式(拉取):监控中心主动去各个目标机器上抓数据。典型代表是 Prometheus。
- Push 模式(推送):目标机器上的 Agent 主动把数据发到监控中心。典型代表是 Datadog。
- 混合模式:既支持拉取也支持推送,适应不同场景。Zabbix 就是典型的代表。
我的经验之谈:我建议中小团队优先用 Pull 模式,架构简单,不担心 Agent 把中心撑爆。但如果你有大量动态容器、短生命周期任务,Push 模式更省心——你总不能等着 Pod 销毁了再去抓数据吧?
2.2 Prometheus:拉取模式的神
Prometheus 现在基本是云原生监控的事实标准。它的理念很纯粹:你暴露 Metrics 端点,我来拉。数据模型是 多维时序,每一条数据由指标名 + 标签唯一标识。
采集原理:服务发现 + 主动抓取
Prometheus Server 定期从配置好的 targets 中抓取 Metrics 数据。这个 targets 列表可以静态配置,也可以通过服务发现动态获取——Kubernetes 的 Pod、Service 都能自动发现。
# prometheus.yml 采集配置片段
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- job_name: 'api-service'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
regex: api
action: keep
嗯,这里有个关键点。Prometheus 的抓取间隔决定了数据粒度。默认 15s,你可以调成 5s,但要注意存储压力和网络开销。我在项目中遇到过,有人对所有服务都用 5s 抓取,结果存储直接被打爆。
避坑指南:我之前见过一个团队,把所有 HTTP 接口的 Metrics 全暴露给 Prometheus,结果一个 `/metrics` 端点返回几 MB 数据,每次抓取都要 3 秒,直接拖垮了业务接口。记住:不是所有数据都值得采集。核心指标 5s 粒度,普通指标 30s 或 60s 完全够用。
告警规则:基于 PromQL 的表达式
告警写在 YAML 文件里,通过 PromQL 查询语句定义阈值条件。举个例子:
groups:
- name: node-alert
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 2m
labels:
severity: warning
annotations:
summary: "Instance {{ $labels.instance }} CPU 使用率超过 80%"
这里的 `for: 2m` 是 Prometheus 特有的 Pending 状态机制——持续超过阈值 2 分钟才真正发出告警,避免抖动误报。我个人觉得这个设计非常优雅。
2.3 Zabbix:老牌选手的全面监控
Zabbix 是传统 IT 监控领域的老大哥,尤其在服务器、网络设备、数据库监控方面极其成熟。它的数据传输更灵活。
| 采集方式 | 说明 | 典型场景 |
|---|---|---|
| Zabbix Agent | 安装在目标机器上,被动或主动采集 CPU、内存、磁盘等 | 服务器基础监控(大部分场景) |
| SNMP Trap | 通过 SNMP 协议从网络设备获取数据 | 交换机、路由器、防火墙 |
| IPMI | 通过 BMC 接口获取硬件状态 | 服务器硬件:风扇、温度、电源 |
| JMX | 通过 Java 管理扩展获取 JVM 指标 | Java 应用监控(Tomcat、Spring Boot) |
| 自定义脚本 | Zabbix 可以执行外部脚本获取数据 | 定制场景,比如检查证书到期、业务日志 |
数据模型:Items + Triggers
Zabbix 里每个监控项叫 Item,每个 Item 定义一个 Key。比如 `system.cpu.load[all,avg1]`。触发告警靠 Trigger,表达式基于 Item 的历史值。
// Zabbix 触发器表达式举例
// 当 CPU 负载在最后 5 分钟平均值大于 5 时触发
{Server:system.cpu.load[all,avg1].avg(5m)} > 5
说个实际场景:我之前部署大型机房时,用 Zabbix 批量监控 2000+ 台服务器。它内置的自动发现规则太好了——发现新网卡自动创建 Item,不用手动加配置。但 Zabbix 的强项是传统环境,容器和 Kubernetes 的支持就比较弱了。
2.4 Datadog:SaaS 监控的全栈体验
Datadog 是商业 SaaS 监控的标杆。不用自己搭服务器,部署 Agent 就能用。它把 Metrics、Traces、Logs 三合一,非常方便。
Agent 架构:推模式 + 集成平台
Datadog Agent 安装在你的主机或容器里,默认每 15s 采集一次系统指标,通过 HTTPS 推送到 Datadog 云端。最厉害的是它的 集成平台——官方提供 700+ 种服务的开箱即用仪表盘和告警规则。比如你部署了 Nginx,装好 Agent 后就自动监控了连接数、请求速率。
# datadog.yaml 基本配置
: YOUR_
site: datadoghq.com
tags:
- env:production
- team:infra
# conf.d/nginx.d/conf.yaml
init_config:
instances:
- nginx_status_url: http://localhost/nginx_status
告警:Monitor 的灵活性
Datadog 的告警叫 Monitor,图形化配置界面很友好。你还可以用公式组合多个指标、设置异常检测算法自动识别异常。
| 特性 | Prometheus | Zabbix | Datadog |
|---|---|---|---|
| 部署方式 | 自托管 | 自托管 | SaaS(云端) |
| 采集模式 | Pull | Push / Pull | Push |
| 数据模型 | 多维时序(Label) | Item + Key | Metrics + Tags |
| 告警引擎 | PromQL + Alertmanager | Trigger 表达式 | Monitor + 异常检测 |
| 学习成本 | 中等(需要学 PromQL) | 中等(需要理解 Item 体系) | 低(图形化配置) |
| 容器支持 | 原生极好 | 一般 | 极好 |
注意成本:Datadog 收费按 Host 和 Data Volume 计算。我见过有团队没做数据降采样,一个月指标费用顶上半个运维团队工资。如果你在用 Datadog,一定要配置 Metrics 过滤和降级采样。
2.5 告警数据采集的整体逻辑
不管用哪个系统,底层原理是一样的。我画个流程图帮你理解:
- 数据产生:应用或系统产生 Metrics、Logs、Events。
- 数据采集:通过 Agent 或直接暴露端点,让监控系统拿到数据。
- 数据存储:时序数据库(TSDB)、日志系统。
- 告警评估:监控引擎周期性查询数据,比对告警规则。
- 告警通知:触发规则后发出通知(邮件、钉钉、Slack)。
这三者选哪个?我的建议很直接:
- 团队以 Kubernetes 为主 → Prometheus 是唯一认真考虑的选项。社区支持、Operator 都成熟。
- 传统正版服务器+网络设备 → Zabbix 稳如老狗,模板丰富,批量管理方便。
- 团队小、不想自己运维监控系统 → Datadog 省心省力,但控制好预算。
快速避坑:不管你选哪个系统,第一件事不是配置告警规则,而是先把 基础数据完整性 搞定。我经历过一次事故:服务器负载飙升到 90,但采集间隔是 5 分钟,导致告警延迟了 10 分钟才发现。数据采集频率建议:核心指标 ≤30s,普通指标 ≤60s。