Noções Básicas de Monitoramento
O monitoramento do PostgreSQL responde a uma pergunta: os usuários estão esperando pelo banco de dados, e por quê? Observe conexões, bloqueios, lag de replicação, bloat e disco antes que os gráficos de CPU fiquem vermelhos. O PostgreSQL 18.4 expõe estatísticas ricas nas visualizações pg_stat_*; combine-as com métricas do host e alerte sobre sintomas que os usuários sentem.
Receita
-- Snapshot de saúde de cinco minutos
SELECT count(*) FILTER (WHERE state = 'active') AS active,
count(*) FILTER (WHERE wait_event_type = 'Lock') AS waiting_locks,
count(*) AS total
FROM pg_stat_activity
WHERE backend_type = 'client backend';
SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;
SELECT client_addr, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE wait_event IS NOT NULL
AND pid <> pg_backend_pid()
LIMIT 10;Quando usar isso:
- Orientação de plantão para um novo cluster de produção
- Criação dos primeiros dashboards antes da implantação do postgres_exporter
- Triagem de incidentes quando os tickets de "banco de dados lento" aumentam
Exemplo de Trabalho
Consultas diárias do dashboard de operações: saturação, lag e principais eventos de espera.
-- Saturação de conexão vs max_connections
SELECT
(SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend') AS used,
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS max_conn,
round(100.0 * (SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend') /
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections'), 1) AS pct_used;
-- Lag de replicação (standby / subscriber)
SELECT application_name, state, sync_state,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag_bytes
FROM pg_stat_replication;
-- Sinal de bloat do banco de dados (tuplas mortas)
SELECT relname, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;
-- Risco de disco: diretório WAL e de dados (execute também no host)
SELECT pg_size_pretty(sum(size)) AS wal_size
FROM pg_ls_waldir();# Métricas do host ainda são obrigatórias
df -h /var/lib/postgresql
iostat -x 1 3O que isso demonstra:
- Contagem de conexões em comparação com o limite máximo de
max_connections - Lag de replicação em bytes de
pg_stat_replication - Crescimento de tuplas mortas como sinal de saúde do vacuum
- Tamanho do diretório WAL como preditor de incidentes de disco
Mergulho Profundo
O que Observar
| Sinal | Visualização / origem | Sintoma do usuário |
|---|---|---|
| Conexões | pg_stat_activity, estatísticas do pooler | Erros "too many clients" |
| Bloqueios | pg_locks, wait_event | Requisições travadas, timeouts |
| Lag de replicação | pg_stat_replication, slots | Leituras desatualizadas, risco de RPO |
| Bloat | pg_stat_user_tables, pgstattuple | Scans lentos, autovacuum atrasado |
| Disco | pg_database_size, diretório WAL, df | Falhas de escrita, risco de crash |
| Carga de consulta | pg_stat_statements | Latência p95 aumentada |
Filosofia de Alerta
Alerta sobre sintomas: esgotamento de conexões, lag acima do SLO, disco > 85%, esperas de bloqueio > N segundos. Evite disparar alertas para cada pico de contador.
Pilha de Coleta
# Caminho típico de métricas
# postgres_exporter -> Prometheus -> Grafana + AlertmanagerArmadilhas
- Monitorar apenas CPU - O Postgres é frequentemente limitado por I/O ou bloqueios. Correção: adicione
iowait, latência de disco, eventos de espera depg_stat_activity. - Ignorar o pool PgBouncer - o aplicativo vê saturação do pool enquanto o Postgres está ocioso. Correção: exporte
cl_active,cl_waitingdo pool. - Alerta de
max_connectionsem 100% - novas conexões falham antes que o alerta dispare se o limite estiver incorreto. Correção: alerte em 80% e rastreie a profundidade da fila do pool. - Lag em segundos apenas em réplicas assíncronas - o lag em bytes é importante para cargas de trabalho de escrita com picos. Correção: plote
pg_wal_lsn_diffe o tempo de lag de replay juntos. - Sem linha de base - não é possível distinguir o normal do ruim. Correção: registre conexões p95 semanais e tempos das principais consultas.
- Autovacuum não monitorado - o bloat se acumula por semanas. Correção: alerte sobre tabelas com
n_dead_tupalto elast_autovacuumdesatualizado.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| postgres_exporter + Prometheus | Métricas padrão k8s/VM | Loja totalmente gerenciada com dashboards nativos |
| CloudWatch / Cloud Monitoring | Nativo do RDS/Cloud SQL | Necessidade de correlação entre motores no Grafana |
| Datadog / New Relic APM | APM unificado + DB | Equipes pequenas sensíveis a custos |
Apenas pg_stat_statements | Triagem rápida de consultas | Pontos cegos de capacidade e disco permanecem |
FAQs
Com que frequência consultar métricas?
15-30s para Prometheus é o típico. pg_stat_activity para incidentes é em tempo real via SQL.
Dashboards mínimos?
Conexões, lag, disco, top 5 eventos de espera, top consultas por tempo total, lag de slot de replicação.
Monitorar standbys separadamente?
Sim. O lag de replay e os conflitos de hot standby são importantes para o roteamento de leitura.
Qual é um bom alerta de lag?
Depende do RPO. Comece com 100MB ou 30s para OLTP assíncrono; aperte para pares de HA síncronos.
Preciso de pg_stat_statements?
Fortemente sim para qualquer OLTP de produção. Veja artigo dedicado.
Lacunas no Postgres Gerenciado?
Os dashboards do provedor cobrem a infraestrutura; você ainda adiciona estatísticas de consulta e correlação de aplicativos.
Bloat sem pgstattuple?
Use a proporção n_dead_tup e a taxa de crescimento da tabela; confirme com pgstattuple mensalmente.
Quem é o responsável pelo plantão?
O plantão do aplicativo aciona em caso de violação do SLO do usuário; DBA/plataforma investiga esperas em pg_stat_activity.
Volume de logs vs métricas?
Métricas para tendências e alertas; logs para auditoria de DDL e análise forense de consultas lentas.
Endpoint de verificação de integridade é suficiente?
SELECT 1 prova que o login funciona, não tempestades de bloqueio ou disco cheio. Use verificações em camadas.
Relacionados
- pg_stat_activity & Locks - sessões bloqueadas
- pg_stat_statements - carga de trabalho de consulta
- postgres_exporter & Grafana - pilha de métricas
- SLO Dashboards - orçamentos voltados para o usuário
- Melhores Práticas de Monitoramento - lista de verificação de alertas
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+.