分布式链路追踪-skywalking

一、分布式调用链

随着业务的高速发展,服务之间的调用关系愈加复杂

线上每一个请求会经过多个业务系统,并产生对各种缓存或者DB 的访问,业务流会经过很多个微服务的处理和传递。

问题:

• —次请求的流量从哪个服务而来?最终落到了哪个服务中去?

• 为什么这个请求这么慢?到底哪个环节出了问题?

• 这个操作需要依赖哪些东西?是数据库还是消息队列?

• Redis挂了,哪些业务受影响?

所以如何理清他们并跟踪它们之间的调用关系就显得比较关键

二、什么是调用链

这个时候我们希望有—套这样的系统:

• 故障定位:调用链路跟踪,一次请求的逻辑轨迹可以完整清晰的展示出来。

• 性能分析:调用链的各个环节分别添加调用耗时,可以分析出系统的性能瓶颈。

• 数据分析:可以得到请求的行为路径,汇总分析应用在很多业务场景

同时我们还希望它具备:

• 低消耗性

• 低侵入性

• 时效性

• 决策支持

• 数据可视化

三、调用链选型

zipkin:是Twitter 开源的调用链分析工具,目前基于 springcloud sleuth 得到了广泛的使用,使用部署简单。

Pinpoint:是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。

SkyWalking:是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache化器。

CAT:是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监

调用链-基本原理和接入方式

调用链选型

数据存储支持对比

社区活跃度

性能分析

模拟了三种并发用户:500,750,1000。使用jmeter测试,每个线程发送30个请求,设置思考时间为10ms,使用的采样率为1,即100%组合起来,一共有12种。下面看下汇总表:

四、skywalking支持的rpc框架

  • Dubbo

  • Dubbox

  • Apache Dubbo

  • Motan

  • gRPC

  • Apache ServiceComb Java Chassis

  • SOFARPC

五、skywalking 总体架构

  • Metric的特点是,它是可累加的:他们具有原子性,每个都是一个逻辑计量单元,或者一个时间

段内的柱状图。 例如:队列的当前深度可以被定义为一个计量单元,在写入或读取时被更新统

计; 输入HTTP请求的数量可以被定义为一个计数器,用于简单累加; 请求的执行时间可以被定义为一个柱状图,在指定时间片上更新和统计汇总。

  • Tracing的最大特点就是,它在单次请求的范围内,处理信息。 任何的数据、元数据信息都被绑定到系统中的单个事务上。 例如:一次调用远程服务的RPC执行过程;一次实际的SQL查询语句;一次HTTP请求的业务性ID。

总结,Metric主要用来进行数据的统计,比如HTTP请求数的计算。Tracing主要包含了某一次请求的链路数据。

1.探针(agent)负责进行数据的收集,包含了Tracing和Metrics的数据,agent会被安装到服务所在的服务器上,以方便数据的获取。

2. 可观测性分析平台OAP(Observability Analysis Platform),接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如Elasticsearch、MySQL数据库、H2数据库等。同时OAP还使用查询引擎(Query Core)提供HTTP查询接口。

3. Skywalking提供单独的UI进行数据的查看,此时UI会调用OAP提供的接口,获取对应的数据然后进行展示

六、告警功能

Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应

时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完

成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告

警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。

skywalking默认的告警规则

1. 最近3分钟内服务的平均响应时间超过1秒

2. 最近2分钟服务成功率低于80%

3. 最近3分钟90%服务响应时间超过1秒

4. 最近2分钟内服务实例的平均响应时间超过1秒

七、java agent

java agent本质上可以理解为一个插件,该插件就是一个精心提供的jar包,这个jar包通过JVMTI(JVM Tool Interface)完成加载,最终借助JPLISAgent(Java Programming Language Instrumentation Services Agent)完成对目标代码的修改。

java agent技术的主要功能如下:

1、可以在加载java文件之前做拦截把字节码做修改

2、可以在运行期将已经加载的类的字节码做变更

3、还有其他的一些小众的功能

4、获取所有已经被加载过的类

5、获取所有已经被初始化过了的类

6、获取某个对象的大小

7、将某个jar加入到bootstrapclasspath里作为高优先级被bootstrapClassloader加载

8、将某个jar加入到classpath里供AppClassloard去加载

9、设置某些native方法的前缀,主要在查找native方法的时候做规则匹配

通过java agent技术进行类的字节码修改最主要使用的就是Java Instrumentation API。

java agent 启动时修改

启动时修改主要是在jvm启动时,执行native函数的Agent_OnLoad方法,在方法执行时,执行如下步骤:

1、创建InstrumentationImpl对象

2、监听ClassFileLoadHook事件

3、调用InstrumentationImpl的loadClassAndCallPremain方法,在这个方法里会去调用javaagent里MANIFEST.MF里指定的Premain-Class类的premain方法

java agent 运行时修改

运行时修改主要是通过jvm的attach机制来请求目标jvm加载对应的agent,执行native函数的Agent_OnAttach方法,在方法执行时,执行如下步骤:

1、创建InstrumentationImpl对象

2、监听ClassFileLoadHook事件

3、调用InstrumentationImpl的loadClassAndCallAgentmain方法,在这个方法里会去调用javaagent里MANIFEST.MF里指定的Agentmain-Class类的agentmain方法

如何使用java agent?

使用 java agent 需要几个步骤:

1. 定义一个 MANIFEST.MF 文件,必须包含 Premain-Class 选项,通常也会加入Can-Redefine-Classes 和 Can-Retransform-Classes 选项。

2. 创建一个Premain-Class 指定的类,类中包含 premain 方法,方法逻辑由用户自己确定。

3. 将 premain 的类和 MANIFEST.MF 文件打成 jar 包。

4. 使用参数 -javaagent: jar包路径 启动要代理的方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code.song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值