Tutoriel : DĂ©marrer avec la journalisation et le traçage¶

Introduction¶

Ce tutoriel prĂ©sente les bases de l’émission, de la collecte et de l’interrogation des donnĂ©es de journal et de trace Ă  partir du code du gestionnaire de fonction et de procĂ©dure.

Le tutoriel utilise l’interface Web Snowsight, mais vous pouvez utiliser n’importe quel client Snowflake qui prend en charge le SQL d’exĂ©cution. Pour plus d’informations sur Snowsight, voir Premiers pas avec les feuilles de calcul et Utilisation de feuilles de calcul dans Snowsight.

Ce que vous apprendrez¶

Dans ce tutoriel, vous apprendrez Ă  :

  • CrĂ©er une table d’évĂ©nements pour stocker les donnĂ©es du journal et de la trace.

    Snowflake collecte les données de journal et de trace dans la structure prédéfinie de la table.

  • Émettre des messages et des donnĂ©es de suivi Ă  partir d’une fonction dĂ©finie par l’utilisateur (UDF).

    Vous pouvez utiliser une API conçue pour votre langage de gestionnaire afin d’émettre des messages de journal et des donnĂ©es de trace Ă  partir du code du gestionnaire.

  • Visualiser les donnĂ©es de journal et de trace collectĂ©es en interrogeant la table des Ă©vĂ©nements.

    Vous pouvez interroger la table Ă  l’aide d’une instruction SELECT pour analyser les donnĂ©es collectĂ©es.

Conditions préalables¶

  • Vous devez exĂ©cuter toutes les commandes SQL dans la mĂȘme session de commande SQL car le contexte de la session est nĂ©cessaire.

    Pour ce faire dans Snowsight, par exemple, collez tout votre code dans la mĂȘme feuille de calcul au fur et Ă  mesure. Au fur et Ă  mesure que vous progressez, chaque section s’appuie sur la prĂ©cĂ©dente.

  • Vous devez ĂȘtre en mesure d’utiliser le rĂŽle ACCOUNTADMIN.

    Dans ce tutoriel, vous effectuerez toutes les Ă©tapes en utilisant le rĂŽle ACCOUNTADMIN. En rĂšgle gĂ©nĂ©rale, cependant, vous utiliserez des rĂŽles dont les privilĂšges sont spĂ©cifiquement dĂ©finis pour l’action que vous effectuez. Par exemple, vous pouvez avoir des rĂŽles distincts pour les dĂ©veloppeurs qui crĂ©ent des UDFs, pour les analystes qui interrogent les donnĂ©es de journalisation et de trace collectĂ©es, etc.

    Pour en savoir plus sur les rĂŽles, voir Changer de rĂŽle principal et Meilleures pratiques liĂ©es au contrĂŽle d’accĂšs.

Configuration de la base de donnĂ©es, de l’entrepĂŽt et de l’accĂšs¶

Dans cette section, vous allez créer un entrepÎt et une base de données dont vous aurez besoin pour le tutoriel. Vous commencerez également à utiliser le rÎle ACCOUNTADMIN, qui est nécessaire pour exécuter certaines des instructions de ce tutoriel.

Vous crĂ©ez une base de donnĂ©es dans laquelle vous crĂ©erez ultĂ©rieurement la table des Ă©vĂ©nements et la fonction dĂ©finie par l’utilisateur. Vous pouvez supprimer tous les objets que vous avez créés dans le tutoriel, y compris la base de donnĂ©es et l’entrepĂŽt, lorsque vous n’en avez plus besoin.

Pour crĂ©er une base de donnĂ©es et un entrepĂŽt Ă  utiliser dans le tutoriel :

  1. Connectez-vous Ă  Snowsight.

  2. Passez au rĂŽle ACCOUNTADMIN.

  3. Ouvrez Projects » Worksheets.

  4. Sélectionnez + » SQL Worksheet.

  5. Renommez la nouvelle feuille de calcul en Logging-tracing tutorial.

  6. Dans la nouvelle feuille de calcul, collez et exĂ©cutez l’instruction suivante pour crĂ©er une base de donnĂ©es. La nouvelle base de donnĂ©es n’est destinĂ©e qu’à ce tutoriel.

    CREATE OR REPLACE DATABASE tutorial_log_trace_db;
    
    Copy
  7. Collez et exĂ©cutez l’instruction suivante pour crĂ©er un entrepĂŽt. Le nouvel entrepĂŽt n’est destinĂ© qu’à ce tutoriel.

    CREATE OR REPLACE WAREHOUSE tutorial_log_trace_wh
      WAREHOUSE_TYPE = STANDARD
      WAREHOUSE_SIZE = XSMALL;
    
    Copy

Dans cette section, vous mettez en place les Ă©lĂ©ments dont vous avez besoin pour le tutoriel. Dans la section suivante, vous allez crĂ©er une table d’évĂ©nements pour stocker les donnĂ©es d’enregistrement et de suivi.

CrĂ©er une table d’évĂ©nements¶

Dans cette section, vous allez crĂ©er une table d’évĂ©nements. Lorsque le code de votre gestionnaire Ă©met des messages de journal et des donnĂ©es de trace, Snowflake enregistre les donnĂ©es Ă©mises dans les lignes de la table d’évĂ©nements. Vous pouvez interroger la table des Ă©vĂ©nements pour analyser les donnĂ©es.

Vous devez crĂ©er une table d’évĂ©nements pour collecter les donnĂ©es du journal et de la trace. Une table d’évĂ©nements utilise toujours la structure prĂ©dĂ©finie dĂ©finie par Snowflake.

Important

Pour complĂ©ter cette section, vous devez ĂȘtre en mesure d’utiliser le rĂŽle ACCOUNTADMIN, qui est nĂ©cessaire pour modifier un compte afin que la nouvelle table d’évĂ©nements soit la table d’évĂ©nements active du compte.

Pour crĂ©er la table d’évĂ©nements, vous devez utiliser un rĂŽle avec le privilĂšge CREATE EVENT TABLE attribuĂ©.

Pour crĂ©er la table d’évĂ©nements et en faire la table d’évĂ©nements active pour le compte :

  1. Collez et exĂ©cutez l’instruction suivante pour crĂ©er une table d’évĂ©nements.

    CREATE OR REPLACE EVENT TABLE tutorial_event_table;
    
    Copy

    C’est dans cette table que Snowflake stocke les journaux et les donnĂ©es de trace.

  2. Collez et exĂ©cutez l’instruction suivante pour modifier le compte de sorte que la table d’évĂ©nements que vous avez créée soit active pour le compte.

    USE ROLE ACCOUNTADMIN;
    
    ALTER ACCOUNT SET EVENT_TABLE = tutorial_log_trace_db.public.tutorial_event_table;
    
    Copy

    Cette instruction dĂ©finit la nouvelle table d’évĂ©nements comme la table que Snowflake doit utiliser pour stocker les messages de journal et les donnĂ©es de trace des gestionnaires du compte courant. Vous ne pouvez avoir qu’une seule table d’évĂ©nements active pour un compte.

Dans cette section, vous avez créé une table d’évĂ©nements. Dans la section suivante, vous commencerez Ă  Ă©mettre des messages de journal que Snowflake stockera dans la table.

Émettre des messages de journal¶

Dans cette section, vous allez crĂ©er une fonction dĂ©finie par l’utilisateur (UDF) avec un code de gestionnaire Python qui Ă©met des messages de journalisation. Lorsque votre code Ă©met des messages de journal, Snowflake collecte les donnĂ©es du message et les stocke dans la table d’évĂ©nements que vous avez créée.

Snowflake prend en charge les APIs pour enregistrer les messages de chaque langage de gestionnaire pris en charge. Pour les gestionnaires que vous écrivez en Python, vous pouvez utiliser le module logging de la bibliothÚque standard de Python.

Pour crĂ©er une UDF qui Ă©met des messages de journal :

  1. Collez et exĂ©cutez l’instruction suivante pour dĂ©finir le niveau de journalisation sur INFO.

    ALTER SESSION SET LOG_LEVEL = INFO;
    
    Copy

    Ceci spĂ©cifie la sĂ©vĂ©ritĂ© des messages de journalisation que Snowflake doit capturer lors de l’exĂ©cution de l’UDF. Dans ce cas, le niveau autorise tous les messages, de l’informatif (INFO) au plus grave (FATAL).

  2. Collez et exĂ©cutez l’instruction suivante pour crĂ©er une fonction dĂ©finie par l’utilisateur.

    CREATE OR REPLACE FUNCTION log_trace_data()
    RETURNS VARCHAR
    LANGUAGE PYTHON
    RUNTIME_VERSION = 3.9
    HANDLER = 'run'
    AS $$
    import logging
    logger = logging.getLogger("tutorial_logger")
    
    def run():
      logger.info("Logging from Python function.")
      return "SUCCESS"
    $$;
    
    Copy

    Les lignes surlignĂ©es dans le code effectuent les opĂ©rations suivantes :

    • Importez le module Python logging pour que le code du gestionnaire puisse l’utiliser.

    • CrĂ©ez un enregistreur, qui expose l’interface que votre code utilisera pour enregistrer les messages.

    • Enregistrez un message au niveau INFO.

  3. Collez et exĂ©cutez l’instruction suivante pour exĂ©cuter la fonction que vous venez de crĂ©er.

    SELECT log_trace_data();
    
    Copy

    Ceci produit la sortie suivante. En outre, lorsque la fonction s’exĂ©cute, elle Ă©met un message de journal que Snowflake collecte dans la table d’évĂ©nements.

    --------------------
    | LOG_TRACE_DATA() |
    --------------------
    | SUCCESS          |
    --------------------
    

Dans cette section, vous avez Ă©mis un message de journal Ă  partir d’une UDF. Dans la section suivante, vous interrogerez la table d’évĂ©nements pour rĂ©cupĂ©rer les donnĂ©es relatives au message.

Interroger des messages du journal¶

Dans cette section, vous allez interroger la table des Ă©vĂ©nements pour connaĂźtre les donnĂ©es des messages de journal Ă©mis par l’UDF que vous avez exĂ©cutĂ©e dans la section prĂ©cĂ©dente.

Note

Plusieurs secondes peuvent s’écouler avant que les donnĂ©es d’enregistrement ou de trace Ă©mises par le code du gestionnaire ne soient enregistrĂ©es dans la table d’évĂ©nements. Si vous n’obtenez pas de rĂ©sultats immĂ©diats, rĂ©essayez dans quelques secondes.

Snowflake utilise les colonnes de la table d’évĂ©nements prĂ©dĂ©finies pour collecter et stocker les donnĂ©es de journalisation et de trace des types suivants :

  • DonnĂ©es Ă©mises par le code du gestionnaire, telles que les messages de journal et les donnĂ©es d’évĂ©nements de trace.

    Vous les trouverez dans des colonnes telles que RECORD_TYPE, RECORD, RECORD_ATTRIBUTES, etc.

  • DonnĂ©es sur le contexte dans lequel les donnĂ©es du journal ou de la trace ont Ă©tĂ© Ă©mises, telles que l’horodatage, le nom de la mĂ©thode de gestionnaire Ă  partir de laquelle les donnĂ©es ont Ă©tĂ© Ă©mises, etc.

    Vous trouverez ces données dans des colonnes telles que RESOURCE_ATTRIBUTES, TIMESTAMP et SCOPE.

Pour interroger la table d’évĂ©nements afin d’obtenir des donnĂ©es sur les messages du journal :

  1. Collez et exĂ©cutez l’instruction suivante pour interroger la table d’évĂ©nements.

    SELECT
      TIMESTAMP AS time,
      RESOURCE_ATTRIBUTES['snow.executable.name'] as executable,
      RECORD['severity_text'] AS severity,
      VALUE AS message
    FROM
      tutorial_log_trace_db.public.tutorial_event_table
    WHERE
      RECORD_TYPE = 'LOG'
      AND SCOPE['name'] = 'tutorial_logger';
    
    Copy

    Certaines colonnes contiennent des donnĂ©es structurĂ©es exprimĂ©es sous forme de paires clĂ©-valeur. Dans cette requĂȘte, vous spĂ©cifiez les clĂ©s d’attribut dans une colonne en utilisant la notation par crochets comme RECORD['severity_text'].

    Vous utilisez Ă©galement la notation entre crochets (SCOPE['name']) pour spĂ©cifier que vous souhaitez sĂ©lectionner les valeurs des colonnes uniquement lorsque les entrĂ©es de journal sont Ă©mises avec l’enregistreur Python, tutorial_logger, que vous avez créé dans le code du gestionnaire.

  2. Afficher la sortie.

    -----------------------------------------------------------------------------------------------------------
    | TIME                | EXECUTABLE                           | SEVERITY | MESSAGE                         |
    -----------------------------------------------------------------------------------------------------------
    | 2023-04-19 22:00:49 | "LOG_TRACE_DATA():VARCHAR(16777216)" | "INFO"   | "Logging from Python function." |
    -----------------------------------------------------------------------------------------------------------
    

    La sortie illustre la façon dont les colonnes prĂ©dĂ©finies de la table d’évĂ©nement contiennent chacune des parties des donnĂ©es collectĂ©es. Pour les valeurs EXECUTABLE et SEVERITY, vous avez utilisĂ© la notation entre crochets pour spĂ©cifier les attributs dont vous voulez les valeurs.

    Colonne de sortie

    Description

    TIME

    L’heure Ă  laquelle l’entrĂ©e a Ă©tĂ© créée (Ă  partir de la colonne TIMESTAMP).

    EXECUTABLE

    Nom de l’UDF et les paramùtres (de l’attribut snow.executable.name de la colonne RESOURCE_ATTRIBUTES).

    SEVERITY

    GravitĂ© de l’entrĂ©e de journal (Ă  partir de l’attribut RECORD de la colonne severity_text).

    MESSAGE

    Message du journal (de la colonne VALUE).

Dans cette section, vous avez utilisĂ© une instruction SELECT pour interroger des donnĂ©es de journalisation. Dans la section suivante, vous mettrez Ă  jour l’UDF pour qu’elle Ă©mette des donnĂ©es de trace.

Émettre de donnĂ©es de trace¶

Dans cette section, vous mettrez Ă  jour le code du gestionnaire de l’UDF afin qu’il Ă©mette Ă©galement des donnĂ©es de trace. Lorsque votre code Ă©met des donnĂ©es de trace, Snowflake collecte les donnĂ©es et les stocke dans la table d’évĂ©nements que vous avez créée.

Les donnĂ©es de trace prĂ©sentent des qualitĂ©s structurelles, notamment des donnĂ©es d’évĂ©nements regroupĂ©es en spans et des donnĂ©es capturĂ©es sous forme de paires clĂ©-valeur, qui vous permettent de dresser un tableau plus dĂ©taillĂ© de l’activitĂ© de votre code que ne le permettent gĂ©nĂ©ralement les donnĂ©es de journalisation.

Snowflake prend en charge des APIs pour émettre des données de trace à partir de chaque langage de gestionnaire pris en charge. Pour les gestionnaires que vous écrivez en Python, vous pouvez utiliser le paquet telemetry Snowflake.

Pour mettre Ă  jour l’UDF afin d’émettre des donnĂ©es de trace :

  1. Collez et exĂ©cutez l’instruction suivante pour spĂ©cifier les donnĂ©es de trace Ă  capturer.

    ALTER SESSION SET TRACE_LEVEL = ON_EVENT;
    
    Copy

    Cette opĂ©ration dĂ©finit le niveau de trace sur ON_EVENT. Ceci spĂ©cifie que seules les donnĂ©es de trace Ă©mises explicitement par votre propre code doivent ĂȘtre capturĂ©es.

  2. Collez et exĂ©cutez l’instruction suivante pour crĂ©er une UDF qui Ă©met des donnĂ©es de trace.

    CREATE OR REPLACE FUNCTION log_trace_data()
    RETURNS VARCHAR
    LANGUAGE PYTHON
    PACKAGES = ('snowflake-telemetry-python')
    RUNTIME_VERSION = 3.9
    HANDLER = 'run'
    AS $$
    import logging
    logger = logging.getLogger("tutorial_logger")
    from snowflake import telemetry
    
    def run():
      telemetry.set_span_attribute("example.proc.run", "begin")
      telemetry.add_event("event_with_attributes", {"example.key1": "value1", "example.key2": "value2"})
      logger.info("Logging from Python function.")
      return "SUCCESS"
    $$;
    
    Copy

    En exĂ©cutant ce code, vous remplacez la fonction que vous avez créée prĂ©cĂ©demment par une fonction qui ajoute du code pour l’émission de donnĂ©es de trace. Les lignes surlignĂ©es effectuent les opĂ©rations suivantes :

    • Ajouter snowflake-telemetry-python – qui contient le paquet telemetry – Ă  l’environnement d’exĂ©cution de l’UDF.

    • Importer le paquet telemetry pour pouvoir appeler ses fonctions.

    • DĂ©finir un attribut et une valeur d’attribut au span que Snowflake crĂ©e lorsque le code s’exĂ©cute.

      Un span reprĂ©sente l’unitĂ© d’exĂ©cution d’une procĂ©dure ou d’une UDF, Ă  l’intĂ©rieur de laquelle vous pouvez ajouter plusieurs Ă©vĂ©nements.

    • Ajouter un Ă©vĂ©nement (avec ses propres attributs) Ă  enregistrer dans le cadre du span.

  3. Collez et exĂ©cutez l’instruction suivante pour exĂ©cuter la fonction que vous venez de crĂ©er.

    SELECT log_trace_data();
    
    Copy

    Ceci produit la sortie suivante. En outre, lorsque la fonction s’exĂ©cute, elle Ă©met des donnĂ©es de trace que Snowflake collecte dans la table d’évĂ©nements.

    --------------------
    | LOG_TRACE_DATA() |
    --------------------
    | SUCCESS          |
    --------------------
    

Dans cette section, vous avez Ă©mis des donnĂ©es de trace Ă  partir d’une UDF. Dans la section suivante, vous interrogerez la table d’évĂ©nements pour rĂ©cupĂ©rer les donnĂ©es relatives Ă  la trace.

Interroger des messages de trace¶

Dans cette section, vous allez interroger la table d’évĂ©nements pour obtenir des donnĂ©es de trace Ă©mises par l’UDF que vous avez exĂ©cutĂ©e dans la section prĂ©cĂ©dente.

Note

Plusieurs secondes peuvent s’écouler avant que les donnĂ©es d’enregistrement ou de trace Ă©mises par le code du gestionnaire ne soient enregistrĂ©es dans la table d’évĂ©nements. Si vous n’obtenez pas de rĂ©sultats immĂ©diats, rĂ©essayez dans quelques secondes.

La requĂȘte que vous Ă©crivez permet de rĂ©cupĂ©rer des informations contextuelles sur les Ă©vĂ©nements Ă©mis par la fonction. Ce contexte inclut le nom de la fonction qui l’a Ă©mis.

Pour rechercher des donnĂ©es de trace dans la table des Ă©vĂ©nements :

  1. Collez et exĂ©cutez l’instruction suivante pour interroger la table d’évĂ©nements des donnĂ©es de trace.

    SELECT
      TIMESTAMP AS time,
      RESOURCE_ATTRIBUTES['snow.executable.name'] AS handler_name,
      RECORD['name'] AS event_name,
      RECORD_ATTRIBUTES AS attributes
    FROM
      tutorial_log_trace_db.public.tutorial_event_table
    WHERE
      RECORD_TYPE = 'SPAN_EVENT'
      AND HANDLER_NAME LIKE 'LOG_TRACE_DATA%';
    
    Copy

    Certaines colonnes contiennent des donnĂ©es structurĂ©es exprimĂ©es sous forme de paires clĂ©-valeur. Pour ces derniĂšres, vous pouvez sĂ©lectionner les valeurs d’attribut dans une colonne en utilisant la notation par crochets, comme le montre le code.

  2. Afficher la sortie.

    -----------------------------------------------------------------------------------------------------------------------------------------------------
    | TIME                    | HANDLER_NAME                         | EVENT_NAME              | ATTRIBUTES                                             |
    -----------------------------------------------------------------------------------------------------------------------------------------------------
    | 2023-05-10 20:49:35.080 | "LOG_TRACE_DATA():VARCHAR(16777216)" | "event_with_attributes" | { "example.key1": "value1", "example.key2": "value2" } |
    -----------------------------------------------------------------------------------------------------------------------------------------------------
    

    La sortie illustre la façon dont les colonnes prĂ©dĂ©finies de la table d’évĂ©nement contiennent chacune des parties des donnĂ©es collectĂ©es. Pour les valeurs EXECUTABLE et SEVERITY, vous avez utilisĂ© la notation entre crochets pour spĂ©cifier l’attribut dont vous voulez la valeur.

    Colonne de sortie

    Description

    TIME

    Heure de crĂ©ation de l’entrĂ©e (Ă  partir de la colonne TIMESTAMP).

    HANDLER_NAME

    Nom de l’UDF et les paramùtres (de l’attribut snow.executable.name de la colonne RESOURCE_ATTRIBUTES).

    EVENT_NAME

    Nom de l’évĂ©nement ajoutĂ© avec la fonction add_event (Ă  partir de l’attribut name de la colonne RECORD).

    ATTRIBUTES

    Attributs ajoutĂ©s pour accompagner l’évĂ©nement (Ă  partir de la colonne RECORD_ATTRIBUTES).

Dans cette section, vous avez interrogĂ© la table des Ă©vĂ©nements pour obtenir des donnĂ©es de trace Ă©mises par l’UDF que vous avez Ă©crite. Dans la derniĂšre section, vous trouverez des liens vers des informations relatives Ă  ce que vous avez fait pendant le tutoriel.

En savoir plus¶

Vous avez terminĂ© ! C’est bien fait.

Dans ce tutoriel, vous avez obtenu une vue d’ensemble de la façon dont vous pouvez Ă©mettre et stocker des donnĂ©es de journal et de trace Ă  partir du code du gestionnaire, puis interroger les donnĂ©es stockĂ©es. En cours de route, vous :