Kit SDK .NET Core Trace basé sur la configuration

Le kit SDK .NET Core Trace basé sur la configuration permet une spécification déclarative des spans, et des balises qu'ils doivent porter, et les crée en exécutant certaines méthodes de votre application.

L'approche déclarative est légèrement plus expressive que l'utilisation du SDK de traçage basé sur le code, même si elle n'offre pas toutes les fonctionnalités.

Avant de mettre en place un traçage personnalisé, consultez les bonnes pratiques en matière de traçage.

Limitation de responsabilité

Le kit SDK basé sur la configuration est fragile face aux modifications de votre application. Vous pouvez renommer une classe ou une méthode, et soudainement, la configuration ne correspond plus, et vous perdez vos données de traçage. Dans la mesure du possible, nous vous recommandons d'utiliser le SDK d'.NET Core, qui s'adapte bien mieux aux modifications du code et offre davantage de fonctionnalités pour vous aider à atteindre vos objectifs.

Configuration

La configuration est définie dans le configuration.yaml fichier.

REMARQUE : les modifications apportées à la configuration du kit SDK .NET Core Trace basé sur la configuration sont automatiquement prises en compte par l'agent Instana. Les applications déjà instrumentées doivent être redémarrées pour utiliser la configuration modifiée.
Remarque : le SDK de traçage .NET Core basé sur la configuration est disponible dans la version des paquets 1.191.20 NuGet et dans le capteur .NET Core1.0.28 ou une version ultérieure. Avec les versions de package Nuget antérieures à la version 1.193.4, il s'agit d'une fonctionnalité optionnelle. Pour l'activer, définissez la variable d'environnement INSTANA_NETCORE_SDKCONFIG sur 1 afin de l'activer. La version > = 1.193.4 n'a plus besoin de ce commutateur.

Format

La liste suivante décrit le format général de la configuration :

# .NET Full Framework Tracing
com.instana.plugin.netcore:
  instrumentation:
    sdk:
      targets:
        - match:
            type: class
            class: '<type-name>'
            method: '<method-name>'
            arguments: <number of arguments>
          span:
            name: '<span-name>'
            type: 'ENTRY' | 'EXIT' | 'INTERMEDIATE'
            tags:
              - name: '<name of tag>'
                kind: argument
                index: <0-based index of the method's argument>
              - name: '<name of tag>'
                kind: constant
                index: '<constant value>'
              - name: '<name of tag>'
                kind: return

Plusieurs cibles peuvent être définies dans la clé targets, chacune indiquant un span à créer. L'objet match d'une méthode target permet de déterminer à quelle méthode l'instrumentation doit s'appliquer. L'objet span indique comment générer le span, y compris son nom (qui est utilisé, par exemple, dans Analyse illimitée pour le filtre call.name), ainsi que les balises qui doivent être définies.

Correspondance des méthodes à instrumenter

Remarque : le SDK basé sur la configuration ne prend actuellement en charge que la correspondance des méthodes au sein des classes. L'instrumentation basée sur les interfaces ou les classes de base (traversant le chemin d'héritage) n'est pas encore prise en charge.

Cet objet décrit le point de code auquel une instrumentation doit avoir lieu :

  • type : type du code à instrumenter. Valeurs prises en charge :
  • class, correspondance avec une classe concrète
  • name: Nom complet de la classe, de l'interface ou de la classe de base à rechercher. Pour les classes imbriquées, la notation a.b.c.OutsideClass$NestedClass est requise
  • method : nom de la méthode de la classe, de l'interface ou de la classe de base spécifiée dont un appel doit être enregistré
  • arguments : nombre d'arguments admis par la méthode (seules les surcharges avec ce nombre d'arguments seront mises en correspondance). 0 si aucun argument n'est transmis.

Spécification de la présentation des spans

Cet objet décrit les propriétés du span qui sera créé si la méthode décrite dans match est appelée :

  • name : nom du span
  • type : type de span. Valeurs prises en charge :
    • ENTRY, utilisé pour indiquer les appels « entrants » depuis les systèmes externes
    • INTERMEDIATE, utilisé pour capturer les appels internes aux méthodes « intéressantes » (par défaut)
    • EXIT, utilisé pour indiquer les appels « sortants » vers les systèmes externes
  • tags : liste des balises/annotations à capturer et comment obtenir leurs valeurs (facultatif). Valeurs prises en charge :
    • constant, capture une valeur constante
      • kind: constant
      • name : nom de la balise à créer
      • value : valeur constante de la balise à créer
    • return, capture la valeur de retour de l'appel de méthode
      • kind: return
      • name : nom de la balise à créer. La valeur est la valeur de l'objet renvoyé
    • argument, capture une valeur d'argument spécifique de l'appel de méthode
      • kind: argument
      • name : nom de la balise à créer
      • index : index basé sur 0 de l'argument à capturer en tant que valeur de la balise
Remarque : si la valeur capturée est null ou Nullable<T> sans valeur, la balise définie ne sera pas ajoutée. Les périodes pour lesquelles il manque des balises peuvent être recherchées dans Unbounded Analytics à l'aide de is not present l'opérateur associé au call.tag filtre.

Spans erronés

Si une valeur Exception sort du cadre d'une méthode instrumentée, la plage sera automatiquement signalée comme erronée, et la valeur de Exception::Message sera définie comme message d'erreur, que vous pourrez rechercher dans Unbounded Analytics à l'aide de la call.error.message balise.

Exemple

L'extrait de code suivant montre un exemple de configuration de la façon dont une application traitant des travaux par lots peut être tracée :

com.instana.plugin.clr:
  instrumentation:
    sdk:
      targets:
        - match:
            type: class
            class: Example.BatchJobStarter
            method: ExecuteJob
            arguments: 1
          span:
            name: BatchJob
            type: ENTRY
            tags:
              - name: endpoint
                kind: constant
                value: BatchJob
              - name: batch.job
                kind: argument
                index: 0
        - match:
            type: class
            class: Example.ProprietaryDatabaseClient
            method: ExecuteQuery
            arguments: 1
          span:
            name: DatabaseCall
            type: EXIT
            tags:
              - name: db.connection_string
                kind: constant
                value: 'Data Source=SomeServer;Initial Catalog=SomeDB'
              - name: db.statement
                kind: argument
                index: 0

Tout d'abord, la méthode ExecuteJob dans la classe Example.BatchJobStarter est instrumentée pour créer des spans d'entrée avec le nom BatchJob, l'annotation endpoint avec la valeur constante BatchJob et l'annotation batch.job avec le premier argument comme valeur.

En outre, les appels de base de données sortants pendant le traitement par lots, c'est-à-dire les appels de la méthode ExecuteQuery dans Example.ProprietaryDatabaseClient, créeront des spans de sortie portant le nom DatabaseCall et l'annotation db.connection_string avec la valeur constante Data Source=SomeServer;Initial Catalog=SomeDB et l'annotation db.statement avec le premier argument de l'appel de méthode.

Le traitement d'un nouveau lot avec ExecuteJob démarrera une nouvelle trace, et les mises à jour ultérieures de la base de données avec ExecuteQuery y seront répertoriées en tant que spans enfants. Toutes les fonctions Instana, comme l'Analyse illimitée, peuvent être utilisées de la même manière que les traces créées avec Instana AutoTrace.

Limitations

Les restrictions suivantes s'appliquent au kit SDK .NET Core Trace basé sur la configuration.

  • L'instrumentation des constructeurs n'est pas prise en charge.
  • L'instrumentation des méthodes statiques n'est pas prise en charge.
  • Le démarrage d'un span dans une méthode et sa fermeture dans une autre ne sont pas pris en charge, c'est-à-dire que le kit SDK basé sur la configuration n'a pas d'équivalent pour MethodPairInstrumentation utilisé dans l'autotrace.
  • La capture de tous les arguments ou de la valeur de retour sans la création explicite d'un tag n'est pas prise en charge.
  • La spécification de modèles de noms pour les classes ou les méthodes n'est pas prise en charge.
  • La restauration d'un contexte de trace avant la création d'un span n'est pas prise en charge.