第1章:Prometheus监控实战——从架构到告警的全链路解析
大家好,我是你们的老朋友。今天咱们聊聊Prometheus。说实话,我在云平台摸爬滚打这么多年,监控系统换了一茬又一茬,但Prometheus是我用得最顺手的一个。它不复杂,但很强大。咱们这一章,就把它的核心脉络捋清楚。
本章核心知识点一览:
- Prometheus架构设计与部署
- Exporter配置(Node Exporter / Blackbox Exporter)
- PromQL查询语言入门
- Alertmanager告警管理
1.1 Prometheus架构:为什么它这么流行?
Prometheus的架构,说白了就是「拉模型」。它主动去各个目标上抓取数据,而不是等数据送上门。这个设计理念,我个人非常喜欢。为什么呢?因为被动接收数据,一旦发送方挂了,你根本不知道是数据没产生还是网络断了。但主动抓取,你心里有数——抓不到就是有问题。
它的核心组件其实不多:
- Prometheus Server:负责数据抓取、存储和查询。它是整个系统的大脑。
- Exporter:把各种指标暴露成Prometheus能理解的格式。比如Node Exporter暴露系统指标,Blackbox Exporter做网络探测。
- Alertmanager:处理告警,去重、分组、发送通知。
- Grafana:虽然不是Prometheus官方组件,但几乎是标配。用来做可视化仪表盘。
我记得有一次,一个同事问我:「为什么不用Zabbix?」我说:「Zabbix太重了,配置复杂。Prometheus轻量、灵活,尤其适合云原生环境。」你想想看,在Kubernetes里部署Prometheus,简直不要太爽——自动发现、动态配置,省心多了。
1.2 部署Prometheus:三分钟上手
部署Prometheus其实很简单。我习惯用Docker,一条命令搞定:
docker run -d \
--name prometheus \
-p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
当然,生产环境我建议用二进制部署或者Kubernetes Operator。这里给个简单的配置文件示例:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['192.168.1.100:9100']
小提示: scrape_interval别设太短,5秒以下容易把Prometheus自己搞挂。我一般设15秒,够用了。
1.3 Exporter配置:Node Exporter与Blackbox Exporter
Exporter是Prometheus的「眼睛」。没有它,Prometheus就是个瞎子。咱们重点说两个最常用的。
1.3.1 Node Exporter:系统指标采集
Node Exporter用来采集Linux服务器的CPU、内存、磁盘、网络等指标。部署同样简单:
docker run -d \
--name node-exporter \
-p 9100:9100 \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /:/rootfs:ro \
prom/node-exporter \
--path.procfs=/host/proc \
--path.sysfs=/host/sys \
--path.rootfs=/rootfs
我曾经遇到过一个坑:默认的Node Exporter会暴露大量指标,有些其实用不上。比如node_disk_io_time_seconds_total这种,如果磁盘很多,指标数量会爆炸。我的建议是:用--collector.disable-defaults关闭不需要的采集器,只开启你关心的。
1.3.2 Blackbox Exporter:网络探测
Blackbox Exporter用来做HTTP、HTTPS、TCP、ICMP等探测。比如你想监控一个网站是否可达:
modules:
http_2xx:
prober: http
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
valid_status_codes: [200, 301, 302]
follow_redirects: true
然后在Prometheus配置里加上:
scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://example.com
- https://google.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.1.200:9115
注意: Blackbox Exporter的__address__要改成Blackbox Exporter本身的地址,而不是目标地址。这个很多人第一次配置都会搞错,包括我。
1.4 PromQL查询语言:从入门到写复杂表达式
PromQL是Prometheus的查询语言。说实话,刚开始学的时候我觉得它有点反人类,但用习惯了就发现它很优雅。
几个基础概念:
- 瞬时向量:某个时间点的数据。比如
node_cpu_seconds_total - 区间向量:一段时间内的数据。比如
node_cpu_seconds_total[5m] - 标量:单纯的数字,比如
100
来个实际例子。你想看CPU使用率:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
这个表达式什么意思?说白了就是:先算过去5分钟CPU空闲时间的平均变化率,然后用100减去它,得到的就是CPU使用率。嗯,这里要注意rate()函数只能用在Counter类型指标上,Gauge类型用avg_over_time()。
我常用的几个函数:
| 函数 | 用途 | 示例 |
|---|---|---|
| rate() | 计算Counter的每秒增长率 | rate(http_requests_total[5m]) |
| irate() | 计算瞬时增长率(更敏感) | irate(node_network_receive_bytes_total[1m]) |
| avg_over_time() | 计算一段时间内的平均值 | avg_over_time(node_memory_MemFree_bytes[1h]) |
| topk() | 取前N个值 | topk(3, node_cpu_seconds_total) |
避坑指南: 我曾经在生产环境用irate()做告警,结果因为数据点太少,告警频繁抖动。后来换成rate()加长窗口,问题就解决了。所以,短窗口用irate(),长窗口用rate(),这是经验之谈。
1.5 Alertmanager告警管理:别让告警变成噪音
告警管理是监控的最后一道防线。Alertmanager的核心能力是:去重、分组、抑制、静默。
先看一个告警规则示例:
groups:
- name: node_alerts
rules:
- alert: NodeDown
expr: up{job="node"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} has been down for more than 1 minute"
然后配置Alertmanager:
route:
receiver: 'email'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- match:
severity: critical
receiver: 'pagerduty'
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
from: 'alert@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'alert@example.com'
auth_password: 'password'
这里有几个关键参数:
- group_wait:同一组告警等待多久再发送。我一般设30秒,避免短时间大量告警轰炸。
- group_interval:发送间隔。5分钟比较合理。
- repeat_interval:重复告警间隔。4小时一次,别太频繁,否则运维会疯的。
个人经验: 告警一定要分级。Critical级别的走电话或PagerDuty,Warning级别的发邮件或钉钉。我曾经见过一个团队把所有告警都设成Critical,结果真正出问题时没人当回事——这就是「狼来了」效应。
好了,这一章的内容就到这里。Prometheus的架构、部署、Exporter配置、PromQL查询、Alertmanager告警管理,咱们都过了一遍。这些东西看着多,其实核心就一句话:主动抓取、灵活查询、智能告警。你只要把这三个环节打通,监控体系就稳了。
公众号:蓝海资料掘金营,微信deep3321