服务器采集数据源码,Skywalking数据采集与收集源码分析

skywalking的架构图如下:

319cfa4a9b6d06872664e47452d479d9.png

Skywalking的agent负责采集数据,发送到collector,collector聚合,并且存储这些数据,且提供了一个简洁使用的UI端,可共我们查看监控的指标。

下面我们来开始分析skywalking的源码。

下载源码并构建

因为skywalking为了实现高性能通信,采用的是grpc的方式来实现服务器与客户端的数据传输的,所以导入之后我们需要稍微做一些事情,我们可以参考docs/en/guides/How-to-build.md这篇文档来构建。

打包构建

我们可以在github上面将skywalking源码fork一份,然后下载到自己的本地。

// 直接

git clone --recurse-submodules https://github.com/apache/skywalking.git

// 或者

git clone https://github.com/apache/skywalking.git

cd skywalking/

git submodule init

git submodule update

执行命令:

./mvnw clean package -DskipTests

最终打好的包在dist目录下面

在IDEA里面构建源码

用IDEA打开skywalking项目(作为maven项目导入)

f2e9384f8e675e4c1d80ece663c3dded.png

然后在skywalking所在目录命令行运行脚本去编译构建(因为skywalking用到了grpc):

./mvnw compile -Dmaven.test.skip=false

然后查看设置生成的源代码(主要是看potobuf文件编译生成的源代码)

apm-protocol/apm-network/target/generated-sources/protobuf选中这个目录下面的grpc-java和java,然后右键选择Mark Directory As-->Generated Sources Root如下图所示

da11604aa4ba35feb984c40469898316.png

oap-server/server-core/target/generated-sources/protobuf目录的grpc-java和java文件夹Mark Directory As-->Generated Sources Root`

oap-server/server-receiver-plugin/receiver-proto/target/generated-sources/protobuf目录的grpc-java和java文件夹Mark Directory As-->Generated Sources Root`

oap-server/exporter/target/generated-sources/protobuf目录的grpc-java和java文件夹Mark Directory As-->Generated Sources Root`

oap-server/server-configuration/grpc-configuration-sync/target/generated-sources/protobuf目录的grpc-java和java文件夹Mark Directory As-->Generated Sources Root`

oap-server/oal-grammar/target/generated-sources目录的grpc-java和java文件夹Mark Directory As-->Generated Sources Root`

在Eclipse里面构建源码

1、按照maven项目导入到eclipse中

2、添加一下内容到skywalking/pom.xml中

org.codehaus.mojo

build-helper-maven-plugin

1.8

add-source

generate-sources

add-source

src/java/main

apm-protocol/apm-network/target/generated-sources/protobuf

apm-collector/apm-collector-remote/collector-remote-grpc-provider/target/generated-sources/protobuf

3、添加如下内容,使得eclipse的M2e插件能够支持扩展配置

org.eclipse.m2e

lifecycle-mapping

1.0.0

org.codehaus.mojo

build-helper-maven-plugin

[1.8,)

add-source

4、apm-collector-remote/collector-remote-grpc-provider/pom.xml文件中添加如下依赖

com.google.guava

guava

24.0-jre

5、执行命令

./mvnw compile -Dmaven.test.skip=true

6、执行命令

先执行maven clean,然后maven update

7、执行命令:

./mvnw compile

8、刷新项目

源码分析

skywalking的分布式链路追踪流程大致如下:

Agent采集数据

Agent发送数据到Collector

Collector接收数据

Collector将接收的数据存储到持久层

我们这里主要探探Agent采集Java类系统的数据比如spring等,以spring cloud的一个简易的分布式系统来讲:

00de5a3f371d581fddf4d60b339d60f5.png

这是一个建议的订单系统,有Eureka,Order,Product,Stock,当下订单的时候,order会调用product,product又会调用stock。

我们从apm-sniffer工程开始出发(sniffer即嗅探器、探针的意思)

320d523c8d9e1de59ed8ff97de86e556.png

apm-agent工程

我们看到这个工程只有一个类

org.apache.skywalking.apm.agent.SkyWalkingAgent

这个类有一个方法:

/**

* 主入口,使用byte-buddy来实现来增强插件里面定义的所有的类。

*/

public static void premain(String agentArgs, Instrumentation instrumentation) throws PluginException, IOException {

}

Agent采集数据

我们这里主要介绍JVM的数据和spring相关的数据

JVM的数据

我们看到在apm-agent-core里面有类:org.apache.skywalking.apm.agent.core.jvm.JVMService

这个类实现了BootService和java.lang.Runnable接口,而这个类是怎么执行里面的一些方法的呢?在apm-agent-core这个工程的/src/main/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService文件里面有很多类的全限定名信息:

org.apache.skywalking.apm.agent.core.remote.TraceSegmentServiceClient

org.apache.skywalking.apm.agent.core.context.ContextManager

org.apache.skywalking.apm.agent.core.sampling.SamplingService

org.apache.skywalking.apm.agent.core.remote.GRPCChannelManager

org.apache.skywalking.apm.agent.core.jvm.JVMService

org.apache.skywalking.apm.agent.core.remote.ServiceAndEndpointRegisterClient

org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService

org.apache.skywalking.apm.agent.core.commands.CommandService

org.apache.skywalking.apm.agent.core.commands.CommandExecutorService

org.apache.skywalking.apm.agent.core.context.OperationNameFormatService

而这每个类都实现了BootService这个借口,BootService是所有当插件机制开始起作用时需要启动的远程交换需要实现的接口。BootService启动的时候将调用boot方法。

org.apache.skywalking.apm.agent.core.boot.ServiceManager这个类里面会将所有实现BootService的类的实例都执行一遍。

JVMService类实例化后执行的boot方法内容如下

@Override

public void boot() throws Throwable {

// 创建一个持续收集(生产)指标的单一线程的线程池,这个线程池会定期(每秒)执行,而且执行的是JVMService的run方法

collectMetricFuture = Executors

.newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("JVMService-produce"))

.scheduleAtFixedRate(new RunnableWithExceptionProtection(this, new RunnableWithExceptionProtection.CallbackWhenException() {

@Override public void handle(Throwable t) {

logger.error("JVMService produces metrics failure.", t);

}

}), 0, 1, TimeUnit.SECONDS);

// 创建一个持续发送(消费)数据的单一线程的线程池,这个线程池会定期(每秒)执行,而且执行的是JVMService的内部类Sender的run方法

sendMetricFuture = Executors

.newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("JVMService-consume"))

.scheduleAtFixedRate(new RunnableWithExceptionProtection(sender, new RunnableWithExceptionProtection.CallbackWhenException() {

@Override public void handle(Throwable t) {

logger.error("JVMService consumes and upload failure.", t);

}

}

), 0, 1, TimeUnit.SECONDS);

}

JVMService类的run方法:

public void run() {

if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue()

&& RemoteDownstreamConfig.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SkyWalking是一个开源的分布式系统跟踪解决方案,它可以帮助开发者快速地识别和解决分布式系统中的问题。SkyWalking的核心功能是跟踪分布式调用,它通过在每个调用中添加唯一的标识符来跟踪调用链路,并且收集每个调用的性能指标。SkyWalking提供了一个可扩展的插件机制,可以轻松地集成各种框架和组件,例如Spring、Dubbo、RocketMQ等。 SkyWalking源码结构比较清晰,主要分为以下几个部分: 1. apm-commons:公共模块,包含一些公共工具类和数据结构。 2. apm-protocol:SkyWalking的协议模块,定义了SkyWalking数据上报协议和数据查询协议。 3. apm-sniffer:抓取器模块,用于在应用程序中注入SkyWalking的Agent,以便收集应用程序的性能指标。 4. apm-collector:收集器模块,用于接收来自Agent的数据,并将其存储到数据库中。 5. apm-webapp:Web应用程序模块,提供了一个Web界面,用于查询和分析SkyWalking数据。 6. plugins:插件模块,包含了各种插件,例如Spring插件、Dubbo插件等。 在SkyWalking源码中,最核心的部分是apm-sniffer模块和apm-collector模块。apm-sniffer模块主要负责在应用程序中注入SkyWalking的Agent,以便收集应用程序的性能指标,并将这些数据发送给apm-collector模块。apm-collector模块则负责接收来自Agent的数据,并将其存储到数据库中。 如果要深入了解SkyWalking源码,可以从这两个模块入手,了解它们是如何实现的,以及它们之间是如何通信的。此外,还可以研究SkyWalking的插件机制,了解如何编写自己的插件,并将其集成到SkyWalking中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值