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 :
Connectez-vous Ă Snowsight.
Ouvrez Projects » Worksheets.
Sélectionnez + » SQL Worksheet.
Renommez la nouvelle feuille de calcul en
Logging-tracing tutorial
.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;
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;
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 :
Collez et exĂ©cutez lâinstruction suivante pour crĂ©er une table dâĂ©vĂ©nements.
CREATE OR REPLACE EVENT TABLE tutorial_event_table;
Câest dans cette table que Snowflake stocke les journaux et les donnĂ©es de trace.
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;
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 :
Collez et exĂ©cutez lâinstruction suivante pour dĂ©finir le niveau de journalisation sur
INFO
.ALTER SESSION SET LOG_LEVEL = INFO;
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
).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" $$;
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
.
Collez et exĂ©cutez lâinstruction suivante pour exĂ©cuter la fonction que vous venez de crĂ©er.
SELECT log_trace_data();
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 :
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';
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.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
etSEVERITY
, 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 :
Collez et exĂ©cutez lâinstruction suivante pour spĂ©cifier les donnĂ©es de trace Ă capturer.
ALTER SESSION SET TRACE_LEVEL = ON_EVENT;
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.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" $$;
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 paquettelemetry
â Ă 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.
Collez et exĂ©cutez lâinstruction suivante pour exĂ©cuter la fonction que vous venez de crĂ©er.
SELECT log_trace_data();
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 :
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%';
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.
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
etSEVERITY
, 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âattributname
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 :
Avez créé une table dâĂ©vĂ©nements. Pour plus dâinformations sur les tables dâĂ©vĂ©nements, voir ce qui suit :
Pour plus de dĂ©tails sur la mise en place dâune table dâĂ©vĂ©nements, voir Aperçu de la table dâĂ©vĂ©nements.
Pour des informations de rĂ©fĂ©rence sur les colonnes qui composent une table dâĂ©vĂ©nements, voir Colonnes de table dâĂ©vĂ©nements.
Pour en savoir plus sur les possibilitĂ©s offertes par les tables dâĂ©vĂ©nements, voir Utilisation des tables dâĂ©vĂ©nements.
Avez créé une fonction dĂ©finie par lâutilisateur (UDF) qui Ă©met des donnĂ©es de journal et de trace. Pour des informations connexes, consultez les rubriques suivantes :
Pour une vue dâensemble de la prise en charge de la journalisation dans Snowflake, voir Enregistrement de messages Ă partir de fonctions et de procĂ©dures. Pour plus dâinformations sur la journalisation avec Python, voir Enregistrement de messages Ă partir de fonctions et de procĂ©dures et le module de journalisation de la bibliothĂšque standard de Python.
Pour plus de détails sur la définition des niveaux, voir Définition des niveaux de journalisation, des métriques et du traçage.
Pour une vue dâensemble de la prise en charge du traçage, voir ĂvĂ©nements de trace pour les fonctions et les procĂ©dures. Pour plus dâinformations sur le traçage avec Python, voir Ămettre des Ă©vĂ©nements de trace en Python.
Pour des informations gĂ©nĂ©rales sur la crĂ©ation dâUDFs, voir Vue dâensemble des fonctions dĂ©finies par lâutilisateur.
Interrogation de la table des Ă©vĂ©nements pour les donnĂ©es de journalisation et de trace. Pour plus dâinformations sur les tables dâĂ©vĂ©nements, reportez-vous Ă ce qui suit :
Pour une vue plus complĂšte de la maniĂšre dâinterroger les donnĂ©es du journal, voir Affichage des messages de journalisation.
Pour savoir comment interroger des données de trace, voir Affichage des données de trace.
Pour plus dâinformations sur les spans et les Ă©vĂ©nements, ainsi que sur la maniĂšre dont Snowflake stocke les donnĂ©es les concernant, voir Comment Snowflake reprĂ©sente les Ă©vĂ©nements de trace.