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 の使用に関するベストプラクティスについて、詳細な手順を提供しています。詳細については、準備 を参照してください。
背景情報
使用上の注意
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 コンソールでデータを表示する
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={})