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. 基于JieBaNet+Lucene.Net实现全文搜索

    实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度 ...

  2. lua脚本之钉钉免密登录

    nginx.conf worker_processes ; error_log logs/error.log; events { worker_connections ; } http { resol ...

  3. LINUX内核CPU负载均衡机制【转】

    转自:http://oenhan.com/cpu-load-balance 还是神奇的进程调度问题引发的,参看Linux进程组调度机制分析,组调度机制是看清楚了,发现在重启过程中,很多内核调用栈阻塞在 ...

  4. Windows Server2008 R2 服务器域名设置Https安全证书访问

    域名支持Https访问设置 1.首先登陆域名申办公司的域名管理账号添加TXT域名解析信息 以新网域名公司为例:http://dcp.xinnet.com,输入域名:www.xxx.com和密码登录即可 ...

  5. Java后端面经总结:拿下蚂蚁金服美团头条 offer 秘诀

    笔者在面过 猿辅导,去哪儿,旷视, 陌陌,头条, 阿里, 快手, 美团, 腾讯之后,除了收获一大堆面试问题,还思考到如何成为面试官眼中的”爱技术,爱思考,靠谱,有潜力候选人的”一些”套路”. 面试问题 ...

  6. 笔记4:WEB服务器

    web服务器 1 HTTP协议 http:超文本传输协议,基于tcp的方式,会更稳当更安全.协议就是规定了怎样去请求服务器,服务器如何返回信息.如下图红色方框标记所示: 打开浏览器电商广告原理: 我们 ...

  7. JS高阶---回调函数

    1.什么函数是回调函数? 此时两者的执行并没有先后顺序 两个都是回调函数 满足三个特点就是回调 .定义了函数 .没有主动调用 .最后执行了 2.常见的回调函数有哪些? .DOM事件回调函数 .定时器回 ...

  8. 201871010121-王方-《面向对象(java)程序设计对象》第十周学习总结

    王方第九周Java实验总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  9. 【Excel】截取字符 LEFT(A1,2) RIGHT(A1,2) MID(SHEET1!E2,1,9)

    LEFT(A1,2)从左边取两个字符 RIGHT(A1,2)从右边取两个字符 MID(SHEET1!E2,1,9)从sheet1表E2单元格中第一位起后9位 可以嵌套

  10. The 2019 China Collegiate Programming Contest Harbin Site

    题解: https://files.cnblogs.com/files/clrs97/HarbinEditorialV2.zip Code: A. Artful Paintings /* let x= ...