Aller au contenu
Edouard Topin's Blog
Observabilité as Code sur VCF & Kubernetes / Série 01/05

Fondations de l'observabilité pour VCF : métriques, logs et traces

Les trois piliers de l'observabilité définis par la spécification OpenTelemetry, pourquoi ils comptent pour VCF et VKS, et comment choisir le bon outil pour chacun.

Edouard Topin
7 min de lecture
Illustration éditoriale abstraite de trois piliers représentant les métriques, logs et traces reliés par une base commune.

Il existe un moment précis dans chaque incident d’infrastructure où l’on réalise qu’on navigue à l’aveugle. Un service est dégradé, des utilisateurs sont impactés, et le premier réflexe — ouvrir vCenter — affiche des graphes CPU, mémoire et réseau qui ne montrent rien d’anormal. Pendant ce temps, quelque chose au niveau applicatif échoue silencieusement.

C’est exactement ce que l’observabilité est conçue pour prévenir. Et pourtant, la majorité des plateformes VCF que je rencontre sont instrumentées uniquement pour la visibilité couche infrastructure. Les workloads Kubernetes qui tournent dessus génèrent une masse de données — events, logs, métriques, traces — que personne ne collecte de façon systématique.

Cet article pose le cadre conceptuel. Avant de déployer Prometheus ou de configurer Fluent Bit, il faut comprendre précisément ce que représente chaque signal d’observabilité, ce qu’il ne peut pas vous dire, et comment les trois signaux se composent en tableau de bord cohérent. Le projet OpenTelemetry a formalisé ces définitions. C’est la référence que nous utilisons.

La spécification OpenTelemetry : un vocabulaire commun

La spécification OpenTelemetry est l’effort CNCF pour standardiser comment les données d’observabilité sont générées, collectées et transmises. Sa valeur première n’est pas dans les outils — c’est dans le vocabulaire commun qu’elle fournit. Quand vous dites “span”, “trace”, “metric point” ou “log record” dans un contexte OTel, tout le monde dans la salle parle de la même chose.

La spécification distingue trois types de signaux, chacun avec un modèle de données et une sémantique distincts.

Métriques — Une mesure capturée à un instant donné, agrégée sur une série de points. Le modèle de données OTel définit six types d’instruments : Counter, UpDownCounter, Gauge, Histogram, ObservableCounter et ObservableGauge. Un point de métrique porte une valeur, un timestamp et un ensemble d’attributs. Les métriques sont le signal le plus compact : elles perdent le détail de chaque événement en échange d’une agrégation efficace et d’une rétention longue durée.

Logs — Un enregistrement d’un événement discret. Le modèle OTel définit un LogRecord avec un timestamp, un observed timestamp, un contexte de trace (traceId, spanId), un numéro de sévérité, un texte de sévérité, un corps et des attributs. Les logs portent le contexte le plus riche par événement, au prix du volume — un cluster actif produit des millions de lignes de logs par minute.

Traces — Un enregistrement du parcours d’une requête distribuée à travers les services. Une trace est un graphe acyclique orienté de spans. Chaque span a un nom, des timestamps de début/fin, un statut, des attributs, des événements et des liens. Le modèle de trace est ce qui rend le débogage distribué possible : on peut suivre une requête utilisateur unique depuis l’API gateway à travers cinq microservices et identifier exactement quel appel base de données a ajouté 400ms.

Les trois signaux ne sont pas des alternatives. Ils sont complémentaires. Une alerte sur une métrique vous dit que quelque chose ne va pas. Les logs vous disent ce qui s’est passé. Une trace vous dit la latence ou l’erreur trouve son origine dans le graphe d’appels.

Pourquoi les environnements VCF ont besoin des trois couches

Une erreur fréquente chez les équipes plateforme est de confondre observabilité et monitoring. Le monitoring consiste à surveiller des modes de défaillance connus — poser des seuils sur des métriques déjà comprises. L’observabilité est la propriété d’un système qui permet de poser des questions arbitraires sur son état interne à partir de ses sorties externes.

Les plateformes VCF combinent plusieurs couches avec des caractéristiques opérationnelles très différentes. La couche hyperviseur (ESXi, vSAN, NSX) est gérée et émet des métriques structurées via l’API vSphere et Aria Operations. Le plan de contrôle Kubernetes (Supervisor, clusters VKS) expose des métriques via l’endpoint /metrics de ses composants. Les workloads applicatifs dans les pods sont largement opaques sans instrumentation.

Chaque couche nécessite un mécanisme de collecte différent :

  • Métriques ESXi et vSAN disponibles via Aria Operations (vROps) ou via l’API vSphere interrogée par des exporters comme vsphere-exporter pour Prometheus.
  • Métriques composants Kubernetes (kube-apiserver, etcd, kubelet, kube-scheduler) scrapées directement par Prometheus via des ressources ServiceMonitor.
  • Métriques applicatives nécessitant soit de l’auto-instrumentation (agents OTel Java/Python/Go) soit des appels explicites au SDK depuis le code applicatif.
  • Logs des pods écrits sur stdout/stderr et collectés par un DaemonSet (Fluent Bit, Fluentd ou Vector) vers un backend de centralisation.
  • Traces nécessitant de l’instrumentation — via les SDKs OTel ou via le tracing au niveau service mesh (Istio, Linkerd) qui capture les spans au niveau proxy.

Architecture de référence pour VCF + VKS

L’architecture qui fonctionne en production pour une plateforme VCF combine deux couches de collecte.

La première couche est la couche infrastructure : Aria Operations collecte les métriques hôte, cluster, datastore et NSX. Ces métriques couvrent la contention de ressources, les performances vSAN, la saturation réseau et les événements plateforme. Aria Operations est la source de vérité pour la visibilité couche infra.

La deuxième couche est la couche cloud-native : une stack Prometheus (kube-prometheus-stack via Helm) dans chaque cluster VKS collecte les métriques composants Kubernetes, les métriques nœuds (via node-exporter) et les métriques applicatives. Grafana fournit les dashboards corrélant les deux couches via remote_write depuis Aria Operations.

Fluent Bit tourne en DaemonSet dans chaque cluster VKS, collectant les logs pods et les transmettant à Loki. L’OpenTelemetry Collector tourne en Deployment, recevant l’OTLP des applications instrumentées et transmettant les traces à Tempo ou Jaeger.

ESXi / vSAN / NSX

  Aria Operations ──── remote_write ──── Prometheus
       │                                      │
   API vROps                              Grafana
                                         │       │
                                       Loki    Tempo
                                         │       │
                                    Fluent Bit  OTel Collector
                                         │       │
                                      Pods VKS ──┘

Cette architecture évite le piège de déployer une plateforme d’observabilité monolithique pour tout l’estate VCF. Elle compose à la place des outils spécialisés : Aria Operations pour l’infrastructure, Prometheus pour les métriques Kubernetes, Loki pour les logs, Tempo pour les traces, unifiés sous Grafana comme couche unique de requête et de dashboard.

Choisir le bon outil pour chaque signal

La question du choix d’outils est souvent surcompliquée. Les principes sont simples.

Métriques : Prometheus vs Aria Operations vs InfluxDB
Prometheus est le choix natif Kubernetes. Son modèle pull, son modèle de données basé sur les labels et PromQL sont optimisés pour les patterns de cardinalité qu'on rencontre en Kubernetes. Aria Operations est supérieur pour les métriques couche vSphere — il comprend la hiérarchie d'objets vSphere et fournit des corrélations clés en main entre hôte, cluster et objets VM. InfluxDB excelle dans les workloads time-series à haut débit d'écriture et les requêtes SQL-like (Flux), mais manque d'intégration Kubernetes native. Dans un contexte VCF : utilisez Aria Operations pour les métriques infra, Prometheus pour les métriques Kubernetes. Ils se complètent plutôt qu'ils ne se concurrencent.
Logs : Loki vs Elasticsearch vs Splunk
Loki est le choix léger pour les environnements Kubernetes-first. Il n'indexe que les labels (pas le corps complet du log), ce qui le rend significativement moins coûteux à opérer qu'Elasticsearch. Son langage de requête LogQL est modelé sur PromQL, donc la même équipe qui opère Prometheus peut opérer Loki. Elasticsearch (stack ELK) est le meilleur choix quand vous avez besoin de recherche plein texte dans le contenu des logs ou de pipelines d'agrégation complexes. Splunk est le choix enterprise avec le coût opérationnel le plus élevé et le feature set d'analyse sécurité le plus riche. Pour la plupart des équipes plateforme sur VCF + VKS : commencez par Loki. Son coût de stockage est typiquement 10 à 20 fois inférieur à ELK pour un volume de logs équivalent.
Traces : Jaeger vs Tempo vs Zipkin
Jaeger et Zipkin sont deux backends de tracing distribué matures avec support UI pour la visualisation en cascade des traces. Tempo est le backend de stockage de traces de Grafana Labs, conçu pour être interrogé depuis Grafana Explore uniquement — il n'a pas d'UI standalone mais s'intègre nativement avec Loki (corrélation log-vers-trace) et Prometheus (corrélation exemplar-vers-trace). Si votre équipe opère déjà Grafana, Tempo est le choix à moindre friction. Si vous avez besoin d'une UI de traces standalone sans Grafana, Jaeger est la référence.
Collecte : OTel Collector vs agents par langage
L'OpenTelemetry Collector est le pipeline de traitement standard pour les signaux OTel. Il reçoit les données via OTLP (ou des formats legacy), les traite (manipulation d'attributs, sampling, batching) et exporte vers plusieurs backends. L'alternative — envoyer directement les signaux depuis l'application vers le backend — crée un couplage fort entre le code applicatif et la topologie d'infrastructure. Le Collector agit comme couche de découplage vendor-neutral. Pour les déploiements VCF : faites tourner le Collector en Deployment (un par cluster) pour traces et métriques, et en DaemonSet si vous avez besoin de collecte niveau hôte.

Les quatre golden signals et leur application

Les quatre golden signals — latence, trafic, erreurs, saturation — ont été définis par le livre SRE de Google comme l’instrumentation minimum nécessaire à la production. Ils se mappent sur les trois piliers d’observabilité de façon prévisible.

La latence se mesure mieux avec les traces (P50/P95/P99 au niveau span) et les histogrammes (métriques Prometheus _bucket). Les logs peuvent enregistrer la latence par requête mais s’agrègent mal.

Le trafic est un signal métrique : requêtes par seconde, octets par seconde, événements par seconde. Les compteurs Prometheus sont l’outil naturel.

Les erreurs vivent à la fois dans les métriques (compteurs de taux d’erreur) et dans les logs (enregistrements de niveau erreur). Les traces portent un statut d’erreur sur les spans, permettant de corréler “cette trace contient une erreur” avec le service responsable.

La saturation est principalement un signal infra : CPU ready time, pression mémoire, profondeur de file disque, drops de buffers réseau. Ces données viennent de la couche infrastructure — Aria Operations ou node-exporter — pas de l’instrumentation applicative.

Démarrer sans tout instrumenter en même temps

Le mode d’échec le plus fréquent dans les projets d’observabilité est de tenter d’instrumenter tout simultanément. Le résultat est un déploiement de plusieurs mois qui ne délivre aucune valeur tant que tout n’est pas terminé.

L’approche pragmatique consiste à commencer par les deux signaux qui ont le meilleur ratio temps-à-valeur pour les opérations en production. Les métriques d’abord — déployer kube-prometheus-stack avec la configuration de scrape par défaut donne immédiatement la santé des composants Kubernetes, l’utilisation des ressources nœud et le nombre de redémarrages pods sans écrire une ligne de code applicatif. Les logs ensuite — un DaemonSet Fluent Bit avec le filtre de métadonnées Kubernetes donne des logs pods structurés avec namespace, nom de pod, nom de conteneur et labels nœud immédiatement interrogeables dans Loki.

Les traces arrivent en dernier, parce qu’elles nécessitent de l’instrumentation applicative. Les agents d’auto-instrumentation pour Java, Python, Go et Node.js peuvent réduire significativement la charge, mais ils requièrent quand même un changement de déploiement par application. Réservez le tracing distribué aux services où l’analyse de latence est un besoin de production documenté.

Les articles suivants de cette série couvrent chaque couche en détail : les patterns de déploiement Prometheus et Grafana pour VKS dans le prochain article, la configuration Loki et Fluent Bit dans le troisième, la conception du pipeline OTel Collector dans le quatrième, et l’intégration Aria Operations avec la stack open source dans le cinquième.

Références.

Reçois le prochain par email

Les nouveaux articles et séries, envoyés à leur publication. Aucun autre courrier.

Désabonnement en un clic, à tout moment.

Retour au blog
Partager

Articles similaires

  1. 17 min de lecture

    Modèles de coûts FinOps : ce que facturent AWS, Azure et GCP — et ce que VCF calcule

    Un cluster-heure EKS, un palier AKS, une requête de pod GKE et un matériel VCF amorti ne sont pas quatre valeurs de la même variable. Ce que chaque plateforme facture, et ce que VCF calcule.

  2. 23 min de lecture

    Network policies et Cilium : construire un default-deny défendable

    L'API NetworkPolicy est livrée avec Kubernetes ; l'appliquer est le travail du CNI. Ce que Cilium ajoute, ce qui reste standard, et comment atteindre le default-deny sans casser la production.

  3. 18 min de lecture

    RBAC Kubernetes : les fondations, et les pièges qui survivent à l'audit

    Chacun de ces pièges est publié sur kubernetes.io. Ce qui manque, c'est leur mise en ordre — et le chemin qui mène d'un Namespace vSphere jusqu'à cluster-admin.

Suivre le blog

Nouveaux articles, réflexions et mises à jour.