É possível monitorar o desempenho do servidor PostgreSQL de dentro de uma função PL / PGSQL?

Aug 17 2020

Isso pode soar exótico, mas eu gostaria de saber programaticamente se é um 'bom momento' para executar uma função PL / PGSQL de gravação pesada em um servidor. Por 'bom momento', quero dizer ponderar sobre algum indicador direto ou calculado do nível de carga, nível de simultaneidade ou qualquer outra magnitude do servidor PostgreSQL.

Estou ciente de que existem vários aplicativos avançados especializados em rastreamento de desempenho, como https://www.datadoghq.com. Mas eu só quero um KPI interno simples que altere ou atrase a execução desses procedimentos de gravação pesada até que chegue um 'momento melhor'.

Alguns desses procedimentos eliminam tabelas, alguns fazem cálculos de média / soma em milhões de linhas, alguns verificam tabelas remotas, etc. Eles podem esperar minutos ou horas por um 'momento melhor' quando a pressão do usuário simultâneo diminuir.

Qualquer ideia?

Respostas

3 jjanes Aug 16 2020 at 23:56

Você pode ver quantas outras sessões estão ativas por algo como:

select count(*) from pg_stat_activity where state='active';

Mas você precisa ser um superusuário, ou ter a função pg_monitor, ou então o estado será NULL para sessões de outros usuários. Se isso o incomoda, você pode escrever uma função com SEGURANÇA DEFINER para permitir o acesso a esta informação. (Você provavelmente deve colocar isso em sua própria função de qualquer maneira, o que significa que não há razão para que ele precise ser implementado em plpgsql, a menos que essa seja a única linguagem disponível para você.)

Você também pode invocar quaisquer operações arbitrárias do sistema operacional usando uma linguagem pl adequadamente privilegiada. Isso inclui de plpgsql , abusando COPY...FROM PROGRAM.