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

Jaeger接入Python应用:jaeger-client-python【非完全教程】的更多相关文章

  1. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  2. Python中执行变量而非字符串

    Python中执行变量而非字符串 设想这样的场景,你需要大型项目的开发.但是项目的开发第一步是啥? 当然是import导入了. ...but............ 默认 import 后面跟着字符串 ...

  3. Python web框架 Tornado异步非阻塞

    Python web框架 Tornado异步非阻塞   异步非阻塞 阻塞式:(适用于所有框架,Django,Flask,Tornado,Bottle) 一个请求到来未处理完成,后续一直等待 解决方案: ...

  4. python的scribe client

    在网上找了一个python的scribe client使用方法 依赖的模块: pip install facebook-scribe pip install thrift 代码例子: #!/usr/b ...

  5. Python面试题之Python面试题汇总

    在这篇文章中: Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 Python的优势: 4:简述解释型和编译型编程语言 5:Py ...

  6. Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  7. Python学习笔记 - day12 - Python操作NoSQL

    NoSQL(非关系型数据库) NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数据的存储.(例如 ...

  8. 我的Python学习之路 Python的输入输出与基本数据类型

    *** python中的变量不需要事先声明再使用,而可以直接来一个变量名,后面一个赋值,接着一个数据值,如 hw = "hello python",相当于Python能智能的根据你 ...

  9. [Python学习笔记1]Python语言基础 数学运算符 字符串 列表

    这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...

随机推荐

  1. weblogic 安全漏洞问题解决

    1 weblogic控制台地址暴露 ²  整改方法: 禁用weblogic控制台.在weblogic域(sguap-domain和base-domain)的config下的config.xml中 &l ...

  2. VMware基本用法

    ###VMware tools 介绍 只有在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由移动(不用 ...

  3. vue---v-model的详细解答

    1.v-model:双向数据绑定的实现原理     等同于一个  v-bind  加   v-on <div id="app"> <!-- <input t ...

  4. 020.Dockerfile

    docker-cli读取Dockerfile,根据指令生成定制的docker镜像. Dockerfile的指令根据作用可以分为两种,构建指令和设置指令. 构建指令:用于构建image,其指定的操作不会 ...

  5. [b0013] Hadoop 版hello word mapreduce wordcount 运行(三)

    目的: 不用任何IDE,直接在linux 下输入代码.调试执行 环境: Linux  Ubuntu Hadoop 2.6.4 相关: [b0012] Hadoop 版hello word mapred ...

  6. Odoo 启动选项总结

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189209.html 一:启动选项用在哪里 如果你是用Pycharm进行odoo二次开发的话,可以通过 R ...

  7. JVM 启动参数,共分为3类

    JVM 启动参数,共分为3类: 类别 说明 标准参数(-) 所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 非标准参数(-X) 这些参数不是虚拟机规范规定的.因此,不是所有VM的实现(如:H ...

  8. HardFault_Handler的方法转载

    在硬汉平台看到一个比较好的帖子,关于如何定位HardFault_Handler,这里要记录下网址. http://www.armbbs.cn/forum.php?mod=viewthread& ...

  9. arduino控制SIM900A模块

    https://item.taobao.com/item.htm?spm=a1z09.2.0.0.5fc02e8dncAF2p&id=604968021102&_u=i1qf7bf5f ...

  10. js判断超过几个字符后显示省略号