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

Managed Service for OpenTelemetry:Jaeger を使用して Python アプリケーションのトレースデータを報告する

最終更新日:Dec 30, 2024

Jaeger を使用して Python アプリケーションをインストゥルメント化し、トレースデータを Managed Service for OpenTelemetry に報告すると、Managed Service for OpenTelemetry は Python アプリケーションの監視を開始します。アプリケーショントポロジー、トレース、異常トランザクション、低速トランザクション、SQL 分析など、アプリケーションの監視データを表示できます。このトピックでは、Jaeger を使用して Python アプリケーションをインストゥルメント化し、トレースデータを報告する方法について説明します。

重要

OpenTelemetry Protocol (OTLP) を使用して、アプリケーションを Managed Service for OpenTelemetry に接続することをお勧めします。この場合、より多くの機能、より高度なトレース機能、最高のユーザーエクスペリエンスが提供されます。

Alibaba Cloud は、OpenTelemetry をアプリケーションと統合する方法と、Managed Service for OpenTelemetry をすぐに使い始めるのに役立つ OpenTelemetry の使用に関するベストプラクティスについて、詳細な手順を提供しています。詳細については、準備 を参照してください。

背景情報

データはどのように報告されますか?

  • 次の図は、Jaeger エージェントを使用せずにデータを報告する方法を示しています。

  • 次の図は、Jaeger エージェントを使用してデータを報告する方法を示しています。

使用上の注意

  • Python の場合、Jaeger v1.25 では、Jaeger エージェントを使用してのみトレースデータを報告できます。HTTP 経由でトレースデータを報告することはできません。詳細については、公式 Jaeger ドキュメントの クライアントライブラリの機能 を参照してください。

  • Python の場合、Jaeger v1.25 では、Jaeger クライアントから Jaeger エージェントに UDP 経由でのみトレースデータを報告できます。UDP プロトコルは、通信の信頼性を保証しません。トレースデータの信頼性の高い転送を確実にするために、Jaeger クライアントと Jaeger エージェントを同じホストで実行することをお勧めします。

手順 1:環境を構築する

この例では、環境を構築するために、Docker、Jaeger エージェント、Jaeger クライアント、および Python の次のバージョンが必要です。

Docker と Jaeger エージェント

Docker バージョン:20.10.7

Jaeger エージェントバージョン:1.25

  1. Docker Hub で次のコマンドを実行して、Jaeger エージェント v1.25 のイメージをプルします。

    docker pull jaegertracing/jaeger-agent:1.25
  2. 次のコマンドを実行して、Jaeger エージェント v1.25 を実行します。

    docker run -d --name jaeger-agent  -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778/tcp jaegertracing/jaeger-agent:1.25 --reporter.type=grpc --reporter.grpc.host-port=<endpoint>(エンドポイントを入力) --agent.tags=<auth>(認証情報を入力)
    説明

    <endpoint><auth> を、Managed Service for OpenTelemetry コンソールの クラスター構成 ページに表示されているエンドポイントと認証情報に置き換えます。エンドポイントの取得方法については、このトピックの「前提条件」セクションを参照してください。

Python と Jaeger クライアント

Python バージョン:3.8.5

Jaeger クライアントバージョン:4.6.0

Python で次の Python パッケージをインストールして、Jaeger クライアント環境を構成します。

certifi==2021.5.30
charset-normalizer==2.0.4
idna==3.2
jaeger-client==4.6.0
opentracing==2.4.0
requests==2.26.0
six==1.16.0
threadloop==1.0.2
thrift==0.13.0
tornado==6.1
urllib3==1.26.6

手順 2:Tracer オブジェクトを作成する

  1. 次の内容を含む Python ファイルを作成します。

    次のコードを実行して Tracer オブジェクトを作成し、Tracer オブジェクトを使用してスパンを作成し、Managed Service for OpenTelemetry バックエンドにデータを報告します。

    import logging
    import time
    from jaeger_client import Config
    
    
    def construct_span(tracer):
        with tracer.start_span('AliyunTestSpan') as span:
            span.log_kv({'event': 'test message', 'life': 42})
            print("tracer.tages: ", tracer.tags)
            with tracer.start_span('AliyunTestChildSpan', child_of=span) as child_span:
                span.log_kv({'event': 'down below'})
            return span
    
    
    if __name__ == "__main__":
        log_level = logging.DEBUG
        logging.getLogger('').handlers = []
        logging.basicConfig(format='%(asctime)s %(message)s', level=log_level)
    
        config = Config(
            config={ # 通常はyaml設定ファイルから読み込みます
                'sampler': {
                    'type': 'const',
                    'param': 1,
                },
                'local_agent': {
                    # Jaeger エージェントのホスト名とポート番号を指定します。
                    # データの信頼性を確保するために、Jaeger クライアントと Jaeger エージェントを同じホストで実行することをお勧めします。したがって、reporting_host パラメーターは 127.0.0.1 に設定されます。
                    'reporting_host': '127.0.0.1',
                    'reporting_port': 6831,
                },
                'logging': True,
            },
            # アプリケーション名を指定します。
            service_name="mytest3",
            validate=True
        )
    
        # この呼び出しは opentracing.tracer も設定します
        tracer = config.initialize_tracer()
    
        span = construct_span(tracer)
    
        time.sleep(2)   # IOLoop にyieldしてスパンをフラッシュします - https://github.com/jaegertracing/jaeger-client-python/issues/50
        tracer.close()  # バッファリングされたスパンをフラッシュします
  2. Python ファイルを実行します。

Managed Service for OpenTelemetry コンソールでデータを表示する

  1. Managed Service for OpenTelemetry コンソール にログインします。左側のナビゲーションペインで、アプリケーション をクリックします。

  2. アプリケーション ページで、上部のナビゲーションバーでリージョンを選択し、アプリケーションの名前をクリックします。

  3. アプリケーションの概要 セクションで、アプリケーションの主要なパフォーマンスメトリクスとトポロジを表示できます。

    图1.应用总览界面

  4. 左側のナビゲーションペインで、アプリケーションの詳細 をクリックします。

    アプリケーションの詳細 セクションの [概要] タブで、アプリケーションの概要を表示できます。图2.应用详情-概览界面

  5. アプリケーションの詳細 セクションで、トレース タブをクリックします。

    トレース タブで、アプリケーションのトレースを表示できます。图3.应用详情-调用链路界面

Jaeger を使用する

このセクションでは、Jaeger を使用する一般的な方法について説明します。詳細については、公式 Jaeger ドキュメントの はじめに を参照してください。

  • Tracer オブジェクトを作成する:

    from jaeger_client import Config
    
    def init_jaeger_tracer(service_name='your-app-name'):
        config = Config(config={}, service_name=service_name)
        return config.initialize_tracer()
  • スパンを作成して終了する:

    # 親スパンを持たないスパンを開始します。
    tracer.start_span('TestSpan')
    # 親スパンを持つスパンを開始します。
    tracer.start_span('ChildSpan', child_of=span)
    # スパンを終了します。
    span.finish()
  • SpanContext を渡す:

    # シリアル化:SpanContext を挿入して次のスパンに渡します。
    tracer.inject(
            span_context=span.context, format=Format.TEXT_MAP, carrier=carrier
        )
    # デシリアライズ:渡された SpanContext を抽出します。
    span_ctx = tracer.extract(format=Format.TEXT_MAP, carrier={})