惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Help Net Security
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
博客园 - Franky
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
量子位
V
Visual Studio Blog
Y
Y Combinator Blog
小众软件
小众软件
N
Netflix TechBlog - Medium
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网

博客园 - Hey,Coder!

微信小程序 web方案实现调音器功能 systemctl slice配置docker最大占用cpu 内存 pipenv环境变量配置 .net8验证码 数据库差异对比工具 ubuntu24 换源 ssh配置 ubuntu24 Harbor部署 ubuntu24 kvm部署 cockpit web管理界面 .net api代理 Ubuntu 24.04 DMAR IOMMU 报错修复 uniapp iOS App 上架 vs文件软链接 Docker 网络别名 .net8通用中间件处理公共返回值结构 .net环境下OpenTelemetry Body 读取注意事项 jaeger界面显示异常 .net opentelemetry collector jaeger c# opentelemetry 自定义export c# opentelemetry 自定义export c# 生成对象的初始化代码 Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard docker consul registrator 服务自动注册consul 微服务动态扩容
docker部署prometheus grafana pgexporter Alertmanager
Hey,Coder! · 2026-09-02 · via 博客园 - Hey,Coder!

目录结构

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'             # 告警接收人