ログ自動計装の例

このページでは、OpenTelemetry で Python ログを自動計装する方法を説明します。

トレースやメトリクスとは異なり、同等のLogs APIはありません。 あるのはSDKだけです。 Python の場合は、Python の logger ライブラリを使用し、OTel SDK がルートロガーに OTLP ハンドラーをアタッチし、Python ロガーを OTLP ロガーに変えます。 これを実現する1つの方法は、OpenTelemetry Python リポジトリのログの例で文書化されています。

これを実現するもう1つの方法は、Pythonがログの自動計装をサポートすることです。 以下の例は、OpenTelemetry Python リポジトリのログの例に基づいています。

しかし、アプリケーション開発者がログを作成するために使用するものではないので、トレースおよびメトリクスAPIとは異なります。 かわりに、このブリッジAPIを使用して、標準の言語固有のロギングライブラリでログアペンダーをセットアップします。 詳細については、Logs API を参照のこと。

まずexamplesディレクトリとexample Pythonファイルを作成します。

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

以下の内容を example.py に貼り付けます。

import logging

from opentelemetry import trace

tracer = trace.get_tracer_provider().get_tracer(__name__)

# トレースコンテキストの相関
with tracer.start_as_current_span("foo"):
    # なにかする
    current_span = trace.get_current_span()
    current_span.add_event("This is a span event")
    logging.getLogger().error("This is a log message")

otel-collector-config.yamlのサンプルを開いてコピーし、python-logs-example/otel-collector-config.yamlに保存します。

準備

以下の例を実行します。 その際、仮想環境を使用することを推奨します。 以下のコマンドを実行し、ログの自動計装の準備をします。

mkdir python_logs_example
virtualenv python_logs_example
source python_logs_example/bin/activate

インストール

以下のコマンドは適切なパッケージをインストールします。 opentelemetry-distro パッケージは、独自のコードをカスタム計装するための opentelemetry-sdk や、プログラムを自動的に計装するためのいくつかのコマンドを提供する opentelemetry-instrumentation など、他のいくつかのパッケージに依存しています。

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

この後の例では、計装結果をコンソールに送信します。 コレクターのような他の送信先にテレメトリーを送信するための OpenTelemetry Distro のインストールと設定については、ドキュメントを参照してください。

: opentelemetry-instrumentによる自動計装を使用するには、 環境変数またはコマンドラインで設定する必要があります。 エージェントはテレメトリーパイプラインを作成するので、これらの手段以外では変更できません。 テレメトリーパイプラインのカスタマイズが必要な場合は、エージェントを使用せず、 OpenTelemetry SDK と計装ライブラリをコードにインポートし、そこで設定する必要があります。 また、OpenTelemetry API をインポートすることで > 自動計装を拡張することもできます。 詳細については、API リファレンス を参照してください。

実行

この節は、自動計装されたログを実行する手順を説明します。

新しいターミナルウィンドウを開き、コレクターを起動します。

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

別のターミナルを開き、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

サンプル出力は次のとおりです。

...
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
...

Span イベントとログの両方が同じ SpanID(f318281c4654edc5)を持つことに注意してください。 ロギングSDKは、テレメトリーを相関させる能力を向上させるために、ログに記録されたイベントに現在のスパンのSpanIDを追加します。