监控系统基础:采集、存储、展示、告警四个核心环节

做了这么多年监控系统,我越来越觉得,搞懂这四个环节比什么都重要。哪四个?采集、存储、展示、告警。说白了,就是把数据拿过来、存起来、画出来、再决定要不要喊人。你想想看,任何一个监控系统,都逃不出这个框架。这四个环节不是孤立的,它们环环相扣,缺一个整个系统就转不起来。

01 采集——一切数据的起点

采集是源头。没有数据,后面存储、展示、告警全是空谈。我个人习惯把采集拆成两个问题:采什么和怎么采。

采什么?三类数据是主流:

  • 指标(Metrics):CPU、内存、请求延迟、QPS……这些是数值型的时间序列数据,最核心。
  • 日志(Logs):应用打出来的文本记录,结构化或非结构化都常见。
  • 链路追踪(Traces):一个请求从入口到所有依赖服务的完整调用链。

怎么采?业界主要有两种模式——推和拉。我在项目中见过不少团队在这上面踩坑。两种模式各有优劣,直接看对比:

对比维度 推模式 (Push) 拉模式 (Pull)
数据流向 Agent 主动发送 → 接收端 Server 主动抓取 ← 目标端
代表工具 Telegraf、StatsD、Pushgateway Prometheus Server
适用场景 短生命周期任务、批处理、边缘节点 长期运行的微服务、基础设施
核心优势 动态环境灵活,目标无需暴露端口 采集节奏可控,便于服务发现
主要劣势 接收端压力不可控,存在丢数据风险 需要服务注册与发现机制

采集策略上,不是所有数据都要全量采。对于高基数指标,我建议做采样或聚合。比如请求延迟,可以采 P50、P95、P99,而不是把每个请求的延迟都存下来。

我的建议:核心服务用拉模式,稳定可控;边缘节点或短期任务用推模式,灵活部署。别混用,否则排查数据丢失时你会疯掉。

02 存储——数据的持久化基石

数据采回来,得有个地方存。监控数据的特点是写多读少、时间范围查询、数据量大。传统关系型数据库扛不住这种负载,所以有了时序数据库(TSDB)。

我在项目中用过 Prometheus、InfluxDB 和 VictoriaMetrics。选型时重点看三点:写入吞吐量、压缩比、查询性能。

数据模型是所有 TSDB 的核心。拿 Prometheus 举例:

metric_name{label1="value1", label2="value2"} value timestamp

一条数据由 指标名 + 标签 + 值 + 时间戳 组成。标签用来做维度过滤和聚合,这也是时序数据灵活性的来源。

存储策略上,我最常关注两个参数:

  • 保留期(Retention):原始数据存多久?7 天、30 天还是 90 天?
  • 下采样(Downsampling):老数据按小时或天聚合,降低存储成本。
踩坑提醒:我曾经因为没给时序数据设保留期,磁盘在凌晨三点直接爆了。嗯,血泪教训。无论用哪个 TSDB,务必先配好数据保留策略。

03 展示——数据的外在表达

数据存好了,得让人看懂。展示这层的核心工具是仪表盘(Dashboard),Grafana 是目前的事实标准。

我个人习惯在仪表盘上只放 5-7 个关键图表,一屏能看完最好。展示不是堆图表,而是讲清楚系统的健康状况。

常见的图表类型:

  • 折线图:展示趋势,比如 CPU 使用率的变化。
  • 柱状图:做对比,比如各节点的内存占用。
  • 热力图:看分布,比如请求延迟的散点分布。
  • 仪表盘/数字:展示关键状态,比如当前 QPS、错误率。

查询语言是展示层的灵魂。用 PromQL 举个例子:

# 过去5分钟CPU平均使用率超过80%的节点
avg by(instance) (rate(cpu_usage_total[5m])) > 0.8

一条好的 PromQL 能把复杂的聚合逻辑表达清楚,比写一堆代码省事多了。

一个小技巧:在 Grafana 里用变量(Variables)做动态过滤,比如按环境、按集群切换。这样一张仪表盘就能覆盖不同场景,不用重复建。

04 告警——监控的价值出口

监控的最终价值不是看数据,而是触发行动。告警就是那个“喊人”的机制。

告警规则定义“什么情况需要喊人”。比如 Prometheus 的规则配置:

groups:
- name: system-alerts
  rules:
  - alert: HighCPUUsage
    expr: cpu_usage_percent > 90
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "节点 {{ $labels.instance }} CPU 使用率超过 90%"

这个规则说:CPU 使用率超过 90% 且持续 5 分钟,就触发告警。这里的 for 字段很关键——避免瞬时抖动导致误报。

告警分级我通常分四级:

  • P0(致命):核心服务不可用,立即响应。
  • P1(严重):功能受损,需要快速处理。
  • P2(一般):异常但影响有限,工作时间内处理。
  • P3(提醒):只是通知,不强制响应。

但光有分级还不够,告警多了就是噪音。关键在告警收敛:

  • 抑制(Inhibition):上游挂了,下游的告警自动闭嘴。
  • 聚合(Grouping):同类告警合并成一条,避免轰炸。
  • 静默(Silence):已知问题或维护期间暂时屏蔽。
我曾经吃过告警风暴的亏:有一次网络抖动,几百个告警同时涌进来,值班手机直接被打爆。后来我强制团队给每个告警规则配上收敛策略,再也没出过这种问题。

05 四环节的闭环关系

采集、存储、展示、告警不是串行完事,而是一个闭环。告警推动你调整采集策略,展示帮你验证存储是否可靠,存储反过来影响采集的频率和粒度。任何一个环节出问题,整个系统都会跟着抖。

下面这张图把四个环节的关系画清楚了:

监控系统四大核心环节闭环架构 采集 指标 · 日志 · 链路 存储 时序数据库 展示 仪表盘 · 可视化 告警 规则 · 通知 · 收敛 四环节形成闭环:采集是基础,存储是核心, 展示是窗口,告警是出口。告警驱动持续优化。

你看,告警发现问题后,你会回来调整采集的粒度或新增指标;展示时发现数据不准,你会回头检查存储和采集链路。这个闭环转得越快,系统的可观测性就越成熟。

核心要点:

  • 采集、存储、展示、告警是监控系统的四大基石。
  • 采集选推还是拉,取决于场景;核心服务用拉,边缘任务用推。
  • 存储优先选时序数据库,务必配好保留期。
  • 展示不是堆图表,关键指标一张屏内看清。
  • 告警要分级 + 收敛,别让告警变成噪音。
  • 四环节形成闭环,持续迭代才能用好。