Fundamentos de Monitorización
La monitorización de PostgreSQL responde a una pregunta: ¿están los usuarios esperando a la base de datos y por qué? Vigila las conexiones, bloqueos, latencia de replicación, hinchazón y disco antes de que los gráficos de CPU se pongan rojos. PostgreSQL 18.4 expone estadísticas ricas en las vistas pg_stat_*; combínalas con métricas del host y alerta sobre los síntomas que sienten los usuarios.
Receta
-- Instantánea de salud 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;Cuándo usar esto:
- Orientación on-call para un nuevo clúster de producción
- Diseño de los primeros paneles antes del despliegue de postgres_exporter
- Triaje de incidentes cuando aumentan las incidencias de "la base de datos está lenta"
Ejemplo de Trabajo
Consultas diarias del panel de operaciones: saturación, latencia y eventos de espera principales.
-- Saturación de conexiones 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;
-- Latencia de replicación (standby / suscriptor)
SELECT application_name, state, sync_state,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag_bytes
FROM pg_stat_replication;
-- Señal de hinchazón de la base de datos (tuplas muertas)
SELECT relname, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;
-- Riesgo de disco: directorio WAL y de datos (ejecutar también en el host)
SELECT pg_size_pretty(sum(size)) AS wal_size
FROM pg_ls_waldir();# Métricas del host siguen siendo obligatorias
df -h /var/lib/postgresql
iostat -x 1 3Lo que esto demuestra:
- Conteo de conexiones comparado con el techo máximo de
max_connections - Latencia de replicación en bytes desde
pg_stat_replication - Crecimiento de tuplas muertas como señal de salud del vacuum
- Tamaño del directorio WAL como predictor de incidentes de disco
Profundización
Qué Vigilar
| Señal | Vista / fuente | Síntoma del usuario |
|---|---|---|
| Conexiones | pg_stat_activity, estadísticas del pooler | Errores de "demasiados clientes" |
| Bloqueos | pg_locks, wait_event | Solicitudes colgadas, tiempos de espera agotados |
| Latencia de replicación | pg_stat_replication, slots | Lecturas obsoletas, riesgo de RPO |
| Hinchazón | pg_stat_user_tables, pgstattuple | Escaneos lentos, autovacuum retrasado |
| Disco | pg_database_size, directorio WAL, df | Fallan escrituras, riesgo de caída |
| Carga de consultas | pg_stat_statements | Latencia p95 aumentada |
Filosofía de Alertas
Alerta sobre síntomas: agotamiento de conexiones, latencia por encima del SLO, disco > 85%, esperas de bloqueo > N segundos. Evita alertar por cada pico de contador.
Pila de Recolección
# Ruta típica de métricas
# postgres_exporter -> Prometheus -> Grafana + AlertmanagerTrampas
- Monitorizar solo CPU - PostgreSQL a menudo está limitado por I/O o bloqueos. Solución: añadir
iowait, latencia de disco, eventos de espera depg_stat_activity. - Ignorar el pool de PgBouncer - la aplicación ve saturación del pool mientras PostgreSQL está inactivo. Solución: exportar
cl_active,cl_waitingdel pool. - Alerta de
max_connectionsal 100% - las nuevas conexiones fallan antes de que se dispare la alerta si el umbral es incorrecto. Solución: alertar al 80% y rastrear la profundidad de la cola del pool. - Latencia en segundos solo en réplicas asíncronas - la latencia en bytes importa para cargas de trabajo de escritura variables. Solución: graficar
pg_wal_lsn_diffy el tiempo de latencia de replay juntos. - Sin línea base - no se puede distinguir lo normal de lo malo. Solución: registrar el p95 semanal de conexiones y los tiempos de consulta principales.
- Autovacuum no vigilado - la hinchazón se acumula durante semanas. Solución: alertar sobre tablas con
n_dead_tupalto ylast_autovacuumobsoleto.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| postgres_exporter + Prometheus | Métricas estándar de k8s/VM | Tienda totalmente gestionada con paneles nativos |
| CloudWatch / Cloud Monitoring | Nativo de RDS/Cloud SQL | Necesidad de correlación entre motores en Grafana |
| Datadog / New Relic APM | APM unificado + DB | Equipos pequeños sensibles al costo |
Solo pg_stat_statements | Triaje rápido de consultas | Persisten puntos ciegos de capacidad y disco |
Preguntas Frecuentes
¿Con qué frecuencia encuestar métricas?
15-30s para Prometheus es lo típico. pg_stat_activity para incidentes es en tiempo real vía SQL.
¿Paneles mínimos?
Conexiones, latencia, disco, 5 eventos de espera principales, consultas principales por tiempo total, latencia de slot de replicación.
¿Monitorizar standbys por separado?
Sí. La latencia de replay y los conflictos de hot standby importan para el enrutamiento de lectura.
¿Qué es una buena alerta de latencia?
Depende del RPO. Empezar con 100MB o 30s para OLTP asíncrono; ajustar para pares HA síncronos.
¿Necesito pg_stat_statements?
Fuertemente sí para cualquier OLTP de producción. Ver artículo dedicado.
¿Lagunas en Postgres gestionado?
Los paneles del proveedor cubren la infraestructura; todavía necesitas añadir estadísticas de consulta y correlación de aplicaciones.
¿Hinchazón sin pgstattuple?
Usar la relación n_dead_tup y la tasa de crecimiento de la tabla; confirmar con pgstattuple mensualmente.
¿Quién se encarga del on-call?
El on-call de aplicaciones alerta sobre la violación del SLO del usuario; el DBA/plataforma investiga las esperas de pg_stat_activity.
¿Volumen de logs vs métricas?
Métricas para tendencias y alertas; logs para auditoría DDL y forense de consultas lentas.
¿Un endpoint de health check es suficiente?
SELECT 1 prueba que el inicio de sesión funciona, no tormentas de bloqueos o disco lleno. Usar comprobaciones en capas.
Relacionado
- pg_stat_activity y Bloqueos - sesiones bloqueadas
- pg_stat_statements - carga de consultas
- postgres_exporter y Grafana - pila de métricas
- Paneles de SLO - presupuestos orientados al usuario
- Mejores Prácticas de Monitorización - lista de verificación de alertas
Versiones de la pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.