postgres_exporter y Grafana
postgres_exporter recopila métricas de PostgreSQL para Prometheus; los dashboards de Grafana visualizan conexiones, replicación, proxies de hinchazón y puntos de control. Estandariza un conjunto de dashboards por entorno y alerta sobre umbrales vinculados al dolor del usuario, no a contadores de vanidad.
Receta
# Fragmento de docker-compose
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"# Scrape de prometheus.yml
scrape_configs:
- job_name: postgresql
static_configs:
- targets: ['postgres_exporter:9187']Cuándo usar esto:
- Flota de Kubernetes o VM que necesita métricas unificadas
- Reemplazo de scripts de salud SQL ad hoc con scraping continuo
- Integración con Alertmanager para notificaciones de guardia
Ejemplo de Trabajo
Despliega el exporter con consultas personalizadas y alertas de Grafana.
-- Rol de monitorización dedicado (mínimo privilegio)
CREATE ROLE monitor LOGIN PASSWORD 'rotate-me' NOSUPERUSER;
GRANT pg_monitor TO monitor;
GRANT CONNECT ON DATABASE postgres TO monitor;# queries.yaml métrica personalizada: porcentaje de conexión
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: Porcentaje de utilización de conexiones de cliente# Regla de alerta (Prometheus)
groups:
- name: postgresql
rules:
- alert: PostgresConnectionsHigh
expr: pg_connection_pct > 80
for: 5m
labels:
severity: warning
annotations:
summary: Conexiones de PostgreSQL por encima del 80%Lo que esto demuestra:
- Rol
pg_monitorpara el exporter sin superusuario - Métrica de consulta personalizada para saturación de conexiones
- Alerta de Prometheus con duración
forpara reducir el "flapping"
Inmersión Profunda
Puntos Destacados de Métricas Predeterminadas
| Prefijo de métrica | Significado |
|---|---|
pg_stat_database_* | Commits, rollbacks, deadlocks |
pg_stat_bgwriter_* | Checkpoint, buffers |
pg_replication_* | Lag, replay |
pg_locks_count | Recuentos de modos de bloqueo |
Diseño del Dashboard de Grafana
- Fila de Resumen: estado activo, porcentaje de conexiones, bytes de lag, TPS
- Fila de Saturación: disco, tasa de WAL, puntos de control
- Fila de Consultas: las principales desde el sidecar del exporter pg_stat_statements o PMM
- Fila de Replicación: lag por standby y lag de slot
TLS y RDS
DATA_SOURCE_NAME="postgresql://monitor@rds-host:5432/postgres?sslmode=verify-full&sslrootcert=/etc/rds-ca.pem"Errores Comunes
- Exporter usando superusuario - riesgo de fuga en las etiquetas de métricas. Solución: solo rol
pg_monitor. - Scraping de primario y standby con las mismas reglas de alerta - los standbys tienen semánticas de lag diferentes. Solución: etiqueta
instancey dashboards separados. - Demasiadas consultas personalizadas - cada una añade carga. Solución: 5-10 consultas de alto valor, no un scrape completo de pg_stat_statements cada 15s.
- Alerta solo en
pg_up == 0- omite la degradación. Solución: alertas compuestas (conexiones + lag + disco). - Contraseña en el entorno DATA_SOURCE_NAME - visible en la lista de procesos. Solución: archivo
.pgpasso montaje de secretos con 0600. - Falta
sslmodeen servicios gestionados - fallos de autenticación después de habilitar SSL obligatorio. Solución:verify-fullcon la CA del proveedor en el contenedor.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Métricas CloudWatch RDS | Solo AWS, operación mínima | Se necesitan métricas de consulta personalizadas |
| Integración Datadog postgres | SaaS unificado | Costo a escala |
| pgwatch2 | Dashboards PG con opinión | Ya se usa Prometheus/Grafana |
| Cron solo SQL | Instancia única pequeña | Se espera crecimiento |
Preguntas Frecuentes
¿Qué imagen de exporter?
prometheuscommunity/postgres-exporter es la imagen comunitaria mantenida.
¿Intervalo de scrape?
Típicamente 15-30s. Más rápido aumenta la carga sin mucha ganancia para métricas de capacidad.
¿Múltiples bases de datos?
Un DSN por destino o autodescubrimiento por base de datos con trabajos de scrape separados.
¿Métricas de PgBouncer?
Exporter separado o SHOW STATS incorporado analizado por un sidecar. No contar doble con las conexiones de Postgres.
¿Grafana Cloud?
Escritura remota desde Prometheus; los mismos dashboards importables a través de paquetes comunitarios por ID.
¿Etiquetas de alta cardinalidad?
Evitar el texto de la consulta como etiqueta. Usar solo métricas agregadas.
¿ServiceMonitor de Kubernetes?
Patrón estándar con prometheus-operator; anotar secretos TLS para DSN.
¿Fatiga de alertas?
Comenzar con 5 alertas: caído, conexiones 80%, lag, disco 85%, pico de tasa de deadlock.
¿RDS Enhanced Monitoring?
Las métricas del SO complementan al exporter; ambos son útiles para el diagnóstico de espera de I/O.
¿Probar alertas?
Usar amtool alert test o la prueba de alertas unificadas de Grafana; notificar primero al canal de staging.
Relacionado
- Fundamentos de Monitorización - señales para graficar
- pg_stat_statements - carga de consultas
- Dashboards de SLO - paneles orientados al usuario
- Monitorización de Replicación - detalle del lag
- Mejores Prácticas de Monitorización - lista de verificación de umbrales
Versiones de Stack: 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+.