docker部署prometheus grafana pgexporter Alertmanager
目录结构
monitor-pg/
├── docker-compose.yml
├── prometheus/
│ ├── prometheus.yml # 采集配置 + 新增 alerting/rule_files/alertmanagers 段落
│ └── rules/
│ └── postgres_alerts.yml # 告警规则
├── alertmanager/
│ └── alertmanager.yml # 告警路由与接收器
└── (Grafana 数据卷自动创建)
docker-compose.yml
注意修改数据库账号密码DATA_SOURCE_NAME
version: '3.8'
services:
postgres-exporter:
image: prometheuscommunity/postgres-exporter:latest
container_name: postgres-exporter
environment:
# 注意修改密码为你已有的 PostgreSQL 信息
DATA_SOURCE_NAME: "postgresql://dev:password@192.168.0.1:5432/nocode_product?sslmode=disable"
restart: unless-stopped
prometheus:
image: prom/prometheus:v3.5.5
container_name: prometheus
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/rules:/etc/prometheus/rules # 新增:告警规则
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
ports:
- "9090:9090"
depends_on:
- alertmanager
restart: unless-stopped
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
volumes:
- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
ports:
- "9093:9093"
restart: unless-stopped
grafana:
image: grafana/grafana:12.0.0
container_name: grafana
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: admin
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:
prometheus.yml
路径存储到./prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s # 规则评估周期
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093'] # 指向 alertmanager 服务
rule_files:
- /etc/prometheus/rules/*.yml # 加载告警规则
scrape_configs:
- job_name: 'postgres'
static_configs:
- targets: ['postgres-exporter:9187']
告警规则
路径为prometheus/rules/postgres_alerts.yml
groups:
- name: postgres_alerts
rules:
# 1. 连接数过高(超过最大连接数 80%)
- alert: PostgresTooManyConnections
expr: sum(pg_stat_activity_count) / pg_settings_max_connections > 0.8
for: 2m
labels:
severity: warning
annotations:
summary: "PostgreSQL 连接数过高 (实例 {{ $labels.instance }})"
description: "当前连接数占比 > 80% (value: {{ $value }})"
# 2. 缓存命中率低(低于 95%)
- alert: PostgresLowCacheHitRatio
expr: pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read) < 0.95
for: 5m
labels:
severity: warning
annotations:
summary: "缓存命中率过低 ({{ $labels.instance }})"
description: "命中率 < 95% (value: {{ $value }})"
# 3. exporter 抓取失败(PG 不可达)
- alert: PostgresExporterDown
expr: up{job="postgres"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Postgres exporter 不可用"
description: "无法从 {{ $labels.instance }} 抓取指标,PG 可能宕机"
# 4. 长事务(超过 5 分钟)
- alert: PostgresLongRunningTransaction
expr: max(pg_stat_activity_max_tx_duration) > 300
for: 1m
labels:
severity: warning
annotations:
summary: "存在长事务 ({{ $labels.instance }})"
description: "最长事务已持续 > 300s (value: {{ $value }})"
Alertmanager
global:
resolve_timeout: 5m
smtp_from: 'alert@example.com'
smtp_smarthost: 'smtp.qq.com:465' # 改为你的 SMTP
smtp_auth_username: 'alert@example.com'
smtp_auth_password: 'your_auth_code'
smtp_require_tls: false
route:
receiver: 'default'
group_by: ['alertname', 'job']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'default'
email_configs:
- to: 'ops@example.com' # 告警接收人
留待后查,同时方便他人
联系我:ivesbao@163.com
联系我:ivesbao@163.com

浙公网安备 33010602011771号