Python アプリケーションを OpenTelemetry でトレース可能にすることで、OpenTelemetry 向けマネージドサービスにトレースデータを送信できます。接続後、Application Real-Time Monitoring Service (ARMS) ではアプリケーションのトポロジー、トレース、異常トランザクション、遅延トランザクション、および SQL 分析が表示されます。
本トピックでは、以下の 3 種類のトレース可能化(イベントトラッキング)手法について説明します:
自動トレース可能化 — コード変更は不要です。OpenTelemetry エージェントが、実行時にサポート対象のフレームワークを自動的にトレース可能にします。
手動トレース可能化 — 完全な制御が可能です。OpenTelemetry SDK を使用して、スパン、属性、バゲージを直接追加します。
組み合わせトレース可能化 — 自動トレース可能化の上位にカスタムスパンを重ねることで、特定の操作に対する可視性を高めます。
前提条件
OpenTelemetry 向けマネージドサービス コンソールからのエンドポイントおよび認証トークン。「アクセスポイント情報の取得」を参照してください。
サポート対象のフレームワーク
OpenTelemetry では、一般的な Python フレームワーク向けに自動トレース可能化プラグインが提供されています。下記の表には、サポート対象のフレームワークとそのバージョン要件が記載されています。完全な一覧については、「opentelemetry-python-contrib」をご参照ください。
~= V.N は、>= V.N かつ == V.* を意味します。たとえば、aiohttp ~= 3.0 は、3.x 系列における 3.0 以降のバージョンを指します。サンプルコード
完全なサンプルコードは、「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 installopentelemetry-bootstrap は、インストール済みのライブラリを検出し、該当するトレース可能化プラグインを自動的にインストールします。
ステップ 2:Django プロジェクトおよびアプリケーションの作成
AutoAndManualDemo プロジェクトを作成します:
django-admin startproject AutoAndManualDemoプロジェクト内に HelloWorld アプリケーションを作成します:
cd AutoAndManualDemo # プロジェクト内に HelloWorld アプリケーションを作成します。 python manage.py startapp helloworld
ステップ 3:アプリケーションコードの追加
次のコードを
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")AutoAndManualDemo/helloworld/urls.pyファイルを作成し、以下のコードを追加します:from django.urls import path from . import views urlpatterns = [ path('', views.hello_world_view, name='helloworld') ]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:トレースデータの送信確認
ブラウザで
http://127.0.0.1:8000/helloworld/にアクセスします。コンソールにトレースデータが表示され、OpenTelemetry 向けマネージドサービスにトレースデータが送信されます。ARMS コンソールにログインします。
左側のナビゲーションウィンドウで、アプリケーションモニタリング > アプリケーション を選択します。
アプリケーション ページで、設定したサービス名でアプリケーションを検索し、クリックします。
アプリケーションの詳細ページで、トレースが表示されていることを確認します。送信したリクエストに対応するスパンデータが表示されるはずです。
言語 列に アイコンが表示されている場合、アプリケーションはアプリケーションモニタリングに接続されています。ハイフン(-)が表示されている場合、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 コンソールでトレースデータを確認します。「自動トレース可能化」セクションの「トレースデータの送信確認」の手順に従ってください。
組み合わせトレース可能化
自動および手動のトレース可能化を組み合わせることで、エージェントによる広範なフレームワークカバーと、ビジネス上重要な操作に対するカスタムスパンの追加を同時に実現できます。この手法では、フレームワークレベルのトレーシングに自動トレース可能化エージェントを活用し、アプリケーション固有のスパンには SDK 呼び出しを追加します。
ステップ 1:依存関係のインストール
pip install django
pip install requests
pip install opentelemetry-sdk
pip install opentelemetry-instrumentation-django
pip install opentelemetry-exporter-otlpステップ 2:Django プロジェクトおよびアプリケーションの作成
AutoAndManualDemo プロジェクトを作成します:
django-admin startproject AutoAndManualDemoプロジェクト内に 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 ファイルの変更
helloworld/urls.pyファイルを作成し、以下のコードを追加します:from django.urls import path from . import views urlpatterns = [ path('', views.hello_world_view, name='helloworld') ]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 grpciohttp://127.0.0.1:8000/helloworld/ にリクエストを送信し、ARMS コンソールでトレースデータを確認します。「自動トレース可能化」セクションの「トレースデータの送信確認」の手順に従ってください。
モニタリングデータの表示
ARMS コンソール にログインします。
左側のナビゲーションウィンドウで、アプリケーションモニタリング > アプリケーション を選択します。
アプリケーション ページで、ご利用のアプリケーションの名前をクリックします。
アプリケーションの詳細ページで、トレース、アプリケーショントポロジー、異常トランザクション、遅延トランザクション、および SQL 分析データを表示します。
言語 列に アイコンが表示されている場合、アプリケーションはアプリケーションモニタリングに接続されています。ハイフン(-)が表示されている場合、OpenTelemetry 向けマネージドサービスに接続されています。