Cette bibliothèque simplifie l'utilisation d'OpenTelemetry en fournissant une interface minimaliste pour configurer et exposer les outils d'observabilité (traces, logs et métriques).
OpenTelemetry est un framework standard, open-source, pour collecter et envoyer des données d'observabilité (traces, métriques et logs) à partir de vos applications.
- Traces: Suivent le flux d'exécution à travers les composants de votre application
- Métriques: Capturent des valeurs numériques sur l'état et la performance
- Logs: Enregistrent des événements et des messages textuels
- Standard ouvert: Compatible avec de nombreux fournisseurs
- Pas de verrouillage: Vous pouvez changer de backend d'analyse à tout moment
- Intégré: Corrèle naturellement les traces, métriques et logs
- Extensible: Fonctionne avec tous les langages et frameworks
pip install opentelemetry-api opentelemetry-sdk
from mini_telemetry import TelemetryTools
# 1. Initialisation (fait une seule fois)
telemetry = TelemetryTools(
service_name="mon-service",
service_version="1.0.0",
environment="production"
)
# 2. Obtenir les outils pour chaque composant
tracer = telemetry.get_tracer("mon.module")
meter = telemetry.get_meter("mon.module")
logger = telemetry.get_logger("mon.module")
# 3. Utiliser ces outils dans votre code
Mini-Telemetry exporte exclusivement vers stdout (la sortie standard):
- Aucun composant externe requis pour visualiser les données
- Tout apparaît directement dans la console/terminal
- Parfait pour le développement et le debug
- Un autre composant séparé peut collecter cette sortie si nécessaire (Filebeat, Fluentd, etc.)
Format des sorties:
- Logs: Texte formaté ou JSON, avec IDs de trace
- Traces: JSON formaté avec structure de span complète
- Métriques: JSON formaté avec valeurs et timestamps
Cette approche minimaliste permet de:
- Commencer immédiatement sans infrastructure complexe
- Voir toutes les données au même endroit
- Utiliser les outils standard de redirection UNIX si nécessaire (
> file.log
) - Intégrer facilement à des conteneurs Docker ou des environnements cloud
Une trace représente le chemin d'exécution complet à travers le système. Elle est composée de spans interconnectés.
Un span représente une opération unique dans votre code avec:
- Un nom
- Un temps de début/fin
- Des attributs (clé-valeur)
- Des événements horodatés
- Des liens vers d'autres spans
- Un statut (succès/échec)
# Créer un span parent
with tracer.start_as_current_span("opération-principale") as span:
# Ajouter des attributs
span.set_attribute("utilisateur.id", "123")
# Effectuer l'opération...
# Créer un span enfant (sous-opération)
with tracer.start_as_current_span("sous-opération") as child:
# Opération enfant...
pass
# Enregistrer un événement
span.add_event("événement-important", {"détail": "valeur"})
# Définir le statut
span.set_status(trace.Status(trace.StatusCode.OK))
Les métriques sont des mesures numériques collectées sur une période. Types principaux:
- Compteur: Valeur qui ne peut qu'augmenter (ex: nombre de requêtes)
- Histogramme: Distribution de valeurs (ex: temps de réponse)
- Jauge: Valeur qui peut augmenter/diminuer (ex: utilisation mémoire)
# Créer un compteur
counter = meter.create_counter(
name="requêtes",
description="Nombre de requêtes traitées",
unit="1" # Pas d'unité spécifique
)
# Incrémenter le compteur (avec attributs)
counter.add(1, {"endpoint": "/api", "méthode": "GET"})
# Créer un histogramme
histogram = meter.create_histogram(
name="latence",
description="Temps de réponse des requêtes",
unit="ms" # Millisecondes
)
# Enregistrer une valeur
histogram.record(42.5, {"endpoint": "/api"})
Les logs peuvent être enrichis avec les identifiants de trace et de span, permettant de les corréler avec les traces:
# Le logger est configuré pour ajouter automatiquement les IDs de trace et span
logger.info("Traitement démarré")
logger.error("Une erreur s'est produite", exc_info=True)
# Avec contexte supplémentaire
logger.info("Opération terminée", extra={"durée_ms": 123, "status": "success"})
La corrélation est l'un des aspects les plus puissants d'OpenTelemetry:
- Logs → Traces: Les logs incluent automatiquement des IDs de trace/span
- Traces → Métriques: Les attributs de span peuvent être appliqués aux métriques
- Métriques → Traces: Les problèmes détectés dans les métriques peuvent être explorés via les traces associées
Exemple de log avec contexte de trace:
2023-03-27 14:23:45 [INFO] mon.module - trace_id=abcdef0123456789 span_id=0123456789abcdef - Message
-
Conventions de nommage:
- Services:
com.entreprise.service
- Spans:
opération.action
(ex:http.request
,db.query
) - Métriques:
domaine.objet.mesure
(ex:http.server.duration_ms
)
- Services:
-
Attributs cohérents: Utilisez les mêmes attributs pour les spans et métriques associées
# Dans un span
span.set_attribute("endpoint", "/api/users")
# Dans une métrique (même attribut)
counter.add(1, {"endpoint": "/api/users"})
-
Granularité des spans:
- Créez des spans pour les opérations significatives
- Utilisez des spans imbriqués pour les sous-opérations
- Ne tracez pas les fonctions triviales
-
Gestion des erreurs:
try:
# Code
except Exception as e:
# Enregistrer l'exception dans le span
span.record_exception(e)
span.set_status(trace.Status(trace.StatusCode.ERROR, str(e)))
logger.error(f"Erreur: {str(e)}", exc_info=True)
raise
Voir le fichier mini_telemetry.py pour un exemple complet de:
- Configuration des outils
- Instrumentation manuelle
- Corrélation entre traces, métriques et logs
Par défaut, les traces, logs et métriques sont envoyés uniquement à la console (stdout), sans nécessiter de composants externes.
Si vous souhaitez ultérieurement exporter vers d'autres systèmes, voici comment procéder:
- Jaeger/Zipkin pour les traces
- Prometheus pour les métriques
- Elasticsearch pour les logs
Exemple d'ajout d'exportateur OTLP:
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# Dans _setup_tracing()
otlp_exporter = OTLPSpanExporter(endpoint="http://collector:4317")
span_processor = BatchSpanProcessor(otlp_exporter)
trace_provider.add_span_processor(span_processor)
Cette extension est entièrement optionnelle et n'est recommandée que lorsque votre projet atteint une maturité nécessitant une infrastructure d'observabilité complète.