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={})
Jaeger接入Python应用:jaeger-client-python【非完全教程】的更多相关文章
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- Python中执行变量而非字符串
Python中执行变量而非字符串 设想这样的场景,你需要大型项目的开发.但是项目的开发第一步是啥? 当然是import导入了. ...but............ 默认 import 后面跟着字符串 ...
- Python web框架 Tornado异步非阻塞
Python web框架 Tornado异步非阻塞 异步非阻塞 阻塞式:(适用于所有框架,Django,Flask,Tornado,Bottle) 一个请求到来未处理完成,后续一直等待 解决方案: ...
- python的scribe client
在网上找了一个python的scribe client使用方法 依赖的模块: pip install facebook-scribe pip install thrift 代码例子: #!/usr/b ...
- Python面试题之Python面试题汇总
在这篇文章中: Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 Python的优势: 4:简述解释型和编译型编程语言 5:Py ...
- Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- Python学习笔记 - day12 - Python操作NoSQL
NoSQL(非关系型数据库) NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数据的存储.(例如 ...
- 我的Python学习之路 Python的输入输出与基本数据类型
*** python中的变量不需要事先声明再使用,而可以直接来一个变量名,后面一个赋值,接着一个数据值,如 hw = "hello python",相当于Python能智能的根据你 ...
- [Python学习笔记1]Python语言基础 数学运算符 字符串 列表
这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...
随机推荐
- 设置 WPF 的全球化语言
https://stackoverflow.com/questions/7454024/setting-culture-en-in-globally-in-wpf-app Thread.Current ...
- 处理 JS中 undefined 的 7 个技巧
摘要: JS的大部分报错都是undefined... 作者:前端小智 原文:处理 JS中 undefined 的 7 个技巧 Fundebug经授权转载,版权归原作者所有. 大约8年前,当原作者开始学 ...
- 【洛谷P4542】 [ZJOI2011]营救皮卡丘(费用流)
洛谷 题意: 给出\(n\)个点,\(m\)条边,现在有\(k,k\leq 10\)个人从\(0\)号点出发前往\(n\)点. 规定若某个人想要到达\(x\)点,则\(1\)~\(x-1\)号点都有人 ...
- JPA-save()方法会将字段更新为null的解决方法
今天在开发上碰到一个问题,在做页面展示的时候传给前端十个字段,前端修改了其中3个的值,所以只传了3个值给后端,其余字段默认为null,更新后其他7个字段在全部变为了空值. 在前端没法全量回传所有属性的 ...
- java+selenium3学习
http://blog.csdn.net/u011541946/article/details/72898514 http://git.oschina.net/zhengshuheng https:/ ...
- eclipse打可运行的jar
参考:https://www.cnblogs.com/wangzhisdu/p/7832666.html 用eclipse打包可运行的jar比较坑的地方: 3.1 从下拉框选择该jar的入口文件,即m ...
- python27期day18:模块和包、作业。
1.模块和包: 我们今天来讲解一下模块和包,模块我们已经知道是什么东西了,我们现在来看看这个包是个什么? 我说的包可不是女同胞一看见就走不动的包,而是程序中一种组织文件的形式. 只要文件夹下含有__i ...
- 柯里化currying + 隐式调用 = 一个有名的add面试题
柯里化 =================================== 维基百科解释: 柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参 ...
- spark 配置
1. mv slaves.template slaves slaves 文件添加 hadoop.slave01 hadoop.slave02 hadoop.slave03 2. cp spark-en ...
- 【oracle】oracle11g安装失败 提示找不到文件,模板General_Purpose.dbc不存在
先确定一下自己的安装包是不是一起解压的! 不是就重新解压,重新装. 是,剩下的我也不会