すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:OpenTelemetry を使用した Python アプリケーションからのトレースデータのレポート

最終更新日:Mar 12, 2026

Python アプリケーションを OpenTelemetry でトレース可能にすることで、OpenTelemetry 向けマネージドサービスにトレースデータを送信できます。接続後、Application Real-Time Monitoring Service (ARMS) ではアプリケーションのトポロジー、トレース、異常トランザクション、遅延トランザクション、および SQL 分析が表示されます。

本トピックでは、以下の 3 種類のトレース可能化(イベントトラッキング)手法について説明します:

  • 自動トレース可能化 — コード変更は不要です。OpenTelemetry エージェントが、実行時にサポート対象のフレームワークを自動的にトレース可能にします。

  • 手動トレース可能化 — 完全な制御が可能です。OpenTelemetry SDK を使用して、スパン、属性、バゲージを直接追加します。

  • 組み合わせトレース可能化 — 自動トレース可能化の上位にカスタムスパンを重ねることで、特定の操作に対する可視性を高めます。

重要 ヒント: Alibaba Cloud では、LlamaIndex、Dify、LangChain、OpenAI、Qwen などの LLM フレームワーク向けに、組み込みの可観測性機能を備えた専用 Python エージェントを提供しています。このエージェントは、オープンソース版エージェントと比較して、より豊富なメトリック、トレース、継続的プロファイリングデータを生成します。詳細については、「Python アプリケーションのモニタリング」をご参照ください。

前提条件

  • OpenTelemetry 向けマネージドサービス コンソールからのエンドポイントおよび認証トークン。「アクセスポイント情報の取得」を参照してください。

サポート対象のフレームワーク

OpenTelemetry では、一般的な Python フレームワーク向けに自動トレース可能化プラグインが提供されています。下記の表には、サポート対象のフレームワークとそのバージョン要件が記載されています。完全な一覧については、「opentelemetry-python-contrib」をご参照ください。

説明 表中の ~= V.N は、>= V.N かつ == V.* を意味します。たとえば、aiohttp ~= 3.0 は、3.x 系列における 3.0 以降のバージョンを指します。

サポート対象の Python フレームワークを表示するには、展開してください。

プラグインサポート対象のパッケージおよびバージョン
opentelemetry-instrumentation-aio-pikaaio_pika - [7.2.0, 10.0.0)
opentelemetry-instrumentation-aiohttp-clientaiohttp ~= 3.0
opentelemetry-instrumentation-aiohttp-serveraiohttp ~= 3.0
opentelemetry-instrumentation-aiopgaiopg - [0.13.0, 2.0.0)
opentelemetry-instrumentation-asgiasgiref ~= 3.0
opentelemetry-instrumentation-asyncpgasyncpg >= 0.12.0
opentelemetry-instrumentation-aws-lambdaaws_lambda
opentelemetry-instrumentation-botoboto ~= 2.0
opentelemetry-instrumentation-boto3sqsboto3 ~= 1.0
opentelemetry-instrumentation-botocorebotocore ~= 1.0
opentelemetry-instrumentation-cassandracassandra-driver ~= 3.25, scylla-driver ~= 3.25
opentelemetry-instrumentation-celerycelery - [4.0, 6.0)
opentelemetry-instrumentation-confluent-kafkaconfluent-kafka - [1.8.2, 2.2.0]
opentelemetry-instrumentation-dbapidbapi
opentelemetry-instrumentation-djangodjango >= 1.10
opentelemetry-instrumentation-elasticsearchelasticsearch >= 2.0
opentelemetry-instrumentation-falconfalcon - [1.4.1, 4.0.0)
opentelemetry-instrumentation-fastapifastapi ~= 0.58
opentelemetry-instrumentation-flaskflask - [1.0, 3.0)
opentelemetry-instrumentation-grpcgrpcio ~= 1.27
opentelemetry-instrumentation-httpxhttpx >= 0.18.0
opentelemetry-instrumentation-jinja2jinja2 - [2.7, 4.0)
opentelemetry-instrumentation-kafka-pythonkafka-python >= 2.0
opentelemetry-instrumentation-logginglogging
opentelemetry-instrumentation-mysqlmysql-connector-python ~= 8.0
opentelemetry-instrumentation-mysqlclientmysqlclient < 3
opentelemetry-instrumentation-pikapika >= 0.12.0
opentelemetry-instrumentation-psycopg2psycopg2 >= 2.7.3.1
opentelemetry-instrumentation-pymemcachepymemcache - [1.3.5, 5)
opentelemetry-instrumentation-pymongopymongo - [3.1, 5.0)
opentelemetry-instrumentation-pymysqlPyMySQL < 2
opentelemetry-instrumentation-pyramidpyramid >= 1.7
opentelemetry-instrumentation-redisredis >= 2.6
opentelemetry-instrumentation-remouladeremoulade >= 0.50
opentelemetry-instrumentation-requestsrequests ~= 2.0
opentelemetry-instrumentation-sqlalchemysqlalchemy
opentelemetry-instrumentation-sqlite3sqlite3
opentelemetry-instrumentation-starlettestarlette ~= 0.13.0
opentelemetry-instrumentation-system-metricspsutil >= 5
opentelemetry-instrumentation-tornadotornado >= 5.1.1
opentelemetry-instrumentation-tortoiseormtortoise-orm >= 0.17.0
opentelemetry-instrumentation-urlliburllib
opentelemetry-instrumentation-urllib3urllib3 - [1.0.0, 3.0.0)
opentelemetry-instrumentation-wsgiwsgi

サンプルコード

完全なサンプルコードは、「python-opentelemetry-demo」からダウンロードできます。

トランスポートプロトコルの選択

OpenTelemetry 向けマネージドサービスでは、HTTP および gRPC の両方のプロトコルでトレースデータを受け付けます。ネットワーク環境に応じて適切なプロトコルを選択してください。

プロトコル推奨される利用シーン補足事項
HTTPほとんどの環境プロキシおよびファイアウォールを透過的に通過できます。認証ヘッダーは不要です。
gRPC低遅延・高スループットが求められる環境grpcio パッケージのインストールが必要です。Authentication ヘッダーを使用します。

以下に示す例では、両方のオプションを紹介しています。ネットワーク要件に応じて、いずれかを選択してください。

プレースホルダーのリファレンス

以下の例に含まれるプレースホルダーを、実際の値に置き換えてください。

プレースホルダー説明取得元
<your-service-name>ARMS コンソールでアプリケーションを識別します。お客様が定義します。例: my-python-app
<host-name>アプリケーションを実行しているマシンのホスト名。ターミナルで hostname を実行します。
<endpoint>トレースデータをレポートするためのエンドポイント (HTTP または gRPC)。OpenTelemetry 向けマネージドサービス コンソール。詳細については、「アクセスポイント情報の取得」をご参照ください。
<token>認証トークン (gRPC のみ)。OpenTelemetry 向けマネージドサービス コンソール。詳細については、「アクセスポイント情報の取得」をご参照ください。

自動トレース可能化

自動トレース可能化は、分散トレーシングを迅速に導入するための最も簡単な方法です。OpenTelemetry エージェントが、コード変更なしで実行時にサポート対象のフレームワークをトレース可能にします。

ステップ 1:依存関係のインストール

pip install django
pip install requests
pip install opentelemetry-distro \
	opentelemetry-exporter-otlp

opentelemetry-bootstrap -a install

opentelemetry-bootstrap は、インストール済みのライブラリを検出し、該当するトレース可能化プラグインを自動的にインストールします。

ステップ 2:Django プロジェクトおよびアプリケーションの作成

  1. AutoAndManualDemo プロジェクトを作成します:

       django-admin startproject AutoAndManualDemo
  2. プロジェクト内に HelloWorld アプリケーションを作成します:

       cd AutoAndManualDemo
    
       # プロジェクト内に HelloWorld アプリケーションを作成します。
       python manage.py startapp helloworld

ステップ 3:アプリケーションコードの追加

  1. 次のコードを AutoAndManualDemo/helloworld/views.py ファイルに追加します:

       from django.http import HttpResponse
       from datetime import datetime
    
       # ビューを定義します。
       def hello_world_view(request):
           result = "Hello World!  Current Time =" + str(get_time())
           return HttpResponse(result)
    
       def get_time():
           now = datetime.now()
           return now.strftime("%H:%M:%S")
  2. AutoAndManualDemo/helloworld/urls.py ファイルを作成し、以下のコードを追加します:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  3. AutoAndManualDemo/AutoAndManualDemo/urls.py ファイルに URL パターンを追加します:

       from django.contrib import admin
       from django.urls import path, include
    
       urlpatterns = [
        path('admin/', admin.site.urls),
        path('helloworld/', include('helloworld.urls')),
       ]

ステップ 4:アプリケーションの実行

起動コマンドの先頭に opentelemetry-instrument を付与し、エクスポーターの構成を渡します。

HTTP 経由でのレポート

opentelemetry-instrument \
    --traces_exporter console,otlp_proto_http \
    --metrics_exporter none \
    --service_name <your-service-name> \
    --exporter_otlp_traces_endpoint <endpoint> \
    python manage.py runserver --noreload

コンソールにトレースデータを表示しない場合は、--traces_exporter パラメーターを --traces_exporter otlp_proto_http に設定してください。

説明
  • --noreload フラグにより、Django が manage.main メソッドを二重に実行することを防ぎます。
  • CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False というエラーが表示された場合、実行前に環境変数を設定してください。このエラーは、opentelemetry-instrument がプロジェクトの設定ファイルではなく、デフォルトの Django 設定ファイル(django/conf/global_settings.py)を読み込むために発生します。
  export DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settings

ステップ 5:トレースデータの送信確認

  1. ブラウザで http://127.0.0.1:8000/helloworld/ にアクセスします。コンソールにトレースデータが表示され、OpenTelemetry 向けマネージドサービスにトレースデータが送信されます。

  2. ARMS コンソールにログインします。

  3. 左側のナビゲーションウィンドウで、アプリケーションモニタリング > アプリケーション を選択します。

  4. アプリケーション ページで、設定したサービス名でアプリケーションを検索し、クリックします。

  5. アプリケーションの詳細ページで、トレースが表示されていることを確認します。送信したリクエストに対応するスパンデータが表示されるはずです。

説明 icon言語 列に アイコンが表示されている場合、アプリケーションはアプリケーションモニタリングに接続されています。ハイフン(-)が表示されている場合、OpenTelemetry 向けマネージドサービスに接続されています。

手動トレース可能化

スパン、属性、コンテキスト伝搬に対して細かい制御を行う場合は、手動トレース可能化を使用します。この手法では、OpenTelemetry SDK の呼び出しをコードに直接追加します。

ステップ 1:依存関係のインストール

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

ステップ 2:OpenTelemetry の初期化

トレーサープロバイダーおよびエクスポーターを構成する初期化モジュール(例: manual.py)を作成します。

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
    OTLPSpanExporter as OTLPSpanGrpcExporter,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
    OTLPSpanExporter as OTLPSpanHttpExporter,
)
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor


def init_opentelemetry():
    resource = Resource(attributes={
        SERVICE_NAME: "<your-service-name>",
        HOST_NAME: "<host-name>",
    })

    # オプション A:gRPC 経由でのエクスポート
    span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
        endpoint="<endpoint>",
        headers=("Authentication=<token>"),
    ))

    # オプション B:HTTP 経由でのエクスポート(使用する場合はコメントを解除)
    # span_processor = BatchSpanProcessor(OTLPSpanHttpExporter(
    #     endpoint="<endpoint>",
    # ))

    trace_provider = TracerProvider(
        resource=resource,
        active_span_processor=span_processor,
    )
    trace.set_tracer_provider(trace_provider)

ステップ 3:スパンの作成

初期化後にトレーサーを取得し、操作の追跡にスパンを作成します。

tracer = trace.get_tracer(__name__)

# コンテキストマネージャーパターン
with tracer.start_as_current_span("child_span") as child_span:
    print("hello world")

親子関係を表すためにスパンをネストできます:

def outer_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("parent_span") as parent_span:
        inner_method()

def inner_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("child_span") as child_span:
        print("hello world")

ステップ 4:トレース ID およびスパン ID の取得

現在のスパンコンテキストからトレース ID およびスパン ID を抽出します。これらの ID は、ログとトレースの相関付けに役立ちます。

ctx = trace.get_current_span().get_span_context()
trace_id = '{trace:032x}'.format(trace=ctx.trace_id)
span_id = '{span:016x}'.format(span=ctx.span_id)
print(trace_id)
print(span_id)

ステップ 5:Baggage API を使用したカスタムメタデータの伝搬

OpenTelemetry Baggage API は、トレース内のスパン間でキーと値のペアを伝搬します。ユーザー ID、テナント ID、リクエストコンテキストなどのメタデータをサービス間で渡すために、バゲージを使用します。

from opentelemetry import trace, baggage

def baggage_and_attribute_usage():
    tracer = trace.get_tracer(__name__)

    # グローバルレベルでバゲージを設定
    global_ctx = baggage.set_baggage("key", "value_from_global_ctx")

    # カスタム属性を持つスパンを作成
    with tracer.start_as_current_span(
        name='baggage_parent_span',
        attributes={'attribute_key': 'value'},
    ) as baggage_parent_span:

        # 親コンテキストでバゲージを設定
        parent_ctx = baggage.set_baggage("key", "value_from_parent_ctx")

        with tracer.start_as_current_span(
            name='baggage_child_span',
            context=parent_ctx,
        ) as baggage_child_span:

            # 子コンテキストでバゲージを設定
            child_ctx = baggage.set_baggage("key", "value_from_child_ctx")

    # 各コンテキストからバゲージ値を読み取ります
    print(baggage.get_baggage("key", global_ctx))   # value_from_global_ctx
    print(baggage.get_baggage("key", parent_ctx))    # value_from_parent_ctx
    print(baggage.get_baggage("key", child_ctx))     # value_from_child_ctx

ステップ 6:実行および確認

python manual.py

アプリケーションの実行後、ARMS コンソールでトレースデータを確認します。「自動トレース可能化」セクションの「トレースデータの送信確認」の手順に従ってください。

完全なサンプルコードを表示するには、展開してください。

from opentelemetry import trace, baggage
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
    OTLPSpanExporter as OTLPSpanGrpcExporter,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
    OTLPSpanExporter as OTLPSpanHttpExporter,
)
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor


def init_opentelemetry():
    resource = Resource(attributes={
        SERVICE_NAME: "<your-service-name>",
        HOST_NAME: "<host-name>",
    })

    # gRPC 経由でのエクスポート
    span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
        endpoint="<endpoint>",
        headers=("Authentication=<token>"),
    ))

    # HTTP 経由でのエクスポート(使用する場合はコメントを解除)
    # span_processor = BatchSpanProcessor(OTLPSpanHttpExporter(
    #     endpoint="<endpoint>",
    # ))

    trace_provider = TracerProvider(
        resource=resource,
        active_span_processor=span_processor,
    )
    trace.set_tracer_provider(trace_provider)


def inner_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("child_span") as child_span:
        print("hello world")


def outer_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("parent_span") as parent_span:
        inner_method()


def baggage_and_attribute_usage():
    tracer = trace.get_tracer(__name__)
    global_ctx = baggage.set_baggage("key", "value_from_global_ctx")
    with tracer.start_as_current_span(
        name='baggage_parent_span',
        attributes={'attribute_key': 'value'},
    ) as baggage_parent_span:
        parent_ctx = baggage.set_baggage("key", "value_from_parent_ctx")
        with tracer.start_as_current_span(
            name='baggage_child_span',
            context=parent_ctx,
        ) as baggage_child_span:
            child_ctx = baggage.set_baggage("key", "value_from_child_ctx")

    print(baggage.get_baggage("key", global_ctx))
    print(baggage.get_baggage("key", parent_ctx))
    print(baggage.get_baggage("key", child_ctx))


if __name__ == '__main__':
    init_opentelemetry()
    outer_method()
    baggage_and_attribute_usage()

組み合わせトレース可能化

自動および手動のトレース可能化を組み合わせることで、エージェントによる広範なフレームワークカバーと、ビジネス上重要な操作に対するカスタムスパンの追加を同時に実現できます。この手法では、フレームワークレベルのトレーシングに自動トレース可能化エージェントを活用し、アプリケーション固有のスパンには SDK 呼び出しを追加します。

ステップ 1:依存関係のインストール

pip install django
pip install requests
pip install opentelemetry-sdk
pip install opentelemetry-instrumentation-django
pip install opentelemetry-exporter-otlp

ステップ 2:Django プロジェクトおよびアプリケーションの作成

  1. AutoAndManualDemo プロジェクトを作成します:

       django-admin startproject AutoAndManualDemo
  2. プロジェクト内に HelloWorld アプリケーションを作成します:

       cd AutoAndManualDemo
    
       # プロジェクト内に HelloWorld アプリケーションを作成します。
       python manage.py startapp helloworld

ステップ 3:コードへのカスタムスパンの追加

OpenTelemetry トレース API をインポートし、追跡したい操作の周囲にスパンを作成します。

以下の Django ビューの例では、Django トレース可能化プラグインによって自動的に作成されるスパンに加え、2 つのカスタムスパン(hello_world_span および time_span)を追加しています。helloworld/views.py ファイルを次のように変更します:

from django.http import HttpResponse
from opentelemetry import trace
from datetime import datetime


def hello_world_view(request):
    tracer = trace.get_tracer(__name__)

    with tracer.start_as_current_span("hello_world_span") as hello_world_span:
        result = "Hello World!  Current Time =" + str(get_time())
        return HttpResponse(result)


def get_time():
    now = datetime.now()
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("time_span") as time_span:
        return now.strftime("%H:%M:%S")

ステップ 4:urls.py ファイルの変更

  1. helloworld/urls.py ファイルを作成し、以下のコードを追加します:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  2. AutoAndManualDemo/AutoAndManualDemo/urls.py ファイルに URL パターンを追加します:

       from django.contrib import admin
       from django.urls import path, include
    
       urlpatterns = [
        path('admin/', admin.site.urls),
        path('helloworld/', include('helloworld.urls')),
       ]

ステップ 5:トレーサープロバイダーの構成

エクスポーターおよびトレーサープロバイダーを設定する初期化モジュールを作成します。manual.py ファイルの OpenTelemetry 初期化コードに、以下のコードを追加します。このモジュールは、アプリケーションの起動時に早期にインポートする必要があります(例: manage.py または WSGI/ASGI エントリポイント内)。

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# HTTP を使用する場合は、次の行のコメントを解除し、gRPC のインポート行をコメントアウトしてください:
# from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter


resource = Resource(attributes={
    SERVICE_NAME: "<your-service-name>",
    HOST_NAME: "<host-name>",
})

trace.set_tracer_provider(TracerProvider(resource=resource))

# gRPC 経由でトレースをエクスポート
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(OTLPSpanExporter(
        endpoint="<endpoint>",
        headers="Authentication=<token>",  # gRPC のみ必須
    ))
)

# トレースをコンソールにも出力(デバッグに便利)
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(ConsoleSpanExporter())
)

ステップ 6:実行および確認

python manage.py runserver --noreload
説明
  • --noreload フラグにより、Django が manage.main メソッドを二重に実行することを防ぎます。
  • ImportError(symbol not found in flat namespace '_CFRelease') エラーが発生した場合、gRPC パッケージをインストールしてください:
  pip install grpcio

http://127.0.0.1:8000/helloworld/ にリクエストを送信し、ARMS コンソールでトレースデータを確認します。「自動トレース可能化」セクションの「トレースデータの送信確認」の手順に従ってください。

モニタリングデータの表示

  1. ARMS コンソール にログインします。

  2. 左側のナビゲーションウィンドウで、アプリケーションモニタリング > アプリケーション を選択します。

  3. アプリケーション ページで、ご利用のアプリケーションの名前をクリックします。

  4. アプリケーションの詳細ページで、トレース、アプリケーショントポロジー、異常トランザクション、遅延トランザクション、および SQL 分析データを表示します。

説明 icon言語 列に アイコンが表示されている場合、アプリケーションはアプリケーションモニタリングに接続されています。ハイフン(-)が表示されている場合、OpenTelemetry 向けマネージドサービスに接続されています。