应用性能监控-- SkyWalking 2022-03-19 程序之旅,记录 1 条评论 1624 次阅读 ## 应用性能监控-- SkyWalking > SkyWalking 是中国人吴晟开源的应用性能管理系统(APM)工具,使用 Java 语言开发,现在已属于 Apache 旗下开源项目,官网 https://skywalking.apache.org/ SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。 ### APM 与 SkyWalking APM(Application Performance Management),即应用性能管理系统。对应用程序单点性能与整个分布式应用进行监控,记录每一个环节程序执行状况,通过图表与报表的西施让运维人员随时掌握系统的运行状况。 特点: - 实现强大的链路跟踪 - 相比 Zipkin,拥有更友好、更详细的监控项 - 能自动生成可视化图表 #### SkyWalking 与 Sleuth + Zipkin 比较 | | SkyWalking | Sleuth + Zipkin | | ---------------- | ---------------------------------- | --------------- | | 链路跟踪可视化 | 有 | 有 | | 聚合报表 | 丰富 | 很少 | | 服务依赖图 | 形象直观 | 简单依赖图 | | 监控埋点方式 | 无侵入,采用 Java Agent 字节码增强 | 侵入式 | | Java VM 指标监控 | 具备 | 不具有 | | 支持报警 | 有,可自定义 | 不具有 | | 存储机制 | ES、Mysql等 | ES、Mysql等 | | 文档支持 | Apache 支持,国内文档滞后 | 文档丰富 | | | | | ### SkyWalking 服务端与 Java Agent #### 环境要求 - JDK 8 #### SkyWalking 部署 > SkyWalking 服务端用于接收来自 Java Agent 客户端发过来的链路跟踪与指标数据,汇总统计后由 SkyWalking UI 负责展示。 端口占用: - 11800 端口:gPRC 默认监听的服务端口 - 12800 端口:HTTP 默认监听的端口 - 8080 端口:SkyWalking UI 应用默认监听的端口 #### 安装步骤 第一步,安装 ElasticSearch 全文搜索引擎(存储推荐使用 ElasticSearch)。这里推荐查阅[这里](https://blog.mufeng.info/index.php/archives/163/)。 第二步,下载 SkyWalking 服务端 [下载路径](https://skywalking.apache.org/downloads/),点击 Distribution,下载 for Elasticsearch 7。下载完成后解压在不带中文字样的路径下。 ![image-20220319164817148](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220319164817148.png) 第三步,配置 SkyWalking 数据源。在 application.yml 配置中,搜索 elasticsearch 的配置。 修改后的配置是 ```yml storage: # selector: ${SW_STORAGE:h2} selector: ${SW_STORAGE:elasticsearch7} ``` > 可能会遇到的问题 > > 在bin目录下执行 startup.bat 时,startup.bat 闪退,不会启动 Skywalking-Collector 和 Skywalking-Webapp。 > > 解决方案:将 skywalkinge 解压之后的文件夹放到 JDK 安装目录的上一级。例如 D:\Program Files\Java 是 java 环境地址,放在 D:\apache-skywalking-apm-bin-es7 上。 > > 也有可能是 8080 端口被占用,这个得排查一下。 端口占用: - 11800:gRPC 端口,数据收集服务。 - 12800:HTTP 端口,数据收集服务。 - 8080:SkyWalking UI,用于展示数据。 #### 安装 SkyWalking Java Agent 通过 java agent 探针技术,允许应用开发的时候再通过启动增加 javaagent 参数来外挂一些额外的程序。从而完成无侵入的监控埋点。 首先我们这里先说明白服务间的调用关系,假设有三个微服务,分别是:a-service、b-service 和 c-service,他们之间的调用关系是 a->b->c。 其次,我们可以在 `\apache-skywalking-apm-bin-es7\agent`路径下找到 skywalking-agent.jar 文件,如果是在生产环境下,启动命令为 ```shell java -javaagent:./skywalking-agent.jar -Dskywalking.agent.service_name=a-service -Dskywalking.collector.backend_service=localhost:11800 -Dskywalking.logging.file_name=a-service-api.log -jar a-service.jar ``` 如果是开发环境运行,需要在 Run/Debug Configurations 中的 Configuration->Environment->VM options 添加配置参数 ```shell // a-service -javaagent:D:\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=a-service -Dskywalking.collector.backend_service=localhost:11800 -Dskywalking.logging.file_name=a-service-api.log // b-service -javaagent:D:\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=b-service -Dskywalking.collector.backend_service=localhost:11800 -Dskywalking.logging.file_name=b-service-api.log // c-service -javaagent:D:\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=c-service -Dskywalking.collector.backend_service=localhost:11800 -Dskywalking.logging.file_name=c-service-api.log ``` > - Dskywalking.agent.service_name:指定在 SkyWalking 上报数据时的服务名 > > - Dskywalking.collector.backend_service:指定 SkyWalking 服务端的通信 IP 与端口 > > - Dskywalking.logging.file_name:指定 agent 生成的上报日志文件名,日志文件保存 agent 的 logs 目录中,例如:\apache-skywalking-apm-bin-es7\agent\logs ### SkyWalking 常用视图 使用 Apifox 进行压力测试。 ![image-20220319213204303](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220319213204303.png) 打开 SkyWalking UI,默认显示全局监控,自动刷新设置 1 秒。 ![image-20220319213121539](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220319213121539.png) 分别显示的是,各服务每分钟访问次数,高延迟服务列表,服务状态指数,高延迟端点列表,全局响应延迟比检测图,全局响应热力图。 - 服务状态指数:越接近 1 状态越好。 - 高延迟端点列表:是高延迟服务的列出,第一个是我们主要排查的服务对象。 压力测试结果。 ![image-20220319213147774](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220319213147774.png) #### 拓扑图 点击拓扑图可以看到服务间的依赖关系。 ![image-20220319213520455](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220319213520455.png) #### 链路追踪图 ![image-20220319213718901](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220319213718901.png) ## 附页 ### java agent > Java agent 提供了一种在加载字节码时,对字节码进行修改的方式。他共有两种方式执行,一种是在 main 方法执行之前,通过 premain 来实现,另一种是在程序运行中,通过 attach api 来实现。 定义一个简单的 Jave Agent 扩展类。 ```java public class SimpleAgent { public static void premain(String agentArgs, Instrumentation inst) { System.out.println("==========开始执行premain=========="); } } ``` 之后,在 META-INF 目录下找到 MANIFEST.MF 文件,添加内容。 ```makefile Manifest-Version:1.0 Premain-Class:info.mufeng.agent.SimpleAgent ``` 然后,在启动服务的时候加上-javaagent:agent.jar 额外的附加参数。启动的时候会输出如下日志: ```java ==========开始执行premain========== ``` 打赏: 微信, 支付宝 标签: spring boot, 运维, spring cloud alibaba 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
恭贺大佬喜提新域名