OpenTelemetry を使用してアプリケーションをインストルメントし、トレースデータを Managed Service for OpenTelemetry に送信すると、Managed Service for OpenTelemetry はアプリケーションの監視を開始します。アプリケーショントポロジー、トレース、異常トランザクション、低速トランザクション、SQL 分析などのアプリケーションの監視データを表示できます。このトピックでは、エージェントまたは Python 用 OpenTelemetry SDK を使用して 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 install
AutoAndManualDemo プロジェクトを作成し、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 # ビューをここに作成します。 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-otlp
manual.py ファイルに OpenTelemetry 初期化コードを指定します。
コードの
<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-otlp
AutoAndManualDemo プロジェクトを作成し、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 # ビューをここに作成します。 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 コンソール にログインします。左側のナビゲーションペインで、 を選択します。[アプリケーション] ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。
アイコンが言語列に表示されている場合は、アプリケーションは Application Monitoring に接続されています。ハイフン (-) が表示されている場合は、アプリケーションは Managed Service for OpenTelemetry に接続されています。