Monitorar o desempenho de consultas usando o Query Insights avançado

Selecione uma versão da documentação:

Os insights de consultas avançados permitem detectar, diagnosticar e evitar problemas de desempenho de consultas no banco de dados do AlloyDB Omni. Ele captura a telemetria do banco de dados, incluindo estatísticas de consultas normalizadas, eventos de espera, endereços IP do cliente, tags e carga da instância, e retém métricas históricas por 30 dias.

É possível usar o Query Insights avançado para realizar as seguintes tarefas:

  • Identificar consultas de alta latência e com uso intenso de recursos analisando o tempo de execução, o tempo de E/S, o tempo de espera, a atividade do buffer compartilhado e as contagens de linhas.
  • Resolver problemas de gargalos correlacionando consultas lentas com eventos de espera e classes de eventos de espera.
  • Rastrear o desempenho da consulta para componentes de aplicativo específicos marcando consultas com SQLCommenter.
  • Monitorar consultas ativas e transações abertas em tempo real e interromper sessões problemáticas.

Antes de começar

Antes de ativar os insights de consultas avançados, verifique os seguintes requisitos:

  • Você está executando uma instância independente do AlloyDB Omni instalada usando pacotes RPM do Linux.

  • Você tem acesso de superusuário postgres à instância do banco de dados e acesso administrativo para reiniciar o serviço de banco de dados.

  • O banco de dados alloydbadmin existe na sua instância. O AlloyDB Omni cria esse banco de dados por padrão durante a inicialização.

Ativar o Query Insights

Para ativar o Query Insights avançado, siga estas etapas:

  1. Conecte-se ao banco de dados postgres como o superusuário postgres:

    sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d postgres
  2. Verifique as bibliotecas carregadas em shared_preload_libraries, adicione Query Insights avançados à lista de pré-carregamento, ative a extensão e saia do psql:

    SHOW shared_preload_libraries;
    ALTER SYSTEM SET shared_preload_libraries = 'LIBRARY_1','LIBRARY_2','google_insights_v2';
    ALTER SYSTEM SET google_insights_v2.enabled = on;
    \q
    

    Substitua LIBRARY_1, LIBRARY_2 e outras bibliotecas atuais pelos nomes de biblioteca retornados por SHOW shared_preload_libraries. Coloque cada entrada de biblioteca individual entre aspas simples, como 'g_stats','google_columnar_engine','google_insights_v2', e inclua todas as bibliotecas atuais exigidas pelo AlloyDB Omni para não substituí-las.

  3. Reinicie o servidor do AlloyDB Omni para aplicar as configurações de pré-carregamento:

    sudo systemctl restart alloydbomni18
  4. Conecte-se ao banco de dados alloydbadmin como o superusuário postgres:

    sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d alloydbadmin
  5. Crie a extensão Query Insights avançada no banco de dados alloydbadmin:

    CREATE EXTENSION IF NOT EXISTS google_insights_v2;
    
  6. Verifique se a biblioteca está carregada, a extensão está ativada e a extensão google_insights_v2 está instalada em alloydbadmin:

    SHOW shared_preload_libraries;
    SHOW google_insights_v2.enabled;
    SELECT extname, extversion FROM pg_extension WHERE extname = 'google_insights_v2';
    

    Confirme se shared_preload_libraries inclui google_insights_v2, google_insights_v2.enabled retorna on e pg_extension retorna uma linha para google_insights_v2.

Dimensões e parâmetros de capacidade

No AlloyDB Omni, o Query Insights avançado registra a telemetria do banco de dados em tabelas, visualizações e funções SQL no banco de dados alloydbadmin nas seguintes dimensões e capacidades:

  • Consultas: use para identificar instruções SQL lentas ou com uso intenso de recursos quando a latência da consulta aumenta.
  • Tipos de eventos de espera: use para determinar se a CPU, a E/S de disco ou a contenção de bloqueio causam gargalos de carga de trabalho.
  • Eventos de espera: use para identificar o evento de espera específico do PostgreSQL, como DataFileRead ou WALWrite, que atrasa a execução da consulta.
  • Bancos de dados: use para comparar o consumo de recursos em bancos de dados lógicos e isolar bancos de dados de alta carga em instâncias compartilhadas.
  • Usuários e endereços IP do cliente: use para atribuir a carga de consulta a funções de banco de dados ou endereços IP de cliente específicos e identificar clientes de aplicativos problemáticos.
  • Tags: use para correlacionar a carga do banco de dados com serviços, rotas ou ações de ORM específicos do aplicativo marcados com o SQLCommenter.
  • Consultas ativas: use para diagnosticar picos de performance ao vivo, transações bloqueadas e sessões de longa duração em tempo real.

Quando você define google_insights_v2.enabled como on, o AlloyDB Omni coleta automaticamente métricas para consultas, tipos de eventos de espera, eventos de espera, bancos de dados e usuários.

Para atualizar qualquer parâmetro google_insights_v2.* no ambiente de execução sem reiniciar o servidor de banco de dados, execute ALTER SYSTEM SET e recarregue a configuração:

ALTER SYSTEM SET PARAMETER_NAME = VALUE;
SELECT pg_reload_conf();

Substitua:

  • PARAMETER_NAME: o nome do parâmetro de Query Insights avançados a ser configurado, como google_insights_v2.qi_track_active_queries, google_insights_v2.qi_track_tag ou google_insights_v2.qi_track_client_address.
  • VALUE: o novo valor do parâmetro, como on.

Para descrições de cada parâmetro, as visualizações de observabilidade correspondentes e as métricas e colunas que cada visualização retorna, consulte a referência de insights de consultas avançados.

Granularidades temporais

Cada visualização histórica observability_service_* está disponível em três granularidades de tempo:

  • Visualizações de base (*_view): intervalos de descarga de 15 segundos. Use essas visualizações para investigar picos ou incidentes recentes nas últimas 1 a 6 horas.
  • Visualizações de nível 1 aproximadas (*_coarse_1_view): intervalos agregados de 5 minutos para as 2.000 principais consultas. Use essas visualizações para analisar tendências de performance em 6 a 24 horas.
  • Visualizações de nível 2 aproximadas (*_coarse_2_view): intervalos agregados de 30 minutos para as 2.000 principais consultas. Use essas visualizações para analisar tendências de vários dias até o limite de retenção de 30 dias.

As visualizações de observabilidade histórica armazenam todas as colunas de tempo de execução, espera e E/S em microssegundos, incluindo total_execution_time, total_wait_time, total_read_time, total_write_time e time_spent.

Consultar histórico de performance

Conecte-se ao banco de dados alloydbadmin para executar consultas de diagnóstico nas visualizações de observabilidade histórica. Para mais informações, consulte Executar e conectar-se ao AlloyDB Omni.

As instruções SQL nesta seção são exemplos de consultas para cenários comuns de solução de problemas nas dimensões. É possível personalizar esses exemplos, como mudar a janela de tempo recorded_on, filtrar por bancos de dados ou funções específicas ou consultar *_coarse_1_view e *_coarse_2_view para análise de vários dias, para ajustar sua carga de trabalho.

Identificar consultas de alta latência

Para encontrar as 10 principais consultas normalizadas com o maior tempo total de execução na última hora, execute a seguinte consulta de exemplo em google_insights_v2.observability_service_query_view:

SELECT
  query_id,
  database,
  username,
  left(query, 100) AS normalized_query,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us,
  sum(total_rows) AS total_rows,
  sum(total_shared_blocks_hit) AS shared_blocks_hit,
  sum(total_shared_blocks_read) AS shared_blocks_read
FROM google_insights_v2.observability_service_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY query_id, database, username, left(query, 100)
ORDER BY total_execution_time_us DESC
LIMIT 10;

Analisar eventos de espera por consulta

Para identificar quais categorias de eventos de espera (wait_class) e eventos de espera granulares (wait_event) contribuem com o maior tempo de espera para um query_id específico, execute a seguinte consulta de exemplo em google_insights_v2.observability_service_wait_event_stats_by_query_view:

SELECT
  query_id,
  database,
  username,
  wait_class,
  wait_event,
  sum(count) AS wait_occurrences,
  sum(time_spent) AS total_wait_time_us
FROM google_insights_v2.observability_service_wait_event_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
  AND query_id = QUERY_ID
GROUP BY query_id, database, username, wait_class, wait_event
ORDER BY total_wait_time_us DESC;

Substitua QUERY_ID pelo valor query_id que observability_service_query_view retorna.

Analisar a carga do banco de dados, do usuário e do IP do cliente

Para comparar o tempo total de execução, o tempo de espera e o volume de consultas em bancos de dados lógicos e funções de banco de dados na última hora, execute a seguinte consulta de exemplo em google_insights_v2.observability_service_db_load_conn_view:

SELECT
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  sum(total_wait_time) AS total_wait_time_us
FROM google_insights_v2.observability_service_db_load_conn_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY database, username
ORDER BY total_execution_time_us DESC;

Se você ativar google_insights_v2.qi_track_client_address, também poderá identificar quais endereços IP do cliente conectados geram o maior tempo de consulta usando a seguinte consulta de exemplo em google_insights_v2.observability_service_client_address_stats_by_query_view:

SELECT
  client_address,
  username,
  database,
  query_id,
  sum(count) AS total_executions,
  sum(time_spent) AS total_time_spent_us
FROM google_insights_v2.observability_service_client_address_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY client_address, username, database, query_id
ORDER BY total_time_spent_us DESC
LIMIT 10;

Rastrear a performance da consulta por tags

Quando google_insights_v2.qi_track_tag está definido como on e suas consultas incluem SQLCommenter comentários, execute a seguinte consulta de exemplo para agregar o tempo de execução por metadados de tag do aplicativo usando google_insights_v2.observability_service_tag_view:

SELECT
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us
FROM google_insights_v2.observability_service_tag_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username
ORDER BY total_execution_time_us DESC
LIMIT 10;

Monitorar consultas ativas

Quando você define google_insights_v2.qi_track_active_queries como on, é possível monitorar consultas em execução e transações abertas em tempo real consultando google_insights_v2.stat_activity e google_insights_v2.stat_activity_v3 no banco de dados alloydbadmin.

Essas visualizações expõem conexões de clientes ativas, durações de sessão e transação e eventos de espera atuais, excluindo trabalhadores em segundo plano e conexões alloydbadmin.

Consultar sessões ativas e durações de transação

Para identificar quais consultas estão ativamente em execução na instância no momento e quais transações estão em execução há mais tempo, execute a seguinte consulta de exemplo em alloydbadmin:

SELECT
  pid AS "Process ID",
  left(normalized_query, 40) AS "Query",
  state AS "Status",
  round(EXTRACT(EPOCH FROM (clock_timestamp() - backend_start))::numeric, 2) AS "Session duration (secs)",
  CASE
    WHEN xact_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - xact_start))::numeric, 2)
    ELSE NULL
  END AS "Transaction duration (secs)",
  CASE
    WHEN query_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2)
    ELSE NULL
  END AS "Query duration (secs)",
  COALESCE(wait_event_type, '') AS "Wait event type",
  COALESCE(wait_event, '') AS "Wait event",
  database AS "Database",
  COALESCE(application_name, '') AS "Application name",
  username AS "Username",
  COALESCE(client_addr::text, '') AS "Client address"
FROM google_insights_v2.stat_activity_v3
WHERE state = 'active'
ORDER BY query_start ASC;

Interromper uma consulta ou transação de longa duração

Para interromper uma consulta de longa duração ou uma transação bloqueada identificada em google_insights_v2.stat_activity_v3, transmita o ID de processo para pg_terminate_backend:

SELECT pg_terminate_backend(PROCESS_ID);

Substitua PROCESS_ID pelo valor Process ID (pid) retornado por google_insights_v2.stat_activity_v3.

Desativar insights de consultas avançados

Para interromper a coleta de telemetria sem reiniciar a instância do AlloyDB Omni, defina google_insights_v2.enabled como off e recarregue a configuração:

ALTER SYSTEM SET google_insights_v2.enabled = off;
SELECT pg_reload_conf();

Para remover os objetos de extensão e os dados históricos armazenados do banco de dados alloydbadmin, conecte-se a alloydbadmin e descarte a extensão:

DROP EXTENSION IF EXISTS google_insights_v2 CASCADE;

A seguir