Prometheus + Grafana 监控告警体系搭建实战:从指标采集到智能告警

监控告警体系对 SRE 稳定性工程的价值

SRE 的核心工作之一是缩短故障发现到响应的时间窗口(MTTD)。没有监控的生产环境,等于蒙眼开车。Prometheus 作为时序数据采集和存储引擎,Grafana 作为可视化与告警前端,二者的组合是目前主流的监控方案。这套体系不只是看图表,关键是定义好指标、阈值和告警规则,让系统在出问题之前发出预警。

架构设计:组件与数据流

完整的 Prometheus + Grafana 监控体系包含四个组件:

Prometheus Server:核心采集和存储引擎,通过 HTTP 拉取目标暴露的 metrics 端点,数据存储在本地 TSDB。

Exporter:暴露 metrics 端点的采集代理。node_exporter 采集主机指标,mysqld_exporter 采集 MySQL 指标,blackbox_exporter 采集网络探测指标。应用自身也可以通过 Prometheus SDK 直接暴露 metrics。

Alertmanager:接收 Prometheus 触发的告警,负责去重、分组、路由、静默和通知。支持邮件、企业微信、钉钉、Slack 等通知渠道。

Grafana:数据可视化面板,通过 PromQL 查询 Prometheus 数据源,支持告警规则配置和通知。

Prometheus 部署与配置实战

生产环境推荐 Docker 部署:

docker run -d --name=prometheus \
  -p 9090:9090 \
  -v /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /data/prometheus/data:/prometheus \
  prom/prometheus:latest

核心配置文件 prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

rule_files:
  - 'rules/*.yml'

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets:
          - 'web-01:9100'
          - 'web-02:9100'
          - 'db-01:9100'
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance

  - job_name: 'mysql'
    static_configs:
      - targets: ['db-01:9104']

  - job_name: 'blackbox-http'
    metrics_path: probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://api.example.com/health
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115

scrape_interval 设 15 秒,粒度够细又不给系统造成太大负担。HTTP 探测通过 blackbox_exporter 间接采集,relabel 配置让 target 地址正确传递。

告警规则设计与分级

告警规则放在 rules/ 目录下,按严重级别分层:

# rules/infrastructure.yml
groups:
  - name: infrastructure
    rules:
      # P0 - 紧急:服务宕机
      - alert: NodeDown
        expr: up{job="node"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "节点 {{ $labels.instance }} 不可达"
          description: "已持续 1 分钟无法采集到 {{ $labels.instance }} 的指标"

      # P1 - 严重:磁盘即将满
      - alert: DiskSpaceWarning
        expr: |
          (node_filesystem_avail_bytes{fstype=~"ext4|xfs"}
          / node_filesystem_size_bytes{fstype=~"ext4|xfs"}) < 0.15
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }} 磁盘 {{ $labels.mountpoint }} 剩余空间不足 15%"

      # P2 - 提醒:CPU 使用率偏高
      - alert: HighCPU
        expr: |
          100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 10m
        labels:
          severity: info
        annotations:
          summary: "{{ $labels.instance }} CPU 使用率超过 80% 持续 10 分钟"

for 字段是关键:设置了持续时间窗口,避免瞬时抖动触发告警。P0 告警的 for 设 1 分钟,P2 设 10 分钟,区分紧急和缓急。

Alertmanager 告警路由与通知策略

Alertmanager 配置核心是路由树和静默规则:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
    - match:
        severity: critical
      receiver: 'oncall-pager'
      repeat_interval: 15m
    - match:
        severity: warning
      receiver: 'team-chat'

receivers:
  - name: 'default'
    email_configs:
      - to: 'sre@company.com'
        from: 'alertmanager@company.com'
        smarthost: 'smtp.company.com:587'
  - name: 'oncall-pager'
    webhook_configs:
      - url: 'http://pagerduty-webhook/notify'
  - name: 'team-chat'
    webhook_configs:
      - url: 'http://dingtalk-webhook/notify'

group_by 控制告警合并维度——同一类告警聚在一起发一条通知。group_wait 是首次等待时间,group_interval 是同组新告警的间隔。repeat_interval 控制未恢复告警的重复通知频率,P0 级别 15 分钟提醒一次,P2 级别 4 小时提醒一次。

Grafana 仪表盘搭建

Grafana 添加 Prometheus 数据源后,关键仪表盘的指标配置:

节点总览面板

# CPU 使用率
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

# 磁盘 I/O 利用率
rate(node_disk_io_time_seconds_total[5m])

# 网络带宽
rate(node_network_receive_bytes_total{device=~"eth0|ens.*"}[5m])

服务健康面板

# HTTP 探测成功率
probe_success{job="blackbox-http"}

# 请求延迟 P99
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# 请求错误率
sum(rate(http_requests_total{code=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))

Grafana 支持变量模板,用 $instance 变量做面板过滤,一套模板适配多台服务器。

混沌工程验证监控覆盖度

搭建完监控体系,必须验证告警是否真的能触发。用混沌工程手段主动注入故障:

# 模拟 CPU 满载
stress-ng --cpu 4 --timeout 600s

# 模拟磁盘写满
dd if=/dev/zero of=/tmp/fillfile bs=1M count=50000

# 模拟网络延迟
tc qdisc add dev eth0 root netem delay 500ms 100ms

注入故障后观察:告警是否在预期时间内触发?通知是否到达正确渠道?值班人员能否根据告警信息快速定位问题?这套验证流程建议每月执行一次,确保监控规则始终有效。

监控告警体系的目标不是面板数量,而是故障发生时能在 MTTD 内准确定位。Prometheus + Grafana 的组合提供了灵活的指标采集和告警定义能力,关键在于告警规则要和业务 SLI 挂钩,覆盖度要通过混沌工程持续验证。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheusgrafana-jian-kong-gao-jing-ti-xi-da-jian-shi-zhan/

(0)
小编小编
上一篇 4小时前
下一篇 4小时前

相关推荐