services

Instana trace et analyse toutes les demandes.

Les services et les points de terminaison sont automatiquement détectés, et les relations entre les services, les points de terminaison et votre infrastructure sont automatiquement mises en corrélation et stockées dans notre graphe dynamique.

En fonction des données collectées à partir des traceurs et des détecteurs, les indicateurs clés de performance sont calculés pour les appels, les temps d'attente et les appels erronés. Les indicateurs clés de performance vous aident à découvrir la santé de chaque service individuel, puis la santé de l'ensemble de votre infrastructure.

Les services font partie de la surveillance des applications et fournissent une vue logique de votre système. Les services sont dérivés d'entités d'infrastructure telles que des hôtes, des conteneurs et des processus. Les appels entrants sont associés à des entités d'infrastructure et enrichis de données d'infrastructure; par exemple, le libellé du pod « Kubernetes » ou le nom de l'application « SpringBoot ». Après cette étape de traitement de liaison d'infrastructure, une étape de mappage de service mappe les appels enrichis pour générer un nom de service par appel en fonction d'un ensemble de règles. Instana est fourni avec un ensemble complet de règles prédéfinies permettant de générer automatiquement le meilleur nom de service possible pour vous. Pour affiner le mappage de service, vous pouvez créer vos propres règles personnalisées. Voir Personnalisation du mappage de service.

Règles prédéfinies

Pour chaque appel, les règles suivantes sont prises en compte par ordre décroissant de priorité. Le nom de service attribué à un appel est déterminé en fonction de la règle de priorité la plus élevée qui correspond.

Règle Étiquettes
Règle de service personnalisée Balises définies par l'utilisateur (voir Mappage de service personnalisé)
Nom de service défini par l'utilisateur depuis la variable d'environnement INSTANA_SERVICE_NAME sur le processus {instana.service.name}
Nom de service défini par l'utilisateur via l'en-tête HTTP X-Instana-Service {call.http.header.x-instana-service}
Nom de service défini par l'utilisateur dans les données de span sdk (définir la balise service) {call.tag.service}
Nom de service défini OpenTelemetry {otel_resource.service.name}
Nom de service OpenTelemetry du service distant {otel.peer.service}
Nom de service défini par Jaeger {jaeger.service.name}
Nom de service défini par Zipkin {zipkin.service.name}
Gestionnaire de file d'attente IBM MQ {ibmmq.queuemanager.name}
Nom du serveur ACE {ace.integrationnode.name}:{ace.server.name}
Nom de cluster Consul Consul@{consul.cluster.name}
Nom de cluster Cassandra {cassandra.cluster.name}
Nom du cluster ElasticSearch {elasticsearch.cluster.name}
Nom de cluster Couchbase {couchbase.cluster.name}
Nom de l'ensemble de répliques MongoDB {mongo.replicaSetName}
Nom du cluster Kafka {kafka.cluster.name}
Nom du cluster ClickHouse Clickhouse@{clickhouse.cluster.name}
Fonction en tant que span de service avec functionname {faas.functionname}
ID de cluster AWS EC {aws.ec.cluster.id}
AWS RDS nom du cluster {aws.rds.cluster.name}
AWS DynamoDB DynamoDB
AWS S3 AWS S3
Type de service Google Cloud Storage Google Cloud Storage
Azure App Service {azure.appservice.name}
Nom du conteneur AWS ECS {container.label.com.amazonaws.ecs.container-name}
Famille de tâches AWS ECS {container.label.com.amazonaws.ecs.task-definition-family}
Nom du conteneur Kubernetes {kubernetes.container.name}
Nom de l'application Foundry Cloud {cloudfoundry.application.name}
Nom du service Swarm Docker {docker.label.com.docker.swarm.service.name}
ID d'application Marathon (analysé) {marathon.app.id-1}
Nom de la tâche Nomad {nomad.task.name}
Nom du service de projet Rancher 1 {container.label.io.rancher.project_service.name}
Nom d'image de conteneur (analysé) {container.image.name-1}
Conteneur d'application (JBoss, Tomcat, WebLogic, WebSphere, MSIIS) nom de déploiement avec extension de fichier (analysé) {call.deployment.name-1}
Nom de déploiement du conteneur d'application (JBoss, Tomcat, WebLogic, WebSphere, MSIIS) sans extension de fichier (analysé) {call.deployment.name-1}
Nom de l'assistant de suppression {dropwizard.name}
Nom d'amorçage Spring {springboot.name}
Nom JBoss {jboss.server.name} {jboss.node.name?}
Nom WebSphere {websphere.server.name}
Nom WebLogic {weblogic.server.name}
Port Redis Redis@{redis.port} sur {host.name}
Port Aerospike Aerospike@{aerospike.port} sur {aerospike.host}
Port Neo4j Neo4j@{neo4j.port} sur {host.name}
Port Memcached Memcached@{memcached.port} sur {host.name}
Port Varnish Varnish@{varnish.port} sur {host.name}
Port Clickhouse Clickhouse@{clickhouse.httpPort} sur {host.name}
Nom de la base de données MongoDB MongoDB@{mongo.port} sur {host.name}
Port Zookeeper Zookeeper@{zookeeper.clientPort} sur {host.name}
Version Solr Solr-{solr.version} sur {host.name}
Solr Solr sur {host.name}
Solr Zookeeper Solr Zookeeper-{solr.zk_host}
Port PostgreSQL PostgreSQL@{postgresql.port} sur {host.name}
Port CockroachDB CockroachDB@{cockroachdb.port} sur {host.name}
Port MySQL MySQL@{mysql.port} sur {host.name}
Port OracleDB OracleDB@{oracledb.port} sur {host.name}
SID de base de données MSSQL MSSQL@{mssql.instance}
Port MariaDB MariaDB@{mariadb.port} sur {host.name}
Port DB2 Db2@{db2.port} sur {host.name}
Version Kafka Kafka-{kafka.version} sur {host.name}
Nom du courtier ActiveMQ {activemq.broker.name}
Version RabbitMQ RabbitMQ-{rabbitmq.version} sur {host.name}
Version de RocketMQ RocketMQ-{rocketmq.version} sur {host.name}
Nom JVM depuis le fichier jar {jvm.app.name-1}
Nom JVM {jvm.app.name}
Application Node.js avec l'environnement hôte {nodejs.app.name}
Nom de l'instantané Python {python.app.name}
Nom Ruby {ruby.app.name}
Nom Go {go.app.name}
PHP utilisant host-header lorsqu'il est disponible (analysé) {call.http.host-1}
PHP PHP
PHP pour pool de workers PHP-FPM PHP
Nom CLR {clr.app.name}
Nom .Net Core {netcore.app.name}
Nom Haskell {haskell.app.name}
Nom Crystal {crystal.app.name}
Service d'exécution Cloud GCP {gcp.cloudrun.service.name}
Identificateur de l'infrastructure de cloud {cloud.id}
Span Shell Processus générés
Span de service RPC utilisant object (analysé, avec espaces de nom WSDL) {call.rpc.object-1}
Span de service RPC utilisant object {call.rpc.object}
Span FTP de base de données {call.database.connection}
Intervalle de type de cache de base de données avec connection (analysé) {call.database.type} @ {call.database.connection-1}
Span de type de cache de base de données {call.database.type}
Span de base de données MongoDB (analysé) {call.database.schema-1}
Span de la base de données ElasticSearch (analysé) {call.database.connection-1}
Span de base de données Couchbase/Redis (analysé) {call.database.connection-1}
AWS S3 étendue de la base de données AWS S3
Span de base de données DynamoDB DynamoDB
Intervalle Google Cloud Storage Google Cloud Storage
Azure Storage span Azure Storage
Span de base de données CosmosDB (analysé) {call.database.schema-1}
Span de base de données générique {call.database.schema}
Span de base de données générique, en utilisant le schéma de connection (analysé) {call.database.connection-1}
Span de base de données générique, en utilisant l'hôte depuis connection (analysé) {call.database.connection-1}
Span base de données générique, substitution type {call.database.type}
Span de messagerie, pour les files d'attente temporaires {call.messaging.type}
IBM MQ intervalle à partir d'une adresse {call.messaging.address-1}
Apache RocketMQ intervalle à partir d'une adresse {call.messaging.address-1}
IBM ACE intervalle à partir d'une adresse {call.messaging.address-1}
Span JMS utilisant l'adresse (analysé) {call.messaging.address-1}
Span de messagerie en utilisant l'adresse (complète) {call.messaging.address}
Span de messagerie, aucune adresse {call.messaging.type}
Intervalle z/OS Connect {call.zcee.serviceName}
Span HTTP avec l'hôte (analysé) {call.http.host-1}
Span HTTP avec URL (analysée) {call.http.url-1}
Span de script PHP (par exemple, CLI) {call.php.script.name}
Span SDK SDK
RPC (RMI) intervalle, non object RMI
Nombre d'abonné GraphQL Abonnés GraphQL
Déclencheur d'événement {call.event.trigger}
Service de métadonnées Cloud Service de métadonnées Cloud

Un service peut être considéré comme un composant logique qui fournit une API publique au reste du système, où l'API est constituée de ses nœuds finaux. Un service est surveillé et émet et reçoit des appels. Une demande de service produit un appel unique vers un nœud final donné.

Les services peuvent être considérés isolément ou sous l'angle d'une perspective d'application. Les services sont souvent mappés à une « unité de déploiement », telle qu'un package ou un conteneur. Si plusieurs instances de ce conteneur, par exemple, fonctionnent en même temps, elles sont toutes mappées au même service logique.

Les types de services sont affectés automatiquement par héritage via les nœuds finaux. Par exemple, si un service dispose des deux nœuds finaux HTTP et BATCH, il est affecté à la fois aux types HTTP et BATCH. Les indicateurs clés de performance (appels, erreurs, latence) des services affichent un agrégat de tous les appels, quel que soit le type.

Personnalisation du mappage de service

Quatre méthodes de personnalisation du mappage de service par défaut sont disponibles.

  1. Créez une règle de service personnalisé. Même si les services sont configurés, par exemple, avec la variable d'environnement INSTANA_SERVICE_NAME, cette règle est prioritaire sur toutes les autres règles.
  2. Ajoutez la service.name balise.
  3. Définissez la variable INSTANA_SERVICE_NAME d'environnement. Ces limitations sont décrites dans le document « Dynamic Language Sensors ».
  4. Indiquez l'en-tête « HTTPX-Instana-Service ».

Création d'une règle de service personnalisée

  1. Dans la barre latérale, cliquez sur « Applications » et sélectionnez l'onglet « Services ».
  2. Cliquez sur Configurer les services
  3. Cliquez sur Ajouter une règle de service personnalisé.
  4. Dans la liste déroulante, sélectionnez les balises.

Les règles de service personnalisées, tout comme les règles prédéfinies, sont prises en compte par ordre décroissant de priorité pour chaque appel. Le nom de service attribué à un appel est déterminé en fonction de la règle de priorité la plus élevée qui correspond.

L'une des raisons pour lesquelles vous utilisez une règle de service personnalisé est l'utilisation des méta-informations existantes de vos composants d'infrastructure. Par exemple, si vous libellez vos conteneurs Docker avec des informations spécifiques au domaine, telles que com.acme.service-name:myservice, pour mapper des services à partir de ce libellé, sélectionnez les balises docker.label et com.acme.service-name . Tous les appels qui passent un conteneur avec le libellé com.acme.service-name sont associés à un service, qui est nommé par cette valeur, par exemple, myservice. Il existe plusieurs balises pour créer un mappage de service personnalisé.

Vous pouvez également ajouter plusieurs clés pour le mappage de service. Plusieurs balises sont concaténées avec un tiret. Notez que toutes les clés doivent correspondre. Par exemple, si vous souhaitez séparer vos services de préproduction en fonction de la zone d'hôte, vous pouvez ajouter deux clés : host.zone + docker.label:com.acme.service-name. Vos services seront alors nommés en concaténant les valeurs de la zone d'hôte, suivies de l'étiquette « docker ». Ainsi, vous séparerez les deux services, par exemple prod-myservice et dev-myservice.

A l'aide d'une balise spéciale service.default_name, une règle de service personnalisée peut également être utilisée pour étendre les règles de service par défaut avec d'autres balises. Par exemple, pour fractionner les services créés automatiquement par des zones d'hôte, créez la règle de service personnalisé à l'aide des balises service.default_name et host.zone.

Boîte de dialogue Configuration de service

Définition du nom du service au niveau global

Vous pouvez définir un nom de service pour tous les appels associés à un service. Le nom du service ne peut être défini que pour les processus surveillés par un traceur Instana.

Pour définir le nom de service de tous les appels entrants et sortants d'un service, définissez la variable d'environnement INSTANA_SERVICE_NAME sur le processus.

Lorsque vous définissez le nom du service, le nom du processus n'est pas modifié. Pour renommer le processus, utilisez la variable d'environnement INSTANA_PROCESS_NAME .

Vous pouvez définir un nom de service global pour les traceurs suivants à l'aide de la configuration dans le code:

Pour plus d'informations sur les variables d'environnement prises en charge par Instana, consultez la section Variables d'environnement.

Définition du nom du service pour chaque appel

Vous pouvez définir un nom de service pour chaque appel. Lorsque vous modifiez le nom de service d'un appel, le service source ou de destination de l'intervalle d'entrée ou de sortie cible est modifié.

Pour modifier le nom de service d'un appel, ajoutez une balise personnalisée (custom.tags.service) à la plage cible. Choisissez l'un des SDK de traceur cible suivants:

Configuration du nom du service dans OpenTelemetry ou OpenTracing

Pour définir un nom de service dans OpenTelemtry ou OpenTracing, utilisez la fonction setTag.

Exemple:span.setTag('service', 'my-service')

Remarque : le site OpenTracing est désormais archivé; veuillez utiliser OpenTelemetry à la place.

Spécification de l'en-tête HTTP X-Instana-Service

En définissant l'en-tête « X-Instana-ServiceHTTP » lors d'un appel, la destination (le service qui reçoit la requête HTTP ) est associée à la valeur fournie dans cet en-tête.

Remarque : l'en-tête HTTP X-Instana-Service n'est pas automatiquement collecté. Pour capturer X-Instana-Service l'en-tête, vous devez le configurer dans le fichier de configuration de l'agent configuration.yamlInstana. Pour plus d'informations, consultez la section « Enregistrement des en-têtes d' HTTP s personnalisés ».

Configuration manuelle du service (en phase d'expérimentation)

Dans certains cas, le mappage de service automatique ne peut pas fonctionner correctement pour certains appels. La configuration de service manuelle peut identifier les appels à l'aide d'une expression de filtre de balise à l'aide de balises d'appel (par exemple, call.http.host, call.database.connection), et vous pouvez:

  • soit les mapper à un service non surveillé avec un nom de service personnalisé,
  • ou les lier à une base de données ou à un service de messagerie existant créé à partir d'une entité d'infrastructure surveillée.

La configuration manuelle des services peut être ajoutée, mise à jour ou supprimée via API.

Mappage vers un service non surveillé avec un nom personnalisé

Les appels vers un service non surveillé par Instana sont redirigés vers un service à l'aide de balises d'appel.

Par exemple, les requêtes HTTP adressées à un site tiers API, tel que [ www.google.com ...], sont redirigées vers le service [...] www.google.com , en fonction de host l'en-tête HTTP (call.http.host balise). Les appels vers www.google.fr ou www.google.de sont redirigés vers des services différents, car les en-têtes host HTTP sont différents.

Vous pouvez mapper tous les appels à différents domaines vers un service nommé "Google" en ajoutant la configuration de service manuelle suivante:

{
    "tagFilterExpression": {
        "type": "TAG_FILTER",
        "name": "call.http.host",
        "value": "www.google.",
        "operator": "STARTS_WITH",
        "entity": "NOT_APPLICABLE"
    },
    "unmonitoredServiceName": "Google",
    "description": "Map calls to different google domains to Google service",
    "enabled": true
}
 

Services non spécifiés

Le service Unspecified est un service spécial qui agit en tant que service de secours pour les appels qui n'ont pu être mis en correspondance avec aucune des règles de mappage de service personnalisées ou prédéfinies .

A partir du tableau de bord du service, vous pouvez utiliser la liste des noeuds finaux, ou mieux, passer à Analyze Calls et regrouper par call.name pour déterminer le sujet de ces appels.

En général, cela met en évidence un problème temporaire au niveau du backend d' Instana, où, pendant un court instant, la destination des appels n'a pas pu être associée au processus sous-jacent (par exemple parce que le processus venait de démarrer et que l'agent d' Instana ne l'avait pas encore détecté, alors que l'instrumentation d' Instana enregistrait déjà les appels); par conséquent, les balises nécessaires utilisées dans les règles de mappage des services n'ont pas pu être extraites. Cliquez ici pour en savoir plus sur le rôle de la corrélation des infrastructures et de la cartographie des services.

Il arrive toutefois que cela mette en évidence une lacune dans notre ensemble de règles prédéfinies, et dans ce cas, nous aimerions connaître votre avis afin de les améliorer.

Notez que lorsque la destination des appels HTTP n'a pas pu être liée à un processus et que l'en-tête Host est une adresse IP, les appels sont mappés au service Non spécifié. Dans ce cas, vous pouvez ajouter l'en-tête X-Instana-Service aux demandes pour définir un nom de service significatif.

Carte des processus de service

La mappe de flux de services affiche les services en amont et en aval d'un service.

Limites de la cartographie des flux de services

La mappe de flux de services affiche actuellement des données précises uniquement pour les traces synchrones à exécution courte qui se terminent dans un délai de 20 secondes. Dans tous les autres cas, la mappe de flux de services peut afficher des données inexactes.

Questions fréquentes

Pourquoi aucun service n'est répertorié ?

Cela provient du fait que l'agent n'est pas exécuté en mode APM ou qu'aucun agent n'est installé. Par conséquent, aucune trace n'a été collectée, ou si un agent est installé, aucune trace n'a été collectée au cours de la période sélectionnée.

Pour vérifier si un agent est installé et en cours d'exécution, cliquez sur Infrastructure pour afficher les hôtes de la mappe d'infrastructure qui peuvent avoir un agent, ou cliquez sur Plus > Agents pour afficher la liste des agents installés. Si aucun agent n'apparaît dans la liste, consultez la documentation pour savoir comment installer un agent ou créer une perspective d'application.

Pourquoi le nom du service change-t-il parfois?

Le mappage de service repose sur les données d'infrastructure. Toutefois, dans certains scénarios, les données de trace ne peuvent pas être enrichies avec des données d'infrastructure. Par exemple, il se peut que les données de trace ne soient pas encore enrichies peu après le démarrage d'un agent d' Instana, ou d'un processus surveillé. Cela prend un certain temps jusqu'à ce que l'application surveillée soit entièrement instrumentée et que les traceurs et les détecteurs commencent à collecter des données. Si les premières traces sont collectées avant que tous les détecteurs ne deviennent actifs, il se peut que certaines ou même toutes les données d'infrastructure soient manquantes dans ces traces. Dans ce cas, le nom du service utilisé est moins précis; par exemple, un hôte HTTP plutôt qu'un nom d'application SpringBoot.

Un mécanisme appelé « mappage résilient » est utilisé pour éviter les problèmes de mappage des services liés au redémarrage des agents d' Instana s ou des processus surveillés. Le mappage résilient prend effet si les données d'infrastructure pour le mappage des appels au service approprié ne sont pas disponibles. La cartographie résiliente peut attribuer un appel au service approprié en s'appuyant sur un cache contenant les résultats des cartographies précédentes. Toutefois, cela peut entraîner un nom de service inattendu, par exemple, si le cache contient des données d'infrastructure obsolètes. Le service attendu revient automatiquement lorsque le cache Resilient est mis à jour.