本文已参与腾源会发起的「开源摘星计划」
网上看到许多解析skywalking的源码读解,本人很受用。但都是集中在对java agent插件的原理的讲解。而我工作中需要模拟skywalking后台进行链路数据处理。这方面就是空白,今天我就来尝试读解skywalking后台源码,也就是skywalking oap,并对其进行拆解利用。形成自己的链路数据采集/存储/展示能力。通过本文将展示skywalking8.7.0的后台数据处理过程,以及怎样形成自己的链路数据处理能力。
总体来看,我们首先利用skyalking的java agent采集链路信息,保持原装不动。采集来的信息由kafka进行缓存。Skywalking oap读取kafka并存储到elasticsearch7中。由于Skywalking体系中,采集了许多agent的管理信息/metrics/健康检查等,所以需要一套原始的Skywalking oap运行管理多个agent。这是原始的处理流程。
而我们自己的模拟链路采集应用,则是消费kafka中skywalking-segments主题中的链路数据。Skywalking oap同时也会去消费,互不相干。
- 下载源码
首先需要下载版本8.7.0的src。下载地址:Index of /dist/skywalking
选择apache-skywalking-apm-8.7.0-src.tgz。用idea打开。准备编译。
- 编译
编译前先需要注释checkstyle以及修改npm代理。以免编译过程报错。
1,注释checkstyle
找到根模块的pom文件,找到checkstyle的<plugins>删除该插件。
2,修改npm代理
找到apm-webapp模块的pom文件,修改npm的代理地址为:
<arguments>install --registry=https://registry.npm.taobao.org</arguments>
最后在“终端”中输入:mvn install "-Dmaven.test.skip=true",在漫长的编译后,就可以生成相应的jar包。(12代i9笔记本大概需要10分钟左右)
另外可以调大idea的内存占用如果需要。
- Protobuf
- 用idea新建一个项目。先将模块skywalking项目中的apm-protocol中proto目录复制到自己项目中的main目录下:
下面图片是skywalking8.7.0的文件位置:
在pom中添加protobuf的编译插件:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>${protobuf-maven-plugin.version}</version>
<configuration>
<!--
The version of protoc must match protobuf-java. If you don't depend on
protobuf-java directly, you will be transitively depending on the
protobuf-java version that grpc depends on.
-->
<protocArtifact>
com.google.protobuf:protoc:${com.google.protobuf.protoc.version}:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>
io.grpc:protoc-gen-grpc-java:${protoc-gen-grpc-java.plugin.version}:exe:${os.detected.classifier}
</pluginArtifact>
</configuration>
<executions>
<execution>
<id>grpc-build</id>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
然后编译protobuf,编译方法是:
执行protobuf:compile,执行成功后就会在taget目录下生成java代码,这些代码是protobuf
数据结构的java类。并需要将这些java源文件标记为java源文件。标记方法鼠标右键选择图中java目录,选择菜单:将目标标记为->源代码根目录。这样在其他源文件就可以引用这些类。