[TP] Déployer un pipeline d'observabilité complet avec Agent et Gateway


Mise en place d'une architecture d'observabilité résiliente avec un agent OTel pour la collecte locale et une gateway pour le traitement centralisé, le tout dans un environnement Docker.

Ce que vous allez apprendre dans ce TP :
  • Déployer un backend de visualisation complet (Grafana, Prometheus, Loki, Tempo)
  • Configurer et lancer un collecteur OTel en mode Gateway
  • Configurer et lancer un collecteur OTel en mode Agent
  • Instrumenter une application pour envoyer sa télémétrie à l'Agent
  • Visualiser les traces, métriques et logs dans Grafana
  • Cloner le dépôt de configuration
  • Démarrer l'infrastructure via Docker Compose
  • Valider l'accès aux outils de visualisation
  • Comprendre la structure d'une trace distribuée
  • Générer du trafic et retrouver la trace correspondante
  • Analyser le parcours d'une requête
  • Comprendre comment l'appel à l'API météo est effectué
  • Simuler une mise en production pour activer la propagation de contexte
  • Vérifier l'instrumentation et la corrélation des traces dans la console
  • Créer le fichier de configuration pour la gateway
  • Lancer le conteneur de la gateway
  • Créer la configuration pour l'agent
  • Lancer l'agent et l'application de démo

Architecture Cible


Ce que vous allez apprendre dans cette section :
  • Déployer un backend de visualisation complet (Grafana, Prometheus, Loki, Tempo)
  • Configurer et lancer un collecteur OTel en mode Gateway
  • Configurer et lancer un collecteur OTel en mode Agent
  • Instrumenter une application pour envoyer sa télémétrie à l'Agent
  • Visualiser les traces, métriques et logs dans Grafana

L'objectif est de construire un pipeline où une application instrumentée envoie ses données à un **agent OTel local**. Cet agent transmet ensuite les données à une **gateway OTel centralisée**, qui se charge de les traiter et de les exporter vers notre backend de stockage et de visualisation (stack : Loki, Grafana, Tempo, Prometheus).



Pourquoi cette architecture Agent + Gateway ?
  • Résilience : L'agent peut mettre en cache les données si la gateway est indisponible.
  • Performance : L'agent, étant local, a une latence très faible pour l'application. Le traitement lourd (filtrage, enrichissement) est déporté sur la gateway.
  • Scalabilité : On peut scaler la gateway indépendamment des applications pour gérer la charge de milliers d'agents.
  • Sécurité : Seule la gateway a besoin des credentials pour se connecter aux backends finaux.

Déploiement du Backend d'observabilité


Ce que vous allez apprendre dans cette section :
  • Cloner le dépôt de configuration
  • Démarrer l'infrastructure via Docker Compose
  • Valider l'accès aux outils de visualisation

Nous allons commencer par déployer notre backend qui centralisera et visualisera toutes les données de télémétrie.
  1. Récupérer les fichiers de configuration
    Récupérez les fichiers de configuration nécessaires pour le déploiement du backend.
    git clone https://github.com/RousselTM/otel-formation.git 
    cd otel-formation
  2. Déployer le backend via Docker Compose
    Lancez le déploiement des services : Prometheus pour les métriques, Loki pour les logs, Tempo pour les traces et Grafana pour la visualisation.
    docker compose up -d
  3. Vérification de l'accès à l'application de démo
    Assurez-vous que l'application de démo Java/Wildfly est bien accessible. Accédez à l'URL
    http://localhost:8090
    et générez un peu de trafic en naviguant sur le site.
  4. Vérification de l'accès à la console Grafana
    Assurez-vous que l'interface Grafana est accessible. Accédez à l'URL
    http://localhost:3000
    et connectez-vous avec les identifiants admin/grafanapassword.
  5. Vérification des sources de données
    Une fois connecté, nous allons vérifier la présence des logs, métriques et traces.

    Allez dans **Explore**, sélectionnez la source de données appropriée (Loki pour les logs, Mimir pour les métriques, Tempo pour les traces) et vérifiez que des données apparaissent.

    Note : Si vous voyez déjà des données, c'est normal. L'application de démo est pré-instrumentée avec le SDK OpenTelemetry. Elle envoie sa télémétrie à une gateway Grafana Alloy (une version d'OTel Collector adaptée par Grafana Labs) qui redirige les données vers le backend.

    L'objectif de ce TP sera justement de reconfigurer l'application pour qu'elle envoie ses données vers un pipeline de collecte que nous allons paramétrer nous-mêmes.
    La commande `docker compose up -d` a déployé une stack complète qui inclut l'application de démo, le backend de stockage (Loki, Mimir, Tempo) et une gateway de collecte préconfigurée (Grafana Alloy).

Analyse d'une trace


Ce que vous allez apprendre dans cette section :
  • Comprendre la structure d'une trace distribuée
  • Générer du trafic et retrouver la trace correspondante
  • Analyser le parcours d'une requête

Exploration avec Grafana.
  1. Rappel sur la définition d'une trace
    Une trace distribuée représente le parcours complet d'une requête à travers les différents services de votre application. Elle est composée de 'spans', chaque span représentant une unité de travail (ex: un appel HTTP, une requête en base de données). Pour un rappel complet, nous vous recommandons de lire cet article sur les bonnes pratiques OpenTelemetry.
  2. Génération et recherche d'une trace
    Ouvrez la page météo de l'application de démo à l'adresse http://localhost:8090/meteo.jsp et affichez la météo pour le Cameroun et la France. Ensuite, dans Grafana, allez dans **Explore** > **Tempo**. Utilisez la recherche (Search) pour filtrer par nom de service (`service.name="wildfly-app"`) et retrouvez la trace correspondant à l'appel de la page `/meteo.jsp`.
  3. Comprendre les appels de la page
    En analysant la trace que vous avez trouvée, identifiez les différents appels internes et externes effectués par la page `/meteo.jsp` pour construire la réponse. Observez la durée de chaque span pour identifier les éventuels points de latence.
  4. Analyser les attributs (Span vs Resource)
    Dans les détails d'un span, vous trouverez les **Span Attributes** (spécifiques à cette opération) et les **Resource Attributes** (communs à tous les spans de ce service). Explorez les spans liés à la base de données et, en utilisant les attributs, retrouvez le type de base de données contactée, son IP/port et la requête exécutée.

    Pour en savoir plus sur la différence entre attributs et ressources, consultez cet article.

Propagation de contexte


Ce que vous allez apprendre dans cette section :
  • Comprendre comment l'appel à l'API météo est effectué
  • Simuler une mise en production pour activer la propagation de contexte
  • Vérifier l'instrumentation et la corrélation des traces dans la console

Comprendre l'importance et la mise en place de la propagation de contexte pour lier les actions frontend et backend.
  1. Analyse de l'appel API Météo
    Dans les traces précédentes, nous n'avons pas vu l'appel vers l'API de météo. Pour comprendre comment cet appel est fait, utilisez les outils de développement de votre navigateur ('Inspecter' ou 'Voir le code source de la page') sur la page météo.
  2. Simuler une mise en production
    Pour activer la propagation de contexte, nous allons simuler une mise en production en déployant une nouvelle version de l'application. Pour ce faire, allez dans le dossier `app` du projet et exécutez les commandes suivantes pour remplacer l'ancienne version par la nouvelle :
    mv app/ROOT.war app/ROOT-old.war
    mv app/ROOT-new.war app/ROOT.war
    Ensuite, redémarrez le conteneur de l'application pour que les changements soient pris en compte :
    sudo docker compose restart wildfly
  3. Vérification de l'instrumentation
    Après avoir redémarré l'application, retournez sur la page météo, ouvrez la console JavaScript de votre navigateur et vérifiez que l'instrumentation OpenTelemetry est bien active. Vous devriez voir des messages liés à OTel s'afficher.

  4. Analyse de l'instrumentation dans Grafana
    Après avoir généré du trafic sur la page météo, retournez dans Grafana et analysez la nouvelle trace. Vous devriez maintenant voir une trace complète qui commence par un span frontend (JavaScript) et qui est suivie par les spans backend (Java).
  5. Ajout d'informations métier aux spans
    L'instrumentation automatique est puissante, mais souvent les entreprises le combinent avec l'instrumentation manuelle pour transférer les données métiers. Analysez la trace 'meteo-app-js' pour retrouver les informations métiers (pays, température et vitesse du vent) qui ont été injectées dans le nouveau code source.

    Cas d'usage en entreprise : En production, on utilise cette technique pour injecter des informations cruciales comme l'ID client, le montant d'un panier, le type d'abonnement ou toute autre donnée métier. Cela permet de créer des tableaux de bord qui ne se contentent pas de montrer la performance technique, mais qui répondent à des questions business : 'Quel est le temps de réponse moyen pour nos clients VIP ?' ou 'Quelles sont les erreurs les plus fréquentes pour les paniers supérieurs à 100€ ?'.

Configuration de la Gateway OTel


Ce que vous allez apprendre dans cette section :
  • Créer le fichier de configuration pour la gateway
  • Lancer le conteneur de la gateway

La gateway est le point de collecte central. Elle reçoit les données de tous les agents, les traite et les exporte vers le backend.
  1. Configurer les Receivers
    Modifiez la configuration pour que la gateway écoute les requêtes OTLP via gRPC et HTTP sur leurs ports par défaut.

    Note : Un receiver est le point d'entrée des données dans le collecteur. Il définit comment le collecteur reçoit la télémétrie (ex: via le protocole OTLP, Jaeger, ou Prometheus).
  2. Configurer un Processeur
    Ajoutez un processeur `batch` à votre configuration. Ce processeur est essentiel pour regrouper les données de télémétrie en lots avant de les exporter, ce qui améliore les performances et réduit le nombre de requêtes sortantes.

    Note : Un processor s'exécute sur les données entre leur réception et leur exportation. Il peut les modifier (ex: ajouter un attribut), les filtrer (ex: supprimer une donnée sensible) ou, comme ici, les regrouper.
  3. Configurer un Exporter
    Configurez les exportateurs pour envoyer les données vers les backends appropriés. Chaque type de signal (trace, métrique, log) a sa destination.

    • Pour le débogage : Ajoutez un exportateur logging pour afficher toutes les données reçues directement dans les logs du conteneur. C'est un outil indispensable pour vérifier que le collecteur reçoit bien les données.
    • Traces : Configurez un exportateur otlp/tempo pour envoyer les traces vers Tempo sur son port gRPC (tempo:4317).
    • Métriques : Utilisez l'exportateur prometheusremotewrite pour envoyer les métriques à Prometheus/Mimir via son endpoint d'écriture à distance (sachant que voici l'URL de Prometheus http://prometheus:9090).
    • Logs : Utilisez l'exportateur loki pour envoyer les logs vers Loki (sachant que voici l'URL de Loki http://loki:3100).

    Note : Un exporter est la destination finale des données de télémétrie. Il définit où et comment le collecteur envoie les données après qu'elles ont été reçues et traitées.
  4. Configurer les Services (Pipelines)
    Maintenant que les receivers, processors et exporters sont définis, il faut les assembler dans des pipelines. Chaque pipeline définit le chemin que suivra un type de signal (trace, métrique ou log).

    Note : La section service et plus particulièrement pipelines est le cœur de la configuration du collecteur. C'est ici que l'on définit le chemin de traitement pour chaque type de signal en connectant les `receivers`, `processors` et `exporters` que nous avons définis précédemment. Sans cette section, le collecteur ne sait pas quoi faire des données qu'il reçoit.

    Configurez les pipelines pour que :
    • Les traces reçues via OTLP soient traitées par le processeur `batch` puis envoyées vers `logging` et `otlp/tempo`.
    • Les métriques reçues via OTLP soient traitées par le processeur `batch` puis envoyées vers `logging` et `prometheusremotewrite`.
    • Les logs reçus via OTLP soient traités par le processeur `batch` puis envoyés vers `logging` et `loki`.

    Activez également la télémétrie interne du collecteur pour surveiller son propre état.
  5. Changement de gateway
    Vous devez modifier le fichier compose.yaml pour modifier la variable OTEL_EXPORTER_OTLP_ENDPOINT pour qu'il pointe vers la nouvelle gateway 'http://otel-collector:4317' et relancer le service.

Configuration de l'Agent OTel et de l'Application


Ce que vous allez apprendre dans cette section :
  • Créer la configuration pour l'agent
  • Lancer l'agent et l'application de démo

L'agent s'exécute au plus près de l'application. Son rôle est simple : collecter les données et les transférer à la gateway. Nous déploierons également une application de démo qui génère des traces, logs et métriques.
  1. Créer la configuration de l'Agent
    Créez un fichier `otel-agent-config.yaml`. La configuration de l'agent est minimale : il reçoit les données de l'application (sur le port 5317 pour ne pas entrer en conflit avec la gateway) et les exporte vers la gateway.
  2. Lancer l'Agent et l'Application de Démo
    Ajoutez les services `otel-agent` et `app-demo` à votre `docker-compose.yaml` et démarrez-les. L'application est configurée pour envoyer sa télémétrie à l'agent.

Niveau de difficulté: (2/5)

Articles recommandés

Comprendre la notion de score

Le concept de score va permettre à Elasticsearch de classer vos documents par...

Différences entre Technologies et Services dans Dynatrace

Dans Dynatrace, les concepts de 'Technologie' et de 'Services' aident à organ...

OpenTelemetry : Instrumentation Automatique vs Manuelle

Comprenez les différences entre l'instrumentation automatique et manuelle ave...

Dynatrace : Différences entre SQL Modifications, SQL Queries or Procedures, et SQL Transactions

Cet article détaille les différences entre trois concepts essentiels dans l'e...

Types de consommation de licence

Comprendre l'évolution de la facturation dans Dynatrace : la différence entre...

Les Types de Services Dynatrace : Comprendre et Optimiser Votre Surveillance Applicative

Découvrez les différents types de services que Dynatrace peut surveiller, leu...

Les SLO Dynatrace : Comprendre et Gérer les Objectifs de Niveau de Service

Découvrez comment utiliser les SLO (Service Level Objectives) dans Dynatrace ...

Apdex vs Core Web Vitals

Découvrez les différences entre Apdex et Core Web Vitals, deux indicateurs de...

Comprendre Elastic Common Schema(ECS)

Comme toujours dans nos missions de conseil, nous recommandons aux entreprise...

Pourquoi collecter des métriques

Découvrez les raisons clés pour collecter des métriques avec des exemples con...

Les types de métriques dans Prometheus

Découvrez en détail les quatre types de métriques supportés par Prometheus (C...

Grail : Dynatrace Data Lakehouse

Désormais vous disposez dans Dynatrace (SaaS) d'un Data Lakehouse nommé Grail...

Introduction à PromQL

Apprenez à maîtriser PromQL, le langage de requête utilisé dans Prometheus, a...

Dynatrace OneAgent : tags, props, vars CLI

Pense‑bête des commandes CLI/API pour gérer tags, propriétés, variables d'env...

Grafana Alloy : Collecte et Transformation de Télémétrie

Apprenez à utiliser Grafana Alloy pour collecter, transformer et acheminer lo...

Grafana Alloy : Collecter les métriques système et les logs locaux

Découvrez comment configurer Grafana Alloy pour superviser le serveur sur leq...

Grafana Alloy : L'importance de l'auto-supervision (Self-Monitoring)

Découvrez pourquoi et comment configurer Grafana Alloy pour qu'il se supervis...

Grafana Alloy : Comprendre et exploiter l'Interface Utilisateur (UI)

Découvrez comment activer, sécuriser et utiliser l'interface web intégrée de ...

OTLP expliqué : comprendre le protocole OpenTelemetry

Découvrez le protocole OTLP expliqué simplement. Comprendre les différences e...

Grafana Alloy : Guide complet pour collecter métriques, logs et traces

Tutoriel complet sur Grafana Alloy. Découvrez comment installer, configurer e...

Grafana Alloy : Syntaxe et Configuration (Alloy Language : River)

Dans le cadre d'une formation Grafana ou formation observabilité, maîtrisez l...

Grafana Alloy : Collecte de Métriques (Prometheus & Ecosystem)

Apprenez à configurer Grafana Alloy pour collecter, transformer et envoyer de...

C'est quoi l'observabilité

La capacité à connaître l'état interne d'un système à partir des données que ...

Grafana Alloy : Gestion des Logs avec Loki

Découvrez comment configurer Grafana Alloy pour lire des fichiers de logs, jo...

Grafana Alloy : Gestion des Traces avec Tempo

Plongez dans le traitement des traces distribuées. Apprenez à ingérer des tra...

Grafana Alloy : Profilage Continu avec Pyroscope

Découvrez comment configurer le profilage continu (Continuous Profiling) dans...

Grafana Alloy : Déploiement Avancé et Clustering

Apprenez à gérer les déploiements à grande échelle de Grafana Alloy. Configur...

Grafana Assistant : L'IA au service de l'observabilité

Découvrez Grafana Assistant, l'intelligence artificielle intégrée à Grafana C...

Grafana Alloy vs OpenTelemetry Collector : Lequel choisir ?

Comparaison détaillée entre Grafana Alloy et l'OpenTelemetry Collector. Décou...

Grafana Alloy vs Dynatrace ActiveGate : Lequel choisir ?

Comparaison entre Grafana Alloy et Dynatrace ActiveGate. Comprenez les différ...

Grafana Alloy vs Grafana Agent vs Promtail : Lequel choisir ?

Découvrez l'évolution des collecteurs de télémétrie de l'écosystème Grafana. ...

Référence des Composants Grafana Alloy

Un guide de référence complet sur tous les composants disponibles dans Grafan...

Dynatrace : Maîtriser les Entity Selectors pour une observabilité à grande échelle

Découvrez l'importance stratégique des Entity Selectors, maîtrisez leur synta...

Dynatrace : Gestion du RGPD et protection de la vie privée (Data Privacy)

Apprenez à configurer Dynatrace pour respecter le RGPD, masquer les données s...

Dynatrace Synthetic Monitoring : Guide complet et bonnes pratiques

Découvrez comment utiliser le Synthetic Monitoring de Dynatrace pour surveill...

Dynatrace Credential Vault : Sécuriser et gérer vos secrets

Découvrez comment l'application Credential Vault de Dynatrace permet de gérer...

Les variantes du DevOps : Comprendre l'évolution de la culture de l'ingénierie

Découvrez les différentes déclinaisons du DevOps : DevSecOps, AIOps, NoOps, G...

Dynatrace vs Datadog : Le duel des leaders de l'APM

Comparatif complet entre les deux géants de l'observabilité. Automatisation p...

Grafana vs Kibana : Quel outil de visualisation choisir ?

Découvrez les différences fondamentales entre Grafana, le roi des métriques m...

Grafana Loki vs Elasticsearch : La bataille du stockage de logs

Comparatif entre Loki, le système de logs inspiré par Prometheus, et Elastics...

Prometheus vs VictoriaMetrics : Scalabilité des métriques

Pourquoi choisir VictoriaMetrics comme alternative à Prometheus pour le stock...

OpenTelemetry vs Dynatrace OneAgent : Standard ouvert ou magie propriétaire ?

Comprenez la différence entre l'instrumentation manuelle standardisée d'OpenT...

XLA : Pourquoi l'Expérience Utilisateur est le nouveau standard de l'Observabilité

Découvrez le concept de XLA (Experience Level Agreements), la différence avec...

Dynatrace : Management Zones vs Segments

Comprenez les différences fondamentales entre les Management Zones et les Seg...

Exploiter l'API Dynatrace v2 : Guide Complet de l'Automatisation

Apprenez à utiliser l'API Dynatrace pour automatiser votre observabilité : ge...

Qu'est-ce que le Cloud Computing ? La définition du NIST

Comprenez les fondamentaux du Cloud Computing à travers les 5 caractéristique...

IaaS, PaaS, SaaS : Comprendre les modèles de service

Découvrez les différences entre l'infrastructure, la plateforme et le logicie...

Le modèle de responsabilité partagée en sécurité

Apprenez qui est responsable de quoi en matière de sécurité dans le Cloud.

Élasticité vs Scalabilité : Les clés de la performance

Comprenez comment le cloud s'adapte automatiquement à la charge de vos utilis...

Introduction au FinOps : Maîtriser sa facture Cloud

Comment passer du CapEx à l'OpEx tout en gardant le contrôle financier.

Le Serverless : L'informatique sans serveurs à gérer

Focus sur le Function as a Service (FaaS) et l'abstraction de l'infrastructure.

Edge Computing : Amener le Cloud au plus près des données

Découvrez pourquoi le traitement à la périphérie du réseau est essentiel pour...

Qu'est-ce qu'une application Cloud Native ?

Comprendre les principes des microservices, des conteneurs et des APIs.

Les 6 Rs : Stratégies de migration vers le Cloud

Découvrez les différentes approches pour déplacer votre infrastructure on-pre...

Synthetic Monitoring as Code : Industrialisez la gestion des scénarios synthétiques

Découvrez comment intégrer le Synthetic Monitoring dans vos pipelines CI/CD p...

Grafana Provisioning : Automatisez la gestion de vos tableaux de bord et sources de données

Découvrez comment utiliser le provisioning de Grafana pour gérer vos configur...

Les Data Sources dans Grafana : Connectez et unifiez vos données

Apprenez à étendre les capacités de Grafana via les Data Sources. Découvrez l...

Maîtriser les Transformations dans Grafana : Manipulez vos données avec agilité

Apprenez à utiliser les transformations Grafana pour reformater, calculer et ...

Maîtriser les Variables dans Grafana : Dynamisez vos Tableaux de Bord

Apprenez à utiliser les variables pour créer des tableaux de bord interactifs...

Guide des Bonnes Pratiques Dynatrace : Vers une Observabilité Mature

Optimisez votre plateforme Dynatrace grâce à nos recommandations d'experts : ...

Les types de transactions dans les base de données

Cet article détaille les différences entre trois concepts essentiels dans l'e...

Bonnes Pratiques OpenTelemetry (OTel) : Le Guide de l'Observabilité Moderne

Maîtrisez OpenTelemetry grâce à nos conseils d'experts : implémentation du Co...

Protection des Applications

Découvrez comment sécuriser vos backends contre les abus et les attaques cour...

Haute Disponibilité

Assurez la continuité de service de vos applications avec les stratégies de h...

Bonnes Pratiques Grafana Alloy : Optimiser sa Collecte de Télémétrie

Découvrez les règles d'or pour configurer Grafana Alloy de manière robuste : ...

Architecture OpenTelemetry : Comprendre les 3 niveaux

Plongée au cœur de l'architecture OpenTelemetry. Apprenez comment les données...