Rastreamento de consultas distribuído em logs do PostgreSQL no Aurora PostgreSQL Limitless Database
O rastreamento de consultas distribuído é uma ferramenta para rastrear e correlacionar consultas em logs do PostgreSQL no Aurora PostgreSQL Limitless Database. No Aurora PostgreSQL, é possível usar o ID da transação para identificar uma transação. Mas no Aurora PostgreSQL Limitless Database, o ID da transação pode se repetir em vários roteadores. Portanto, recomendamos usar o ID de rastreamento no Limitless Database.
Os principais casos de uso são:
-
Usar a função
rds_aurora.limitless_get_last_trace_id()
para encontrar o ID de rastreamento exclusivo da última consulta executada na sessão atual. Em seguida, pesquisar o grupo de logs do cluster de banco de dados no Amazon CloudWatch Logs usando esse ID de rastreamento para encontrar todos os logs relacionados.Você pode usar os parâmetros
log_min_messages
elog_min_error_statement
em conjunto para controlar o volume de logs impressos e imprimir uma declaração que contenha o ID de rastreamento. -
Use o parâmetro
log_min_duration_statement
para determinar o tempo de execução acima do qual todas as consultas imprimem sua duração de execução e ID de rastreamento. Esse tempo de execução pode então ser pesquisado no grupo de logs do cluster de banco de dados no CloudWatch Logs para ajudar a determinar os nós de gargalo e os esforços de otimização do planejador.O parâmetro
log_min_duration_statement
habilita o ID de rastreamento para todos os nós, independentemente dos valores dos parâmetroslog_min_messages
elog_min_error_statement
.
ID de rastreamento
O ponto central deste recurso é um identificador exclusivo conhecido como ID de rastreamento. O ID de rastreamento é uma string de 31 dígitos anexada às linhas de log STATEMENT dos logs do PostgreSQL, que atua como um identificador preciso para correlacionar logs relacionados à execução de uma consulta específica. Os exemplos são 1126253375719408504000000000011
e 1126253375719408495000000000090
.
O ID de rastreamento é composto pelo seguinte:
-
Identificador da transação: os primeiros 20 dígitos, que identificam a transação de forma exclusiva.
-
Identificador de comando: os primeiros 30 dígitos, que indicam uma consulta individual em uma transação.
Se mais de 4.294.967.294 consultas forem executadas dentro de um bloco de transação explícito, o identificador de comando retorna para
1
. Quando isso acontece, você recebe uma notificação pela seguinte mensagem deLOG
no log do PostgreSQL:wrapping around the tracing ID back to 1 after running 4294967294 (4.2 billion or 2^32-2) queries inside of an explicit transaction block
-
Identificador do tipo de nó: o último dígito, que indica se o nó está funcionando como um roteador coordenador (
1
) ou um nó participante (0
).
Os seguintes exemplos ilustram os componentes do ID de rastreamento:
-
1126253375719408504000000000011
:-
Identificador da transação:
1126253375719408504
-
Identificador de comando:
112625337571940850400000000001
indica o primeiro comando no bloco de transação -
Identificador do tipo de nó:
1
indica um roteador coordenador
-
-
1126253375719408495000000000090
:-
Identificador da transação:
1126253375719408495
-
Identificador de comando:
112625337571940849500000000009
indica o nono comando no bloco de transação -
Identificador do tipo de nó:
0
indica um nó participante
-
Usar o rastreamento de consultas
Execute as seguintes tarefas para usar o rastreamento de consultas:
-
Verifique se o rastreamento está habilitado.
Você pode verificar o seguinte comando:
SHOW rds_aurora.limitless_log_distributed_trace_id;
Por padrão, ele é habilitado (
on
). Se não estiver habilitado, configure-o usando este comando:SET rds_aurora.limitless_log_distributed_trace_id = on;
-
Controle o volume dos logs impressos configurando o nível de severidade do log.
O volume de log é controlado pelo parâmetro
log_min_messages
. O parâmetrolog_min_error_statement
é usado para imprimir a linhaSTATEMENT
com o ID de rastreamento. Por padrão, ambos estão definidos comoERROR
. Você pode verificar usando os seguintes comandos:SHOW log_min_messages; SHOW log_min_error_statement;
Para atualizar o nível de gravidade e imprimir a linha
STATEMENT
da sessão atual, use os seguintes comandos com um desses níveis de gravidade:SET log_min_messages = '
DEBUG5
|DEBUG4
|DEBUG3
|DEBUG2
|DEBUG1
|INFO
|NOTICE
|WARNING
|ERROR
|LOG
|FATAL
|PANIC
'; SET log_min_error_statement = 'DEBUG5
|DEBUG4
|DEBUG3
|DEBUG2
|DEBUG1
|INFO
|NOTICE
|WARNING
|ERROR
|LOG
|FATAL
|PANIC
';Por exemplo:
SET log_min_messages = 'WARNING'; SET log_min_error_statement = 'WARNING';
-
Habilite a impressão do ID de rastreamento nos logs acima de um tempo de execução específico.
O parâmetro
log_min_duration_statement
pode ser alterado para o tempo mínimo de execução da consulta acima do qual a consulta imprime uma linha de log com a duração da execução, junto com os IDs de rastreamento em todo o cluster de banco de dados. Por padrão, esse parâmetro é definido como-1
, o que significa que está desabilitado. Você pode verificar o seguinte comando:SHOW log_min_duration_statement;
Alterá-lo para
0
imprime a duração e o ID de rastreamento nos logs de cada consulta no cluster de banco de dados. É possível defini-lo como0
para a sessão atual usando o seguinte comando:SET log_min_duration_statement = 0;
-
Obtenha o ID de rastreamento.
Depois de executar uma consulta (mesmo dentro de um bloco de transação explícito), chame a função
rds_aurora.limitless_get_last_trace_id
para obter o ID de rastreamento da última consulta executada:SELECT * FROM rds_aurora.limitless_get_last_trace_id();
Essa função retorna o identificador da transação e o identificador do comando. Ela não retorna o identificador do tipo de nó.
=> SELECT * FROM customers; customer_id | fname | lname -------------+-------+------- (0 rows) => SELECT * FROM rds_aurora.limitless_get_last_trace_id(); transaction_identifier | command_identifier ------------------------+-------------------------------- 10104661421959001813 | 101046614219590018130000000001 (1 row)
A função retorna uma linha em branco para consultas não distribuídas, pois elas não têm um ID de rastreamento.
=> SET search_path = public; SET => SELECT * FROM rds_aurora.limitless_get_last_trace_id(); transaction_identifier | command_identifier ------------------------+-------------------- | (1 row)
nota
Para consultas VACUUM e ANALYZE, a instrução de duração não é registrada com o ID de rastreamento. Portanto,
limitless_get_last_trace_id()
não retorna o ID de rastreamento. Se VACUUM ou ANALYZE for uma operação de longa duração, você pode usar a seguinte consulta para obter o ID de rastreamento dessa operação:SELECT * FROM rds_aurora.limitless_stat_activity WHERE distributed_tracing_id IS NOT NULL;
Se o servidor for interrompido antes de você encontrar o último ID de rastreamento, será necessário pesquisar os logs do PostgreSQL manualmente para encontrar os IDs de rastreamento nos logs logo antes da falha.
-
Pesquise o ID de rastreamento nos logs do cluster de banco de dados usando o CloudWatch.
Use o CloudWatch Insights para consultar o grupo de logs do cluster de banco de dados, conforme mostrado nos exemplos a seguir.
-
Consultar um identificador de transação específico e todos os comandos executados dentro dele:
fields @timestamp, @message | filter @message like /10104661421959001813/ | sort @timestamp desc
-
Consultar um identificador de comando específico:
fields @timestamp, @message | filter @message like /101046614219590018130000000001/ | sort @timestamp desc
-
-
Examine todos os logs em todo o cluster de banco de dados produzidos pela consulta distribuída.
Exemplos de log
Os exemplos a seguir mostram o uso do rastreamento de consultas.
Correlacionar logs para consultas propensas a erros
Neste exemplo, o comando TRUNCATE
é executado na tabela customers
quando essa tabela não existe.
- Sem rastreamento de consultas
-
Arquivo de log do PostgreSQL no roteador coordenador:
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:DETAIL: relation "public.customers" does not exist 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:CONTEXT: remote SQL command: truncate public.customers; 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:STATEMENT: truncate customers;
Arquivo de log do PostgreSQL em um fragmento participante:
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[ 27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[ 27503]:STATEMENT: truncate customers;
Esses logs são comuns. Eles não têm os identificadores precisos necessários para correlacionar facilmente as consultas em todo o cluster de banco de dados.
- Com rastreamento de consultas
-
Arquivo de log do PostgreSQL no roteador coordenador:
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:DETAIL: relation "public.customers" does not exist 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:CONTEXT: remote SQL command: truncate public.customers; 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:STATEMENT: /* tid = 1126253375719408502700000000011 */ truncate customers;
Arquivo de log do PostgreSQL em um fragmento participante:
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:STATEMENT: /* tid = 1126253375719408502700000000010 */ truncate customers;
Na presença do rastreamento de consulta, cada linha de log é anexada com um identificador único de 31 dígitos. Aqui,
1126253375719408502700000000011
e1126253375719408502700000000010
representam os IDs de rastreamento para os nós coordenador e participante, respectivamente.-
Identificador da transação:
11262533757194085027
-
Identificador de comando:
112625337571940850270000000001
-
Identificador do tipo de nó: o último dígito,
1
ou0
, indica um roteador coordenador e um nó participante, respectivamente.
-
Correlacionar logs para encontrar o tempo de execução da consulta em vários nós
Neste exemplo, o parâmetro log_min_duration_statement
foi atualizado para 0
para imprimir a duração de todas as consultas.
- Sem rastreamento de consultas
-
2024-01-15 07:28:46 UTC:[local]:postgres@postgres_limitless:[178322]:LOG: duration: 12.779 ms statement: select * from customers;
- Com rastreamento de consultas
-
Arquivo de log do PostgreSQL no roteador coordenador:
2024-01-15 07:32:08 UTC:[local]:postgres@postgres_limitless:[183877]:LOG: duration: 12.618 ms statement: /* tid = 0457669566240497088400000000011 */ select * from customers;
Arquivo de log do PostgreSQL em um fragmento participante:
2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.279 ms statement: /* tid = 0457669566240497088400000000010 */ START TRANSACTION ISOLATION LEVEL READ COMMITTED 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.249 ms parse <unnamed>: SELECT customer_id, fname, lname FROM public.customers 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.398 ms bind <unnamed>/c1: SELECT customer_id, fname, lname FROM public.customers 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.019 ms execute <unnamed>/c1: SELECT customer_id, fname, lname FROM public.customers 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.073 ms statement: /* tid = 0457669566240497088400000000010 */ COMMIT TRANSACTION