Ps:關於jaeger與python的文章很少,這篇文章是從很多地方,包括官方文檔搜集整理而來,為之后的使用提供參考,現在並沒有做過實際驗證,如有錯誤請指出,我也會之后會在使用過程中就錯誤之處修改。
Jaeger接入Python應用
在Python中,使用jaeger-client接入。它是一個客戶端庫,可用於檢測Python應用程序以進行分布式跟蹤收集,並將這些跟蹤發送給Jaeger。有關其他詳細信息,請參閱OpenTracing Python API。
jaeger-client的git地址:jaeger-client
1. 安裝 jaeger-client
pip install jaeger-client
2. (示例)創建 Tracer 對象,並通過 Tracer 對象創建 Span 來追蹤業務流程。
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
注意:如果使用All-in-one Docker鏡像(或者類似)方式使用Jaeger,並且希望在應用程序的單獨容器中運行Jaeger,請使用下面的代碼定義運行Jaeger代理的主機和端口。請注意,不建議這樣做,因為Jaeger通過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)。而是定義一個返回跟蹤器的函數(參見下面的示例),並在完成所有導入后顯式調用該函數。
生產環境初始化tracer的推薦方法:
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全局變量。如果需要創建其他tracer(例如,要在客戶端創建未檢測的遠程服務的跨度),請使用new_tracer()方法。
開源監控系統Prometheus
jaeger_client這個模塊將prometheus集成到了jaeger的性能指標功能中,帶prometheus的tracer初始化方法:
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. 其他
1. devoploment
對於開發,一些參數可以通過config字典傳遞。有關更多詳細信息,請參閱Config類。
2. WSGI
在WSGI下運行的應用程序通常會分叉多個子進程來處理各個請求。初始化Jaeger跟蹤器時,它可能會啟動一個新的后台線程。如果該進程稍后分叉,則可能導致問題或掛起應用程序(由於對解釋器的獨占鎖定)。因此,建議直到子進程分叉后才初始化跟蹤器。
3. 創建和結束 Span
# 開始無 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={})