Exemple d'auto-instrumentation des journaux

Cette page montre comment utiliser l’auto-instrumentation des journaux Python dans OpenTelemetry.

Contrairement aux traces et aux métriques, il n’y a pas d’API équivalente pour les journaux. Il n’y a qu’un SDK. Pour Python, vous utiliserez la bibliothèque logger de Python, puis le SDK OTel qui attachera un gestionnaire OTLP au logger racine, transformant le logger Python en logger OTLP. Une façon d’accomplir cela est documentée dans l’exemple “logs” du dépôt OpenTelemetry Python.

Une autre façon de le faire est via le support de Python pour l’auto-instrumentation des journaux. L’exemple ci-dessous est basé sur l’exemple “logs” du dépôt OpenTelemetry Python.

Il existe une API qui fait le pont pour les journaux ; cependant, elle est différente de l’API des traces et des métriques, car elle n’est pas utilisée par les développeurs d’applications pour créer des journaux. Au lieu de cela, ils peuvent utiliser cette API pour configurer des appenders de journaux dans les bibliothèques de journalisation standard spécifiques au langage. Pour plus d’informations, voir API des journaux.

Commencez par créer le répertoire des exemples et le fichier Python d’exemple :

mkdir python-logs-example cd python-logs-example touch example.py 

Collez le contenu suivant dans example.py :

import logging  from opentelemetry import trace  tracer = trace.get_tracer_provider().get_tracer(__name__)  # Corrélation du contexte de trace {#trace-context-correlation} with tracer.start_as_current_span("foo"):  # Faire quelque chose  current_span = trace.get_current_span()  current_span.add_event("Ceci est un événement de span")  logging.getLogger().error("Ceci est un message de journal") 

Ouvrez et copiez l’exemple otel-collector-config.yaml , et enregistrez-le dans python-logs-example/otel-collector-config.yaml

Préparation

Exécutez l’exemple suivant, nous vous recommandons d’utiliser un environnement virtuel pour le faire. Exécutez les commandes suivantes pour vous préparer à l’auto-instrumentation des journaux :

mkdir python_logs_example virtualenv python_logs_example source python_logs_example/bin/activate 

Installation

Les commandes suivantes installent les paquets appropriés. Le paquet opentelemetry-distro dépend de quelques autres, comme opentelemetry-sdk pour l’instrumentation personnalisée de votre propre code et opentelemetry-instrumentation qui fournit plusieurs commandes qui aident à instrumenter automatiquement un programme.

pip install opentelemetry-distro pip install opentelemetry-exporter-otlp 

Les exemples qui suivent envoient les résultats de l’instrumentation à la console. Apprenez-en plus sur l’installation et la configuration de la Distribution OpenTelemetry pour envoyer la télémétrie à d’autres destinations, comme un Collecteur OpenTelemetry.

Note: Pour utiliser l’instrumentation automatique via opentelemetry-instrument, vous devez la configurer via des variables d’environnement ou la ligne de commande. L’agent crée un pipeline de télémétrie qui ne peut être modifié que par ces moyens. Si vous avez besoin de plus de personnalisation pour vos pipelines de télémétrie, alors vous devez renoncer à l’agent et importer le SDK OpenTelemetry et les bibliothèques d’instrumentation dans votre code et les configurer dans votre code. Vous pouvez également étendre l’instrumentation automatique en important l’API OpenTelemetry. Pour plus de détails, voir la référence de l’API.

Exécution

Cette section vous guide à travers le processus d’exécution d’une journalisation instrumentée automatiquement.

Ouvrez une nouvelle fenêtre de terminal et démarrez le Collecteur OTel :

docker run -it --rm -p 4317:4317 -p 4318:4318 \  -v $(pwd)/otel-collector-config.yml:/etc/otelcol-config.yml \  --name otelcol \  otel/opentelemetry-collector-contrib:0.76.1 \  "--config=/etc/otelcol-config.yml" 

Ouvrez un autre terminal et exécutez le programme Python :

source python_logs_example/bin/activate  export OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true opentelemetry-instrument \  --traces_exporter console,otlp \  --metrics_exporter console,otlp \  --logs_exporter console,otlp \  --service_name python-logs-example \  python $(pwd)/example.py 

Exemple de sortie :

... ScopeSpans #0 ScopeSpans SchemaURL: InstrumentationScope __main__ Span #0  Trace ID : 389d4ac130a390d3d99036f9cd1db75e  Parent ID :  ID : f318281c4654edc5  Name : foo  Kind : Internal  Start time : 2023-08-18 17:04:05.982564 +0000 UTC  End time : 2023-08-18 17:04:05.982667 +0000 UTC  Status code : Unset  Status message : Events: SpanEvent #0  -> Name: This is a span event  -> Timestamp: 2023-08-18 17:04:05.982586 +0000 UTC  ...  ScopeLogs #0 ScopeLogs SchemaURL: InstrumentationScope opentelemetry.sdk._logs._internal LogRecord #0 ObservedTimestamp: 1970-01-01 00:00:00 +0000 UTC Timestamp: 2023-08-18 17:04:05.982605056 +0000 UTC SeverityText: ERROR SeverityNumber: Error(17) Body: Str(This is a log message) Attributes:  -> otelSpanID: Str(f318281c4654edc5)  -> otelTraceID: Str(389d4ac130a390d3d99036f9cd1db75e)  -> otelTraceSampled: Bool(true)  -> otelServiceName: Str(python-logs-example) Trace ID: 389d4ac130a390d3d99036f9cd1db75e Span ID: f318281c4654edc5 ... 

Notez que l’événement de Span et le journal ont tous deux le même SpanID (f318281c4654edc5). Le SDK de journalisation ajoute le SpanID du Span actuel à tous les événements journalisés pour améliorer la capacité à corréler la télémétrie.