Lab 4 — Dashboard unifié logs / métriques / traces
Vous disposez maintenant des trois signaux : traces (Labs 2), métriques système et produit (Lab 3), logs (collectés d’office par la démo). Dans ce lab, vous les rassemblez dans un seul dashboard Grafana : la « vue service » que consulterait un astreinte.
Prérequis
- Labs 1 à 3 terminés.
- D’abord les variables de la formation chargées dans votre shell :
. ./scripts/env.sh— elles donnent$PF_HOSTet$UI_PORT, l’adresse et le port de vos UIs. - Ensuite le port-forward des UIs :
./scripts/open-ui.sh. Le script affiche l’URL de Grafana,http://$PF_HOST:$UI_PORT/grafana/— soithttp://localhost:8080/grafana/sur un poste individuel, maishttp://localhost3:8080/grafana/pour student3 sur le serveur partagé.
Étapes
- Explorer les datasources déjà câblées :
Dans Grafana : ⚙️ Connections → Data sources. Trois sources correspondent à nos trois signaux — identifiez-les et notez leur type.
💡 Où lire l’UID d’une datasource ? Deux chemins, l’un pour la souris, l’autre pour un script.
Dans l’interface, ouvrez la datasource : l’UID est dans l’URL, en dernier segment —
.../grafana/connections/datasources/edit/webstore-metrics.En ligne de commande (la démo autorise l’accès anonyme avec le rôle Admin : aucun jeton à créer) :
Cette même API montre l’UID à l’œuvre entre datasources. La configuration d’une datasource se lit dans le champ
jsonDatade la réponse ; isolons-en une ligne, celle de Prometheus :Traduction : « quand tu rencontres un
trace_id, va ouvrir la trace dans la datasource dont l’UID estwebstore-traces» — c’est-à-dire Jaeger. Sans cet UID, Grafana saurait qu’il tient un identifiant de trace, mais pas où aller la chercher. C’est le mécanisme des exemplars, à l’étape 9.La même configuration se lit à deux autres endroits : dans l’interface, sur la page de la datasource Prometheus ; et à la source, dans la ConfigMap qui la provisionne —
kubectl get configmap grafana-datasources -n otel-demo -o yaml.
- Créer un dashboard vide (Dashboards → New → New dashboard), puis ajouter la variable
service_name:
Settings → Variables → New variable :
- Type
Query, datasource Prometheus - Query :
label_values(traces_span_metrics_calls_total, service_name)
traces_span_metrics_calls_totalest produite par le connector spanmetrics du collecteur (vu au Lab 3) : chaque service tracé a donc automatiquement des métriques de débit/latence — y comprisreview-service, sans l’avoir instrumenté pour les métriques !
- Panel 1 — métriques (Prometheus) : un Time series « Débit de requêtes » :
Ajoutez un second panel « Latence p95 » :
- Panel 2 — logs (OpenSearch) : un panel de type Logs, datasource OpenSearch, requête Lucene :
Panel 3 — traces (Jaeger) : un panel Table (ou Traces), datasource Jaeger, query type Search, service
$service_name, limit 20.Tester la variable : basculez
service_nameentrefrontend,checkoutetreview-service— les trois panels doivent suivre.Exporter le dashboard en JSON (Share → Export → Save to file) : c’est le livrable, à committer dans votre dépôt.
Bonus — une règle d’alerte : Alerting → New alert rule sur la latence p95 de
$service_name(> 500 ms pendant 2 min). Observez l’étatPending→Firingen chargeant la boutique via le load generator.Bonus (avancé) — les exemplars : du point sur la courbe à la trace.
Une métrique est une agrégation : « 30 requêtes, p95 à 400 ms » ne dit pas quelles requêtes. Un exemplar est une mesure individuelle conservée à côté de l’agrégat, avec le trace_id de la requête qui l’a produite :
Grafana pose alors de petits marqueurs sur la courbe de latence : cliquer sur l’un d’eux ouvre la trace de cette requête précise, celle qui a fait le pic. Au lieu de chercher dans Jaeger une trace qui ressemblerait au symptôme, c’est le symptôme qui vous donne son identifiant.
Le plus rapide est d’ouvrir un dashboard que la démo livre exprès pour ça, « Cart Service Exemplars » :
Ses panels tracent la latence du panier (heatmap et p95) avec l’option Exemplars activée, sur des métriques qui en produisent vraiment : app_cart_get_cart_latency_seconds_bucket en porte plusieurs dizaines par demi-heure. Les marqueurs apparaissent le long de la courbe — cliquez sur l’un d’eux, puis sur le lien de la trace.
Cet UID est le même sur tous les clusters de la formation : il n’est pas tiré au hasard à l’installation, il est écrit dans la ConfigMap
grafana-dashboard-exemplars-dashboardque le chart livre — et le chart est épinglé à la version0.40.9. Vous pouvez le vérifier :kubectl get configmap grafana-dashboard-exemplars-dashboard -n otel-demo -o yaml | grep -o '"uid": *"[^"]*"'.
Pour le faire vous-même, dans Explore, datasource Prometheus, en activant les exemplars dans les options de la requête :
💡 Et pour en avoir sur vos panels ?
spanmetricssait produire des exemplars — il faut simplement le lui demander, l’option étant désactivée par défaut. Sur le modèle du Lab 3, créezmanifests/40-otel-grafana-values.yaml:puis empilez-le sur les values des labs précédents :
Deux minutes plus tard,
calls_totalet l’histogramme de latence portent leurs exemplars — et votre panel « Latence p95 » devient cliquable jusqu’à la trace. C’est le{}de la configuration par défaut qui vous en privait, pas une limite du connector.Deux réserves à connaître : un exemplar n’est gardé que le temps d’un cycle d’export (il n’est pas rejoué indéfiniment), et
max_per_data_pointen limite le nombre à 5 par point de mesure.
Livrable
Le dashboard « vue service » exporté en JSON, avec ses 3 panels pilotés par la variable service_name.