Sky Walking 介绍 及 8.7.0 源码学习环境搭建
- Sky Walking 概述
- Sky Walking 架构概要
- Java 语言探针无侵入式埋点实现原理
- 搭建源码学习环境
- 下载源码并导入idea
- 编译之前做一些修改
- 去除 maven-checkstyle-plugin 插件
- 修改 **apm-webapp** 的 pom.xml
- 编译项目
- 编译 apm-protocol 协议项目
Sky Walking 概述
Sky Walking 时一个针对分布式系统的 应用性能监控器(APM) 和 可观测性分析平台(OAP)。多维度应用性能分析手段,从分布式拓补图到应用性能指标、Trace、日志的关联分析与告警。它是一个为微服务、容器化和分布式系统而生的高度组件化的 APM 项目。
APM:Application Performance Monitor OAP:Observability Analysis Platform
应用场景描述: 用于分布式系统性能监控。它不是一个单纯的跟踪系统,它的跟踪是为了分析与监控服务的。它不是一个大数据为基础的 APM,即:它不依赖于大数据的生态,任何系统架构都可以使用它作为 APM。
优势
- 对传统分布式架构 和 云原生架构 具有一致性支持
- 易于维护(不引入过多的技术栈)
- 高性能
15台OAP,20台ES 可以支撑 250 多台服务
- 100%采样,合理的性能消耗(不到10%)
- 便于二次开发和集成(面向协议、模块化、提供网络接口)
Sky Walking 架构概要
SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面.
- 探针 基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式.
- 平台后端, 支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。 分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统自定义聚合分析。
- 存储 通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统。
- UI 一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。
主要内容:采集上报,分析,持久化,可视化
- 采集上报: 探针采集(Tracing 和 Metrics),语言探针或其他项目协议 在新的架构示意图中,系统采集部分还多了 Logging 和 事件检查器(Event Detector),并且在他们和接收器中间还加了一个传输层。
- OAP 平台: 由接收器、分析内核、查询内核三部分组成 在新的架构示意图中,Tracing 和 Metrics 被拿到了外面,接收器 Receiver 也被单独拿了出来,并且可以做成集群。
Java 语言探针无侵入式埋点实现原理
原理:Java Agent 的启动时加载(静态 Java Agent,服务启动时指定,并在服务之前被类加载器加载)。
在(类加载第一阶段)加载阶段,加载完Class字节码后对类的字节流进行修改,达到无侵入式埋点。
Instrumentation 是 JVM 对外提供的一个可以在类加载时修改被加载类的字节流的接口。
搭建源码学习环境
下载源码并导入idea
官网地址:https://skywalking.apache.org/
源码下载:apache-skywalking-apm-8.7.0-src.tgz解压得到源码文件夹:
导入Idea:
第一次导入会比较慢,等待下载各种依赖和插件。
此时可以去官网下载中文文档项目:document-cn-translation-of-skywalking
下载后解压:
## 解压后的目录结构
- document-cn-translation-of-skywalking-master
- docs
- .vuepress
- zh
- README.md
- .gitignore
- .travis.yml
- LICENSE
- package.json
把 README.md 改成 README_ZH.md,然后等 skywalking 项目准备完成后,把刚下载解压的中文文档项目的 docs 中的全部内容复制到 apache-skywalking-apm-8.7.0-src.tgz 解压后的项目对应的 docs 目录里面,这样就可以方便的查看中文文档了。
编译之前做一些修改
去除 maven-checkstyle-plugin 插件
插件作用:代码风格检查,用来规范代码风格的
修改 apm-webapp 的 pom.xml
apm-webapp 是前端项目,负责编译前端工程 skywalking-ui,这里会下载 node v8.17.0 的环境,编译时会卡住。
解决办法 (1) : 删掉这个部分的插件:frontend-maven-plugin ,不编译前端模块
解决办法 (2) :
修改插件中的下载镜像地址:
改成国内解析地址
此处选择第一个解决办法,因为本机已经安装过了 node 环境,需要使用前端时可以单独编译。
编译项目
## 项目根目录下编译,并跳过测试模块
mvn clean package -Dmaven.test.skip=true
编译完成后可以再根目录下看到一个dist目录,编译后是一个压缩文件。
使用 mvnw clean package -DskipTests 命令编译,所有打出来的包都在 dist 目录下,并且 Linux 下为 .tar.gz 文件,Windows 下为 .zip 文件
编译 apm-protocol 协议项目
利用官方提供 Protocol Buffers 工具将 protocol 文件编译成 java 文件。
cd apm-protocol
## 到 apm-protocol 目录中
mvn clean compile -Dmaven.test.skip=true
如果使用了 Mac Book M1 芯片,可能会找不到对应的 Protocol Buffers 工具osx-aarch_64。解决参考。
编译完成后在 apm-protocol\apm-network\target\generated-sources\protobuf\目录下出现两个源码目录,里面时编译出来的 java 代码,对应 apm-protocol\apm-network\src 中的 .proto文件。右键这两个目录,将他们设置为 Sources Root:
这样查看源码时就不会有找不到的类了。