🐱 うさねこ教室 Python と可観測性の教室

トレースを計装する

🐱 この章の目次

SDK のセットアップ

トレースの計装には、まず必要なパッケージをインストールします。

pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp

TracerProvider は、Tracer を生成し、Span の処理パイプラインを管理する中心的なコンポーネントです。 SpanProcessor が Span のライフサイクルを制御し、Exporter がデータの送信先を決定します。

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://localhost:4317"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

BatchSpanProcessor は Span をバッファリングしてバッチ送信するため、本番環境に適しています。 開発時はコンソールへ出力する SimpleSpanProcessor + ConsoleSpanExporter の組み合わせが便利です。

Span の作成と属性

Span は、ひとつの処理単位を表すトレースの構成要素です。 属性を付与することで、検索やフィルタリングに使える構造化された情報を付加できます。

tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span("fetch-user") as span:
    span.set_attribute("user.id", user_id)
    span.set_attribute("db.system", "postgresql")
    user = db.get_user(user_id)

例外が発生した場合は record_exception で Span にエラー情報を記録します。 ステータスを ERROR に設定することで、バックエンド側でエラー Span を識別可能になります。

from opentelemetry.trace import StatusCode

with tracer.start_as_current_span("payment") as span:
    try:
        process_payment(order)
    except Exception as e:
        span.record_exception(e)
        span.set_status(StatusCode.ERROR, str(e))
        raise

FastAPI の自動計装

FastAPI アプリケーションには専用の自動計装パッケージが用意されています。

pip install opentelemetry-instrumentation-fastapi
from fastapi import FastAPI
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor

app = FastAPI()
FastAPIInstrumentor.instrument_app(app)

これだけで、全リクエストに対して Span が自動生成され、HTTP メソッド・パス・ステータスコードが属性として記録されます。 内部のビジネスロジックには手動計装で子 Span を追加し、ボトルネックを可視化しましょう。