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.
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 :
- 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
- 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
- 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 :
- Une balise
span.kindappropriée doit toujours être envoyée avec ces balises. - Les balises
http.host,http.pathethttp.paramsdoivent être envoyées uniquement à la place dehttp.url. L'envoi d'une combinaison de ces balises avechttp.urln'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 |
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 |