Tornado应用程序的OpenTracing支持

tornado_opentracing的Python项目详细描述


这个包支持通过The OpenTracing Project在tornado项目中进行分布式跟踪。一旦生产系统与真正的并发性竞争或分成许多服务,关键的(以前很容易的)任务就会变得困难:面向用户的延迟优化、后端错误的根本原因分析、关于现在分布式系统的不同部分的通信等。分布式跟踪从一开始就跟随一个请求。从移动/浏览器一直到微服务。

由于核心服务和库采用opentracing,应用程序构建器不再承担向自己的代码添加基本跟踪工具的任务。通过这种方式,开发人员可以使用他们喜欢的工具构建他们的应用程序,并从内置的跟踪工具中获益。OpenCACKIN实现存在于主要的分布式跟踪系统中,并且可以通过一行配置更改来绑定或交换。

如果您想了解有关底层python api的更多信息,请访问pythonsource code

安装

运行以下命令:

$ pip install tornado_opentracing

为所有请求设置跟踪

为了在系统中实现跟踪(对于所有请求),请将以下代码行添加到站点的Application构造函数中以启用跟踪:

fromopentracing.scope_managers.tornadoimportTornadoScopeManagerimporttornado_opentracing# Create your opentracing tracer using TornadoScopeManager for active Span handling.tracer=SomeOpenTracingTracer(scope_manager=TornadoScopeManager())# Initialize tracing before creating the Application objecttornado_opentracing.init_tracing()# And either ONE of these possible values:# 1. Specify a TornadoTracing object.app=Application(''' Other parameters here '''opentracing_tracing=tornado_opentracing.TornadoTracing(tracer),)# 2. Pass a module-level callable, invoked once,# returning an opentracing compliant Tracer with optional parameters.app=Application(''' Other parameters here '''opentracing_tracer_callable='opentracing.mocktracer.MockTracer',opentracing_tracer_parameters={'scope_manager':opentracing.scope_managers.TornadoScopeManager(),},)

对于高级用法,可以设置其他设置:

app=Application(''' Other parameters here '''opentracing_tracing=tornado_opentracing.TornadoTracing(tracer),opentracing_trace_all=True,# defaults to True.opentracing_trace_client=True,# AsyncHTTPClient tracing, defaults to Trueopentracing_traced_attributes=['method'],# only valid if trace_all==Trueopentracing_start_span_cb=my_start_span_cb,# optional start Span callback.)

注意:列出了要跟踪的有效请求属性here。当您跟踪一个属性时,这意味着创建的跨距将具有带有属性名和请求值的标记。

跟踪所有请求

为了跟踪所有请求,请在创建Application时设置opentracing_trace_all=True(这是默认值)。如果要记录所有请求的任何属性(作为标记),请将它们添加到opentracing_traced_attributes。例如,如果要跟踪uri和方法,请设置opentracing_traced_attributes = ['uri', 'method']

opentracing_start_span_cb是在创建新的Span之后调用的回调,它必须有两个参数:新的Spanrequest对象。

跟踪要求在创建Application之前调用init_tracing()(这将修补RequestHandlerApplication和其他tornado组件)。

跟踪单个请求

如果不想跟踪到站点的所有请求,则可以使用函数装饰器跟踪单个函数。这可以通过自己管理一个全局唯一的TornadoTracing对象,并将以下代码行添加到RequestHandler子类的任何get/post/put/delete函数中来完成:

tracing=TornadoTracing(some_opentracing_tracer)classMyRequestHandler(tornado.web.RequestHandler):# put the decorator before @tornado.gen.coroutine, if used@tracing.trace(['uri','method'])# optionally pass a list of traced attributesdefget(self):...# do some stuff

此跟踪用法不使用在Application中定义的任何opentracing_*设置,也不需要调用init_tracing

可选参数允许跟踪请求属性。

跟踪http客户端请求

跟踪所有请求时,默认情况下会启用对AsyncHTTPClient的跟踪,但可以通过设置opentracing_trace_client=False禁用此功能。

对于跟踪单个请求或仅使用http客户端(不使用tornado.web)的应用程序,可以像这样启用客户端跟踪:

tornado_opentracing.init_client_tracing(some_opentracing_tracer)

init_client_tracing接受与opentracing兼容的跟踪程序,并且可以选择接受start_span_cb参数作为回调。请注意,在初始化init_tracing时使用trace_all时,如果需要,此调用不是必需的。

注意:当前的TornadoScopeManager限制防止一次调度多个具有活动Span的协同程序(请参阅下面的活动范围处理部分)。而且由于使用AsyncHTTPClient一次获取多个url是一种常见的模式,因此新创建的用于客户端请求的Span不会通过ScopeManager设置为活动。

有效量程处理

对于活动的Span处理和传播,您的Tracer应该使用opentracing.scope_managers.tornado.TornadoScopeManager。将设置跟踪所有请求和单个请求一个正确的堆栈上下文将自动生成,并且活动的Span将从父协程传播到其子协程。在任何其他情况下,代码都需要在tracer_stack_context()下显式运行:

fromopentracing.scope_managers.tornadoimporttracer_stack_contextwithtracer_stack_context():ioloop.IOLoop.current().run_sync(main_func)

注意:由于给定的上下文是共享的,因此当前TornadoScopeManager不支持一次调度多个协同路由设置活动的Span,因此可能会出现混乱:

@tornado.gen.coroutinedefchild_coroutine(name,input_data):# Cannot set Span as active.# However, the parent active Span will still be set,# thus no need to specify it with child_of=withtracer.start_span('child-%s'%name)asspan:...@tornado.gen.corotuinedefparent_coroutine():withtracer.start_active_span('parent'):a=child_coroutine('A',input_a)b=child_coroutine('B',input_b)yield[a,b]

示例

这里有一个simple exampletornado应用程序,它记录所有请求:

其他示例包含在examples directrory下。

更多信息

如果您有兴趣进一步了解opentracing标准,请访问opentracing.iojoin the mailing list。如果您想在您的项目中实现opentracing并需要帮助,请随时在community@opentracing.io向我们发送一条消息。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java搜索按钮不适用于我   java制作一个应用程序来打开您自己的文件扩展名   XMemcached中的java异步集   java无法在Android上使用HTML5 canvas touch   java是否可以用PHP为Restlet创建客户端?   java在主题中添加图标。AppCompat。光   java Safari错误,无法打开浏览器   java gson解析json值中commaseparatedvalue字符串中的项   java如何使用Quarkus在卡夫卡的同一主题中设置多个使用者   java组织。json。JSONException:在{main}()的第6个字符处的main后面应该是“:”   windowbuilder如何将Java文件导出到GATE developer   java这与安卓 studio ide问题有关,在更新我们的ide之后   java Android将活动加载到类中<?>对象   java如何在springdatajpa中使用DISTINCT、GROUP BY和ORDER BY?   使用jlink的java可复制构建