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

转载于:https://www.cnblogs.com/ChangAn223/p/11461188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值