Prometheus是云原生监控体系的事实标准,采用时序数据库存储指标数据,配合PromQL查询语言实现灵活的数据聚合与告警。Grafana提供可视化仪表板层,与Prometheus无缝集成。本文涵盖Prometheus部署、PromQL语法、Alertmanager告警路由和Grafana仪表板设计的完整方案。
Prometheus架构与指标数据模型
Prometheus通过HTTP Pull模式从被监控目标的/metrics端点抓取指标,支持主动抓取和Pushgateway被动推送两种模式。指标数据模型为时间序列,由指标名称和标签键值对唯一定位,每个时间点存储一个float64值。
Prometheus定义四种指标类型:
- Counter:单调递增计数器,如http_requests_total,只能通过rate()函数计算变化率
- Gauge:可增可减的瞬时值,如memory_usage_bytes、cpu_temperature
- Histogram:分桶统计,如http_request_duration_seconds_bucket,预定义bucket边界
- Summary:客户端计算分位数,如http_request_duration_seconds{quantile=”0.99″}
# prometheus.yml 核心配置
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node-exporter'
static_configs:
- targets: ['10.0.1.10:9100', '10.0.1.11:9100']
- job_name: 'app-metrics'
metrics_path: /metrics
static_configs:
- targets: ['10.0.1.20:8080']
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
PromQL查询语法与聚合运算
PromQL支持即时查询和范围查询。掌握常用函数和聚合操作是编写告警规则的基础。
# CPU使用率(5分钟平均)
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
# 磁盘使用率
(node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100
# HTTP请求QPS(按status分组)
sum by (status) (rate(http_requests_total[1m]))
# P99延迟(从Histogram计算)
histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
# 多维聚合:按service和method分组计算平均延迟
avg by (service, method) (rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m]))
# 使用rate计算变化率(Counter专用)
rate(node_network_receive_bytes_total[5m]) # 每秒接收字节数
# 子查询:1小时内的QPS是否持续超过阈值
max_over_time(rate(http_requests_total[1m])[1h:1m]) > 1000
rate()只适用于Counter类型,计算时自动处理计数器重置。increase()函数计算区间内总增量。irate()取最后两个样本计算瞬时变化率,精度更高但波动大,适合短时图表展示。histogram_quantile()结合分桶数据计算分位数,注意bucket分布要覆盖实际数据范围。
Alertmanager告警规则与通知路由
告警规则在prometheus.yml同级目录的rules文件中定义,Alertmanager负责告警的去重、分组和路由分发。
# alert_rules.yml
groups:
- name: node-alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 10m
labels:
severity: warning
annotations:
summary: "CPU使用率过高 {{ $labels.instance }}"
description: "CPU使用率已达 {{ $value }}%,持续超过10分钟"
- alert: DiskSpaceLow
expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足 {{ $labels.instance }}"
description: "{{ $labels.mountpoint }} 已使用 {{ $value }}%"
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "服务不可达 {{ $labels.instance }}"
description: "{{ $labels.job }} 目标已离线超过1分钟"
# alertmanager.yml 告警路由配置
route:
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'default'
routes:
- match:
severity: critical
receiver: 'critical-webhook'
- match:
severity: warning
receiver: 'warning-webhook'
receivers:
- name: 'default'
webhook_configs:
- url: 'http://10.0.1.100:5000/alert'
- name: 'critical-webhook'
webhook_configs:
- url: 'http://10.0.1.100:5000/critical'
- name: 'warning-webhook'
webhook_configs:
- url: 'http://10.0.1.100:5000/warning'
for参数指定告警持续时长,避免瞬时抖动误报。group_by控制告警聚合维度,同一分组的告警合并为一个通知发送。repeat_interval控制重复告警间隔,避免告警风暴。生产环境建议critical级别接企业微信/钉钉/飞书webhook,warning级别接邮件。
Grafana仪表板设计与变量联动
Grafana仪表板通过变量(Variables)实现多实例切换和动态过滤,避免为每个实例单独建面板。
Grafana变量配置示例:
变量名: instance
类型: Query
数据源: Prometheus
查询: label_values(node_cpu_seconds_total, instance)
刷新: On Dashboard Load
面板PromQL引用变量:
CPU使用率: 100 - (avg by (instance) (rate(node_cpu_seconds_total{instance="$instance", mode="idle"}[5m])) * 100)
内存: (node_memory_MemTotal_bytes{instance="$instance"} - node_memory_MemAvailable_bytes{instance="$instance"}) / node_memory_MemTotal_bytes{instance="$instance"} * 100
仪表板布局建议:顶部放置关键摘要面板(单值面板显示总实例数、异常实例数),中间放置时间序列折线图(CPU、内存、磁盘、网络),底部放置表格面板(各实例资源排行)。阈值线(Threshold)设置参考值,CPU 80%黄色、90%红色,磁盘85%黄色、90%红色,异常区间自动变色提示。
告警面板可添加Alert List插件面板,实时显示当前活跃告警。配合Grafana Alerting功能,可以直接在Grafana中定义告警规则,无需维护单独的prometheus rules文件,适合小型团队使用。Prometheus + Alertmanager + Grafana三件套覆盖了从数据采集、规则计算到可视化展示的全链路,是SRE运维监控的标准组合。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-jian-kong-gao-jing-shi-zhan-promql-cha-xun-yu-fa/