Meilleures pratiques pour le traçage personnalisé

Si vous souhaitez étendre Instana AutoTrace™ ou intégrer des segments instrumentés manuellement, nous vous recommandons de suivre les bonnes pratiques suivantes.

Pour plus d'informations, consultez Instana AutoTrace.

Utilisation de spans bien annotés

Pour surveiller de manière optimale vos applications et votre infrastructure, Instana exécute un traitement et une analyse avancés sur toutes les données entrantes. Cela inclut tous les spans entrants provenant de toutes les sources.

Pour tirer le meilleur parti de l'analyse et du traitement automatiques d'Instana, l'ajout des balises appropriées aux spans permet à Instana d'analyser et d'agir de manière optimale sur les spans entrants.

Par exemple, le code suivant Python OpenTracing fournit moins d'informations.

Remarque : l'exemple suivant utilise OpenTracing à titre d'illustration, mais le principe s'applique à tout code de traçage personnalisé.
import opentracing

with opentracing.tracer.start_active_span('vanilla') as pscope:
  # ...
  # do something that takes 50ms
  # ...
  pscope.span.log_kv({"foo": "bar"})
 

A partir de ce code, nous savons seulement que c'est un intervalle nommé vanilla qui a pris 50 ms de temps. Nous ne connaissons pas son type : HTTP, RPC ou un Messagerie. Nous ne savons pas ce qui s'est passé au cours de cette période, par exemple, communication avec d'autres composants de votre infrastructure.

Si vous fournissez les balises contextuelles OpenTracing appropriées, Instana analyse et extrait des informations du span pour agir dessus.

import opentracing
import opentracing.ext.tags as ext

with opentracing.tracer.start_active_span('webserver') as pscope:
    pscope.span.set_tag(ext.SPAN_KIND, "entry")
    pscope.span.set_tag(ext.PEER_HOSTNAME, "localhost")
    pscope.span.set_tag(ext.HTTP_URL, "/python/simple/two")
    pscope.span.set_tag(ext.HTTP_METHOD, "POST")
    pscope.span.log_kv({"foo": "bar"})

    # ...
    # work that took 50ms
    # ...

    pscope.span.set_tag(ext.HTTP_STATUS_CODE, 204)
 

Ce span bien annoté fournit à Instana beaucoup plus d'informations sur ce qui s'est passé dans son contexte. À partir des balises fournies, nous savons qu'il s'agit d'une demande de serveur Web entrant à /python/simple/two et que le code d'état HTTP résultant est 204.

Un segment correctement annoté, comme l'extrait ci-dessus, permet à Instana d'extraire les services, de surveiller les connexions et leur état de santé, ce qui enrichit l'expérience offerte par votre tableau de bord.

Pour plus de détails sur cet exemple, consultez la spécification « OpenTracing », qui définit la liste officielle de toutes les balises « OpenTracing » prises en charge. La liste complète des balises prise en charge par Instana (qui est un superset des balises OpenTracing) est disponible à la fin de cette page.

Annotation des spans "intégrés"

Dans certains cas, il peut s'avérer judicieux d'ajouter des métadonnées supplémentaires à un élément « span » existant fourni par une bibliothèque fournie par l' Instana. Pour que ces données s'affichent, elles doivent être à l'intérieur de l'objet sdk.custom.tags dans la trace.

Chaque bibliothèque gère cette situation différemment. Pour comprendre comment ajouter cet objet, consultez la documentation du kit SDK de votre langue.

Démarrage de nouvelles traces avec des spans d'entrée

Dans le traçage distribué, il existe trois grands types de plages:

  • Entrée : annote la réception d'une demande, le début d'une nouvelle tâche ou la consommation d'un message
  • Intermédiaire: Annote le travail interne qui n'effectue pas ou ne reçoit pas d'appels (par exemple, affichage)
  • Exit: Annote le travail qui effectue un appel à un service distant ou qui publie un message dans une file d'attente

La balise span.kind marque le type de span signalé. Pour plus de détails, consultez span.kind le tableau à la fin de cette page ou le cahier des charges de l' OpenTracing.

Lorsque vous démarrez de nouvelles traces, commencez par un span d'entrée. Si vous ne spécifiez pas la balise span.kind, le span est un span d'entrée. En affectant à cette balise la valeur appropriée, vous améliorez le traitement, l'extraction des appels backend de visualisation et le mappage dans Instana.

Consultez l'exemple Go suivant :

// Start a new entry span and set 'kind' to Consumer (entry)
entrySpan := ot.StartSpan("RPCJobRunner")
entrySpan.SetTag(string(ext.SpanKind), string(ext.SpanKindConsumerEnum))

// Now the RPC exit span
spanName := fmt.Sprintf("%s %s", request.Service, request.Method)
clientSpan := ot.StartSpan(spanName, ot.ChildOf(entrySpan.Context()))
clientSpan.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCClientEnum))
clientSpan.SetTag("rpc.call", request.Method)

// Make the RPC call

clientSpan.Finish()
entrySpan.Finish()
 

Marquage d'un span avec une erreur

Les spans qui représentent un travail contenant une erreur, telle qu'une exception, doivent contenir les balises error et message. Pour les définitions de ces balises, voir la définition dans le tableau comme suit.

Transmission du contexte entre les microservices

Pour transmettre le contexte dans les limites, telles que les hôtes, les files d'attente et les services, le traçage distribué inclut une méthode. Cela se fait généralement avec des transporteurs tels que des en-têtes HTTP ou des en-têtes de file d'attente de messages.

Pour plus de détails, voir notre documentation sur les en-têtesHTTP.

Définition d'un nom de service

Cela est facultatif. Les noms de service sont des noms appliqués aux processus d'application surveillés. Dans la plupart des langages, le nom du meilleur service peut être automatiquement détecté en fonction du framework en cours d'utilisation ou à partir de la ligne de commande du processus.

Pour changer cela, vous pouvez définir un nom de service par traceur. Consultez l'exemple suivant pour le langage Go.

serviceName := "default"
if *isServer {
    serviceName = "rpc-client"
} else {
    serviceName = "rpc-server"
}

opts := instana.Options{Service: serviceName})
opentracing.InitGlobalTracer(instana.NewTracerWithOptions(&opts)
 

Tous les traceurs Instana OpenTracing prennent également en charge cette configuration via une variable d'environnement. Si vous définissez la variable d'environnement INSTANA_SERVICE_NAME pour le processus, la valeur est utilisée comme nom de service pour le processus. Cette option remplace la configuration de nom de service de niveau du code.

Voir également la documentation sur les techniques et les règles générales d'extraction de services d' Instana.

Définition d'un nœud final et d'un nom d'appel

Cela est facultatif. Dans de nombreux langages, les noms de nœud final et d'appel sont automatiquement détectés en fonction du type de service.

Si vous souhaitez changer cela, vous pouvez définir des noms de nœud final et d'appel par traceur. Consultez l'exemple suivant pour le langage Java.

SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "endpoint", "endpoint-name");
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "call.name", "call-name");
 

Pour plus d'informations sur les techniques et les règles générales d'extraction des terminaux d' Instana, consultez notre documentation sur les terminaux.

Remplacer la durée du span

Le kit SDK de traçage calcule automatiquement la durée de span depuis le début et la fin du span.

Il représente généralement ce que vous souhaitez mesurer mais, lorsque ce n'est pas le cas, vous pouvez le remplacer à l'aide de la balise duration.

Le format attendu est en millisecondes.

// Overwrite the span duration with 15 milliseconds.
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "duration", "15");
 

Modèles de chemin : regroupement visuel des nœuds finaux HTTP

Instana prend en charge le regroupement automatique des nœuds finaux avec des modèles de chemin. Cette fonction est prise en charge en standard avec le traçage Instana pour la plupart des frameworks. Avec OpenTracing,, une étape supplémentaire est nécessaire, comme décrit ci-dessous.

Des frameworks disposent généralement d'un modèle de chemin REST similaire à ce qui suit :

/api/query/1956-01-31/Guido-van-Rossum
/api/query/1976-04-18/Andrew-Ng
/api/query/1912-06-23/Alan-Turing
 

Ces points de terminaison similaires peuvent être regroupés en indiquant une http.path_tpl clé dans vos segments d' HTTP, avec la valeur /api/query/{birthdate}/{name}« Instana ». Ce modèle permet de regrouper automatiquement les points de terminaison qui correspondent au modèle fourni. Dans votre tableau de bord Instana, les points de terminaison HTTP seront alors regroupés en un seul point de terminaison :

/api/query/{birthdate}/{name}
 

Consultez ce qui suit pour un exemple en Go :

span := ot.GlobalTracer().StartSpan("myTemplatedSpan", ext.RPCServerOption(incomingContext))
span.SetTag("http.path_tpl", "/api/query/{birthdate}/{name}")
span.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCServerEnum))
span.SetTag(string(ext.HTTPUrl), req.URL.Path)
span.SetTag(string(ext.HTTPMethod), req.Method)
span.SetTag(string(ext.HTTPStatusCode), 200)
 

Notez que cette fonction est spécifique à Instana et n'est pas compatible avec OpenTracing.

Balises traitées

Cette section répertorie les balises spécifiques qu'Instana recherche lors de l'identification et du traitement des spans. Lorsqu'un sous-ensemble de balises tel que celui-ci est détecté pour un segment, Instana est alors en mesure de mieux traiter, analyser, visualiser et signaler les segments entrants.

Notez que les balises répertoriées comme suit sont un superset des balises OpenTracing standard. Chaque balise est marquée selon qu'elle est OpenTracing compatible avec un ou x si ce n'est pas le cas.

Certaines descriptions de balises ci-dessous sont tirées directement du document sur les conventions sémantiques de l' OpenTracing.

Catégorie

Dans le traçage distribué, il existe trois grandes catégories de spans :

  1. Instances d'entrée : instances qui reçoivent des requêtes (telles que les serveurs HTTP ou RPC ), traitent les messages d'une file d'attente ou exécutent une tâche
  2. Portées de sortie : portées qui effectuent des requêtes client (par exemple, HTTP, RPC ou une base de données), envoient des messages vers une file d'attente ou effectuent des appels vers la base de données du client
  3. Spans intermédiaires : ils représentent le travail effectué dans les applications, tel que le rendu de vue ou le traitement d'action/de contrôleur.

La balise span.kind d'un span identifie le type de span signalé. Le signalement de cette balise permet à Instana d'extraire, de traiter et de cartographier les communications entre les segments. Chez Instana, nous appelons cette communication un « appel ».

Avec ces informations, Instana peut non seulement surveiller les spans, mais également les appels entre ces derniers, ce qui permet de disposer d'informations plus précises sur la connectivité entre les systèmes. Ainsi, Instana peut également surveiller et envoyer des alertes sur l'intégrité des appels lorsque des spans sont signalés.

Balise Type Compatible OpenTracing ? Description
span.kind Chaîne client ou server pour les rôles appropriés dans une demande RPC ou HTTP, et producer ou consumer pour les rôles appropriés dans un scénario de messagerie. Les autres valeurs acceptées sont entry, exit ou intermediate qui ne sont pas compatibles avec OpenTracing.

HTTP

Les spans HTTP représentent un appel client HTTP ou un traitement de demande de serveur HTTP.

Balise Type Compatible OpenTracing ? Description
http.url Chaîne URL HTTP qualifiée complète utilisée dans la demande client HTTP ou dans le traitement serveur.
http.method Chaîne Méthode HTTP utilisée dans la demande client HTTP ou dans le traitement serveur. On peut citer par exemple « GET », « POST », « PUT », etc.
http.status_code Entier Code de statut HTTP de la demande HTTP.
http.status Entier x Alternative à http.status_code. Les deux sont prises en charge, même si une seule doit être envoyée.
http.path Chaîne x Chemin HTTP de la demande.
http.host Chaîne x Hôte distant si une demande client ou l'hôte qui traite une demande HTTP entrante.
http.params Chaîne x Paramètres de requête de la demande HTTP
http.error Chaîne x En cas d'erreur, un message d'erreur associé au span. Par exemple, « Erreur interne du serveur ».
http.header Chaîne x Signale les en-têtes personnalisés dans la relation avec le span, par exemple, "X-My-Custom-Header = afd812cab"
http.path_tpl Chaîne x Permet le regroupement visuel des noeuds finaux. Pour plus d'informations, voir la documentation Modèles de chemin .
http.route_id Chaîne x Identificateur unique de la route, tel que blog.show. Pratique avec les frameworks dans lesquels un nœud final distinct est référencé par un ID

Remarques :

  1. Une balise span.kind appropriée doit toujours être envoyée avec ces balises.
  2. Les balises http.host, http.path et http.params doivent être envoyées uniquement à la place de http.url. L'envoi d'une combinaison de ces balises avec http.url n'est pas pris en charge, et les résultats sont indéfinis.

RPC

Les spans RPC représentent le travail effectué dans le traitement d'un appel RPC ou d'un appel serveur RPC.

Balise Type Compatible OpenTracing ? Description
rpc.call Chaîne Appel RPC appelé ou traité (dépend de la valeur de span.kind)
rpc.host Chaîne Hôte RPC distant pour les appels client ou hôte RPC qui traite la demande s'il s'agit d'un serveur RPC.
rpc.params Chaîne x Paramètres de l'appel RPC
rpc.port Chaîne x Port de l'appel RPC
rpc.flavor Chaîne x Type de bibliothèque utilisée pour l' RPC, comme XMLRPC, GRPCIO, etc
rpc.error Chaîne x Message d'erreur associé à l'appel RPC
Remarque : ces balises doivent être accompagnées d'une description appropriée ( span.kind ).

GraphQL

Balise Type Compatible OpenTracing ? Description
graphql.operationType Chaîne x Query ou Mutation
graphql.operationName Chaîne x Nom de la requête ou de la mutation
graphql.fields JSON /objet ou JSON sérialisé (voir ci-dessous) x Zones utilisées dans le cadre de la requête ou de la mutation
graphql.arguments JSON /objet ou JSON sérialisé (voir ci-dessous) x Arguments utilisés dans le cadre de la requête

En ce qui concerne graphql.fields et graphql.arguments, vous devez choisir le type de données approprié (JSON ou String) en fonction de ce que le traceur prend en charge.

Exemples :

// NodeJS SDK => JSON
span.annotate('sdk.custom.tags.graphql.fields', {
    Account: [ 'id', 'name' ],
    User: [ 'id', 'name' ]
})
span.annotate('sdk.custom.tags.graphql.arguments', {
    User: [ 'where', 'orderBy' ]
})

// Java SDK => String
SpanSupport.annotate("graphql.fields", "{ \"Account\": [\"id\", \"name\"], \"User\": [\"id\", \"name\"] }");
SpanSupport.annotate("graphql.arguments", "{ \"User\": ["\where\", \"orderBy\"] }");
 

Base de données

Balise Type Compatible OpenTracing ? Description
db.instance Chaîne Nom de l'instance de base de données. Par exemple en Java, si jdbc.url="jdbc:mysql://127.0.0.1:3306/customers", le nom d'instance est "customers"
db.type Chaîne Pour les bases de données SQL, "sql". Pour les autres, la catégorie de base de données en minuscules, par exemple "cassandra", "hbase" ou "redis".
db.statement Chaîne Instruction de base de données pour le type de base de données indiqué. Par exemple, when db.type is "SQL" - SELECT * FROM user_table; when db.type is "redis" - SET mykey 'WuValue'.
db.user Chaîne Nom d'utilisateur pour l'accès à la base de données. Par exemple, "readonly_user" ou "reporting_user"
db.connection_string Chaîne Chaîne de connexion, par exemple, jdbc:mysql://127.0.0.1:3306/customers

Messagerie

Balise Type Compatible OpenTracing ? Description
message_bus.destination Chaîne Adresse à laquelle les messages peuvent être échangés. Il peut s'agir d'une rubrique ou d'une file d'attente, etc.

Lot

Balise Type Compatible OpenTracing ? Description
batch.job Chaîne x Nom du travail en cours d'exécution.

Homologue

Balise Type Compatible OpenTracing ? Description
peer.hostname Chaîne Hôte distant d'un span de sortie effectuant un appel sortant.
peer.address Chaîne Adresse distante d'un span de sortie faisant un appel sortant.
peer.service Chaîne Nom de service côté distant d'un span de sortie faisant un appel sortant. Notez que cette option est facultative et peut être utilisée lorsque le côté distant n'est pas déjà instrumenté.

Erreurs

Balise Type Compatible OpenTracing ? Description
error Booléen Indique si une erreur a été détectée au cours de la période que représente le span.
message Chaîne x Message associé à l'erreur