Capturer des messages provenant d’exceptions non gérées

Vous pouvez avoir des exceptions non gérées dans la procédure et des gestionnaires UDF automatiquement enregistrés sous forme de messages de journal ou de trace dans une table d’événements. La capture de ces messages ne nécessite pas l’ajout de code de gestionnaire spécifique à la journalisation ou au traçage.

Note

Cette fonctionnalité est actuellement prise en charge pour le code de gestionnaire écrit uniquement en Python.

Important

Les messages d’erreur peuvent contenir des informations sensibles. Avant d’activer cette fonctionnalité, déterminez si vous souhaitez que des informations potentiellement sensibles soient capturées dans une table d’événements. Pour en savoir plus, voir Protection des données sensibles.

Activer la capture des entrées d’exception non gérées

Pour activer la capture des messages provenant d’exceptions non gérées, procédez comme suit :

  1. Mettez en place une table d’événements comme décrit dans Configuration d’une table d’événement.

  2. Définissez le paramètre ENABLE_UNHANDLED_EXCEPTIONS_REPORTING sur true.

    Pour en savoir plus sur la définition des paramètres, voir Gestion des paramètres.

  3. Définissez le niveau de journal ou de trace afin que Snowflake capture les entrées pour les exceptions non gérées. Vous pouvez capturer des entrées sous forme d’entrées de journal, d’entrées d’événements de trace, ou les deux.

    1. Pour capturer des messages sous forme d’entrées de journal, définissez le niveau de journalisation sur ERROR ou plus détaillé.

    2. Pour capturer des messages en tant qu’entrées d’événements de trace, définissez le niveau de trace sur ALWAYS ou ON_EVENT.

Données capturées pour les exceptions non gérées

Comme décrit dans Activer la capture des entrées d’exception non gérées, vous pouvez capturer les données de message sous forme d’entrée de journal, d’événement de trace ou les deux. Les données capturées diffèrent entre les entrées d’événements de journal et de trace.

Données capturées dans une entrée de journal

Lorsque vous avez activé la capture des exceptions non gérées sous forme de messages de journal, Snowflake enregistre les éléments suivants dans la table des événements :

Colonne

Données

colonne RECORD

Un attribut severity_text dont la valeur correspond au niveau d’erreur de gravité le plus élevé pour le runtime de langage actuel. Par exemple, pour un gestionnaire écrit en Python, la valeur est FATAL.

colonne RECORD_ATTRIBUTES

Les attributs suivants sont enregistrés pour une exception non gérée.

  • exception.message — Le message d’erreur.

  • exception.type — Nom de la classe de l’exception.

  • exception.stacktrace – La trace de pile de l’exception formatée par un runtime de langage.

  • exception.escapedtrue si cette entrée provient d’une exception non gérée.

colonne VALUE

La chaîne exception.

Exemple

Le code de l’exemple suivant interroge une table d’événements pour les données de journal enregistrées pour une exception non gérée par un gestionnaire d’UDF.

Pour en savoir plus sur l’interrogation d’une table d’événements pour les données de journal, consultez Accès aux données des messages enregistrés.

SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['severity_text'] AS severity,
  RECORD_ATTRIBUTES['exception.message'] AS error_message,
  RECORD_ATTRIBUTES['exception.type'] AS exception_type,
  RECORD_ATTRIBUTES['exception.stacktrace'] AS stacktrace
FROM
  my_event_table
WHERE
  RECORD_TYPE = 'LOG';
Copy

Ce qui suit est la sortie possible de la requête.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SEVERITY | ERROR_MESSAGE                                        | EXCEPTION_TYPE | STACKTRACE                                                                                                                                          |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| "FATAL"  | "could not convert string to float: '$1,000,000.00'" | "ValueError"   | "Traceback (most recent call last):\n  File \"_udf_code.py\", line 6, in compute\nValueError: could not convert string to float: '$1,000,000.00'\n" |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Données capturées dans une entrée d’événement de trace

Lorsque vous avez activé la capture des exceptions non gérées en tant qu’événements de trace, Snowflake enregistre les éléments suivants dans la table des événements :

Colonne

Données

colonne RECORD

Un attribut name dont la valeur est exception et un attribut status dont la valeur est STATUS_CODE_ERROR.

colonne RECORD_ATTRIBUTES

Les attributs suivants sont enregistrés pour une exception non gérée.

  • exception.message — Le message d’erreur.

  • exception.type — Nom de la classe de l’exception.

  • exception.stacktrace – La trace de pile de l’exception formatée par un runtime de langage.

  • exception.escapedtrue si cette entrée provient d’une exception non gérée.

Exemples

Le code dans les exemples suivants interroge une table d’événements pour les données d’événement de trace enregistrées pour une exception non gérée par un gestionnaire d’UDF.

Pour en savoir plus sur l’interrogation d’une table d’événements pour les données d’événement de trace, consultez Accès aux données de trace.

Exemple de span
SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['status']['code'] AS span_status
FROM
  my_event_table
WHERE
  record_type = 'SPAN';
Copy

Ce qui suit est la sortie possible de la requête.

-----------------------
| SPAN_STATUS         |
-----------------------
| "STATUS_CODE_ERROR" |
-----------------------
Exemple d’événement de span
SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['name'] AS event_name,
  RECORD_ATTRIBUTES['exception.message'] AS error_message,
  RECORD_ATTRIBUTES['exception.type'] AS exception_type,
  RECORD_ATTRIBUTES['exception.stacktrace'] AS stacktrace
FROM
  my_event_table
WHERE
  RECORD_TYPE = 'SPAN_EVENT';
Copy

Ce qui suit est la sortie possible de la requête.

-----------------------------------------------------------------------------------------------------------------------------------------
| EVENT_NAME  | ERROR_MESSAGE                                        | EXCEPTION_TYPE | STACKTRACE                                      |
-----------------------------------------------------------------------------------------------------------------------------------------
| "exception" | "could not convert string to float: '$1,000,000.00'" | "ValueError"   | "  File \"_udf_code.py\", line 6, in compute\n" |
-----------------------------------------------------------------------------------------------------------------------------------------

Protection des données sensibles

Étant donné que les messages de journal et de suivi des exceptions non gérées peuvent contenir des données sensibles, il convient d’envisager de prendre les mesures suivantes pour protéger ces données :

  • Désactivez la journalisation des exceptions non gérées en définissant le paramètre ENABLE_UNHANDLED_EXCEPTIONS_REPORTING sur false.

  • Prenez des mesures pour protéger les données sensibles, par exemple en procédant comme suit :

    • Améliorez votre code de gestion des exceptions afin de minimiser le risque d’exceptions non gérées.

    • Appliquez les règles d’accès aux lignes à votre table d’événements afin de limiter l’accès aux lignes contenant des informations personnellement identifiables (PII).

    • Créez une vue au-dessus de la table des événements et appliquez-y des politiques de masquage pour masquer ou supprimer des informations personnellement identifiables (PII).