深度剖析SkyWalking分布式链路追踪
源码分析
skywalking分布式链路追踪流程大致如下:
1.Agent 采集数据
2.Agent 发送数据到Collector
3.Collector 接收数据
4.Collector 将接收的数据储存到持久层
代码分析
我们从apm-sniffer工程开始出发(sniffer既嗅探器、探针的意思)
- 以SkyWalkingAgent类中Premain进行程序的入口同时依赖于pom文件
– 其中 Transformer指定生成Jar包, Premain-Class 指定最后生成的类名称叫什么点进去可以看到这里是个相互依赖的关系=>
– Can-Redefine-Classes是否能重新变形改变这个类意义在于改变修改后的字节码
什么是字节码?
Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。
探针agent==>oapService代码执行过程
agent源码步骤解析
- 1.初始化Agent配置 流程
–当程序入口接收到参数为; 入参参数agentArgs 代表-javaagent://.jar= agentArgs 多个参数声明v1=k,v2=k1,v3=k2 split进行分割
传入到permain入口 进行第一步
- 加在插件寻找plugin
– 引用插件
- 2.字节码增强工具
- 3.将收集的数据传到oap服务
–完成并注册关闭钩子
什么是钩子
钩子方法源于设计模式中模板方法(Template Method)模式,模板方法模式的概念为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。其主要分为两大类:模版方法和基本方法,而基本方法又分为:抽象方法(Abstract Method),具体方法(Concrete Method),钩子方法(Hook Method)。
————————————————
钩子
监控接口相应时间
- 通过新建任务选择指定接口端点、进行接口相应速度的排查,指标:开始时间,服务名,相应速率
- 点击分析可查看接口的相应时间就知道具体在哪里时间过长
监控服务的相应数据__自定义链路追踪
1. 在想要监控的端点服务下引入skywalking
依赖
<!--自定义链路追踪-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.4.0</version>
</dependency>
2.在具体服务业务层引入监控注解
@Trace
@Tags({@Tag(key=“getAll”,value = “returnedObj”),
@Tag(key = “getAll”,value = “arg[0]”)})
其中key为固定,方法中有入参则value指定参数位数,无入参则默认returnedObj