Jaeger接入Python應用:jaeger-client-python【非完全教程】


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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM