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. CSS自定义右键菜单

    <style> .menu { width: 100px; font-size: 14px; font-family: "微软雅黑"; border: 1px soli ...

  2. PHP 简单面向对象 验证码类(静态实例对象调用)

    没事写了一个简单的面向对象验证码类,可以直接使用(替换一下字体路径) <?php class authCode { private static $instance = null; #实例对象 ...

  3. android studio学习----android studio断点调试

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...

  4. Google Analytics 学习笔记四 —— GA的Channels划分规则

    一.流量的Source.Medium和Campaigns 1.Source Source或traffic source通常表示流量的来源,一般通过urm_source参数跟踪 在GA中,流量来源的名字 ...

  5. Spring Cloud Bus介绍--Spring Cloud学习第七天(非原创)

    一.什么是Spring Cloud Bus二.Spring Cloud Bus之RabbitMQ介绍三.Spring Cloud Bus整合RabbitMQ四.Spring Cloud Bus整合Ka ...

  6. Docker 网络简单说明

    docker0 网络模型小结 Docker Daemon 会创建出一个名为 docker0 的虚拟网桥 ,用来连接宿主机与容器,或者连接不同的容器. veth pair 是用于不同network na ...

  7. adb 连接夜神和逍遥模拟器

    然后运行cmd命令,cd到夜神安装目录,执行命令 adb connect 127.0.0.1:62001 nox_adb.exe connect 127.0.0.1:62001 逍遥模拟器 adb c ...

  8. 002-OpenStack-认证服务

    OpenStack-认证服务 [基于此文章的环境]点我快速打开文章 1.安装和配置 控制节点(controller) 1.1 创库授权 keystone mysql CREATE DATABASE k ...

  9. python处理JSON 序列化与反序列化

    #序列化 >>> import json>>> d={"key":"value"}>>> d{'key': ...

  10. File.createNewFile和 File.createTempFile比较和区别

    原文地址:http://wzhiju.iteye.com/blog/1119037 最近,在看代码时看到了一个方法, File.createTempFile() ,由此联想到File.createNe ...