¿Cómo monitorear adecuadamente el número de conexiones de bases de datos PostgreSQL?

10

Intenté usar un script de Nagios para monitorear la cantidad de conexiones de la base de datos en una base de datos de Postgres y llegué a este problema: estas se cuentan como conexiones abiertas actualmente y se miden cada 5 minutos.

SELECT sum(numbackends) FROM pg_stat_database;

Aún así, esto parece perder una gran cantidad de conexiones de corta duración, por lo que las estadísticas están lejos de la realidad.

Traté de ejecutar el script manualmente y observé grandes cambios incluso entre dos conexiones hechas a unos segundos de distancia una de la otra.

¿Cómo podría obtener esta información de manera confiable? like max (connectios) ocurrió durante un intervalo de tiempo.

sorin
fuente
1
Las estadísticas agregadas a lo largo del tiempo para las conexiones serían buenas, pero no creo que PostgreSQL las recopile actualmente. Mire los documentos postgresql.org/docs/current/static/monitoring-stats.html para más detalles.
Craig Ringer
@CraigRinger tal vez podría configurar Postgres o los clientes para mantener las conexiones abiertas durante un período de tiempo más largo, para poder medirlas. Debido a la configuración actual, tuve un caso cuando los postgres comenzaron a rechazar las conexiones. El monitoreo no pudo detectar esto porque esto sucedió dentro del intervalo de 5 minutos, y pasó de debajo del nivel de advertencia a arriba crítico en menos de 5 minutos. Y esto no fue un ataque DoS.
sorin
2
Sí, ese es un problema bastante interesante. Recomiendo encarecidamente poner un PgBouncerfrente a su instancia de PostgreSQL, pondrá en cola las conexiones cuando esté demasiado ocupado en lugar de rechazarlas. (Sí, es estúpido que PostgreSQL no pueda hacer eso por sí mismo, pero no es una solución simple; vea las discusiones interminables en las listas de correo sobre la agrupación integrada).
Craig Ringer
77
¿Qué pasa con el registro de conexiones (usando log_connections y log_disconnections) en el archivo de registro (por ejemplo, csvlog) y luego use pgBadger o algo similar para extraerlo del archivo de registro?
a_horse_with_no_name
2
@a_horse_with_no_name Buen punto. Incluso puede "seguir" los registros con un cliente que solo lee nuevas entradas de registro, integrándose a través de desconexiones y conexiones para obtener un informe casi en tiempo real de las conexiones pico durante un período de tiempo determinado. Francamente, no debería ser tan complicado. Una de mis tareas para el proyecto AXLE ( axleproject.eu ) es implementar un poco más de auditoría, y podría encajar esto en esto ...
Craig Ringer

Respuestas:

1

Es mejor usar herramientas de monitoreo de carga de trabajo como pgbadgerpara verificar las conexiones de la base de datos y la carga general. Le ayudará a comprender qué usuarios se están conectando durante cuánto tiempo y qué consultas están realizando. Para obtener información sobre la instalación y configuración de pgbadger, consulte esta página.

Si solo desea verificar la cantidad de conexiones activas, puede usar select count(*) from pg_stat_activity where state='active'

Lohit Gupta
fuente
0

Puede usar la extensión con local_preload_libraries para hacer esto.

Algo como esto:

#include "postgres.h"
#include <string.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

void _PG_init(void)
{
  SPI_connect();
  int ret = SPI_execute("UPDATE logon_logs SET logged = logged + 1", false, 0);
  SPI_finish();
}

/*
 * _PG_fini
 * Uninstall the hook.
 */
void _PG_fini(void)
{
}

O en su lugar, ACTUALIZAR a través de NOTIFICAR

Roman Tkachuk
fuente
55
Por favor, intente mejorar su respuesta con alguna explicación sobre cómo proceder.
McNets