文章目录OpenTracing Python分布式追踪的标准 APIOpenTracing Python分布式追踪的标准 APIOpenTracing 的 Python 实现opentracing-python目前收获了 750 Star这个项目是 OpenTracing 组织维护的 Python 平台 API为分布式追踪提供了一套标准化的接口。当前版本主要提供 API 定义和一个基础的 no-op 实现让各类 instrumentation 库能够基于统一的接口来收集和传播分布式追踪上下文而不需要绑定到具体的追踪后端。在微服务架构中一个用户请求往往会流经多个服务。如果没有追踪机制定位性能瓶颈或排查故障将变得极为困难。OpenTracing 正是为了解决这一问题而设计的开放标准而opentracing-python则是该标准在 Python 生态中的具体落地。项目的核心工作围绕三个环节展开接收请求时通过 inject/extract API 延续已有的追踪链路创建 Span 对象处理请求时将当前 Span 存入请求本地的存储中供后续创建子 Span 时取用发起请求时从本地存储取出当前 Span创建子 Span并通过 inject/extract API 将其嵌入到出站请求中入站请求处理服务端收到请求时的典型处理逻辑defhandle_request(request):spanbefore_request(request,opentracing.global_tracer())withtracer.scope_manager.activate(span,True)asscope:handle_request_for_real(request)defbefore_request(request,tracer):span_contexttracer.extract(formatFormat.HTTP_HEADERS,carrierrequest.headers,)spantracer.start_span(operation_namerequest.operation,child_ofspan_context)span.set_tag(http.url,request.full_url)remote_iprequest.remote_ipifremote_ip:span.set_tag(tags.PEER_HOST_IPV4,remote_ip)returnspan这里的关键是从请求头中提取 span_context。如果请求中已存在活跃追踪则延续该追踪否则启动新的根 Span。出站请求处理服务向其他服务发起调用时需要创建子 Span 并将追踪上下文传递出去defbefore_http_request(request,current_span_extractor):parent_spancurrent_span_extractor()outbound_spanopentracing.global_tracer().start_span(operation_namerequest.operation,child_ofparent_span)outbound_span.set_tag(http.url,request.full_url)http_header_carrier{}opentracing.global_tracer().inject(span_contextoutbound_span.context,formatFormat.HTTP_HEADERS,carrierhttp_header_carrier)forkey,valueinhttp_header_carrier.iteritems():request.add_header(key,value)returnoutbound_spanScope 与进程内传播OpenTracing 要求每个 Tracer 都包含一个 ScopeManager用于管理当前活跃的 Span。Scope 可以通过上下文管理器自动注册和清理withtracer.start_active_span(someWork,finish_on_closeTrue)asscope:# 执行业务逻辑如果需要手动管理 Scopespantracer.start_span(operation_namesomeWork)scopetracer.scope_manager.activate(span,True)try:# 执行业务逻辑exceptExceptionase:span.set_tag(error,...)finally:scope.close()多框架支持项目内置了多种 ScopeManager 实现覆盖不同的异步框架fromopentracing.scope_managersimportThreadLocalScopeManagerfromopentracing.scope_managers.geventimportGeventScopeManagerfromopentracing.scope_managers.tornadoimportTornadoScopeManagerfromopentracing.scope_managers.asyncioimportAsyncioScopeManagerfromopentracing.scope_managers.contextvarsimportContextVarsScopeManager对于 asyncio 应用推荐使用ContextVarsScopeManager。相比AsyncioScopeManager它能自动将父 Span 传播到子协程、任务或回调中。测试支持项目还提供了 MockTracer 用于单元测试无需接入真实的追踪后端即可验证 instrumentation 逻辑fromopentracing.mocktracerimportMockTracer tracerMockTracer()withtracer.start_span(someWork)asspan:passspanstracer.finished_spans()opentracing-python作为 OpenTracing 规范在 Python 生态中的官方实现为构建可观测的分布式系统提供了基础层接口。instrumentation 库可以基于此 API 开发而应用开发者则可以自由选择后端追踪系统。ntracing-python 作为 OpenTracing 规范在 Python 生态中的官方实现为构建可观测的分布式系统提供了基础层接口。instrumentation 库可以基于此 API 开发而应用开发者则可以自由选择后端追踪系统。