轻松玩转全链路监控

8.jpeg

作者:山猎,阿里云解决方案架构师

前言

随着分布式技术的发展与演进,微服务技术成为了大型分布式IT架构的必然选择。从本质上来讲,微服务是一种架构风格,将一个大型的系统拆分为多个拥有独立生命周期的应用,应用之间采用轻量级的通信机制进行通信。这些应用都是围绕具体业务进行构建,可以独立部署、独立迭代,也可能根据业务负载独立的水平扩展。微服务思想以及相关的技术为IT架构的发展带来了一系列深刻的变革。
微服务技术让IT系统变得更敏捷、更健壮、更高性能的同时,也给带来了架构复杂度的提升,给应用监控带来了前所未有的挑战。在微服务时代,由于服务的拆分,单个用户请求会经过多个微服务应用,形成复杂的调用链路,使传统的依赖于单机业务日志的监控手段无从下手,这就需要建立全新的监控机制,帮助开发者全面洞察系统运行状态,并在系统遇到异常的时候快速的定位和解决问题。

什么是全链路监控?

在分布式微服务架构中,系统为了接收并处理一个前端用户请求,需要让多个微服务应用协同工作,其中的每一个微服务应用都可以用不同的编程语言构建,由不同的团队开发,并可以通过多个对等的应用实例实现水平扩展,甚至分布在横跨多个数据中心的数千台服务器上。单个用户请求会引发不同应用之间产生一串顺序性的调用关系,链路的概念就此诞生。
image.png
随着业务规模的增长,不但来自于前端用户的请求频度会增加,链路也变得更长,这也代表着应用之间的调用关系变得越来越复杂。为了提升微服务系统在复杂链路下的健壮性和稳定性,有3个关键诉求需要我们去解决:
**1 . 如何梳理整套系统的调用关系,并评判应用上下游依赖的合理性?
2 . 如何了解每一个应用的性能指标,并对系统容量进行合理的规划?
3 . 当系统出现故障或异常的时候,如何第一时间发现问题、定位问题、解决问题?**
这3个关键诉求的核心挑战,都来源于应用之间复杂的链路。如果有一套成熟易用的机制,对每一条链路的行为进行记录,并进行深入的分析,提取出有价值的参考数据,就能让这些难题迎刃而解,这个重要的机制就是全链路监控。

标准与规范

十年前,Google成为了分布式系统链路追踪服务的先行者,并通过《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》这篇著名论文阐述了如何在超大规模系统上建设低损耗(low overhead)、应用级透明(application-level transparency)、大范围部署(ubiquitous deployment)的链路追踪服务。

image.png
Dapper阐述了对分布式系统进行链路追踪的技术细节,包括数据表示、埋点、传递、收集、存储与展示等方面,并提出了跟踪树、Span、Trace、Annotation等重要概念,为全链路监控提供了理论指导。
image.png
在Dapper的启发下,业界诞生了很多用于分布式链路追踪的开源组件,为了保持对链路中每一个环节的记录与匹配,不仅需要在应用内部对跟踪信息进行传递,还需要让跟踪信息跨越不同的应用以及不同的分布式组件。这需要制定一套统一的标准,让微服务体系中的所有应用遵循这套标准来实现跟踪信息的描述和传递,这套标准就是OpenTracing。OpenTracing抽象出一套与编程语言以及业务逻辑无关的接口,对链路追踪领域各类元素的统一管理,从而实现完整的全链路监控。
本文不会深入介绍Dapper和OpenTracing的原理以及技术细节。我们只需要知道,优秀的全链路监控组件会尽可能的遵循OpenTracing标准,以获得更好的通用性以及扩展性。

可选方案

全链路监控组件如何获得链路相关的信息呢?最简单的方式是让开发者在业务代码中手工埋点,生成符合OpenTracing标准的链路信息,并汇入全链路监控组件。但手工埋点的方式要求开发者主动配合,并在业务代码中嵌入大量非业务逻辑。这样的方式是极为脆弱的,开发者稍有疏忽就会导致链路信息丢失,甚至影响到正常的业务逻辑。所以非手工埋点的自动链路信息采集,成为了业界的主流,其中包括两种实现方式:
**1 . SDK方式: 通过引入链路追踪SDK自动生成链路数据,并自动上报。对于底层框架没有公开API的情况,监控逻辑的注入会比较复杂,有可能需要开发者针对具体的底层框架预先做好适配工作。
2 . 探针方式: 探针方式不需要在代码编译前引入SDK,而是在应用运行的过程中,通过一个Agent动态的拦截底层框架的行为,从而自动注入监控逻辑**。像Java这样的编程语言可以通过字节码增强技术实现探针方式的链路信息采集。这是一种最开发者最友好的方式,不需要任何代码层面的改动,但并不是每一种编程语言都能提供探针机制,因此SDK方式也被很多全链路监控组件采用。

不管是SDK方式还是探针方式,非手工埋点形式的链路信息采集都依赖于链路追踪组件对于底层框架的识别。这些底层框架包含的领域非常广,其中包含应用对外提供服务所需要的框架,应用进程内部的通讯框架,应用之间相互访问所需要的框架,应用访问外部系统所需要的框架等等。比如在Java体系中,用于提供HTTP服务的Tomcat、Jetty,用于进程内部通讯的RxJava,用于微服务应用之间相互调用的Feign,用于访问外部系统的MyBatis、MySQL JDBC、HTTPClient,都属于这个范畴。对于多种编程语言以及种类繁多的底层框架的适配,是一项浩大的工程,一个全链路监控方案能够适配的底层框架越多,它的能力就越强大。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值