Jaeger クライアントを使用して Python アプリケーションをインストルメントし、Managed Service for OpenTelemetry にトレースデータをレポートします。接続後、ARMS コンソールにアプリケーショントポロジー、トレース、異常なトランザクション、低速なトランザクション、SQL 分析が表示されます。
高度な機能とトレーシング機能を利用するには、OpenTelemetry プロトコルを使用してアプリケーションを Managed Service for OpenTelemetry に接続することを推奨します。
Managed Service for OpenTelemetry の利用を開始するために、OpenTelemetry の詳細な統合ガイドとベストプラクティスをご用意しています。詳細については、「アプリケーションの接続」をご参照ください。
仕組み
Jaeger は 2 つのデータレポート用アーキテクチャをサポートしています。
Jaeger エージェントを使用しない場合:Jaeger クライアントは、トレースデータを Managed Service for OpenTelemetry バックエンドに直接送信します。(注:このドキュメントで説明する Python クライアントは、この方法をサポートしていません。)
Jaeger エージェントを使用する場合:Jaeger クライアントは、トレースデータをローカルで実行中の Jaeger エージェントに送信し、エージェントが gRPC 経由でバックエンドに転送します。
制約事項
Python Jaeger クライアント (v1.25) は、HTTP 経由ではなく、Jaeger エージェントを介してのみトレースデータを報告できます。 詳細については、「クライアントライブラリの機能」をご参照ください。
クライアントは UDP 経由でエージェントと通信するため、配信は保証されません。データ損失を最小限に抑えるために、両方を同じホストで実行してください。
ステップ 1:Jaeger エージェントの起動
Jaeger エージェントのイメージをプルします。
docker pull jaegertracing/jaeger-agent:1.25次のプレースホルダーを [クラスター構成] ページの値に置き換えて、Jaeger エージェントコンテナを開始します:
プレースホルダー 説明 <endpoint>Managed Service for OpenTelemetry の gRPC エンドポイント <auth>認証トークン 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>エージェントが実行されていることを確認してください。ステータスが
Upの場合、エージェントが正常に起動したことを示します。コンテナが実行されていない場合は、ログを確認してください。docker ps --filter name=jaeger-agentdocker logs jaeger-agent
ステップ 2:Python アプリケーションのインストルメント
必要なパッケージをインストールします。以下を
requirements.txtファイルに保存してください。その後、パッケージをインストールします。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.6pip install -r requirements.txtPython ファイル (例:
tracing_demo.py) を作成し、以下のコードを記述します。主要な設定パラメータは以下のとおりです。パラメータ 値 説明 sampler.typeconstすべてのトレースをサンプリングします。本番環境では、 probabilisticを使用し、paramの値を低く設定してください。sampler.param1constタイプの場合、1はすべてのトレースをサンプリングすることを意味し、0はサンプリングしないことを意味します。reporting_host127.0.0.1Jaeger エージェントのアドレスです。同じホストで実行する場合は 127.0.0.1を使用してください。reporting_port6831Jaeger エージェントがスパンをリッスンする UDP ポートです。 service_namemytest3ARMS コンソールでアプリケーションを識別する名前です。 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.tags: ", 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={ 'sampler': { 'type': 'const', # すべてのトレースをサンプリングします。本番環境では 'probabilistic' を使用してください。 'param': 1, }, 'local_agent': { # Jaeger エージェントのアドレスです。エージェントが同じホストで実行する場合は、UDP の信頼性のため 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) # IOLoop がバッファされたスパンをフラッシュするのを待ってから終了します。 # 詳細については、https://github.com/jaegertracing/jaeger-client-python/issues/50 をご参照ください。 time.sleep(2) tracer.close()ファイルを実行します。初期化が成功すると、デバッグ出力にトレーサー設定が表示され、スパンが Jaeger エージェントにレポートされていることが確認できます。
python tracing_demo.py
コンソールでのトレースデータの確認
ARMS コンソールにログインします。左側のナビゲーションペインで、[アプリケーション監視] > [アプリケーション] を選択します。
[アプリケーション] ページで、上部のナビゲーションバーでリージョンを選択し、アプリケーション名をクリックします。
説明[言語] 列の
アイコンは アプリケーションモニタリング を、ハイフン ([-]) は Managed Service for OpenTelemetry を示します。[アプリケーション概要] セクションで、主要なパフォーマンスメトリクスとトポロジーを確認します。
[Application Overview] ページの [Overview Analysis] タブには、以下の主要な指標が表示されます。
[Total Requests]:リクエスト数と、前週比および前日比の変化です。
[Average Response Time]:応答時間とその傾向です。
[Exceptions]:異常なリクエストの数です。
[Span Count]:トレース内のスパンの総数です。
これらの指標の下にある [Services Provided] および [Dependent Services] の各エリアに、リクエスト量と平均応答時間の傾向線グラフが表示されます。
左側のナビゲーションペインで、[アプリケーション詳細]をクリックします。[概要] タブに、アプリケーションの概要が表示されます。
[Application Details] ページでは、デフォルトで [Overview] タブが表示されます。アプリケーショントポロジーと、[Requests]、[response time]、[Exceptions] の 3 つのモニタリングチャートが表示されます。ページ左側のサービスリストには、各インターフェースの応答時間、リクエスト数、例外数が表示されます。
[トレース] タブをクリックすると、アプリケーションから報告されたトレースデータが表示されます。
トレースデータが表示されない場合のトラブルシューティング
アプリケーションを実行した後にトレースデータがコンソールに表示されない場合は、以下を確認してください。
| 問題 | 対処方法 |
|---|---|
| Jaeger エージェントが実行されていない | docker ps --filter name=jaeger-agent を実行し、ステータスが Up であることを確認してください。docker logs jaeger-agent でエージェントログを確認してください。 |
| エンドポイントまたはトークンが正しくない | <endpoint> と <auth>[Cluster Configurations] の値が ページの値と一致していることを確認してください。修正後、エージェントを再起動してください。 |
| エージェントとクライアントが異なるホストにある | Jaeger クライアントは UDP 経由でデータを送信するため、ホスト間では信頼性が低くなります。エージェントをアプリケーションと同じホストで実行し、reporting_host を 127.0.0.1 に設定してください。 |
| スパンがフラッシュされていない | tracer.close() の前に time.sleep(2) が呼び出されていることを確認して、IOLoop がバッファされたスパンをフラッシュできるようにしてください。 |
| ネットワーク接続 | ホストが設定された gRPC ポートで Managed Service for OpenTelemetry エンドポイントに到達できることを確認してください。 |
一般的な Jaeger の操作
以下の例では、一般的な Jaeger トレース操作について説明します。詳細については、「はじめに」をご参照ください。
トレーサーの作成
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={})