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'             # 告警接收人
posted @ 2026-09-02 11:21  Hey,Coder!  阅读(12)  评论(0)    收藏  举报