Skip to content

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_intervalevaluation_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查询 APITSDB 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:数据点间隔,如 15s1m

表达式含特殊字符时,用 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"}'

七、注意事项

  1. 拉取式架构:目标必须能被 Prometheus 主动访问到,防火墙需放行采集端口。
  2. 磁盘规划:TSDB 按时间分块存储,长时间保留会占用大量磁盘,需评估 --storage.tsdb.retention.time 保留期。
  3. 性能:高频查询大量数据会加重 Server 负担,合理设计 step 与查询范围。
  4. 安全:对外暴露时务必加 HTTPS 与认证(反向代理 + basic auth),API 默认无鉴权。

参考资料