postgres_exporter & Grafana
O postgres_exporter coleta métricas do PostgreSQL para o Prometheus; dashboards do Grafana visualizam conexões, replicação, proxies de bloat e checkpoints. Padronize um conjunto de dashboards por ambiente e alerte sobre limites associados a problemas do usuário, não a contadores de vaidade.
Receita
# docker-compose excerpt
services:
postgres_exporter:
image: quay.io/prometheuscommunity/postgres-exporter:v0.16.0
environment:
DATA_SOURCE_NAME: "postgresql://monitor:secret@db:5432/postgres?sslmode=require"
ports:
- "9187:9187"# prometheus.yml scrape
scrape_configs:
- job_name: postgresql
static_configs:
- targets: ['postgres_exporter:9187']Quando usar isso:
- Kubernetes ou frota de VMs precisando de métricas unificadas
- Substituindo scripts de saúde SQL ad-hoc por coleta contínua
- Integração com Alertmanager para paginação de plantão
Exemplo de Trabalho
Implante o exporter com consultas personalizadas e alertas do Grafana.
-- Dedicated monitoring role (least privilege)
CREATE ROLE monitor LOGIN PASSWORD 'rotate-me' NOSUPERUSER;
GRANT pg_monitor TO monitor;
GRANT CONNECT ON DATABASE postgres TO monitor;# queries.yaml custom metric: connection pct
pg_connection_pct:
query: |
SELECT round(100.0 * count(*)::numeric /
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections'), 2) AS pct
FROM pg_stat_activity
WHERE backend_type = 'client backend'
metrics:
- pct:
usage: GAUGE
description: Client connection utilization percent# alert rule (Prometheus)
groups:
- name: postgresql
rules:
- alert: PostgresConnectionsHigh
expr: pg_connection_pct > 80
for: 5m
labels:
severity: warning
annotations:
summary: PostgreSQL connections above 80%O que isso demonstra:
- Role
pg_monitorpara o exporter sem superusuário - Métrica de consulta personalizada para saturação de conexão
- Alerta Prometheus com duração
forpara reduzir flapping
Mergulho Profundo
Destaques das Métricas Padrão
| Prefixo da métrica | Significado |
|---|---|
pg_stat_database_* | Commits, rollbacks, deadlocks |
pg_stat_bgwriter_* | Checkpoint, buffers |
pg_replication_* | Lag, replay |
pg_locks_count | Contagem de bloqueios |
Layout do Dashboard do Grafana
- Linha de Visão Geral: status (up/down), % de conexões, bytes de lag, TPS
- Linha de Saturação: disco, taxa de WAL, checkpoints
- Linha de Consultas: principais consultas do lado do sidecar do exporter
pg_stat_statementsou PMM - Linha de Replicação: lag por standby e lag de slot
TLS e RDS
DATA_SOURCE_NAME="postgresql://monitor@rds-host:5432/postgres?sslmode=verify-full&sslrootcert=/etc/rds-ca.pem"Armadilhas
- Exporter usando superusuário - risco de vazamento em rótulos de métricas. Correção: apenas role
pg_monitor. - Coleta de primário e standby com as mesmas regras de alerta - standbys têm semânticas de lag diferentes. Correção: rótulo
instancee dashboards separados. - Muitas consultas personalizadas - cada uma adiciona carga. Correção: 5-10 consultas de alto valor, não a coleta completa de
pg_stat_statementsa cada 15s. - Alerta apenas em
pg_up == 0- perde degradação. Correção: alertas compostos (conexões + lag + disco). - Senha no env DATA_SOURCE_NAME - visível na lista de processos. Correção: arquivo
.pgpassou montagem de segredos com 0600. - sslmode ausente em gerenciados - falhas de autenticação após habilitar SSL obrigatório. Correção:
verify-fullcom CA do provedor no contêiner.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Métricas CloudWatch RDS | Apenas AWS, operações mínimas | Métricas de consulta personalizadas necessárias |
| Integração Datadog postgres | SaaS unificado | Custo em escala |
| pgwatch2 | Dashboards PG opinativos | Já usa Prometheus/Grafana |
| Cron apenas SQL | Instância única pequena | Espera-se crescimento |
FAQs
Qual imagem do exporter?
prometheuscommunity/postgres-exporter é a imagem comunitária mantida.
Intervalo de scrape?
15-30s típico. Mais rápido aumenta a carga sem muito ganho para métricas de capacidade.
Múltiplos bancos de dados?
Um DSN por target ou autodescoberta por banco de dados com jobs de scrape separados.
Métricas do PgBouncer?
Exporter separado ou SHOW STATS embutido analisado por sidecar. Não conte em duplicidade com conexões do Postgres.
Grafana Cloud?
Remote write do Prometheus; os mesmos dashboards podem ser importados via pacotes comunitários por ID.
Rótulos de alta cardinalidade?
Evite texto de consulta como rótulo. Use apenas métricas agregadas.
ServiceMonitor do Kubernetes?
Padrão com prometheus-operator; anote segredos TLS para DSN.
Fadiga de alertas?
Comece com 5 alertas: fora do ar, conexões 80%, lag, disco 85%, pico de taxa de deadlock.
RDS Enhanced Monitoring?
Métricas do SO complementam o exporter; ambos úteis para diagnóstico de I/O wait.
Testar alertas?
Use amtool alert test ou o teste de alertas unificados do Grafana; notifique o canal de staging primeiro.
Relacionados
- Noções Básicas de Monitoramento - sinais para plotar
- pg_stat_statements - carga de consulta
- Dashboards de SLO - painéis voltados para o usuário
- Monitoramento de Replicação - detalhes de lag
- Melhores Práticas de Monitoramento - checklist de limites
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, e PostGIS 3.5+.