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

:OpenTelemetry を使用して Python アプリケーションのトレースデータを送信する

最終更新日:Dec 30, 2024

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 プラグイン

サポートされているパッケージとバージョン

opentelemetry-instrumentation-aio-pika

aio_pika - [7.2.0, 10.0.0)

opentelemetry-instrumentation-aiohttp-client

aiohttp ~= 3.0

opentelemetry-instrumentation-aiohttp-server

aiohttp ~= 3.0

opentelemetry-instrumentation-aiopg

aiopg - [0.13.0, 2.0.0)

opentelemetry-instrumentation-asgi

asgiref ~= 3.0

opentelemetry-instrumentation-asyncpg

asyncpg ≥ 0.12.0

opentelemetry-instrumentation-aws-lambda

aws_lambda

opentelemetry-instrumentation-boto

boto ~= 2.0

opentelemetry-instrumentation-boto3sqs

boto3 ~= 1.0

opentelemetry-instrumentation-botocore

botocore ~= 1.0

opentelemetry-instrumentation-cassandra

  • cassandra-driver ~= 3.25

  • scylla-driver ~= 3.25

opentelemetry-instrumentation-celery

celery - [4.0, 6.0)

opentelemetry-instrumentation-confluent-kafka

confluent-kafka - [1.8.2, 2.2.0]

opentelemetry-instrumentation-dbapi

dbapi

opentelemetry-instrumentation-django

django ≥ 1.10

opentelemetry-instrumentation-elasticsearch

elasticsearch ≥ 2.0

opentelemetry-instrumentation-falcon

falcon - [1.4.1, 4.0.0)

opentelemetry-instrumentation-fastapi

fastapi ~= 0.58

opentelemetry-instrumentation-flask

flask - [1.0, 3.0)

opentelemetry-instrumentation-grpc

grpcio ~= 1.27

opentelemetry-instrumentation-httpx

httpx ≥ 0.18.0

opentelemetry-instrumentation-jinja2

jinja2 - [2.7, 4.0)

opentelemetry-instrumentation-kafka-python

kafka-python ≥ 2.0

opentelemetry-instrumentation-logging

logging

opentelemetry-instrumentation-mysql

mysql-connector-python ~= 8.0

opentelemetry-instrumentation-mysqlclient

mysqlclient < 3

opentelemetry-instrumentation-pika

pika ≥ 0.12.0

opentelemetry-instrumentation-psycopg2

psycopg2 ≥ 2.7.3.1

opentelemetry-instrumentation-pymemcache

pymemcache - [1.3.5, 5)

opentelemetry-instrumentation-pymongo

pymongo - [3.1, 5.0)

opentelemetry-instrumentation-pymysql

PyMySQL < 2

opentelemetry-instrumentation-pyramid

pyramid ≥ 1.7

opentelemetry-instrumentation-redis

redis ≥ 2.6

opentelemetry-instrumentation-remoulade

remoulade ≥ 0.50

opentelemetry-instrumentation-requests

requests ~= 2.0

opentelemetry-instrumentation-sqlalchemy

sqlalchemy

opentelemetry-instrumentation-sqlite3

sqlite3

opentelemetry-instrumentation-starlette

starlette ~= 0.13.0

opentelemetry-instrumentation-system-metrics

psutil ≥ 5

opentelemetry-instrumentation-tornado

tornado ≥ 5.1.1

opentelemetry-instrumentation-tortoiseorm

tortoise-orm ≥ 0.17.0

opentelemetry-instrumentation-urllib

urllib

opentelemetry-instrumentation-urllib3

urllib3 - [1.0.0, 3.0.0)

opentelemetry-instrumentation-wsgi

wsgi

サンプルコード

python-opentelemetry-demo からサンプルコードをダウンロードします。

方法 1:エージェントを使用してアプリケーションの自動インストルメンテーションを設定する

  1. 必要なパッケージをダウンロードしてインストールします。

    pip install django
    pip install requests
    pip install opentelemetry-distro \
    	opentelemetry-exporter-otlp
     
    opentelemetry-bootstrap -a install
  2. AutoAndManualDemo プロジェクトを作成し、HelloWorld アプリケーションを作成します。

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

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

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

    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. 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')),
      ]
  4. プロジェクトを実行します。

    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 ファイルの DEBUGALLOWED_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 環境変数を追加する必要があります。

  5. ブラウザで http://127.0.0.1:8000/helloworld/ にアクセスします。コンソールにトレースデータが表示され、トレースデータが Managed Service for OpenTelemetry に送信されます。

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

方法 2:アプリケーションを手動でインストルメントする

  1. 必要なパッケージをダウンロードしてインストールします。

    pip install opentelemetry-api
    pip install opentelemetry-sdk
    pip install opentelemetry-exporter-otlp
  2. 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)
                            
  3. スパンを作成します。

    tracer = trace.get_tracer(__name__)  # トレーサーを取得します。
    with tracer.start_as_current_span("child_span") as child_span:  # child_span という名前のスパンを作成します。
        print("hello world")
  4. トレース 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. 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))
        

    完全なサンプルコード

    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 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")  # 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))
    
    
    
    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)
    
    
    if __name__ == '__main__':
        init_opentelemetry()
        outer_method()
        baggage_and_attribute_usage()
  6. アプリケーションを実行します。

    python manual.py

方法 3:自動インストルメンテーションと手動インストルメンテーションを組み合わせる

OpenTelemetry を使用してアプリケーションを自動的にインストルメントした後に、ビジネス要件に基づいて手動でインストルメンテーションを追加する場合は、方法 1 を使用した後に、次の手順を実行します。

  1. 必要なパッケージをダウンロードしてインストールします。

    pip install django
    pip install requests
    pip install opentelemetry-sdk
    pip install opentelemetry-instrumentation-django
    pip install opentelemetry-exporter-otlp 
  2. AutoAndManualDemo プロジェクトを作成し、HelloWorld アプリケーションを作成します。

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

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

      cd AutoAndManualDemo
      
      # プロジェクトに HelloWorld アプリケーションを作成します。
      python manage.py startapp helloworld
  3. 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. 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')),
      ]
  5. 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 経由でトレースデータを送信するために使用される認証トークン。

  6. プロジェクトを実行します。

    python manage.py runserver --noreload
    • --noreload パラメータは、manage.main メソッドが 2 回実行されるのを防ぐために使用されます。

    • ImportError(symbol not found in flat namespace '_CFRelease') エラーが発生した場合は、次のコマンドを実行して Grpcio パッケージをダウンロードしてインストールします。

      pip install grpcio
  7. ブラウザで 127.0.0.1:8000/helloworld にアクセスします。トレースデータは Managed Service for OpenTelemetry コンソールに送信されます。

監視データを表示する

ARMS コンソール にログインします。左側のナビゲーションペインで、アプリケーション監視 > アプリケーション を選択します。[アプリケーション] ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。

説明

image アイコンが言語列に表示されている場合は、アプリケーションは Application Monitoring に接続されています。ハイフン (-) が表示されている場合は、アプリケーションは Managed Service for OpenTelemetry に接続されています。