ディレクトリ
シモンズ:イエガーとpythonのいくつかの記事については、この記事では、コレクションと照合からの公式文書など、多くの場所からである、と指摘してください間違っている場合は、今ではなく、実際の検証を行って、後で使用するための参照を提供し、I会議の後、それの過程で間違った場所を変更します。
イエガーアクセスPythonアプリケーション
Pythonでは、ジャガールクルト、クライアントアクセスを使用して。これは、クライアントライブラリである分散アプリケーションPythonのトレース収集のために検出するために使用することができ、および追跡イエガーに送信します。その他の詳細については、参照してくださいOpenTracing PythonのAPIを。
gitの住所のジャガールクルト-クライアント:イエガー、クライアント
1.インストールルクルト、クライアント
pip install jaeger-client
2.(例)トレーサオブジェクトを作成してビジネスプロセスを追跡するために、トレーサによってオブジェクトスパンを作成します。
import logging
import time
from jaeger_client import Config
if __name__ == "__main__":
log_level = logging.DEBUG
logging.getLogger('').handlers = []
logging.basicConfig(format='%(asctime)s %(message)s', level=log_level)
config = Config(
config={ # usually read from some yaml config
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
},
service_name='your-app-name',
validate=True,
)
# this call also sets opentracing.tracer
tracer = config.initialize_tracer()
with tracer.start_span('TestSpan') as span:
span.log_kv({'event': 'test message', 'life': 42})
with tracer.start_span('ChildSpan', child_of=span) as child_span:
span.log_kv({'event': 'down below'})
time.sleep(2) # yield to IOLoop to flush the spans - https://github.com/jaegertracing/jaeger-client-python/issues/50
tracer.close() # flush any buffered spans
注意:あなたがイエガー、イエガーを使用したオールインワンドッカーの画像(または類似)の方法を使用して、別の容器でアプリケーションを実行したい場合は、次のコードを使用して、ホストとポートが操作イエガーエージェントを定義します。イェーガースパンはUDPで送信したためUDPが配信を保証するものではありませんが、これは、推奨されませんのでご注意ください。(詳細については、こちらをクリックしてください。)
config = Config(
config={ # usually read from some yaml config
'sampler': {
'type': 'const',
'param': 1,
},
'local_agent': {
'reporting_host': 'your-reporting-host',
'reporting_port': 'your-reporting-port',
},
'logging': True,
},
service_name='your-app-name',
validate=True,
)
3.初期化と設定
注意:デッドロックにつながる可能性があり、インポート、中にトラッカーを初期化しないでください(質問参照#31、#60)。しかし、関数の定義は、(以下の例を参照)トラッカーを返し、関数へのすべての導入の明示的な呼び出しが完了した後。
本番環境ではトレーサーを初期化する方法をお勧めします:
from jaeger_client import Config
def init_jaeger_tracer(service_name='your-app-name'):
config = Config(config={}, service_name=service_name, validate=True)
return config.initialize_tracer()
注、initialize_tracer()もグローバル変数opentracing.tracer設定。あなたは追加のトレーサーを作成する必要がある場合(リモートサービスのスパンを作成するには、例えば、クライアントで検出されていない)、new_tracer()メソッドを使用します。
プロメテウスオープンソースの監視システム
このモジュールは、性能、機能イエガー、初期化メソッドを持つトレーサープロメテウスに統合プロメテウスをjaeger_clientます。
from jaeger_client.metrics.prometheus import PrometheusMetricsFactory
config = Config(
config={},
service_name='your-app-name',
validate=True,
metrics_factory=PrometheusMetricsFactory(namespace='your-app-name')
)
tracer = config.initialize_tracer()
4. PythonのOpenTracingのAPIの使用法
公式文書を完了します。PythonのOpenTracing APIのために
トレースは、典型的には、3つのステップを含みます。
- サービスは、(HTTPまたは他のプロトコルを介して)新しい要求を受信し追跡するために、その活動を継続する/抽出APIをOpenTracing注入使用する、プロセス内のスパン・オブジェクトを作成する場合。要求がアクティブな追跡が含まれていない場合、サービスは、新しいトラックと新しい根スパンを開始します。
- サービスは、現在のスパンが(スパンがアクティブと呼ばれる)は、ローカルストレージ要求に格納されますが、サービスは他のRPCサービスに変換される場合には、例えば、サブスパンを作成する必要がある場合、あなたはそれを取得することができますが必要です。
- 他のアウトバウンドサービスコールが、要求がローカルストアから取得されなければならないときにスパンの現在の要求は、(例えば、start_child_span()ヘルパーを使用して)サブ・スパンを作成する必要があり、サブスパンステーションに取り付けられなければならない(例えば、OpenTracing注入/抽出APIによって)HTTPヘッダを使用して。
ここでは、前述の手順の例です。ステップ2は、本開示の子供がScopeManager Tracer.scope_managerに含まれるように、ローカルストレージサービス、および/またはそれが使用されているフレーム/検出ライブラリの特定の要求を達成するために必要。詳細については、以下を参照してください。
(1)着信要求
どこかの要求ハンドラのコード・サーバー:
def handle_request(request):
span = before_request(request, opentracing.global_tracer())
# store span in some request-local storage using Tracer.scope_manager,
# using the returned `Scope` as Context Manager to ensure
# `Span` will be cleared and (in this case) `Span.finish()` be called.
with tracer.scope_manager.activate(span, True) as scope:
# actual business logic
handle_request_for_real(request)
def before_request(request, tracer):
span_context = tracer.extract(
format=Format.HTTP_HEADERS,
carrier=request.headers,
)
span = tracer.start_span(
operation_name=request.operation,
child_of=span_context)
span.set_tag('http.url', request.full_url)
remote_ip = request.remote_ip
if remote_ip:
span.set_tag(tags.PEER_HOST_IPV4, remote_ip)
caller_name = request.caller_name
if caller_name:
span.set_tag(tags.PEER_SERVICE, caller_name)
remote_port = request.remote_port
if remote_port:
span.set_tag(tags.PEER_PORT, remote_port)
return span
(2)発信要求
コード・サーバーのどこかに、アウトバウンドコールを記述します。
from opentracing import tags
from opentracing.propagation import Format
from opentracing_instrumentation import request_context
# create and serialize a child span and use it as context manager
with before_http_request(
request=out_request,
current_span_extractor=request_context.get_current_span):
# actual call
return urllib2.urlopen(request)
def before_http_request(request, current_span_extractor):
op = request.operation
parent_span = current_span_extractor()
outbound_span = opentracing.global_tracer().start_span(
operation_name=op,
child_of=parent_span
)
outbound_span.set_tag('http.url', request.full_url)
service_name = request.service_name
host, port = request.host_port
if service_name:
outbound_span.set_tag(tags.PEER_SERVICE, service_name)
if host:
outbound_span.set_tag(tags.PEER_HOST_IPV4, host)
if port:
outbound_span.set_tag(tags.PEER_PORT, port)
http_header_carrier = {}
opentracing.global_tracer().inject(
span_context=outbound_span,
format=Format.HTTP_HEADERS,
carrier=http_header_carrier)
for key, value in http_header_carrier.iteritems():
request.add_header(key, value)
return outbound_span
5.その他
1. devoploment
開発者のために、いくつかのパラメータが設定辞書を通過させることができます。より詳細な情報については、参照Configクラスを。
2. WSGI
各要求を処理するために、より頻繁にフォークした子プロセスを実行してWSGIアプリケーションでは。イエガートラッカーの初期化は、それが新しいバックグラウンドスレッドを開始することができます。プロセスフォークした場合、それは後で問題を引き起こすか(インタプリタロックの排他性に起因する)アプリケーションを停止することができます。したがって、初期化トラッカー後にフォークした子プロセスまでを推奨します。
3.作成し、スパンを終了
# 开始无 Parent 的 Span
tracer.start_span('TestSpan')
# 开始有 Parent 的 Span
tracer.start_span('ChildSpan', child_of=span)
# 结束 Span
span.finish()
4.転送SpanContext
# 将 spanContext 传到下一个 Span 中(序列化)
tracer.inject(
span_context=span.context, format=Format.TEXT_MAP, carrier=carrier
)
# 解析传过来的 spanContxt(反序列化)
span_ctx = tracer.extract(format=Format.TEXT_MAP, carrier={})