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/