Publié le : 06/11/2024 à 09:00 Vues : 515

Découvrez l'importance stratégique des Entity Selectors, maîtrisez leur syntaxe avancée, et adoptez les règles d'or de conception pour un filtrage dynamique et scalable.

1. Importance stratégique de l'Entity Selector

L'Entity Selector est la clé de voûte de la plateforme Dynatrace pour cibler et isoler des composants spécifiques de votre infrastructure dynamique.

Pourquoi est-ce indispensable ?

Que ce soit pour définir le périmètre d'une Management Zone, configurer des alertes ciblées, créer des tableaux de bord dynamiques ou interroger l'API REST v2, l'Entity Selector est incontournable. Il permet de passer d'une gestion statique (sélection manuelle d'hôtes ou de services) à une gestion dynamique basée sur les attributs réels de votre environnement. Il garantit ainsi une observabilité automatisée et résiliente face aux changements continus (déploiements, auto-scaling, etc.).

2. Rappel de la Syntaxe et des Opérateurs Clés

Un Entity Selector est une chaîne de caractères permettant de filtrer les entités. Les critères sont séparés par des virgules, qui font office d'opérateur logique ET (AND).

Les opérateurs fondamentaux

  • type() : Filtre par type d'entité (ex: HOST, SERVICE, APPLICATION, PROCESS_GROUP).
  • tag() : Filtre par étiquette associée à l'entité. Peut cibler une clé simple ou une paire clé:valeur (ex: tag("ENV:PROD")).
  • entityName() : Filtre par le nom de l'entité.
  • not() : L'opérateur de négation pour exclure explicitement certaines entités.

3. Règle d'or de conception (Passage à l'échelle)

Pour garantir des performances optimales et une maintenance simplifiée, une règle architecturale stricte doit être respectée dans vos configurations.

Bannir la rigidité des IDs

Règle d'or (Passage à l'échelle) : Pour chaque règle de sélection, vous devez impérativement définir soit un Entity ID (identifiant technique unique), soit un Entity type.

Bonne pratique pour la production : L'usage des Entity IDs fixes est à proscrire en production car cette approche est trop spécifique, rigide, et ne survit pas au redéploiement d'une ressource. Pour garantir une gestion à grande échelle, compatible avec le cycle de vie dynamique de vos infrastructures, utilisez exclusivement l'Entity type (ex: type("HOST")) combiné à des attributs ou des tags dynamiques.

Les critères secondaires

  • type("ENTITE") : Spécifie le type d'élément (ex: HOST, SERVICE, CONTAINER_GROUP_INSTANCE).
  • entityName(...) : Filtre selon le nom d'affichage de la ressource.
  • tag(...) : Isole les éléments portant des clés/valeurs spécifiques.
  • healthState(...) : Filtre par état de santé actuel (HEALTHY, UNHEALTHY).
  • entityAttribute(...) : Évalue des propriétés système intrinsèques de l'entité.

Opérateurs textuels et sémantiques

Conseil de performance : Privilégiez l'utilisation des opérateurs dans cet ordre pour optimiser le temps de réponse : d'abord equals ou in (les plus rapides), ensuite startsWith ou endsWith. Utilisez contains uniquement en dernier recours, car il est très gourmand en ressources matérielles.
OpérateurUsage / DescriptionExemple Typique
equalsCorrespondance exacte et stricte de la chaîne.entityName.equals("Frontend-API-01")

osType("LINUX")
startsWithCorrespondance basée sur le préfixe textuel.entityName.startsWith("prod-")
endsWithCorrespondance basée sur le suffixe textuel.entityName.endsWith("-db")
containsCorrespondance partielle (contient la sous-chaîne).entityName.contains("api")
inÉvaluation d'appartenance à une liste de valeurs.type.in("HOST","CONTAINER_GROUP")
caseSensitiveRend la correspondance textuelle sensible ou insensible à la casse.entityName.equals("prod", caseSensitive:false)
existsFiltre les entités possédant un tag ou un attribut spécifique.tag.exists("ENV")
notNégation logique permettant d'exclure les entités correspondant au critère.not(tag("Status:Maintenance"))
healthStateFiltre selon l'état de santé actuel (HEALTHY, UNHEALTHY).healthState("UNHEALTHY")
Relationships (from/to)Navigue dans la topologie Smartscape. Un relationship (ex: runsOn, calls) est utilisé avec fromRelationships pour cibler les entités sources (ex: un service qui appelle un autre) ou avec toRelationships pour cibler les entités de destination (ex: un hôte sur lequel un service s'exécute).fromRelationships.runsOn(type("HOST"))
(Cible les services qui tournent sur un hôte)

toRelationships.runsOn(type("SERVICE"))
(Cible les hôtes qui exécutent un service)

4. Exemples Pratiques : Scénarios de Combinaisons Avancées

Voici quelques cas d'usage fréquents illustrant la puissance de combinaison des sélecteurs.

Scénario A : Cibler la production, en excluant un sous-projet

Vous souhaitez sélectionner tous les hôtes de production, mais exclure ceux spécifiquement dédiés aux tests de charge :

type("HOST"),tag("ENV:PROD"),not(tag("PROJECT:LOADTEST"))

Scénario B : Regroupement de microservices

Vous souhaitez isoler l'ensemble des services liés au système de paiement, fonctionnant dans l'écosystème Kubernetes :

type("SERVICE"),entityName("EasytravelService")

Scénario C : Cibler les processus technologiques d'une équipe

Vous voulez lister tous les groupes de processus gérés par l'équipe Backend, qui exécutent du Java :

type("PROCESS_GROUP"),tag("Owner:Backend"),softwareTechnologies("Java")

Scénario D : Isoler les applications Web par région

Sélectionner les applications Web (RUM) déployées pour la région européenne :

type("APPLICATION"),property("Region:EMEA")

Scénario E : Cibler des bases de données spécifiques

Sélectionner tous les services de base de données Oracle en production :

type("SERVICE"),property("db_type:oracle"),tag("ENV:PROD")

Scénario F : Hôtes Cloud dans une région spécifique

Filtrer les machines virtuelles hébergées sur AWS dans la région 'eu-west-1'. L'utilisation de la propriété cloudType est plus robuste qu'un tag car elle est détectée automatiquement par Dynatrace.

type("HOST"),cloudType("EC2"),tag("Region:eu-west-1")

Scénario G : Noeuds Kubernetes Worker

Isoler uniquement les nœuds worker de votre cluster Kubernetes de production :

type("KUBERNETES_NODE"),tag("Role:worker"),tag("ENV:PROD")

Scénario H : Exclure des entités en maintenance

Sélectionner tous les services actifs de votre infrastructure en excluant explicitement ceux marqués avec un tag de maintenance :

type("SERVICE"),not(tag("Status:Maintenance"))

Scénario I : Filtrer au sein d'une Management Zone existante

Cibler uniquement les hôtes qui appartiennent déjà à une zone de gestion 'MZ_Finance' pour affiner une alerte :

type("HOST"),mzName("MZ_Finance")

Scénario J : Regrouper les applications Mobiles

Vous souhaitez isoler l'ensemble de vos applications mobiles fonctionnant sous iOS. La propriété osType est directement extraite par Dynatrace et est donc plus fiable qu'un tag manuel.

type("MOBILE_APPLICATION"),osType("IOS")

Scénario K : Cibler plusieurs types d'entités avec l'opérateur 'in'

Sélectionner à la fois les hôtes et les groupes de processus qui partagent le tag 'ENV:PROD' :

type.in("HOST","PROCESS_GROUP"),tag("ENV:PROD")

Scénario L : Recherche insensible à la casse avec 'caseSensitive'

Retrouver un service spécifique sans se soucier de la casse exacte de son nom :

type("SERVICE"),entityName.equals("frontend-api", caseSensitive:false)

Scénario M : Vérifier la présence d'un tag avec 'exists'

Isoler tous les hôtes sur lesquels le tag 'Owner' a été défini, quelle que soit sa valeur :

type("HOST"),tag.exists("Owner")

Scénario N : Isoler les entités en état d'alerte avec 'healthState'

Cibler uniquement les services de production qui rencontrent actuellement un problème (état non sain) :

type("SERVICE"),tag("ENV:PROD"),healthState("UNHEALTHY")

Scénario O : Topologie et dépendances avec 'toRelationships.calls'

Sélectionner tous les services qui effectuent des appels vers un service de base de données Oracle :

type("SERVICE"),toRelationships.calls(type("SERVICE"),tag("ENV:PROD"))

5. Guide d'Exécution : Validation de la Règle via cURL

Il est impératif de valider vos sélecteurs via l'API avant de les déployer dans des règles critiques de Management Zones ou d'alerting.

Requêter l'API Entities v2

L'endpoint /api/v2/entities est utilisé pour lister les entités répondant à un Entity Selector.

Conseil de l'expert : Encodage de l'URL
C'est une étape souvent oubliée qui provoque des erreurs HTTP 400. Votre sélecteur contient des caractères spéciaux (guillemets ", virgules ,, ou espaces) qui doivent être encodés dans l'URL. Par exemple, les guillemets " deviennent %22 et les espaces deviennent %20. Utilisez des outils ou des commandes capables d'encoder la chaîne avant de l'envoyer à l'API.

Exemple de validation avec cURL

Voici la commande pour tester le sélecteur type("HOST"),tag("ENV:PROD") de manière sécurisée (URL encodée) :

curl -X GET "https://{VOTRE_ENV}.live.dynatrace.com/api/v2/entities?entitySelector=type(%22HOST%22),tag(%22ENV:PROD%22)" \
  -H "accept: application/json" \
  -H "Authorization: Api-Token dt0c01.VOTRE_TOKEN..."

Analysez la section totalCount et le tableau entities du JSON retourné pour valider que le ciblage est correct.

6. Évaluation et Auto-Vérification

Prenez un instant pour valider votre compréhension globale des concepts abordés.

Mini-Quiz d'auto-évaluation

  • Question 1 : Quelle est la condition minimale et impérative pour qu'un Entity Selector soit valide selon la règle d'or ?
  • Question 2 : Comment lie-t-on plusieurs conditions pour former une requête logique de type 'AND' ?
  • Question 3 : Quel caractère URL-encodé remplace le guillemet double (") indispensable dans vos requêtes API REST ?

Réponses :
1. Contenir explicitement un type() ou un entityId().
2. En utilisant simplement une virgule (,) entre chaque condition.
3. Le code %22.

Lien copié dans le presse-papiers !