观看视频
分享者
jukylin
Go opentracing jaeger 集成及源码分析
一、分布式追踪论文
论文地址:Dapper,大规模分布式系统的跟踪系统 by bigbully
为什么要用分布式追踪
当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。
互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、
可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。
因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具。
分布式系统调用过程
使用分布式追踪要留意哪些问题
-
低损耗
跟踪系统对在线服务的影响应该做到足够小。
-
应用透明
对于应用的程序员来说,是不需要知道有跟踪系统这回事的。
二、Opentracing简介
Opentracing的作用
-
OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
-
可以很自由的在不同的分布式追
踪系统中切换 -
不负责具体实现
Opentracing主要组成
-
一个Trace
一个trace代表了一个事务或者流程在(分布式)系统中的执行过程
-
Span
记录Trace在执行过程中的信息
-
无限极分类
服务与服务之间使用无限极分类的方式,通过HTTP头部或者请求地址传输到最低层,从而把整个调用链串起来。
Jaeger-client的实现
Jaeger-client源码
提取
- 为什么要提取
主要作用是为了找到父亲
-
从哪里提取
进程内,不同进程之间各自约定
粟子:github.com/opentracing-contrib/go-stdlib/nethttp/server.go P86 -
提取什么
traceid:spanid:parentid:是否采集
uber-trace-id=157b74261b51d917:157b74261b51d917:0:1
github.com/jaegertracing/jaeger-client-go/propagation.go P124
注入
-
为什么要注入
主要为了让孩子能找到爸爸
-
注入到哪里
和提取相对
github.com/jaegertracing/jaeger-client-go/propagation_test.go -
注入了什么
github.com/jaegertracing/jaeger-client-go/propagation.go P103
异步report
-
Span.finish
-
把Span放入队列
-
从队列取出,生成thrift,放入spanBuffer
-
Flush到远程
github.com/jaegertracing/jaeger-client-go/transport_udp.go P113
低消耗
-
消耗在哪里
Jaeger-client作用于应用层,提取、注入、生成span、序列化成Thrift、发送到远程等,一系列操作这些都会带来性能上的损耗。
-
如何处理
选择合适采集策略:
- Constant
- Probabilistic
- Rate Limiting
- Remote
应用透明
- 如何做到让业务开发人员无感知
- Golang:
约定第一个参数为ctx,把parentSpan放入ctx
github.com/opentracing/opentracing-go/gocontext.go - PHP:
使用全局变量
- Golang:
三、Jaeger服务端源码阅读
服务端组件职责
各组件按照微服务架构风格设计,职责单一
-
Jaeger-agent负责上报数据的整理
-
Jaeger-collector负责数据保存
-
Jaeger-query负责数据查询
-
Jaeger-agent和Jaeger-collector使用基于TCP协议实现的RPC进行通讯
Jaeger-agent 源码阅读
-
监听3个UDP端口
github.com/jaegertracing/jaeger/cmd/agent/app/flags.go P35
github.com/jaegertracing/jaeger/cmd/agent/app/servers/thriftudp/transport.go P73 -
接收Jaeger-client的数据,放入队列dataChan
github.com/jaegertracing/jaeger/cmd/agent/app/servers/tbuffered_server.go #80
-
从队列dataChan获取数据,进行校验
github.com/jaegertracing/jaeger/cmd/agent/app/processors/thrift_processor.go P108
-
提交数据
github.com/jaegertracing/jaeger/thrift-gen/jaeger/tchan-jaeger.go #39
Jaeger-collector 源码阅读
-
协程池
-
接收jaeger-agent数据
github.com/jaegertracing/jaeger/cmd/collector/app/span_handler.go P69
-
放入队列
github.com/jaegertracing/jaeger/cmd/collector/app/span_processor.go P112
-
从队列拿出来,写入数据库
github.com/jaegertracing/jaeger/cmd/collector/app/span_processor.go p54
github.com/jaegertracing/jaeger/plugin/storage/cassandra/spanstore/writer.go P136
四、Jaeger使用经验
监听指标
-
Jaeger-client 监听 reporter_spans
-
Jaeger-agent 监听 thrift.udp.server.packets.dropped
-
Jaeger-collector 监听 spans.dropped
http://localhost:16686/metrics
测试环境debug
测试环境记录执行mysql语句,redis命令,RPC参数、结果
可以很方便定位问题
性能调优
观察Jaeger-ui,对线上接口,mysql执行时间进行监控调优