¿Es posible monitorear el rendimiento del servidor PostgreSQL desde dentro de una función PL / PGSQL?
Esto puede sonar exótico, me gustaría saber mediante programación si es un "buen momento" para ejecutar una función PL / PGSQL de escritura pesada en un servidor. Por "buen momento" me refiero a considerar algún indicador directo o calculado del nivel de carga, nivel de concurrencia o cualquier otra magnitud del servidor PostgreSQL.
Soy consciente de que existe una serie de aplicaciones avanzadas especializadas en el seguimiento del rendimiento, como https://www.datadoghq.com. Pero solo quiero un KPI interno simple que altere o retrase la ejecución de estos procedimientos de escritura pesada hasta que llegue un 'mejor momento'.
Algunos de estos procedimientos depuran tablas, algunos hacen cálculos de promedios / sumas en millones de filas, algunos verifican tablas remotas, etc. Pueden esperar minutos u horas para un "mejor momento" cuando la presión del usuario concurrente disminuye.
¿Alguna idea?
Respuestas
Puede ver cuántas otras sesiones están activas por algo como:
select count(*) from pg_stat_activity where state='active';
Pero debe ser un superusuario o tener el rol pg_monitor, o de lo contrario el estado será NULL para las sesiones de otros usuarios. Si eso le molesta, puede escribir una función con SEGURIDAD DEFINER para permitir el acceso a esta información. (Probablemente debería poner esto en su propia función de todos modos, lo que significa que no hay ninguna razón por la que deba implementarse en plpgsql a menos que ese sea el único idioma disponible para usted).
También puede invocar cualquier operación arbitraria del sistema operativo utilizando un lenguaje pl con privilegios adecuados. Eso incluye de plpgsql , abusando de COPY...FROM PROGRAM
.