Comment Snowflake représente les événements de trace

En interne, Snowflake utilise le modèle de données OpenTelemetry pour représenter les événements de trace dans un objet appelé span. Un span décrit une opération, telle que l’invocation d’une procédure stockée ou l’exécution d’une UDF sur un ensemble de lignes. Un span comprend l’heure de début et l’heure de fin de l’opération.

Astuce

Pour les lignes directrices à garder à l’esprit lors de l’ajout d’événements de trace, se référer à Lignes directrices générales pour l’ajout d’événements de trace.

Comment Snowflake émet des événements de trace

Lorsqu’une procédure stockée ou une UDF est appelée, Snowflake peut l’exécuter en parallèle, chaque unité d’exécution parallèle s’exécutant sur un ensemble différent de lignes. Tous les événements de trace qui sont émis sont liés à leur unité d’exécution et sont enveloppés dans le même span.

Les événements de trace ne sont émis qu’après la fin de l’unité d’exécution. Si l’unité d’exécution échoue avant la fin, l’émission des événements de trace de cette unité d’exécution n’est pas garantie.

Les événements de trace provenant de différentes unités d’exécution sont stockés dans des lignes distinctes de la table des événements (c’est-à-dire dans des spans différents).

Note

Comme des UDFs sont appliquées par ligne de la table d’entrée, les appels aux APIs d’événements de trace dans votre UDF sont exécutés pour chaque ligne de la table d’entrée. L’ajout d’un événement de trace pour chaque ligne est déconseillé dans la plupart des cas. Il y a une limite de 128 événements par unité d’exécution.

Exemple : Émettre des événements à partir d’une procédure Java

L’exemple suivant illustre la manière dont vous pouvez émettre des événements à partir du code du gestionnaire. Il montre également comment les données d’événements générées sont stockées dans une table d’événements.

Procédure stockée avec gestionnaire Java

Le code Java de l’exemple suivant illustre la manière dont vous pouvez ajouter des événements à un span, ainsi que des données d’attribut. Pour plus d’informations sur des APIs pour les langages de gestionnaire, voir Traçage des événements à partir du code du gestionnaire.

CREATE OR REPLACE PROCEDURE test_stored_proc()
RETURNS STRING
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES=('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest')
HANDLER = 'MyClass.run'
AS
$$
  import com.snowflake.snowpark_java.Session;
  import com.snowflake.telemetry.Telemetry;
  import io.opentelemetry.api.common.AttributeKey;
  import io.opentelemetry.api.common.Attributes;
  import io.opentelemetry.api.common.AttributesBuilder;

  public class MyClass {

    public String run(Session session) {
        // Adding an event without attributes.
        Telemetry.addEvent("testEvent");

        // Adding an event with attributes.
        Attributes eventAttributes = Attributes.of(
            AttributeKey.stringKey("key"), "run",
            AttributeKey.longKey("result"), Long.valueOf(123));
        Telemetry.addEvent("testEventWithAttributes", eventAttributes);

        // Setting span attributes of different types.
        Telemetry.setSpanAttribute("example.boolean", true);
        Telemetry.setSpanAttribute("example.long", 2L);
        Telemetry.setSpanAttribute("example.double", 2.5);
        Telemetry.setSpanAttribute("example.string", "testAttribute");

        return "SUCCESS";
    }
  }
$$;
Copy

Données enregistrées sur le span

Après l’exécution réussie de la fonction ou de la procédure, Snowflake rend l’objet de span OpenTelemetry sous forme d’objets dans les colonnes de la table d’événements, comme le montrent les tables suivantes.

Un span peut avoir ses propres attributs. Étant donné qu’un span représente une procédure stockée et une unité d’exécution d’UDF, il peut être utile de définir des attributs au niveau du span en vue d’une analyse ultérieure des données. Pour plus d’informations sur la définition des attributs de span, reportez-vous au contenu spécifique au langage dans lequel vous écrivez le code du gestionnaire. Pour une liste de ces langues, voir Traçage des événements à partir du code du gestionnaire.

Un span peut contenir un nombre maximal de 128 événements de trace et un nombre maximal de 128 attributs de span.

  • Si le nombre d’événements de trace dépasse la limite, les événements sont abandonnés comme suit, en fonction du langage du gestionnaire :

    • Pour les gestionnaires Python, les événements sont abandonnés dans l’ordre dans lequel ils ont été ajoutés (en d’autres termes, dans l’ordre du « premier entré-premier sorti »).

    • Pour les gestionnaires écrits en Java, JavaScript, Scala et dans Exécution de scripts Snowflake, les nouveaux événements sont abandonnés une fois la limite atteinte.

  • Si le nombre d’attributs de spans dépasse la limite, aucun attribut de span ne peut être ajouté.

Note

Depuis novembre 2022, toutes les clés dropped_*_count ne sont pas définies pour JavaScript parce que le SDK de traçage OpenTelemetry JavaScript ne fait pas état des comptes abandonnés.

Description

Données

Span enregistré par Snowflake pour l’exécution de la procédure contenant le code du gestionnaire.

  • Horodatage de départ de la colonne START_TIMESTAMP :

    2023-03-21 23:12:06.231

  • Horodatage de fin de la colonne TIMESTAMP :

    2023-03-21 23:12:06.944

  • Données de la colonne RECORD :

    {
      "kind": "SPAN_KIND_INTERNAL",
      "name": "snow.auto_instrumented",
      "status": {
        "code": "STATUS_CODE_UNSET"
      }
    }
    
    Copy

Attributs ajoutés par le code du gestionnaire pour le span.

  • Données de la colonne RECORD_ATTRIBUTES :

    {
      "example.boolean": true,
      "example.double": 2.5,
      "example.long": 2,
      "example.string": "testAttribute"
    }
    
    Copy

Données d’événements enregistrées

Le span contient une liste d’événements de trace avec des horodatages qui capturent le moment où les événements de trace ont été ajoutés. Ce n’est pas montré ici : le span a un trace_id qui est l’ID de requête sans les tirets. Le span contient également des valeurs générées par le système pour les clés span_id et name. Les événements qui font partie du span partagent le même span_id.

Les données suivantes ont été enregistrées pour l’événement testEvent.

Description

Données

Nom de l’événement

  • Horodatage de la colonne TIMESTAMP :

    2023-03-21 23:12:06.939

  • Données de la colonne RECORD :

    {
      "dropped_attributes_count": 0,
      "name": "testEvent"
    }
    
    Copy

Les données suivantes ont été enregistrées pour l’événement testEventWithAttributes.

Description

Données

Nom de l’événement

  • Horodatage de la colonne TIMESTAMP :

    2023-03-21 23:12:06.940

  • Données de la colonne RECORD :

    {
      "dropped_attributes_count": 0,
      "name": "testEventWithAttributes"
    }
    
    Copy

Attributs de l’événement

  • Données de la colonne RECORD_ATTRIBUTES :

    {
      "key": "run",
      "result": 123
    }
    
    Copy