Aller au contenu
Industrial Discipline
Tous les articles

3 min de lectureMis à jour le

Un driver OTLP pour OSProfiler : tracer OpenStack avec Jaeger

OSProfiler dispose d'un driver OpenTelemetry (OTLP) qui remplace le driver Jaeger client abandonné : comment l'activer, l'utiliser, et ce que l'on peut en lire. Une contribution OpenStack soutenue par la Société Générale.

Par Sahid Orentino Ferdjaoui

Pourquoi tracer OpenStack

Dans l'écosystème OpenStack, performance et fiabilité sont déterminantes. On pourrait croire que les détails des échanges entre services et des requêtes en base de données n'intéressent pas l'opérateur de la plateforme. Ils sont pourtant indispensables pour comprendre et exploiter l'architecture : ils permettent d'identifier les goulots d'étranglement — jusqu'à la conception et au modèle de données — et d'aider la communauté à corriger ce qui cause des lenteurs. C'est le rôle d'OSProfiler.

La contribution du driver OTLP sur opendev
La revue de la contribution du driver OTLP sur opendev.

Qu'est-ce que le profiling ?

Le profiling est une technique d'analyse du comportement d'une application : temps d'exécution, utilisation de la mémoire, interactions entre composants.

OSProfiler est un outil de profiling conçu pour les services OpenStack. Il offre une interface unifiée pour collecter des traces de toutes les composantes, de Nova à Neutron et au-delà. Une trace suit une requête de bout en bout ; elle est faite de spans, chacun représentant une étape (un appel d'API, une requête SQL) avec sa durée et son parent. On voit ainsi quel service attend quel autre, et où le temps passe.

Chaîne de profiling : client OpenStack, services instrumentés, driver OTLP, JaegerClient openstack--os-profile <hmac>ServicesNova · Neutron · …Driver OTLPOSProfiler ≥ 4.1.0Jaegertraces + interfaceHMACspansOTLPotlp://hôte:4318 · HTTP seulement pour l'instant (pas de gRPC)
Le client signe le contexte de trace avec la clé HMAC ; OSProfiler, dans chaque service, émet les spans vers le backend.

OSProfiler utilise différents backends, via des drivers. Mais le projet souffrait d'un manque de contributions, et depuis l'abandon de la bibliothèque Jaeger client, il n'était plus raisonnable de s'en servir pour envoyer des traces vers l'interface Jaeger d'une plateforme en production.

Une contribution soutenue par la Société Générale

La Société Générale souhaitait contribuer à OpenStack et profiter pleinement d'un service de profiling pour ses plateformes de production. Un travail a donc été entrepris pour proposer une implémentation introduisant un nouveau driver OpenTelemetry, appelé à remplacer à terme le driver Jaeger client.

Depuis la version 4.1.0 d'OSProfiler, le driver OTLP est utilisable. Les traces sont envoyées directement à un backend Jaeger, qui écoute OTLP sur le port 4318 par défaut.

Configuration

Avec Kolla, deux variables suffisent :

globals.yml
enable_osprofiler: "yes"
osprofiler_backend_connection_string: "otlp://jaeger.server:4318"

Hors Kolla, la configuration de chaque service (ici Nova) contient une section [profiler] :

nova.conf (extrait)
[profiler]
enabled = True
hmac_keys = SECRET_KEY
connection_string = otlp://jaeger.server:4318
trace_sqlalchemy = True

hmac_keys est la clé qui autorise le profiling : sans elle, personne ne peut déclencher de traces. trace_sqlalchemy ajoute les requêtes SQL aux traces.

Profiler une commande

On profile une commande en passant la clé HMAC à la ligne de commande OpenStack avec l'option --os-profile :

openstack --os-profile "$HMAC_KEY" server list

Dans Kolla, la clé est générée automatiquement : on la trouve dans /etc/kolla/passwords.yml.

grep osprofiler /etc/kolla/passwords.yml

La commande s'exécute normalement, mais chaque service qu'elle traverse émet ses spans. Il reste à ouvrir l'interface Jaeger et à rechercher la trace correspondante.

Maquette d'une trace dans l'interface Jaeger : la création d'une instanceSPAN0durée totalePOST /serversnova-apibuild_instancesnova-conductorselect_destinationsnova-schedulercreate_portneutron-serverINSERT portsbase de donnéesspawnnova-compute
IllustratifMaquette : noms et durées inventés pour montrer ce que l'on lit dans une trace — quel service attend quel autre, et où le temps passe.

Sur une trace de ce genre, un span de base de données anormalement long, au milieu de l'appel d'un service, désigne immédiatement la requête à examiner. Pour un exemple de charge sur la base de données côté Neutron, voir l'article sur le service metadata.

Limites et précautions

Pour aller plus loin

Contact

Ce problème vous parle ?

Nous intervenons sur ces sujets en production. Écrivez-nous quelques lignes de contexte.

Nous écrire