OpenTelemetry を使用してアプリケーションをインストルメントし、Managed Service for OpenTelemetry にトレースデータを送信すると、Managed Service for OpenTelemetry はアプリケーションのモニタリングを開始します。 アプリケーショントポロジー、トレース、異常トランザクション数、低速トランザクション数、SQL分析など、アプリケーションのモニタリングデータを表示できます。 このトピックでは、エージェントまたは Python 用 OpenTelemetry SDK を使用して、Python アプリケーションを自動または手動でインストルメントし、トレースデータを送信する方法について説明します。
オープンソースのエージェントと比較して、Alibaba Cloud によって開発された Python 用エージェントをインストールすることをお勧めします。 LlamaIndex、Dify、LangChain、OpenAI、Qwen などの一般的な大規模言語モデルフレームワークの可観測性を提供し、より豊富なメトリクス、トレース、継続的なプロファイリングデータを提供します。 詳細については、「Python アプリケーションを監視する」をご参照ください。
背景情報
OpenTelemetry は、一般的なフレームワークのスパンを自動的に作成するために使用できる複数の自動インストルメンテーションプラグインを提供します。 次の表に、サポートされているフレームワークを示します。 詳細については、GitHub をご覧ください。
次の表で、バージョン番号 ~= V.N は バージョン番号 ≥ V.N および バージョン番号 == V.* を示します。 たとえば、aiohttp ~= 3.0 は、aiohttp のバージョンが次の要件を満たしている必要があることを示します:バージョン番号 ≥ 3.0 および バージョン番号 == 3.*。
サンプルコード
サンプルコードは、python-opentelemetry-demo からダウンロードしてください。
方法 1: エージェントを使用してアプリケーションの自動インストルメンテーションを構成する
必要なパッケージをダウンロードしてインストールします。
pip install django pip install requests pip install opentelemetry-distro \ opentelemetry-exporter-otlp opentelemetry-bootstrap -a installAutoAndManualDemo プロジェクトを作成し、HelloWorld アプリケーションを作成します。
AutoAndManualDemo プロジェクトを作成します。
django-admin startproject AutoAndManualDemoプロジェクトに HelloWorld アプリケーションを作成します。
cd AutoAndManualDemo # プロジェクトに HelloWorld アプリケーションを作成します。 python manage.py startapp helloworld
HelloWorld アプリケーションのコードを変更します。
次のコードを AutoAndManualDemo/helloworld/views.py ファイルに追加します。
from django.http import HttpResponse from datetime import datetime # Create your views here. # ここにビューを作成します。 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') ]URL パターンを AutoAndManualDemo/AutoAndManualDemo/urls.py ファイルに追加します。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('helloworld/', include('helloworld.urls')), ]
プロジェクトを実行します。
HTTP 経由でトレースデータを送信するには、
<your-service-name>をアプリケーション名に、<http-endpoint>を HTTP エンドポイントに置き換えます。opentelemetry-instrument \ --traces_exporter console,otlp_proto_http \ --metrics_exporter none \ --service_name <your-service-name> \ --exporter_otlp_traces_endpoint <http-endpoint> \ python manage.py runserver --noreload説明--noreloadパラメーターは、manage.main メソッドが 2 回実行されるのを防ぐために使用されます。AutoAndManualDemo/AutoAndManualDemo/settings.py ファイル内の DEBUG と ALLOWED_HOSTS の両方が正しく設定されているにもかかわらず、
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環境変数を追加する必要があります。
ブラウザで
http://127.0.0.1:8000/helloworld/にアクセスします。 コンソールにトレースデータが表示され、Managed Service for OpenTelemetry にトレースデータが送信されます。コンソールにトレースデータを表示したくない場合は、
--traces_exporterパラメーターを--traces_exporter otlp_proto_httpに設定します。
方法 2: アプリケーションを手動でインストルメントする
必要なパッケージをダウンロードしてインストールします。
pip install opentelemetry-api pip install opentelemetry-sdk pip install opentelemetry-exporter-otlpOpenTelemetry 初期化コードを manual.py ファイルに指定します。
コードの
<token>セクションにある<endpoint>を、取得した OpenTelemetry のエンドポイントに置き換えます。コードの
<service-name>と<host-name>を、実際のアプリケーション名とホスト名に置き換えます。
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, Resource, HOST_NAME from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor def init_opentelemetry(): # アプリケーション名とホスト名を指定します。 resource = Resource(attributes={ SERVICE_NAME: "<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)スパンを作成します。
tracer = trace.get_tracer(__name__) # トレーサーを取得します。 with tracer.start_as_current_span("child_span") as child_span: # child_span という名前のスパンを作成します。 print("hello world")トレース 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)OpenTelemetry Baggage API を使用してカスタムタグを渡します。
baggage_parent_span スパンを作成するときに、attributes パラメーターを指定して属性を構成します。
def baggage_and_attribute_usage(): tracer = trace.get_tracer(__name__) global_ctx = baggage.set_baggage("key", "value_from_global_ctx") # OpenTelemetry Baggage API を使用して、異なるスパン間でデータを転送します。 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))アプリケーションを実行します。
python manual.py
方法 3: 自動インストルメンテーションと手動インストルメンテーションを組み合わせる
OpenTelemetry を使用してアプリケーションを自動的にインストルメントした後に、ビジネス要件に基づいて手動でインストルメンテーションを追加する場合は、方法 1 を使用した後に、次の手順を実行します。
必要なパッケージをダウンロードしてインストールします。
pip install django pip install requests pip install opentelemetry-sdk pip install opentelemetry-instrumentation-django pip install opentelemetry-exporter-otlpAutoAndManualDemo プロジェクトを作成し、HelloWorld アプリケーションを作成します。
AutoAndManualDemo プロジェクトを作成します。
django-admin startproject AutoAndManualDemoプロジェクトに HelloWorld アプリケーションを作成します。
cd AutoAndManualDemo # プロジェクトに HelloWorld アプリケーションを作成します。 python manage.py startapp helloworld
helloworld/views.py ファイルのコードを変更します。
トレーサーを取得します。 スパンを作成し、スパン名を設定します。
from django.http import HttpResponse from opentelemetry import trace from datetime import datetime # Create your views here. # ここにビューを作成します。 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")urls.py ファイルを変更します。
helloworld/urls.py ファイルを作成し、次のコードをファイルに追加します。
from django.urls import path from . import views urlpatterns = [ path('', views.hello_world_view, name='helloworld') ]URL パターンを AutoAndManualDemo/AutoAndManualDemo/urls.py ファイルに追加します。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('helloworld/', include('helloworld.urls')), ]
manual.py ファイルの OpenTelemetry 初期化コードに次のコードを追加します。
from opentelemetry import trace from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter # gRPC プロトコルを使用してトレースデータを送信します。 # from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter # HTTP プロトコルを使用してトレースデータを送信します。 from opentelemetry.sdk.resources import SERVICE_NAME, Resource, HOST_NAME from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter resource = Resource(attributes={ SERVICE_NAME: "<service-name>", HOST_NAME: "<host-name>" }) trace.set_tracer_provider(TracerProvider(resource=resource)) trace.get_tracer_provider().add_span_processor( BatchSpanProcessor(OTLPSpanExporter( endpoint="<endpoint>", headers="Authentication=<token>" # headers パラメーターは、gRPC プロトコルの場合にのみ必要です。 ))) # OTLPSpanExporter を使用してトレースデータを送信します。 trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter())) # Managed Service for OpenTelemetry コンソールでトレースデータを取得します。次のコンテンツを実際の値に置き換え、使用するプロトコルに基づいてコードを変更します。
<service-name>: アプリケーションの名前。<host-name>: ホスト名。<endpoint>: HTTP または gRPC 経由でトレースデータを送信するために使用されるエンドポイント。<token>: gRPC 経由でトレースデータを送信するために使用される認証トークン。
プロジェクトを実行します。
python manage.py runserver --noreload--noreloadパラメーターは、manage.main メソッドが 2 回実行されるのを防ぐために使用されます。ImportError(symbol not found in flat namespace '_CFRelease')エラーが発生した場合は、次のコマンドを実行して Grpcio パッケージをダウンロードしてインストールします。pip install grpcio
ブラウザで
127.0.0.1:8000/helloworldにアクセスします。 トレースデータは Managed Service for OpenTelemetry コンソールに送信されます。
モニタリングデータを表示する
ARMS コンソール にログインします。 左側のナビゲーションウィンドウで、 を選択します。 [アプリケーション] ページで、アプリケーションの名前をクリックします。 表示されるページで、トレースデータを表示します。
[言語] 列に
アイコンが表示されている場合、アプリケーションはアプリケーションモニタリングに接続されています。ハイフン ([-]) が表示されている場合、アプリケーションは Managed Service for OpenTelemetry に接続されています。