Linux 运维

不需要一整套告警体系,只要能在服务出问题前收到一条消息就够了。这是一份刻意保持精简的监控方案。

要监控什么

只盯四个指标,覆盖 95% 的实际故障:

指标含义危险线
up目标是否可达等于 0
磁盘使用率写满就全线崩溃85%
内存可用影响 OOM低于 10%
站点响应时间用户体验超过 3 秒

部署

services:
  prometheus:
    image: prom/prometheus:latest
    restart: unless-stopped
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./data:/prometheus
    ports:
      - "127.0.0.1:9090:9090"

  node-exporter:
    image: prom/node-exporter:latest
    restart: unless-stopped
    pid: host
    volumes:
      - /:/host:ro,rslave
    command:
      - --path.rootfs=/host
    ports:
      - "127.0.0.1:9100:9100"

prometheus.yml

global:
  scrape_interval: 30s

rule_files:
  - /etc/prometheus/alerts.yml

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

scrape_configs:
  - job_name: node
    static_configs:
      - targets: ['node-exporter:9100']

告警规则

groups:
  - name: basic
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels: { severity: critical }
        annotations:
          summary: "{{ $labels.instance }} 已失联 2 分钟"

      - alert: DiskAlmostFull
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) > 0.85
        for: 10m
        labels: { severity: warning }
        annotations:
          summary: "根分区使用率超过 85%"

for: 2m 是必要的:它避免网络抖动导致的抖动式误报,只有持续满足条件才真正告警。

通知渠道

Alertmanager 支持邮件、钉钉、企业微信、Telegram 等。以邮件为例,配置里最关键的是 group_waitrepeat_interval——前者避免同一故障在几秒内连发多条,后者决定未恢复时的重复提醒频率。

建议设成 repeat_interval: 4h,否则半夜会被同一条告警反复吵醒。

小结

Prometheus 本身不复杂,容易被做复杂的是告警规则。先用四条规则跑一个月,根据实际误报再去调阈值,比一开始就写几十条规则要有效得多。

参与讨论