Jaeger

https://github.com/jaegertracing/jaeger
https://www.jaegertracing.io/docs/1.14/getting-started/
https://github.com/jaegertracing/jaeger-client-go

trace
Micro通过Wrapper实现了三种trace接口,aswxray,opencensus,opentracing,这里主要关注opentracing,opentracing已成为行业标准。



opentracing
要引入OpenTracing方案,只需要opentracing.NewClientWrapper加入Client或者Server即可。



func NewClientWrapper(ot opentracing.Tracer) client.Wrapper {
return func(c client.Client) client.Client {
return &otWrapper{ot, c}
}
}
opentracing.NewClientWrapper方法入参是实现OpenTracing的接口opentracing.Tracer



type Tracer interface {
StartSpan(operationName string, opts …StartSpanOption) Span
Inject(sm SpanContext, format interface{}, carrier interface{}) error
Extract(format interface{}, carrier interface{}) (SpanContext, error)
}
jaeger
部署一个测试的jaeger,服务器地址:192.168.8.144,Agent的默认端口是5775。



/home/service/base/jaeger
[root@localhost jaeger]# ll
total 158444
-rwxr-xr-x 1 root root 14565068 Nov 16 19:35 example-hotrod
-rwxr-xr-x 1 root root 20387089 Nov 16 19:35 jaeger-agent
-rwxr-xr-x 1 root root 38456594 Nov 16 19:35 jaeger-all-in-one
-rwxr-xr-x 1 root root 29731462 Nov 16 19:35 jaeger-collector
-rwxr-xr-x 1 root root 25523281 Nov 16 19:35 jaeger-ingester
-rwxr-xr-x 1 root root 33563911 Nov 16 19:35 jaeger-query
-rwxr-xr-x 1 root root 43 Nov 16 19:36 run
-rw-r–r– 1 root root 1939 Nov 16 19:36 x.log
[root@localhost jaeger]# cat run
nohup ./jaeger-all-in-one  » x.log 2>&1 &
jaeger是一款分布式的追踪系统,实现了opentracingAPI标准,也是Go生态的,是CNCF成员。



func TestJaeger(t *testing.T) {
cfg := config.Configuration{
ServiceName: “MicroTestService”,//自定义服务名称
Sampler: &config.SamplerConfig{
Type: “const”,
Param: 1,
},
Reporter: &config.ReporterConfig{
LogSpans: true,
BufferFlushInterval: 1 * time.Second,
LocalAgentHostPort: “192.168.8.144:5775”,//jaeger agent
},
}
tracer, closer, err := cfg.NewTracer()
if err != nil {
t.Error(err)
return
}
defer closer.Close()



r := mock.NewRegistry()
s := selector.NewSelector(selector.Registry(r))

c := client.NewClient(
// set the selector
client.Selector(s),
// add the trace wrapper
client.Wrap(NewClientWrapper(tracer)),
)

req := c.NewRequest("test.service", "Test.Method", map[string]string{
"foo": "bar",
}, client.WithContentType("application/json"))

var rsp map[string]interface{}
c.Call(context.TODO(), req, rsp)
t.Log(rsp) } 浏览器访问:http://192.168.8.144:16686/search可以发现有服务MicroTestService的访问追踪了


随着公司的发展,业务不断增加,模块不断拆分,系统间业务调用变得越复杂,对定位线上故障带来很大困难。整个调用链不透明,犹如系统被蒙上一块黑纱,当线上遇到故障时,整个技术部就陷入痛苦的漩涡。这时候分布式追踪系统应运而生,如揭开了黑纱,让阳光照进黑暗。



分布式系统调用过程
image



opentracing 协议
 opentracing是一套分布式追踪协议,与平台,语言无关,统一接口,方便开发接入不同的分布式追踪系统。



image



简单理解opentracing
一个完整的opentracing调用链包含 Trace + span + 无限极分类



Trace:追踪对象,一个Trace代表了一个服务或者流程在系统中的执行过程,如:test.com,redis,mysql等执行过程。一个Trace由多个span组成
span:记录Trace在执行过程中的信息,如:查询的sql,请求的HTTP地址,RPC调用,开始、结束、间隔时间等。
无限极分类:服务与服务之间使用无限极分类的方式,通过HTTP头部或者请求地址传输到最低层,从而把整个调用链串起来。
相关文档
官方文档
OpenTracing语义规范(中文版)
OpenTracing语义惯例
opentracing文档中文版 ( 翻译 ) 吴晟
分布式追踪系统Jaeger
 Jaeger是Uber开发的一套分布式追踪系统,已在Uber大规模使用。并在2017-9-13 加入CNCF 开源组织。使用Jaeger可以非常直观的展示整个分布式系统的调用链,由此可以很好发现和解决问题:



image



作用
分布式环境下信息传播
分布式交易监控
展示跨进程调用链
性能优化
定位问题
特性
使用udp传输数据,相对于HTTP,优点在于,不用担心Jaeger服务宕机或者网络传输有问题而影响正常的业务。缺点就是丢包,影响了整条调用链。
数据通过Thrift进行序列化,和json对比
接口 Thrift/byte json/byte 节省
接口1 987 2396 约1.5倍
接口2 1212 2916 约1.4倍
接口3 12830 18893 约40%
接口4 17158 22465 约24%
接口5 11025 14282 约23%
 从中可以看出thrift相对json减少了不少空间。在我们采集公司接口的数据大小都集中在10~20k,所以使用thrift会更有优势。



采集策略
Jaeger 官方提供了多种采集策略,使用者可以按需选择使用



ConstSampler,全量采集
ProbabilisticSampler ,概率采集,默认万份之一
RateLimitingSampler ,限速采集,每秒只能采集一定量的数据
RemotelyControlledSampler ,一种动态采集策略,根据当前系统的访问量调节采集策略
客户端
Go
Java
node
python
php
官方提供了 go,java,node,python客户端,其他客户端还在开放中,php客户端为个人开发【欢迎star】



部署
快速部署 —— All in one Docker image
 all-in-one 是Uber官方打包好的镜像,可以直接部署使用,但是只能用于测试环境,不能用于线上,因为它把数据放入了内存。



docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp

-p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
通过 http://localhost:16686 可以在浏览器查看 Jaeger的后台



官方提供的使用例子,需要go环境
go get github.com/uber/jaeger
cd $GOPATH/src/github.com/uber/jaeger
make install_examples
cd examples/hotrod
go run ./main.go all
http://localhost:8080 浏览器打开查看



cassandra + docker 部署,单机模式
docker run -itd

–name=cassandra -p9042:9042

-v /data/cassandra:/var/lib/cassandra

cassandra



进入容器建立表空间
按照官方脚本整理了一份建表语句jaeger_tables,进入cassandra,执行语句即可创建所需的表。



keyspaces:jaeger_v1_dc



运行 jaeger-query
docker run -itd –network=bridge

–name=jaeger-query

-p16686:16686

jaegertracing/jaeger-query

/go/bin/query-linux

–span-storage.type=cassandra

–cassandra.keyspace=jaeger_v1_dc

–cassandra.servers=:9042

–query.static-files=/go/jaeger-ui/



运行 jaeger-collector
docker run -itd –network=bridge

–name=jaeger-collector

-p14267:14267

-p14268:14268

-p9411:9411

jaegertracing/jaeger-collector

/go/bin/collector-linux

–span-storage.type=cassandra

–cassandra.keyspace=jaeger_v1_dc

–cassandra.servers=:9042



运行 jaeger-agent
docker run

-itd –network=bridge

–name=jaeger-agent

-p5775:5775/udp

-p6831:6831/udp

-p6832:6832/udp

-p5778:5778/tcp

jaegertracing/jaeger-agent

/go/bin/agent-linux –collector.host-port=:14267



跨语言调用案例
php
Hprose
Go【beego】
beego
install beego
go get github.com/astaxie/beego
Download trace_example
git clone git@github.com:jukylin/trace_example.git
cd trace_example
bee run trace_example
PHP
install jaeger-php
Run Hprose.php
cd vendor/jukylin/jaeger-php/example
php Hprose.php



jaeger是一个比较有名的分布式链路追踪系统,底层用golang实现,兼容opentracing标准,这里利用其go-client来实现一个最简单的demo,仅供参考。




  1. 安装必要的包:



“github.com/opentracing/opentracing-go”
“github.com/uber/jaeger-client-go”
“github.com/uber/jaeger-client-go/config”



  1. 安装部署jaeger整套:



这里利用jaeger提供的docker,集成了整套环境,利用内存存储:docker hub地址:https://hub.docker.com/r/jaegertracing/all-in-one



直接运行一下命令启动docker:



docker run -d –name jaeger

-e COLLECTOR_ZIPKIN_HTTP_PORT=9411

-p 5775:5775/udp

-p 6831:6831/udp

-p 6832:6832/udp

-p 5778:5778

-p 16686:16686

-p 14268:14268

-p 9411:9411

jaegertracing/all-in-one:1.9


Category golang