Fonctionnalité de journalisation et de partage d’événements précédente — Obsolète

Cette rubrique décrit la méthode obsolète de configuration de la journalisation et du partage d’événements avant l’introduction des définitions d’événements.

Les fournisseurs qui configurent la journalisation et le partage d’événements doivent utiliser la méthode décrite dans Configurer la journalisation et le traçage des événements pour une application. Voir Considérations à prendre en compte lors de la migration depuis l’ancienne fonctionnalité de partage d’événements pour obtenir des informations sur la migration de la fonctionnalité obsolète vers la nouvelle fonctionnalité de journalisation et de partage d’événements.

Avertissement

Le processus de configuration de la journalisation et du partage d’événements décrit dans cette rubrique sera obsolète dans une future version.

Fonctionnalités de journalisation et de partage d’événements précédentes

Cette rubrique fournit des informations sur la configuration de la journalisation et du partage d’événements en tant que fournisseur. Reportez-vous à Activation de la journalisation et du partage d’événements pour une application pour connaître les exigences des consommateurs en matière de configuration de cette fonction.

Les événements de journalisation et de traçage vous permettent de collecter des informations sur une application afin de résoudre les erreurs. Grâce à la journalisation et aux événements de traçage, vous pouvez également avoir une meilleure idée du fonctionnement de votre application et l’améliorer par la suite.

Workflow de configuration de la journalisation et du partage d’événements en tant que fournisseur

En tant que fournisseur, vous pouvez configurer la journalisation et le partage d’événements pour une application en procédant comme suit :

  1. Passez en revue les considérations relatives à l’utilisation de la journalisation et du partage d’événements.

  2. Configurez la journalisation et les événements de traçage pour les fonctions et les procédures stockées.

  3. Définissez le niveau de journalisation et de traçage dans le fichier manifeste.

  4. Configurez un compte pour stocker les événements partagés.

Une fois que le consommateur a installé une application et activé la journalisation et le partage d’événements, vous pouvez voir les informations de journalisation et d’événements partagées par l’application :

Considérations relatives à l’utilisation de la journalisation et du partage d’événements

Avant d’utiliser la journalisation et le partage d’événements pour une application, les fournisseurs doivent tenir compte des points suivants :

  • Les fournisseurs sont responsables de tous les coûts associés au partage d’événements du côté du fournisseur, y compris l’ingestion et le stockage des données.

  • Les fournisseurs doivent avoir un compte pour stocker des événements partagés dans chaque région où vous souhaitez prendre en charge le partage d’événements.

  • Les fournisseurs doivent définir le niveau de journalisation et le niveau de trace par défaut pour une application dans le fichier manifeste.

Note

Le partage d’événements ne peut pas être activé pour une appli installée dans le même compte que le paquet d’application sur lequel elle est basée. Pour tester le partage d’événements pour une appli, un fournisseur doit utiliser plusieurs comptes.

Configurer la journalisation et des événements de trace dans les fonctions et les procédures

Le Native Apps Framework nécessite une table d’événements pour stocker les messages de journal et les événements de traçage générés par les fonctions et les procédures stockées dans une application.

Note

Si le consommateur d’une application ne configure pas une table d’événements et n’en fait pas la table active avant d’installer l’application, les données d’événements et de journalisation sont rejetées.

Un compte peut avoir plusieurs tables d’événements, mais une seule d’entre elles peut être définie comme table d’événements active pour un compte Snowflake à la fois. Sans table d’événements active, les messages de journal et les événements de traçage générés par l’application ne sont pas capturés. Cela est vrai même si les fonctions et procédures d’une application appellent les APIs d’événements de journalisation et de trace.

Pour créer une table d’événements, utilisez la commande CREATE EVENT TABLE. Pour plus d’informations, voir Aperçu de la table d’événements.

Une fois que le code a enregistré les messages du journal et les événements de trace, un fournisseur peut interroger les données enregistrées.

Pour plus d’informations sur l’enregistrement et l’interrogation des données de journal et de traçage, reportez-vous à ce qui suit :

Définir le niveau de journalisation et de traçage dans le fichier manifeste

Pour définir les niveaux de journalisation et de trace par défaut pour une version d’une application, définissez les paramètres log_level et trace_level dans le fichier manifeste, comme indiqué dans l’exemple suivant :

artifacts:
  setup_script: setup.sql
configuration:
  trace_level: OFF
  log_level: DEBUG
Copy

Lorsqu’un fournisseur active le traçage, une Snowflake Native App capture automatiquement les heures de début et de fin de toutes les requêtes et de tous les appels de procédures stockées.

Note

La publication d’une Snowflake Native App dont la propriété trace_level est définie sur une valeur autre que OFF peut exposer les appels à des procédures stockées cachées à tout utilisateur du compte du consommateur qui peut voir la table des événements.

Reportez-vous à Définition des niveaux de journalisation, des métriques et du traçage et Définition des niveaux de journalisation, des métriques et du traçage pour obtenir des informations sur les valeurs prises en charge pour trace_level et log_level.

Lors de son installation initiale, l”Snowflake Native App utilise les niveaux de journalisation définis dans le fichier manifeste. Si le niveau de journalisation est modifié lors d’une mise à niveau ultérieure, le nouveau niveau de journalisation prend effet après la fin du processus de mise à niveau.

Le niveau de journalisation et de traçage ne peut être défini que dans le fichier manifeste. Le consommateur n’est pas autorisé à modifier le niveau de journalisation à l’aide des commandes ALTER APPLICATION ou ALTER DATABASE.

De même, tout paramètre de niveau de session pour le niveau de journalisation est ignoré par l’application.

Configurer un compte pour stocker les événements partagés

Pour stocker des journaux et des événements partagés, un fournisseur doit sélectionner un compte qui contiendra une table d’événements. Il peut s’agir de n’importe quel compte auquel un fournisseur peut accéder. Toutefois, si une organisation compte plusieurs fournisseurs publiant des paquets d’applications, envisagez d’utiliser un compte Snowflake dédié au stockage des événements partagés du consommateur.

Les restrictions suivantes s’appliquent aux comptes utilisés pour stocker des événements partagés :

  • Vous devez utiliser le rôle ORGADMIN pour définir un compte comme compte utilisé pour stocker des événements.

  • Le compte doit avoir une table d’événements actifs.

  • Le compte spécifié ne peut pas être :

    • Un compte bloqué ou suspendu.

    • Un compte de lecteurs.

    • Un compte d’essai.

    • Un compte géré par Snowflake.

Note

Un fournisseur ne peut collecter des journaux et des événements partagés que dans la région où un consommateur installe une application. Les fournisseurs doivent configurer un compte pour stocker les événements partagés dans chaque région où les consommateurs configurent le partage d’événements pour une application.

Définir un compte comme compte d’événements

Pour faire d’un compte le compte d’événements d’une région, appelez la fonction système SYSTEM$SET_EVENT_SHARING_ACCOUNT_FOR_REGION :

CALL SYSTEM$SET_EVENT_SHARING_ACCOUNT_FOR_REGION('<snowflake_region>', '<region_group>', '<account_name>')
Copy

Où :

snowflake_region

Nom de la région où se trouve le compte, par exemple AWS_US_WEST_2, AWS_US_EAST_1.

region_group

Spécifie le groupe de régions, par exemple : PUBLIC. Reportez-vous à Groupes de régions pour plus de détails.

account_name

Spécifie le nom du compte. Si un autre compte est déjà défini comme compte d’événements dans la région spécifiée, l’exécution de cette commande remplace le compte d’événements par le compte spécifié ici. Utilisez toujours le nom du compte et non l’identificateur de compte Snowflake.

Note

Vous devez utiliser le rôle ORGADMIN pour appeler cette fonction.

Définir un compte comme compte d’événements

Pour annuler la désignation d’un compte comme compte d’événements pour une région, appelez la fonction système SYSTEM$UNSET_EVENT_SHARING_ACCOUNT_FOR_REGION :

CALL SYSTEM$UNSET_EVENT_SHARING_ACCOUNT_FOR_REGION('<snowflake_region>', '<region_group>', '<account_name>')
Copy

Où :

snowflake_region

Nom de la région où se trouve le compte, par exemple AWS_US_WEST_2, AWS_US_EAST_1.

region_group

Spécifie le groupe de régions, par exemple : PUBLIC.

account_name

Spécifie le nom du compte. Utilisez toujours le nom du compte et non l’identificateur de compte Snowflake.

Note

Vous devez utiliser le rôle ORGADMIN pour appeler cette fonction.

Afficher des comptes d’événements dans l’organisation du fournisseur

Pour afficher les comptes d’événements dans l’organisation d’un fournisseur, appelez la fonction système SYSTEM$SHOW_EVENT_SHARING_ACCOUNTS :

CALL SYSTEM$SHOW_EVENT_SHARING_ACCOUNTS()
Copy

Note

Vous devez utiliser le rôle ORGADMIN pour appeler cette fonction.

Cette fonction système renvoie une chaîne au format JSON contenant une liste des comptes d’événements de l’organisation. Étant donné que les métadonnées mettent un certain temps à se propager dans toutes les régions, cette fonction peut accuser un certain retard lorsqu’elle affiche le dernier compte d’événements, après que l’utilisateur a défini un compte d’événements pour l’organisation ou annulé sa désignation en tant que telle.

Voir les niveaux d’événements de journalisation et de trace définis pour un paquet d’application

Utilisez la commande DESCRIBE APPLICATION pour afficher le niveau de journalisation d’une application, comme le montre la commande suivante :

DESC APPLICATION HelloSnowflake;
Copy

Utilisez la commande SHOW VERSIONS pour voir le niveau de journalisation des versions d’application définies dans un paquet d’application, comme le montre l’exemple suivant :

SHOW VERSIONS
  IN APPLICATION PACKAGE HelloSnowflake;
Copy

Voir les journaux et les événements dans la table d’événements

Pour voir les journaux et les événements stockés dans la table des événements, utilisez la commande SELECT comme indiqué dans l’exemple suivant :

SELECT * FROM EVENT_DB.EVENT_SCHEMA.MY_EVENT_TABLE
Copy

Informations sur les événements partagés disponibles par le fournisseur

Les sections suivantes décrivent les informations que le Native Apps Framework partage avec les fournisseurs.

Contexte de l’événement de l’application partagé avec le fournisseur

Pour aider les fournisseurs à identifier facilement la source des événements partagés, les champs suivants sont remplis dans la colonne RESOURCE_ATTRIBUTES de la table des événements lorsqu’ils sont partagés avec le fournisseur :

  • snow.application.package.name

  • snow.application.consumer.organization

  • snow.application.consumer.name

  • snow.listing.name

  • snow.listing.global_name

Champs non partagés avec le fournisseur

Afin de protéger les informations relatives au consommateur, les champs suivants de la colonne RESOURCE_ATTRIBUTES ne sont pas partagés avec le fournisseur :

  • snow.database.id

  • snow.database.name

  • snow.schema.id

  • snow.executable.id

  • snow.owner.name

  • snow.owner.id

  • snow.warehouse.name

  • snow.warehouse.id

  • snow.query.id

  • snow.session.id

  • snow.session.role.primary.name

  • snow.session.role.primary.id

  • snow.user.name

  • snow.user.id

  • db.user

Au lieu de partager directement les champs snow.database.name et snow.query.id avec le fournisseur, Snowflake partage les valeurs de hachage (SHA-1) de ces deux champs dans les champs suivants :

  • snow.database.hash

  • snow.query.hash

Snowflake fournit la fonction SHA-1 utilisée pour masquer ces attributs. Les consommateurs peuvent calculer les valeurs de hachage pour le nom de la base de données et l’identifiant de la requête, et les utiliser comme valeurs de référence lorsqu’ils contactent le fournisseur.

Déterminer si le partage d’événements est activé dans le compte du consommateur

Dans certains contextes, un fournisseur peut avoir besoin de déterminer si le partage d’événements a été activé dans le compte d’un consommateur. Par exemple, un fournisseur peut avoir besoin de désactiver une fonctionnalité de l’application si la table d’événements n’est pas disponible.

Pour déterminer si le partage d’événements est activé dans un compte de consommateur, les fournisseurs peuvent appeler les fonctions système suivantes lorsqu’ils définissent la logique de l’appli :

  • IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER

    Renvoie TRUE si l’appli active le partage d’événements et qu’une table d’événements active est disponible dans le compte du consommateur. Renvoie FALSE, sinon.

  • IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT

    Renvoie TRUE si l’appli a été installée dans le même compte que le paquet d’application sur lequel elle est basée. Renvoie FALSE dans le cas contraire.

Déterminer si le partage d’événements est activé à l’aide de Python Permission SDK

Python Permission SDK propose les fonctions suivantes pour déterminer si le partage d’événements est activé sur le compte d’un consommateur :

  • is_event_sharing_enabled()

    Renvoie TRUE si la propriété SHARE_EVENTS_WITH_PROVIDER est vraie et si le compte du consommateur a une table d’événements active configurée. Renvoie FALSE, sinon.

  • is_application_local_to_package()

    Renvoie TRUE si l’application se trouve sur le même compte que le paquet d’application. Renvoie FALSE, sinon.

Déterminer si le partage d’événements est activé en utilisant SQL

L’exemple suivant montre comment appeler une procédure stockée lorsque le partage d’événements est activé dans le compte du consommateur.

Considérez la procédure stockée SQL suivante qui crée une fonction pour calculer la somme de deux nombres :

CREATE OR ALTER VERSIONED SCHEMA app_schema;

CREATE OR REPLACE PROCEDURE app_schema.hidden_sum(num1 float, num2 float)
RETURNS FLOAT
LANGUAGE SQL
EXECUTE AS OWNER
AS $$
  DECLARE
    SUM FLOAT;
  BEGIN
    SYSTEM$LOG('INFO', 'CALCULATE THE SUM OF TWO NUMBERS');
    SUM := :NUM1 + :NUM2;
    RETURN SUM;
  END;
$$;
Copy

Ajoutées au script d’installation de l’application, ces commandes SQL créent la procédure stockée hidden_sum dans le compte du consommateur lors de l’installation de l’appli. Cependant, cette procédure stockée n’est pas visible pour les consommateurs car le privilège USAGE n’est pas accordé à un rôle d’application sur la procédure stockée.

L’exemple suivant montre comment vous pouvez utiliser les valeurs renvoyées par les fonctions système IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER et IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT pour appeler la procédure stockée hidden_sum.

CREATE OR REPLACE PROCEDURE app_schema.sum(num1 float, num2 float)
RETURNS STRING
LANGUAGE SQL
EXECUTE AS OWNER
AS $$
    BEGIN
      IF (SYSTEM$IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT() or SYSTEM$IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER()) THEN
        CALL APP_SCHEMA.HIDDEN_SUM(:NUM1, :NUM2);
      ELSE
        -- notify consumers that they need to enable event sharing
        RETURN 'Sorry you can\'t access the API, please enable event sharing.';
      END IF;
    END;
$$;


CREATE APPLICATION ROLE IF NOT EXISTS ADMIN_ROLE;
GRANT USAGE ON SCHEMA APP_SCHEMA TO APPLICATION ROLE ADMIN_ROLE;
Copy

Dans cet exemple, la procédure stockée sum teste les valeurs des procédures stockées IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER et IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT. Si l’une de leurs valeurs est true, la procédure stockée sum appelle la procédure stockée hidden_sum.

Demander le partage d’événements aux consommateurs à l’aide de Python Permission SDK

Un fournisseur peut utiliser Python Permission SDK pour créer une appli Streamlit afin d’inviter les consommateurs à activer le partage d’événements dans leur compte.

Le SDK fournit la méthode request_event_sharing() qui affiche une boîte de dialogue dans Snowsight qui invite le consommateur à activer le partage d’événements dans son compte. Si la table d’événements n’existe pas dans le compte du consommateur, la boîte de dialogue permet au consommateur de définir la table d’événements s’il utilise le rôle ACCOUNTADMIN.

Exemple : utilisation de Python Permission SDK avec des tables d’événements

L’exemple suivant de Streamlit montre comment utiliser Python Permission SDK pour effectuer les opérations suivantes :

  • Déterminez si le partage d’événements est activé.

  • Si le partage d’événements est activé, appelez la fonction critical_feature_that_requires_event_sharing().

  • Si le partage d’événements n’est pas activé, appelez la fonction request_event_sharing() pour afficher une boîte de dialogue dans Snowsight qui invite le consommateur à activer le partage d’événements.

import streamlit as st
import snowflake.permissions as permissions

def critical_feature_that_requires_event_sharing():
  st.write("critical_feature_that_requires_event_sharing")

def main():
  if permissions.is_event_sharing_enabled() or permissions.is_application_local_to_package():
     critical_feature_that_requires_event_sharing()
  else:
     permissions.request_event_sharing()

if __name__ == "__main__":
  main()
Copy

Dans cet exemple, la méthode critical_feature_that_requires_event_sharing() n’est appelée que si l’une des conditions suivantes est remplie :

  • Le partage d’événements est activé et la table d’événements existe.

  • La Snowflake Native App se trouve sur le même compte que le paquet d’application.

Si aucune de ces conditions n’est remplie, l’appli Streamlit appelle la méthode request_event_sharing() qui invite le consommateur à sélectionner une table d’événements.

Pour plus d’informations, voir Déterminer si le partage d’événements est activé dans le compte du consommateur.