第08讲:搭建 SkyWalking 源码环境,开启征途

news2024/11/27 5:33:13

搭建 SkyWalking 源码环境

  • 下载 SkyWalking 源码

执行 git clone 命令从 GitHub下载 SkyWalking 源码,如下所示 :


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


  • 切换分支

等待 clone 完成之后,我们通过命令行窗口进入 SkyWalking 源码根目录,执行如下命令:


git checkout -b 6.2.0 v6.2.0


     切换到 v6.2.0 tag 的源码,后续源码分析过程都是基于 6.2.0 版本进行分析的。

  • 导入 IDEA

在 IDEA 中点击“Import Project”,选择 SkyWalking 源码目录导入 IDEA 中。SkyWalking 是一个 Maven,在导入过程中会下载相关的依赖 jar 包,过程可能会比较慢,需要你耐心等待。

  • 更新 submodule

全部 Maven 依赖下载完成后,在 SkyWalking 源码根目录中执行如下两条命令,更新 submodule:


git submodule init
git submodule update


  • 打包

上述操作执行完毕之后,执行如下命令,开始打包:


mvn clean package -DskipTests -Dcheckstyle.skip


  • 标记 Generated Source Code 目录

在打包过程中,会自动生成一些代码,需要我们将其目录设置为 Generated Source Codes,这样 IDEA 才能识别这些代码,生成代码主要来源于以下两种方式:

  • SkyWalking Agent 与后端 OAP 之间通信用了 gRPC,其中的 proto 文件会生成一些 Java 代码。

  • SkyWalking OAP 中定义了 OAL 语言,打包过程中会生成一些 Java 代码。

具体的标记方式如下下图所示:



需要标记的目录有:

    • apm-protocol/apm-network/target/generated-sources/protobuf 路径下的 grpc-java 目录和 java 目录。

    • oap-server/server-core/target/generated-sources/protobuf 路径下的 grpc-java 目录和 java 目录。

    • oap-server/server-receiver-plugin/receiver-proto/target/generated-sources/protobuf 路径下的 grpc-java 目录和 java 目录。

    • oap-server/exporter/target/generated-sources/protobuf 路径下的 grpc-java 目录和 java 目录。

    • oap-server/server-configuration/grpc-configuration-sync/target/generated-sources/protobuf 路径下的 grpc-java 目录和 java 目录。

    • /Users/xxx/SW/skywalking/oap-server/generated-analysis/target/generated-sources 路径下的 oal 目录。

  • 安装 ElasticSearch

前文已经完成了 ElasticSearch 的安装,这里不再展开。

  • 启动 OAP

在 IDEA 中,找到 oap-server 模块中 OAPServerStartUp 这个类,右键执行 main() 方法即可。启动过程中无异常日志,并看到如下信息,即表示 OAP 启动成功:


... ... // 省略其他日志
Server started, host 0.0.0.0 listening on 11800


  • 启动 SkyWalking Rocketbot

在 IDEA 中,找到 apm-webapp 模块,这是 Spring Boot 的 Web项目,执行 ApplicationStartUp  中的 main() 方法。正常启动之后,访问 localhost:8080,看到 SkyWalking Rocketbot 的 UI 界面即为启动成功。

  • 启动 demo-webapp 和 demo-provider

为了验证后端的 OAP 以及前面打包生成的 SkyWalking Agent 是否可用,这里需要启动 demo-webapp 和 demo-provider 两个示例 demo。

  • 首先将整个 skywalking-demo 项目移动到与 SkyWalking 源码项目同一级目录,并导入 IDEA 中,如下图所示:



  • 然后修改 demo-provider 和 demo-webapp 模块的 VM options 参数,将其中 -javaagent: 命令指向的 skywalking-agent.jar 换成 SkyWalking 源码项目中的 skywalking-agent.jar,具体路径如下所示:


SkyWalking源码目录/skywalking-agent/skywalking-agent.jar


  • 其他配置无需修改,依次启动 Zookeeper、demo-provider、demo-webapp。启动成功后访问 http://localhost:8000/hello/xxx。

  • 待请求正常响应后,在上一步启动的 SkyWalking Rocketbot 中可以查询到相应的 Trace 信息以及两个项目相关的 Metrics 监控信息,即表示整个源码环境搭建完成。


  • Debug SkyWalking 源码

按照上述方式成功搭建 SkyWalking 源码环境之后,我们尝试 Debug SkyWalking 源码。

  • 首先在 SkyWalking 源码项目中找到 SkyWalkingAgent.java 这个类(位于 apm-sniffer 模块下的 apm-agent 子模块中),该类是 SkyWalking Agent 的入口,提供了 premain() 方法实现,我们可以在其中打一个断点,然后以 Debug 模式重启 demo-webapp,此时 demo-webapp 会停在该断点处,如下图所示:


SkyWalking源码结构

完成 SkyWalking 源码环境的搭建以及 Debug 的测试之后,我们回到 SkyWalking 源码项目,简单介绍一下 SkyWalking 源码中各模块的基本功能。


SkyWalking 源码的整体结构如下图所示:



  • apm-application-toolkit 模块:SkyWalking 提供给用户调用的工具箱。该模块提供了对 log4j、log4j2、logback 等常见日志框架的接入接口,提供了 @Trace 注解等。apm-application-toolkit 模块类似于暴露 API 定义,对应的处理逻辑在 apm-sniffer/apm-toolkit-activation 模块中实现,如下图所示:



  • apm-commons 模块:SkyWalking 的公共组件和工具类。如下图所示,其中包含两个子模块,apm-datacarrier 模块提供了一个生产者-消费者模式的缓存组件(DataCarrier),无论是在 Agent 端还是 OAP 端都依赖该组件。apm-util 模块则提供了一些常用的工具类,例如,字符串处理工具类(StringUtil)、占位符处理的工具类(PropertyPlaceholderHelper、PlaceholderConfigurerSupport)等等。



  • apache-skywalking-apm 目录SkyWalking 打包后使用的命令文件都在此目录中,例如,前文启动 OAP 和 SkyWalking Rocketbot 使用的 startup.sh 文件。

  • apm-protocol 模块:该模块中只有一个 apm-network 模块,我们需要关注的是其中定义的 .proto 文件,定义 Agent 与后端 OAP 使用 gRPC 交互时的协议。

  • apm-sniffer 模块:apm-protocol 模块中有 4 个子模块,如下图所示:



  • apm-agent 模块:其中包含了刚才使用的 SkyWalkingAgent 这个类,是整个 Agent 的入口。

  • apm-agent-core 模块:SkyWalking Agent 的核心实现都在该模块中,也是本课程第二部分重点分析的模块之一。

  • apm-sdk-plugin 模块:SkyWalking Agent 使用了微内核+插件的架构,该模块下包含了 SkyWalking Agent 的全部插件,如下图所示:



  • apm-toolkit-activation 模块:apm-application-toolkit 模块的具体实现,不再赘述。

  • apm-webapp 模块:SkyWalking Rocketbot 对应的后端。

  • oap-server 模块:SkyWalking OAP 的全部实现都在 oap-server 模块,其中包含了多个子模块,如下图所示:



  • exporter 模块:负责导出数据。

  • generate-tool、generate-tool-grammar、generated-analysis 三个模块:与 SkyWalking 自定义的 OAL 语言有关,后面的课时将对 OAL 进行详细介绍。

  • server-alarm-plugin 模块:负责实现 SkyWalking 的告警功能。

  • server-cluster-pulgin 模块:负责 OAP 的集群信息管理,其中提供了接入多种第三方组件的相关插件,如下图所示:



  • server-configuration 模块:负责管理 OAP 的配置信息,也提供了接入多种配置管理组件的相关插件,如下图所示:



  • server-core模块:SkyWalking OAP 的核心实现都在该模块中。

  • server-library 模块:OAP 以及 OAP 各个插件依赖的公共模块,其中提供了双队列 Buffer、请求远端的 Client 等工具类,这些模块都是对立于 SkyWalking OAP 体系之外的类库,我们可以直接拿走使用。

  • server-query-plugin 模块:SkyWalking Rocketbot 发送的请求首先由该模块接收处理,目前该模块只支持 GraphQL 查询。

  • server-receiver-plugin 模块:SkyWalking Agent 发送来的 Metrics、Trace 以及 Register 等写入请求都是首先由该模块接收处理的,不仅如此,该模块还提供了多种接收其他格式写入请求的插件,如下图所示:



  • server-starter 模块:OAP 服务启动的入口。

  • server-storage-plugin 模块:OAP 服务底层可以使用多种存储来保存 Metrics 数据以及Trace 数据,该模块中包含了接入相关存储的插件,如下图所示:



  • skywalking-agent 目录:SkyWalking Agent 编译后生成的 jar 包都会放到该目录中。

  • skywalking-ui 目录:SkyWalking Rocketbot 的前端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM 三大框架原理、核心技术,运行流程讲解

作者:arrows 来源:https://www.cnblogs.com/arrows/p/10537733.html 一、Spring部分 1、 Spring的运行流程 第一步:加载配置文件ApplicationContext ac new ClassPathXmlApplicationContext(“beans.xml”); ,ApplicationContext接口,它由…

存储卡目录变成未知文件?这些技巧能让你恢复数据!

当存储卡的目录变成未知文件时,我们无法直接访问存储卡中的数据。但是,这并不意味着这些数据永远无法恢复。以下是几种可能恢复存储卡数据的方法: 使用数据恢复软件。从互联网上下载并安装专业的数据恢复软件这些软件可以扫描存储卡&#xf…

分布式接口幂等性设计实现

面对分布式架构和微服务复杂的系统架构和网络超时服务器异常等带来的系统稳定性问题,分布式接口的幂等性设计显得尤为重要。本文简要介绍了几种分布式接口幂等性设计实现,包括Token去重机制、乐观锁机制、数据库主键和状态机实现等,以加深理解…

面板安全增强,网站支持反向代理设置,1Panel开源面板v1.2.0发布

2023年5月15日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.2.0版本。 在这一版本中,1Panel着重增强了安全方面的功能,包括安全入口访问、面板SSL设置、网站密码访问等,同时网站新增支持反向代理设置,并带…

JVM学习(三)

1. JAVA 四中引用类型 1.1. 强引用 在 Java 中最常见的就是强引用, 把一个对象赋给一个引用变量,这个引用变量就是一个强引 用。当一个对象被强引用变量引用时 ,它处于可达状态,它是不可能被垃圾回收机制回收的,即…

Java阶段二Day21

Java阶段二Day21 文章目录 Java阶段二Day21整合Lombok基础组件1 Lombok简介2 安装和配置 Lombok3 Lombok 注解及其用法3.1 Getter 和 Setter3.2 ToString3.3 AllArgsConstructor 和 NoArgsConstructor3.4 Data 4. 总结5 微博项目优化 Knife4j1 Knife4j的优点2 Knife4j快速上手2…

使用Docker构建的MySQL主从架构:高可用性数据库解决方案

前言 MySQL主从架构,我们已经在vmware虚拟机上实践过了,接下来我们一起探讨在docker中如何使用MySQL主从架构。 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社…

《论文阅读》基于提示的知识生成解决对话情感推理难题

《论文阅读》基于提示的知识生成解决对话情感推理难题 前言摘要作者新观点问题定义模型框架Global ModelLocal ModelPrompt Based Knowledge Generation分类器实验结果问题前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失…

openEuler 成功适配 LeapFive InFive Poros 开发板

近日,openEuler RISC-V 23.03 创新版本在跃昉科技的 Poros 开发板上成功运行。 openEuler 在 Poros 上适配成功,XFCE 桌面启动正常,文件系统、终端模拟器和输入法等相关 GUI 应用也运行流畅,Chromium 浏览器和 LibreOffice 等应用…

【Pm4py第三讲】关于Output

本节用于介绍pm4py中的输出函数,包括日志输出、模型输出、面向对象日志输出等。 1.函数概述 本次主要介绍Pm4py中一些常见的输入函数,总览如下表: 函数名说明write_bpmn()用于写入bpmn模型write_dfg()用于写入dfg模型write_pnml() 用于写入p…

面试之高手回答

1.int与Integer的区别 int与Integer的区别有很多,我简单罗列三个方面 第一个作为成员变量来说Integer的初始值是null,int的初始值是0; 第二个Integer存储在堆内存,int类型是在直接存储在栈空间; 第三个integer是个对象…

项目管理6大避坑技巧

1、拒绝错位战略目标 明确目标方向 做项目,首先需要明确项目目标。项目中有很多目标都很重要,但只有一两个目标是最重要的。在任何时刻,我们主要精力都应该集中在一到两个最重要的目标上。 一般最重要的目标具有以下特点:能够给组…

CSS--空间转换及动画

01-空间转换 空间转换简介 空间:是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间,Z 轴位置与视线方向相同。空间转换也叫 3D转换属性:transform 平移 transform: translate3d(x, y, z); transform: translateX(); transfor…

能源硕士为何受热捧?社科院与杜兰大学能源管理硕士项目为你解惑

能源行业可谓是全球最具发展前景的行业之一,能源管理硕士更是近几年被争相推荐的“大热门”。广泛的就业选择、较高且稳定的收入,是该专业的特点之一,毕业后可选择在政府相关机构、能源监管部门、全国节能减排领域的各类研究机构工作&#xf…

Linux学习 Day3

目录 1. 时间相关的指令 2. cal指令 3. find指令:(灰常重要) -name 4. grep指令 5. zip/unzip指令 6. tar指令(重要):打包/解包,不打开它,直接看内容 7. bc指令 8. uname –…

Shell基础学习---1、Shell概述、脚本入门、变量

1、Shell 概述 Shell是一个命令解释器,它接收应用程序/用户命令,然后调用操作系统内核。 说明:Shell是一个功能相当强大的编程语言,易编写,易调试、灵活性强。 1、 提供的Shell解释器 2、bash和sh的关系 3、CentOS…

简述-关于Kmeans轮廓系数随着聚类个数的增加后减少的问题

当我们在做Kmeans聚类的准备工作时,通常会用到手肘法(elbow method)或者轮廓系数(silhouette score)去找到最佳簇类个数。 对于轮廓系数寻找法,理论上来说,轮廓系数会随着聚类个数的增加而增加…

云渲染是什么?云渲染和传统渲染农场有什么区别?

云渲染是什么?云渲染和传统渲染农场有什么区别? 今天云渲染小编就来和大家说一说云渲染以及它和传统渲染农场的区别。 一、什么是云渲染?云渲染什么意思? 首先云渲染云渲染是一种依托于云计算的云端服务,用户将本地…

UVM 验证方法学之interface学习系列文章(七)高级 《bind 操作》(3)

在之前的文章,我们就bind 机制,进行了用法分析。其实,对于一些大型的复杂SOC设计,bind的操作,可以说是非常实用的。它不仅能够完成各种UVC的驱动激励操作,而且一定程度能够简便验证平台的搭建和后期维护。下面,我们举个例子说明bind在当今复杂环境下的妙用。 一 TB 思…

聊一聊API 测试有哪些不同类型?

用户希望能够跨设备和浏览器使用应用程序。因此,您必须进行全面的不同 API 测试类型,以了解它的工作情况以及它是否可以执行其主要功能。一些测试人员需要更多地关注这方面,因此,我们看到许多质量较差的应用程序。今天&#xff0c…