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 の使用に関するベストプラクティスについて、詳細な手順を提供しています。詳細については、「Managed Service for OpenTelemetry を使用する準備 」を参照してください。
背景情報
使用上の注意
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
Docker Hub で次のコマンドを実行して、Jaeger エージェント v1.25 のイメージをプルします。
docker pull jaegertracing/jaeger-agent:1.25次のコマンドを実行して、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 オブジェクトを作成する
次の内容を含む 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() # バッファリングされたスパンをフラッシュしますPython ファイルを実行します。
Managed Service for OpenTelemetry コンソールでデータを表示する
ARMS コンソール にログインします。左側のナビゲーションペインで、 を選択します。
アプリケーション ページで、上部のナビゲーションバーでリージョンを選択し、アプリケーションの名前をクリックします。
説明
言語 列に - アイコンが表示されている場合、アプリケーションはアプリケーション監視に接続されています。ハイフン()が表示されている場合、アプリケーションは Managed Service for OpenTelemetry に接続されています。アプリケーションの概要 セクションで、アプリケーションの主要なパフォーマンスメトリクスとトポロジを表示できます。

左側のナビゲーションペインで、アプリケーションの詳細 をクリックします。
アプリケーションの詳細 セクションの [概要] タブで、アプリケーションの概要を表示できます。

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

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={})