随着云原生 + 微服务的推广和落地,服务监控也变得越来越重要了。中等规模的微服务场景下,运维同学已经无法通过日志还原请求的调用轨迹和请求所经过服务的执行耗时,更不用说去定位和分析服务异常根因,研发运维同学需要一个服务监控工具,它可以还原每次请求的服务调用轨迹以及服务执行时间,并以图的形式展现出来。分布式链路追踪系统孕育而生。
近些年市面上有大量优秀的商业产品,这些商业产品通常也叫APM(应用性能监控);比如国内商业公司有阿里云ARMS,听云,博瑞,云智慧等等,国外优秀的商业公司有AppDynamic,DynaTrace等等,它们在产品方面做非常完善,能够适配各种场景。同样地,开源也有非常优秀的解决方案。比如说 CNCF Jaeger,Apache SkyWalking,Cat, Pinpoint等。Jaeger作为CNCF毕业的顶级项目, 在云原生场景下,通常会成为运维同学首选监控解决方案。
Jaeger项目是Uber 在 2015 年开发的。2017 年,Jaeger 纳入云原生计算基金会(CNCF)的孵化项目,2019 年,Jaeger 正式毕业。下图是Jaeger架构图。图中包含两中架构模式,两种架构上大体一样,区别在于添加了Kafka作为缓冲,以解决峰值流量过载的问题。Jaeger Jaeger组件包括 :Client,Agent,Collector,DB,UI等组件,另外Jaeger支持还多种后端存储,其中包括:内存,Badger,Cassandra,ElasticSearch,gRPC插件。
今天我们就来说一说gRPC插件,这个强大且容易被人遗忘的功能。简单点来说,gRPC插件提供了一种能够将Trace数据从Jaeger系统中导出的能力。通过这个能力,开发同学可以很轻松的将Trace对接到一个具备Trace存储和分析的后端服务,这些服务可以对Trace进行二次分析加工,比如说异常根因分析,异常检测和告警等,帮助运维和开发同学更好的发现和定位系统潜在的问题
jaeger插件开发流程
为了更好的了解jaeger插件开发,需要先补充gRPC插件的底层实现原理,Jaeger gRPC插件是使用HashiCorp/go-plugin框架实现的。接下我们将介绍Go Plugin以及插件的开发流程。
Go Plugin由HashiCorp公司开源,它遵循设计模式中的开闭原则,通过接口固定上层业务逻辑,通过改变调用不同的RPC服务接口来改实现对业务的扩展。 目前Go Plugin包含两类插件:RPC Plugin和 GRPCPlugin,两类插件Client的底层调用不一样。一个通过net/rpc调用,一个是grpc服务调用,两个插件都提供了两个方法,Server和Client方法。Service方法的完成的功能是充当服务端的stub,服务端接受到请求后