Prometheus + Grafana监控系统搭建:告警规则配置与可视化面板实战

Prometheus监控架构与数据模型

Prometheus是CNCF开源的监控系统与时间序列数据库,采用pull模型采集指标数据,通过PromQL查询语言实现灵活的指标聚合和告警。相比Zabbix等传统监控方案,Prometheus在云原生环境中部署更轻量,与Kubernetes集成更紧密。

Prometheus的数据模型基于多维标签的时间序列。每个指标由指标名称和一组键值对标签唯一标识,例如http_requests_total{method=”GET”, status=”200″}。这种维度模型使得按标签聚合查询非常高效。

指标类型分四种:Counter(单调递增计数器)、Gauge(可增可减的瞬时值)、Histogram(分桶累积统计)、Summary(分位数统计)。选择正确的指标类型直接影响查询和告警的准确性。

安装部署与target配置

使用Docker快速部署Prometheus和Grafana:

# docker-compose.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'
      - '--storage.tsdb.retention.size=10GB'

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    ports:
      - "9100:9100"

volumes:
  prometheus_data:
  grafana_data:

prometheus.yml核心配置:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

rule_files:
  - /etc/prometheus/rules/*.yml

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

  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

每个scrape_config定义一个采集任务,job_name区分不同监控目标,labels附加静态标签用于后续查询过滤。scrape_interval设为15秒在精度和负载间取得平衡,高频指标可单独配置更短间隔。

告警规则编写与Alertmanager联动

告警规则通过PromQL表达式定义触发条件,存放在rules文件中:

groups:
  - name: host-alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU使用率过高: {{ $labels.instance }}"
          description: "CPU使用率: {{ $value }}% 超过80%持续5分钟"

      - alert: DiskSpaceLow
        expr: (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 > 85
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "磁盘空间不足: {{ $labels.instance }} {{ $labels.mountpoint }}"
          description: "磁盘使用率: {{ $value }}%"

      - alert: ServiceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "服务不可达: {{ $labels.job }} {{ $labels.instance }}"

关键字段说明:expr是PromQL告警条件表达式;for指定条件持续多久才触发告警,避免瞬时抖动误报;labels中的severity用于路由分级;annotations通过模板变量注入实际指标值,告警消息更直观。

Alertmanager配置告警路由和通知渠道:

route:
  receiver: 'default'
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    - matchers: ['severity="critical"']
      receiver: 'webhook-critical'
      group_wait: 0s

receivers:
  - name: 'default'
    webhook_configs:
      - url: 'http://dingtalk-webhook/alert'
  - name: 'webhook-critical'
    webhook_configs:
      - url: 'http://dingtalk-webhook/critical'

group_by控制相同告警的合并粒度,减少告警风暴。group_wait是首次告警等待时间,group_interval是同组后续告警间隔,repeat_interval控制重复通知频率。critical级别告警设group_wait为0立即发送。

Grafana数据源与Dashboard配置

Grafana添加Prometheus数据源,URL填http://prometheus:9090,配置即可。关键Dashboard面板的PromQL查询示例:

CPU使用率面板

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

内存使用率面板

(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

网络流量面板

rate(node_network_receive_bytes_total{device!~"lo"}[5m]) * 8

rate()函数计算Counter指标的增长速率,参数[5m]表示5分钟窗口。乘以8将字节转为比特,适配带宽监控场景。

Recording Rules优化查询性能

频繁使用的复杂PromQL查询会消耗大量CPU。Recording Rules将查询结果预计算并存储为新指标,Grafana直接查询预计算指标即可:

groups:
  - name: precomputed
    rules:
      - record: job:cpu_usage:5m
        expr: 100 - (avg by(job, instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

      - record: job:mem_usage:ratio
        expr: 1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes

命名规范采用level:metric:timeframe格式,如job:cpu_usage:5m表示按job维度聚合的5分钟CPU使用率。Grafana查询时直接使用job:cpu_usage:5m,无需重复计算。

合理的Recording Rules可降低Prometheus查询延迟50%以上,尤其在大规模集群(100+节点)场景下效果显著。

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

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

相关推荐