一文读懂微服务监控之分布式追踪( 三 )

服务A响应format请求 , 调用tracer.extract从http headers中提取信息 , 构建spanContext 。
服务B代码
from flask import Flaskfrom flask import requestfrom lib.tracing import init_tracerfrom opentracing.ext import tagsfrom opentracing.propagation import Format?app = Flask(__name__)tracer = init_tracer('publisher')?@app.route("/publish")def publish(): span_ctx = tracer.extract(Format.HTTP_HEADERS, request.headers) span_tags = {tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER} with tracer.start_active_span('publish', child_of=span_ctx, tags=span_tags): hello_str = request.args.get('helloStr') print(hello_str) return 'published'?if __name__ == "__main__": app.run(port=8082)服务B和A类似 。
之后在支持分布式追踪的软件UI上(下图是Jaeger UI) , 就可以看到类似下图的追踪信息 。我们可以看到服务hello-word和三个操作say-hello/format/println的详细追踪信息 。

一文读懂微服务监控之分布式追踪

文章插图
 
当前有很多分布式追踪软件都提供了OpenTracing的支持 , 包括:Jaeger , LightStep , Instanna , Apache SkyWalking , inspectIT , stagemonitor , Datadog , Wavefront , Elastic APM等等 。其中作为开源软件的Zipkin(http://1t.click/6Ec)和Jaeger(http://1t.click/6DY)最为流行 。
Zipkin
Zipkin(http://1t.click/6Ec)是Twitter基于Dapper开发的分布式追踪系统 。它的设计架构如下图:
一文读懂微服务监控之分布式追踪

文章插图
 
  • 蓝色实体是Zipkin要追踪的目标组件 , Non-Intrumented Server表示不直接调用Tracing API的微服务 。通过Intrumented Client从Non-Intrumented Server中收集信息并发送给Zipkin的收集器Collector 。Intrumented Server 直接调用Tracing API , 发送数据到Zipkin的收集器 。
  • Transport是传输通道 , 可以通过HTTP直接发送到Zipkin或者通过消息/事件队列的方式 。
  • Zipkin本身是一个JAVA应用 , 包含了:收集器Collector负责数据采集 , 对外提供数据接口;存储;API和UI 。
Zipkin的用户界面像这个样子:
一文读懂微服务监控之分布式追踪

文章插图
 

一文读懂微服务监控之分布式追踪

文章插图
 
Zipkin官方支持以下几种语言的客户端:C# , Go , Java , JavaScript , Ruby , Scala , php 。开源社区也有其它语言的支持 。
Zipkin发展到现在有快4年的时间 , 是一个相对成熟的项目 。
Jaeger
Jaeger(http://1t.click/6DY)最早是由Uber开发的分布式追踪系统 , 同样基于Dapper的设计理念 。现在Jaeger是CNCF(Cloud Native Computing Foundation)的一个项目 。如果你对CNCF这个组织有所了解 , 那么你可以推测出这个项目应该和Kubernetes有非常紧密的集成 。
Jaeger基于分布式的架构设计 , 主要包含以下几个组件:
  1. Jaeger Client , 负责在客户端收集跟踪信息 。
  2. Jaeger Agent , 负责和客户端通信 , 把收集到的追踪信息上报个收集器 Jaeger Collector
  3. Jaeger Colletor把收集到的数据存入数据库或者其它存储器
  4. Jaeger Query 负责对追踪数据进行查询
  5. Jaeger UI负责用户交互
这个架构很像ELK , Collector之前类似Logstash负责采集数据 , Query类似Elastic负责搜索 , 而UI类似Kibana负责用户界面和交互 。这样的分布式架构使得Jaeger的扩展性更好 , 可以根据需要 , 构建不同的部署 。
Jaeger作为分布式追踪的后起之秀 , 随着云原生和K8s的广泛采用 , 正变得越来越流行 。利用官方给出的K8s部署模版(http://1t.click/6DU) , 用户可以快速的在自己的k8s集群上部署Jaeger 。
4.分布式跟踪系统——产品对比
当然除了支持OpenTracing标准的产品之外 , 还有其它的一些分布式追踪产品 。这里引用一些其它博主的分析 , 给大家一些参考: