APP下载

轻量级分布式追踪系统的设计与实现

2020-10-09温小斌张达诸映晴

计算机时代 2020年9期
关键词:微服务运维监控

温小斌 张达 诸映晴

摘要:分布式追踪是为了解决微服务环境下服务调用的可观察性问题。鉴于目前追踪系统存在的各种不足之处,设计并实现了一个轻量级的分布式追踪系统,实现了服务调用链、调用频次、响应时间等观察指标的追踪。基于Java agent和字节码编辑技术实现追踪代理程序,生成追踪图数据,并通过gRPC发送到监控中心。追踪系统做到了对应用系统的零侵入,并且實现了OpenTracing标准,能够方便地与各种运维监控系统集成。

关键词:分布式追踪;微服务;运维;监控;OpenTracing

中图分类号:TP319

文献标识码:A

文章编号:1006-8228(2020)09-64-04

Design and implementation of lightweight distributed tracing system

Wen Xiaobin, Zhang Da, Zhu Yingqing

(Ningbo Hadlinks IoT Technology Co., Ltd., Ningbo, Zhejiang 315000, China)

Abstract: Distributed tracing system is to make service call observable in microservice context. To overcome the shortcomings ofcurrent systems, a lightweight distributed tracing system is designed and implemented. It makes metrics in application observable.including chain of service dependencies, calling frequency and response time. Based on Java agent and byte-code editor. a tracingagent is programmed to create tracing data with graph structure, and send the data to monitoring center via gRPC. The tracingsystem achieves zero intrusion into the application, and conforms to OpenTracing standard, it can be easily integrated with variousoperation and maintenance monitoring systems.

Key words: distribLLted tracing; microservice; operation and maintenance; monitoring; OpenTracinii

0引言

微服务架构已经成为广泛使用的架构模式,它把复杂而庞大的业务系统拆分成一些粒度更小而且可以独立部署的服务进程,实现了业务的解耦与复用,方便部署、扩展和维护[1]。分布式追踪技术[2]就是在这种背景下诞生的,它主要解决服务调用的可观察性问题,包括服务调用链、调用频次、响应时间、异常调用等观察指标。为此业界进行了一系列的研究,开发出了各种分布式追踪系统,企业界的典型代表有谷歌的Dapper[3]、阿里巴巴的EagleEye[4],学术界的研究成果有MTracer[5],开源社区的代表性项目有Zipkin和SkyWalking。

然而这些系统存在以下几个方面的问题:①这些系统普遍庞大而复杂,过于重量级,对应用环境的依赖程度高,难以实现和使用;②对业务系统的侵入性太强,需要在业务代码中穿插大量追踪代码,破坏了业务代码的连贯性和整体性;③自成体系,难以与其他监控系统相结合。

为了解决上述问题,设计并实现了一个轻量级的分布式追踪系统。基于Javaagent和字节码编辑技术,做到了对业务系统的零侵入,并且遵循OpenTracing标准,能够方便地集成到其他运维监控系统。

1设计目标

对系统进行设计的时候,主要以如下目标作为出发点:

1)功能上,需要实现服务调用链、调用频次、响应时间、异常调用等观察指标的追踪。

(2)轻量级。对应用环境的依赖少,使用方便。

(3)对业务系统零侵入。不会对业务系统产生功能和性能上的影响,无需对业务系统代码做任何修改。

(4)分布式追踪作为运维内容的一部分,能够方便地集成到各种运维监控系统中。

(5)支持主流的微服务开发框架,包括ApacheDubbo和SpringCloud。

2追踪图

追踪图用于记录分布式调用链的拓扑关系,它本质上是一个有向图数据结构。一个追踪图对应一个完整的调用链,使用唯一的traceID表示。调用链由若干个追踪段segment组成,segment代表分布式系统中的一个应用进程,在图中用顶点表示。一个segment会生成若干个span,span代表最终的调用单元,比如调用某个RPC方法,在图中用有向边表示。表1列出了追踪图中各信息的ID和含义。

图1展示了一个实际追踪图的示例,描述了追踪图的创建过程。

(1)用户向Web应用发起一个请求,追踪程序首先为该请求创建一个追踪段(sengmentID=seg_w),如果traceID不存在,则会创建一个traceID。

(2)Web应用向Dubbo服务A发起请求时,会创建一个span(spanID=1),同理,Web应用向Dubbo服务B发起请求时,也会创建一个span(spanID=2)。在同一个段中,spanID是依次递增的,代表调用的先后顺序。

(3) Dubbo服务A收到请求后,追踪程序同样会创建一个追踪段(segmentID=seg_a),同时会接收到调用者传递过来的参数traceID、callerSegmentID和spanID。

(4)其他服务的调用也遵循上述步骤。最终,通过traceID、callerSegmentID、segmentID等数据,可以将调用信息关联起来,形成一个完整的追踪图。

3追踪代理

追踪代理用于获取追踪图相关的数据,在整个系统中承担数据采集的任务。追踪代理程序的设计和实现,主要基于Javaagent和字节码编辑两项技术,前者用于监听类的加载,拦截并获取类文件的信息,后者用于编辑class文件,在其中加入分布式追踪相关的代码。图2展示了追踪代理程序的工作原理。

在类加载时,JVM会触发ClassFileLoadHook事件,这是一个JVMTI事件,被触发后会调用ClassFileTransformer接口,该接口是一个class文件转换器,需要实现接口中的transform()方法,在该方法中对传入的Java字节码进行重新编辑。追踪相关的功能逻辑均在transform()方法中实现,包括匹配需要监控的Java类和方法,获取并记录traceID、segmentID、spanID等追踪图的数据,并把这些数据发送到监控中心。

追踪代理程序最终编译成一个tracing-agent.jar文件,放入到各个应用和服务程序中,没有其他依赖,非常轻量级。应用和服务的业务代码,不需要做任何修改,即追踪代理对应用层的代码是零侵入的。

4系统实现

4.1系统架构

如图3所示,整个追踪系统采用分布式架构,主要由追踪代理和监控中心两部分组成。追踪代理通过gRPC,往监控中心发送探测到的追踪数据,数据格式遵循OpenTracing标准。监控中心接收到这些追踪数据后,负责数据的解析、存储以及可视化展示。

追踪代理和监控中心完全解耦,这样便于把追踪功能集成到各种运维监控系统之中。本文的监控中心基于Galileo系统实现。Galileo是一个专门针对物联网系统的自动化运维监控系统[6],本文把分布式追踪功能作为其中的一个功能模块对其进行扩展开发。

4.2关键技术

除了前述的Javaagent和字节码编辑技术以外,还有以下几个关键技术点,对系统的实现至关重要,决定了系统的可擴展性和并发性能。

(1) OpenTracing

OpenTracing是一套通用的、标准的追踪数据定义接口,规范了追踪数据的数据模型和实现流程。这套规范由三个方面组成:标准化的span管理API;标准化的追踪数据的跨进程传播API;标准化的active span管理API。实现这套规范意味着数据采集方只需专注于如何追踪系统的运行流程,而无需关注追踪数据的定义和格式。诸如Galileo这样的运维监控平台可以根据OpenTracing标准来解析接收到的数据,方便系统之间的集成。

(2)gRPC

追踪代理与监控中心之间的网络通讯,采用gRPC技术。gRPC是一个高效的RPC框架,基于HTTP/2.0协议,传输的是Protobuf格式的数据。与传统的HTTP/1.1相比,它使用了TCP长连接和多路复用技术,具有更好的性能表现,相同并发量下消耗更少的资源。另外,gRPCClient向gRPCServer发送数据的时候,使用独立的线程池异步发送,不影响业务代码的执行。

5结束语

针对微服务调用的可观察性,本文没计并实现了一个轻量级的分布式追踪系统,实现了服务的调用链、调用频次、响应时间、异常调用等观察指标的追踪,并应用到多个正式商用的物联网项目,取得了不错的效果。下一步的研究工作,是计划把分布式追踪扩展到数据库调用方面,包括MySQL、MongoDB、Redis等数据库的连接池调用的追踪。

参考文献(References):

[1]Chris Richardson. Microservices Patterns: With Examplesin Java[M]. Manning Publications, 2019.

[2]Yuri Shkuro. Mastering Distributed Tracing[M]. PacktPublishing,2019.

[3] B. H. Sigelman, L. A. Barroso, M. Burrows, P.Stephenson, M. Plakal, et al.Dapper, a Large-ScaleDistributed Systems Tracing Infrastructure[R]. GoogleTechnical Report,Googlelnc, 20 10.

[4]钟华,企业IT架构转型之道:阿里巴巴中台战略思想与架构实战[M].机械工业出版社,2017.

[5]J. Zhou,Z.Chen,H.Mi,J.Wang. MTracer:A Trace-Oriented Monitoring Framework for Medium-ScaleDistributed Systems[Al. IEEE 8th International Sympo-sium on Service Oriented System Engineering[C],2014:266-271

[6]温小斌.物联网系统自动化监控的设计与实现[J].计算机时代,2019.6:34-36

收稿日期:2020-05-14

作者简介:温小斌(1981-),男,江西赣州人,硕士,主要研究方向:物联网、分布式系统。

猜你喜欢

微服务运维监控
The Great Barrier Reef shows coral comeback
运维技术研发决策中ITSS运维成熟度模型应用初探
你被监控了吗?
Zabbix在ATS系统集中监控中的应用
微信公众平台在医院图书馆的应用现状调查
基于微信企业号的校园移动服务
微服务视角下高职图书馆数字资源使用分析
从单一模式系统架构往微服务架构迁移转化技术研究
基于ITIL的运维管理创新实践浅析
PDCA循环法在多重耐药菌感染监控中的应用