分布式链路监控工具-Jaeger

2,027 阅读4分钟

Jaeger

Jaeger是一个基于opentracing规范的链路追踪工具,至于opentracing具体是什么,可以参考opentracing官网,简单来说opentracing就是一套标准,里面提供了链路追踪的基本单元和接口。

基本单元可以理解为trace和span,span是一个operation表达,trace是一个完整链路的表达,例如:后端接口的一个调用可以理解为一个trace,而这个后端接口中调用了MySQL的服务,这个MySQL服务的调用过程就可以被看做是一个span。

接口可以理解为opentracing规定的一些接口,例如:inject extract方法等等。

如果一个追踪工具按照opentracing的基本单元,实现了对应的接口,就可以理解为这个追踪工具是符合opentracing规范的。Jaeger就是一个符合opentracing规范的追踪工具。

Client

Jaeger为多种语言提供了client,方便各种语言调用,如 go,python,c++,Java等。client可以理解为生成trace和span然后发送给下游接受模块的工具,生成span和初始化trace都很简单,只要调用jaeger提供的包,使用一个函数就可以新建一个trace,traceid和一些默认的tags都会被自动注入,例如hostmanip之类的信息。

关于各种语言使用jaeger的demo网上有很多,就不赘述了。

关于client是如何将数据发送给下游的接受模块的

1.首先当你调用span.finish方法的时候,client会把finish的span打包转换为可以发送的格式

2.塞到一个队列中,队列的实现各种语言的实现有些许差异。

3.队列有一个处理函数,会把队列中的数据取出来,放到一个batch span中,当这个batch span满的时候,或者时间到了之后(这个时间是可以设置的),就会发送给下游,这个下游可以是agent或者collector,同时选择发送的协议也有很多udp http grpc都有提供,而且扩展别的采样方式也很简单,例如可以复用日志采集的agent,Prometheus的agent等等。

Agent

agent,顾名思义就是接受client生成数据的地方,agent和client使用udp长链接传输数据。agent只是一个用来收集数据的代理,会把数据发送给真正的收集器collector,收集和发送的过程和client相似。

如果在程序跑在物理机上的话,部署agent是有必要的,如果程序是跑在云上,那就需要client直接把数据传给collector了。

同时,如果有部署agent的话,agent还会接受来自collector关于采样的信息

Collector

collector,是用于将采集之后的数据写到kafka中,逻辑也很简单,启动一个server,提供了各种端口,各种协议的方式,然后接受数据写到kafka中就完事。

ingester

ingester从名字就可以看出是从kafka里面取数据然后做持久化的,关于这个持久化的对象,jaeger原生是选择了elasticsearch(简称es),之索引选择es是因为查询非常方便(反向索引),性能也不错。es是elk(全链路的采集/存储/可视化,工业界用的非常多)中一个存储引擎。

ingester原生写入es的索引是采用时间结尾的,方便在前端使用时间去检索。

Query

query,是jaeger后端的一个模块,为前端的搜索提供接口,/api/service /api/search等等都是提供的接口,用于前端查询。

采样策略

因为实际上大规模的系统,利用jaeger进行排查问题或者监控报警之类的需求,只需要部分数据就可以,如果把所有的数据都存入的话可能会导致存储的压力比较大,并且可能服务本身也要因为发送数据出现性能问题,所以jaeger提供了采样策略可供选择。

  • 概率采样
  • 自适应采样
inject extract

inject和extract是jaeger可以做到跨进程追踪的关键,inject和extract的实现也非常简单,可以看作是序列化和反序列化的函数,既然有序列化和反序列化,那就需要数据载体,在jaeger中http header就是一种数据载体,如果两个服务之间是使用http接口进行调用,就可以通过把当前spancontext的数据序列化到header中,然后传递,在下游的服务接受到这个请求的时候可以通过header去解析,然后拿到信息去创建一个span,这个新创建的span就是同一个trace里面的内容,在前端界面查询的时候就可以查到。

当前的记录就到这里,因为工作有需要使用和改造下jaeger,所以就简单记录下,如果后期看的人多,会出一个详细的jaeger各个模块的代码解析。