Promethous
概述
Prometheus 是一个开源的系统监控和告警工具套件,由 SoundCloud 开发并捐赠给 CNCF(云原生计算基金会),是 Kubernetes 生态中最常用的监控方案。
核心功能:
- 多维数据模型:基于指标名称和键值对标签的时间序列数据
- PromQL 查询语言:灵活高效的数据查询和聚合能力
- 拉取模式采集:通过 HTTP 主动拉取目标实例的监控数据
- 服务发现支持:支持静态配置、Consul、Kubernetes 等多种发现机制
- 告警管理:通过 Alertmanager 实现告警分组、抑制和路由
典型应用场景:
- Kubernetes 集群监控(配合 kube-state-metrics、node-exporter)
- 微服务应用性能监控
- 基础设施资源监控(CPU、内存、磁盘、网络)
- 自定义业务指标采集
部署准备
1. 系统要求
| 项目 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 1 核 | 2 核+ |
| 内存 | 1 GB | 2 GB+ |
| 硬盘 | 20 GB | 50 GB+ |
| Docker | 18.06+ | 最新版 |
2. 创建 Docker Compose 编排文件
docker-compose.yaml:
version: '3.8'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "9090:9090"
volumes:
- prom_conf:/etc/prometheus
- prom_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-admin-api'
- '--web.enable-lifecycle'
deploy:
resources:
limits:
cpus: "1"
memory: "2G"
alertmanager:
image: prom/alertmanager
container_name: alertmanager
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "9093:9093"
volumes:
- alert_conf:/etc/alertmanager
deploy:
resources:
limits:
cpus: "1"
memory: "1G"
volumes:
prom_data:
prom_conf:
alert_conf:3. 启动参数说明
| 参数 | 说明 |
|---|---|
--config.file |
指定配置文件路径 |
--storage.tsdb.path |
数据存储目录 |
--web.enable-admin-api |
启用 Admin API(支持删除时间序列等操作) |
--web.enable-lifecycle |
启用热更新(支持 /-/reload 接口) |
安全提示:生产环境中建议谨慎开启
--web.enable-admin-api,或配合反向代理增加认证保护。
启动服务
docker compose up -d查看启动日志:
docker logs prometheus -f --tail=50
docker logs alertmanager -f --tail=50验证访问
curl http://127.0.0.1:9090
curl http://127.0.0.1:9093在浏览器中打开:
- Prometheus:
http://<服务器IP>:9090 - Alertmanager:
http://<服务器IP>:9093
配置示例
1. 基础配置(prometheus.yml)
global:
scrape_interval: 15s # 采集间隔
evaluation_interval: 15s # 告警规则计算间隔
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
- "alerts/*.yml"
scrape_configs:
# 自监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控 Node Exporter(主机指标)
- job_name: 'node_exporter'
static_configs:
- targets:
- '192.168.1.10:9100'
- '192.168.1.11:9100'
# 监控容器(cAdvisor)
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']2. 告警规则示例(alerts/node.yml)
groups:
- name: node_alerts
interval: 30s
rules:
- alert: HighCPUUsage
expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU 使用率过高"
description: "实例 {{ $labels.instance }} CPU 使用率超过 80%,当前值:{{ $value }}%"
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "内存使用率过高"
description: "实例 {{ $labels.instance }} 内存使用率超过 85%,当前值:{{ $value }}%"
- alert: DiskUsageHigh
expr: (node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} - node_filesystem_free_bytes{fstype!~"tmpfs|overlay"}) / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "磁盘空间不足"
description: "实例 {{ $labels.instance }} 磁盘使用率超过 85%,当前值:{{ $value }}%"3. Alertmanager 配置(alertmanager.yml)
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'webhook'
receivers:
- name: 'webhook'
webhook_configs:
- url: 'http://your-webhook-url:8080/alert'
send_resolved: true
- name: 'email'
email_configs:
- to: 'admin@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'alert@example.com'
auth_password: 'password'
from: 'alert@example.com'热更新配置
修改配置文件后,无需重启服务,通过 API 热更新:
# 方式一:使用 POST 请求触发重载
curl -X POST http://127.0.0.1:9090/-/reload
# 方式二:向 Prometheus 进程发送 HUP 信号
kill -HUP <prometheus_pid>常用管理命令
| 操作 | 命令 |
|---|---|
| 启动服务 | docker compose up -d |
| 停止服务 | docker compose stop |
| 重启服务 | docker compose restart |
| 查看状态 | docker compose ps |
| 查看 Prometheus 日志 | docker logs prometheus -f --tail=100 |
| 查看 Alertmanager 日志 | docker logs alertmanager -f --tail=100 |
| 进入 Prometheus 容器 | docker exec -it prometheus /bin/sh |
| 热更新配置 | curl -X POST http://127.0.0.1:9090/-/reload |
常见问题
Q:启动后无法访问 Web 界面?
- 确认容器正常运行:
docker ps | grep prometheus- 检查端口是否被占用:
netstat -tlnp | grep 9090- 查看日志排查错误:
docker logs prometheus --tail=50Q:数据采集失败或目标不可达?
- 确认目标实例的监控端点(如
/metrics)是否正常:
curl http://192.168.1.10:9100/metrics- 检查配置文件中的
targets地址是否正确 - 检查防火墙是否放行对应端口
Q:磁盘空间不足如何处理?
# 查看数据占用
du -sh /var/lib/docker/volumes/*prom_data*
# 方式一:调整数据保留时间(启动参数)
--storage.tsdb.retention.time=15d
# 方式二:清理旧数据(通过 Admin API)
curl -X POST -g 'http://127.0.0.1:9090/api/v1/admin/tsdb/delete_series?match[]={__name__=~".+"}'Q:如何备份 Prometheus 数据?
# 停止服务
docker compose down
# 备份数据目录
docker run --rm -v prometheus_prom_data:/data alpine tar czf /tmp/prometheus_data_backup.tar.gz -C /data .
# 重启
docker compose up -dQ:如何添加新的采集目标?
修改 prometheus.yml 中的 scrape_configs,添加新的 job_name 或 targets,然后执行热更新:
curl -X POST http://127.0.0.1:9090/-/reload