Suivi distribué des requêtes dans les SQL journaux Postgre dans la base de données Aurora Postgre Limitless SQL - Amazon Aurora

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Suivi distribué des requêtes dans les SQL journaux Postgre dans la base de données Aurora Postgre Limitless SQL

Le suivi distribué des requêtes est un outil permettant de suivre et de corréler les requêtes dans les SQL journaux Postgre de la base de données Aurora Postgre SQL Limitless. Dans Aurora PostgreSQL, vous utilisez l'ID de transaction pour identifier une transaction. Mais dans la base de données Aurora Postgre SQL Limitless, l'ID de transaction peut être répété sur différents routeurs. Par conséquent, nous vous recommandons d'utiliser plutôt l'ID de suivi dans Limitless Database.

Les principaux cas d'utilisation sont les suivants :

  • Utilisez cette rds_aurora.limitless_get_last_trace_id() fonction pour trouver l'identifiant de suivi unique de la dernière requête exécutée dans la session en cours. Recherchez ensuite le groupe de journaux du cluster de bases de données dans Amazon CloudWatch Logs à l'aide de cet ID de suivi pour trouver tous les journaux associés.

    Vous pouvez utiliser les log_min_error_statement paramètres log_min_messages et conjointement pour contrôler le volume de journaux imprimés et imprimer un relevé contenant l'identifiant de suivi.

  • Utilisez le log_min_duration_statement paramètre pour déterminer la durée d'exécution au-delà de laquelle toutes les requêtes impriment leur durée d'exécution et leur identifiant de suivi. Cette durée d'exécution peut ensuite être recherchée dans le groupe de journaux du cluster de bases de données dans CloudWatch Logs pour aider à déterminer les nœuds de blocage et à planifier les efforts d'optimisation.

    Le log_min_duration_statement paramètre active l'ID de suivi pour tous les nœuds, quels que soient les valeurs log_min_messages et log_min_error_statement les paramètres.

ID de suivi

Au cœur de cette fonctionnalité se trouve un identifiant unique connu sous le nom d'ID de suivi. L'ID de suivi est une chaîne de 31 chiffres ajoutée aux lignes de STATEMENT journal des SQL journaux Postgre, servant d'identifiant précis pour corréler les journaux liés à l'exécution d'une requête spécifique. Par exemple, 1126253375719408504000000000011 et 1126253375719408495000000000090.

L'ID de suivi est composé des éléments suivants :

  • Identifiant de transaction — Les 20 premiers chiffres, identifiant de manière unique la transaction.

  • Identifiant de commande — Les 30 premiers chiffres, indiquant une requête individuelle au sein d'une transaction.

    Si plus de 4 294 967 294 requêtes sont exécutées dans un bloc de transaction explicite, la commande Identifier est enroulée vers. 1 Lorsque cela se produit, vous êtes averti par le LOG message suivant dans le SQL journal Postgre :

    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
  • Identifiant du type de nœud : dernier chiffre indiquant si le nœud fonctionne en tant que routeur coordinateur (1) ou en tant que nœud participant (0).

Les exemples suivants illustrent les composants de l'ID de suivi :

  • 1126253375719408504000000000011:

    • Identifiant de transaction — 1126253375719408504

    • Identifiant de commande : 112625337571940850400000000001 indique la première commande du bloc de transactions

    • Identifiant du type de nœud : 1 indique un routeur coordinateur

  • 1126253375719408495000000000090:

    • Identifiant de transaction — 1126253375719408495

    • Identifiant de commande — 112625337571940849500000000009 indique la neuvième commande du bloc de transactions

    • Identifiant du type de nœud : 0 indique un nœud participant

Utilisation du suivi des requêtes

Pour utiliser le suivi des requêtes, effectuez les tâches suivantes :

  1. Assurez-vous que le suivi est activé.

    Vous pouvez vérifier à l'aide de la commande suivante :

    SHOW rds_aurora.limitless_log_distributed_trace_id;

    Il est activé par défaut (on). S'il n'est pas activé, définissez-le à l'aide de la commande suivante :

    SET rds_aurora.limitless_log_distributed_trace_id = on;
  2. Contrôlez le volume de journaux imprimés en configurant le niveau de gravité des journaux.

    Le volume du journal est contrôlé par le log_min_messages paramètre. Le log_min_error_statement paramètre est utilisé pour imprimer la STATEMENT ligne avec l'ID de suivi. Les deux sont définis ERROR par défaut. Vous pouvez vérifier à l'aide des commandes suivantes :

    SHOW log_min_messages; SHOW log_min_error_statement;

    Pour mettre à jour le niveau de gravité et imprimer la STATEMENT ligne correspondant à la session en cours, utilisez les commandes suivantes avec l'un de ces niveaux de gravité :

    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';

    Par exemple :

    SET log_min_messages = 'WARNING'; SET log_min_error_statement = 'WARNING';
  3. Activez l'impression de l'ID de suivi dans les journaux au-delà d'une durée d'exécution spécifique.

    Le log_min_duration_statement paramètre peut être modifié en fonction de la durée minimale d'exécution de la requête au-delà de laquelle la requête imprime une ligne de journal avec la durée d'exécution, ainsi que le suivi IDs sur le cluster de base de données. Ce paramètre est défini -1 par défaut, ce qui signifie qu'il est désactivé. Vous pouvez vérifier à l'aide de la commande suivante :

    SHOW log_min_duration_statement;

    Le modifier pour 0 imprimer la durée et l'ID de suivi dans les journaux pour chaque requête sur le cluster de base de données. Vous pouvez le définir 0 pour la session en cours à l'aide de la commande suivante :

    SET log_min_duration_statement = 0;
  4. Obtenez l'ID de suivi.

    Après avoir exécuté une requête (même à l'intérieur d'un bloc de transaction explicite), appelez la rds_aurora.limitless_get_last_trace_id fonction pour obtenir l'ID de suivi de la dernière requête exécutée :

    SELECT * FROM rds_aurora.limitless_get_last_trace_id();

    Cette fonction renvoie l'identifiant de transaction et l'identifiant de commande. Il ne renvoie pas l'identifiant du type de nœud.

    => 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)

    La fonction renvoie une ligne vide pour les requêtes non distribuées, car elles ne possèdent pas d'identifiant de suivi.

    => SET search_path = public; SET => SELECT * FROM rds_aurora.limitless_get_last_trace_id(); transaction_identifier | command_identifier ------------------------+-------------------- | (1 row)
    Note

    Pour les ANALYZE requêtes VACUUM et, l'instruction de durée n'est pas enregistrée avec l'ID de suivi. Par conséquent, limitless_get_last_trace_id() ne renvoie pas l'ID de suivi. S'il s'ANALYZEagit VACUUM d'une opération de longue durée, vous pouvez utiliser la requête suivante pour obtenir l'ID de suivi correspondant à cette opération :

    SELECT * FROM rds_aurora.limitless_stat_activity WHERE distributed_tracing_id IS NOT NULL;

    Si le serveur s'arrête avant que vous ne trouviez le dernier ID de suivi, vous devrez effectuer une recherche manuelle dans SQL les journaux Postgre pour trouver le suivi IDs dans les journaux juste avant la panne.

  5. Recherchez l'ID de suivi dans les journaux du cluster de base de données à l'aide de CloudWatch.

    Utilisez CloudWatch Insights pour interroger le groupe de journaux du cluster de base de données, comme indiqué dans les exemples suivants.

    • Recherchez un identifiant de transaction particulier et toutes les commandes s'exécutent à l'intérieur de celui-ci :

      fields @timestamp, @message | filter @message like /10104661421959001813/ | sort @timestamp desc
    • Requête pour un identifiant de commande particulier :

      fields @timestamp, @message | filter @message like /101046614219590018130000000001/ | sort @timestamp desc
  6. Examinez tous les journaux du cluster de base de données produits par la requête distribuée.

Exemples de journaux

Les exemples suivants montrent l'utilisation du suivi des requêtes.

Corrélation des journaux pour les requêtes sujettes aux erreurs

Dans cet exemple, la TRUNCATE commande est exécutée sur la customers table lorsque cette table n'existe pas.

Sans suivi des requêtes

Fichier SQL journal Postgre sur le routeur coordinateur :

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;

Fichier SQL journal Postgre sur le partage d'un participant :

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;

Ces journaux sont typiques. Ils ne disposent pas des identifiants précis nécessaires pour corréler facilement les requêtes au sein du cluster de base de données.

Avec suivi des requêtes

Fichier SQL journal Postgre sur le routeur coordinateur :

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;

Fichier SQL journal Postgre sur le partage d'un participant :

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;

En présence d'un suivi des requêtes, chaque ligne de journal est associée à un identifiant unique à 31 chiffres. Ici, 1126253375719408502700000000011 et 1126253375719408502700000000010 représentez le suivi IDs pour les nœuds coordinateur et participant, respectivement.

  • Identifiant de transaction — 11262533757194085027

  • Identifiant de commande : — 112625337571940850270000000001

  • Identifiant du type de nœud — Le dernier chiffre0, 1 ou, indique respectivement un routeur coordinateur et un nœud participant.

Corrélation des journaux pour déterminer la durée d'exécution de la requête sur différents nœuds

Dans cet exemple, le log_min_duration_statement paramètre a été mis à jour 0 pour afficher la durée de toutes les requêtes.

Sans suivi des requêtes
2024-01-15 07:28:46 UTC:[local]:postgres@postgres_limitless:[178322]:LOG: duration: 12.779 ms statement: select * from customers;
Avec suivi des requêtes

Fichier SQL journal Postgre sur le routeur coordinateur :

2024-01-15 07:32:08 UTC:[local]:postgres@postgres_limitless:[183877]:LOG: duration: 12.618 ms statement: /* tid = 0457669566240497088400000000011 */ select * from customers;

Fichier SQL journal Postgre sur le partage d'un participant :

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