主题
Prometheus 监控
Prometheus 是一个开源的监控告警系统与时间序列数据库(TSDB),由 SoundCloud 开发、现由 CNCF 托管,是云原生监控的事实标准。它以「拉取(pull)」模式周期性地从目标(targets)采集指标,用 PromQL 灵活查询,配合 Alertmanager 实现告警。
一句话定位:Prometheus = 时间序列数据库 + 拉取式采集 + PromQL 查询 + 告警。它最适合监控动态的、面向服务的云原生架构。
一、核心概念
1. 数据模型
Prometheus 用「指标名 + 标签」标识一条时间序列,格式为:
<metric_name>{<label_name>=<label_value>, ...}例如:
http_requests_total{method="GET", status="200"}指标名描述「测什么」,标签描述「在哪个维度测」,二者共同定位唯一的时间序列。
2. 指标类型
| 类型 | 含义 | 典型场景 |
|---|---|---|
| Counter | 只增不减的累计值 | 请求总数、错误次数 |
| Gauge | 可增可减的瞬时值 | 内存占用、当前温度 |
| Histogram | 观测值落入各桶(bucket)的分布 | 请求延迟分布 |
| Summary | 客户端计算的分位数 | 延迟 P50/P99 |
3. 架构组件
被监控目标(targets) → Prometheus Server(拉取/存储) → PromQL 查询 / Grafana 可视化
↓ 触发告警规则
Alertmanager → 邮件/钉钉/企业微信等| 组件 | 作用 |
|---|---|
| Prometheus Server | 核心:定时抓取指标、存储时间序列、执行规则 |
| Exporter | 把第三方系统指标暴露为 Prometheus 格式(node_exporter、mysql_exporter 等) |
| Alertmanager | 告警去重、分组、路由到通知渠道 |
| Pushgateway | 供短期任务(Job)主动推送指标 |
| Grafana | 可视化大盘(可选,但常用) |
二、Docker 安装
Docker 是上手 Prometheus 最快的方式,无需关心依赖。以下给出两种方式。
方式一:docker run 单容器
先准备配置文件 prometheus.yml(见下文),再运行:
bash
docker run -d \
--name prometheus \
-p 9090:9090 \
-v "$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml" \
prom/prometheus:latest方式二:docker-compose(推荐)
docker-compose.yml:
yaml
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.path=/prometheus'
restart: unless-stopped
volumes:
prometheus-data:启动:
bash
docker-compose up -d启动后访问 http://localhost:9090,进入 Web UI;在「Status → Targets」可查看采集目标状态,在「Graph」页可执行 PromQL 查询。
三、配置文件 prometheus.yml
最简配置只需声明采集间隔与采集目标:
yaml
global:
scrape_interval: 15s # 采集间隔
evaluation_interval: 15s # 规则评估间隔
scrape_configs:
- job_name: "prometheus" # 抓取 Prometheus 自身
static_configs:
- targets: ["localhost:9090"]关键块说明:
- global:全局默认参数(
scrape_interval、evaluation_interval)。 - scrape_configs:采集目标列表,每个
job_name对应一组 target。 - rule_files:告警规则/记录规则文件路径。
修改配置后热加载(无需重启):
bash
docker exec prometheus kill -HUP 1
# 或在容器内:curl -X POST http://localhost:9090/-/reload四、采集与 Exporter
Prometheus 本身只暴露自身指标,监控主机需部署 node_exporter。在 compose 中追加:
yaml
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
restart: unless-stopped随后在 prometheus.yml 中把它加入采集目标:
yaml
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["node-exporter:9100"]注意:
node-exporter:9100是容器网络内的服务名;在宿主机上用curl localhost:9100/metrics可直接查看暴露的指标。
五、PromQL 基础
常用查询示例:
promql
up # 目标健康状态(1=正常,0=异常)
http_requests_total # 某 Counter 指标全部序列
rate(http_requests_total[5m]) # 近 5 分钟每秒请求速率
node_memory_MemAvailable_bytes # 主机可用内存
# CPU 使用率(非空闲占比)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)要点:
rate(v range-vector):计算区间向量的每秒平均增长率,最常用。by(label):按指定标签聚合。- 时间区间用
[5m]、[1h]表示,须配合rate/avg_over_time等函数使用。
六、HTTP API
Prometheus 的 API 分管理 API、查询 API、TSDB Admin API 三类。
1. 管理 API
| 端点 | 用途 |
|---|---|
POST /-/reload | 热重载配置(需启用 --web.enable-lifecycle) |
GET /api/v1/rules | 查看告警/记录规则 |
GET /api/v1/targets | 查看所有采集目标状态(健康/失败/标签) |
GET /api/v1/status/config | 返回当前生效配置 |
GET /api/v1/status/flags | 查看启动标志 |
2. 查询 API
即时查询(单时间点):
bash
curl 'http://localhost:9090/api/v1/query?query=up{job="prometheus"}'范围查询(一段时间区间):
bash
curl 'http://localhost:9090/api/v1/query_range?query=http_requests_total&start=1609459200000&end=1609545600000&step=1m'参数说明:
query:PromQL 表达式time/start+end:Unix 时间戳(毫秒)step:数据点间隔,如15s、1m
表达式含特殊字符时,用
curl -G --data-urlencode "query=..."避免编码问题。
3. TSDB Admin API
需启用 --web.enable-admin-api 才可用,多为危险操作,谨慎使用:
| 端点 | 用途 |
|---|---|
POST /api/v1/admin/tsdb/snapshot | 创建快照 |
POST /api/v1/admin/tsdb/delete_series | 按条件删除序列 |
POST /api/v1/admin/tsdb/clean_tombstones | 清理墓碑 |
POST /api/v1/admin/tsdb/compact | 强制压缩数据块 |
POST /api/v1/admin/wal/trim | 清理 WAL 日志 |
删除序列示例:
bash
curl -X POST 'http://localhost:9090/api/v1/admin/tsdb/delete_series' \
--data-urlencode 'match[]=up{job="expired"}'七、注意事项
- 拉取式架构:目标必须能被 Prometheus 主动访问到,防火墙需放行采集端口。
- 磁盘规划:TSDB 按时间分块存储,长时间保留会占用大量磁盘,需评估
--storage.tsdb.retention.time保留期。 - 性能:高频查询大量数据会加重 Server 负担,合理设计
step与查询范围。 - 安全:对外暴露时务必加 HTTPS 与认证(反向代理 + basic auth),API 默认无鉴权。