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

Par défaut, lorsque vous avez mis en place une table d’événements, Snowflake enregistre automatiquement les exceptions non gérées dans les procédures et les gestionnaires d’UDF de la 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. Vous pouvez désactiver cette fonctionnalité afin que les exceptions non gérées ne soient pas automatiquement enregistrées.

Important

Les messages d’erreur peuvent contenir des informations sensibles. Pensez à désactiver cette fonction si vous ne souhaitez pas que des informations potentiellement sensibles soient capturées dans une table d’événements. Pour en savoir plus, voir Protection des données sensibles.

Note

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

Configuration de la journalisation et du traçage pour capturer les exceptions non gérées

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.

Données capturées pour les exceptions 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

Par défaut, Snowflake enregistre les éléments suivants dans la table d’événements pour les exceptions non gérées dans les procédures et les gestionnaires d’UDF :

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

Par défaut, Snowflake enregistre les éléments suivants dans la table d’événements pour les exceptions non gérées dans les procédures et les gestionnaires d’UDF :

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 :

  • 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).

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