1. 概述
1.1 SkyWalking 是什么?
FROM http://skywalking.apache.org/
分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
—— 官网
1.2 目的
本文主要利用SkyWalking对分布式应用进行请求链路监控,为后续的性能优化提供指南。
1.3 参考链接
- SkyWalking官网:推荐读一读“博客”栏目
- Github
- 中文文档
- skywalking-docker
1.4 版本
本文使用skywalking版本为最新的8.1.0
2. 安装
本文使用 skywalking-docker仓库的脚本进行安装试用。首先进入仓库,选择你需要的版本,下载对应的 docker-compose.yml 文件到本地。
可根据实际情况,对docker-compose.yml文件进行适当的修改。
此处,我们默认不该动任何内容。
启动容器:
docker-compose -d
首次执行的话,可能需要拉取镜像,请耐心等待。
启动完成。访问 http://127.0.0.1:8080,正常访问即表示安装成功。
3. 集成
3.1 下载skywalking程序
此处我们使用8.1.0版本。访问https://github.com/apache/skywalking/releases,点击下载8.1.0版本的压缩包。
下载 完成后,进行解压,项目目录如下:
后续,我们主要关注agent文件夹,这里面包含了探针代理工具包、相关插件及其配置文件。
3.2 本地集成
我们以idea作为开发工具,进行agent的集成。
首先,我们准备一个Spring boot应用;
然后配置jvm的启动参数;
# 代理包绝对路径
-javaagent:/your/path/apache-skywalking-apm-bin/agent/skywalking-agent.jar
# 项目名称
-Dskywalking.agent.service_name=demo
# sw后台服务地址
-Dskywalking.collector.backend_service=127.0.0.1:11800
全部配置参数参见:agent安装与配置
最后启动并访问测试http服务,稍等一会儿,skywalking的页面即可看到监控信息。
3.3 远程集成
远程应用的集成,需要注意的是,要把“agent整个文件夹”复制到远程服务器,然后按照本地集成的方法,将jvm启动参数配置到容器的配置文件,例如tomcat的“bin/catalina.sh ”文件中。
JAVA_OPTS="$JAVA_OPTS -javaagent:/home/demo/sharefile/ext_lib/agent/skywalking-agent.jar -Dskywalking.agent.service_name=demo -Dskywalking.collector.backend_service=192.168.0.104:11800"
3.4 自定义增强监控
自定义增强功能,可以通过xml配置的方式,实现对方法(端点)的监控。例如:我们需用监控socket请求的信息,但是目前skywalking没有监控socket的插件,所以我们可以用自定义增强的方法来采集处理请求的方法。
如何配置
实现对类的自定义增强需要以下几步。
- 激活插件,将插件从optional-plugins/apm-customize-enhance-plugin.jar移动到plugin/apm-customize-enhance-plugin.jar。
- 在agent.config中配置plugin.customize.enhance_file,指明增强规则文件,比如/absolute/path/to/customize_enhance.xml。
- 在customize_enhance.xml中配置增强规则。
<?xml version="1.0" encoding="UTF-8"?>
<enhanced>
<class class_name="test.apache.skywalking.testcase.customize.service.TestService1">
<method method="staticMethod()" operation_name="/is_static_method" static="true"/>
<method method="staticMethod(java.lang.String,int.class,java.util.Map,java.util.List,[Ljava.lang.Object;)" operation_name="/is_static_method_args" static="true">
<operation_name_suffix>arg[0]</operation_name_suffix>
<operation_name_suffix>arg[1]</operation_name_suffix>
<operation_name_suffix>arg[3].[0]</operation_name_suffix>
<tag key="tag_1">arg[2].['k1']</tag>
<tag key="tag_2">arg[4].[1]</tag>
<log key="log_1">arg[4].[2]</log>
</method>
<method method="method()" static="false"/>
<method method="method(java.lang.String,int.class)" operation_name="/method_2" static="false">
<operation_name_suffix>arg[0]</operation_name_suffix>
<tag key="tag_1">arg[0]</tag>
<log key="log_1">arg[1]</log>
</method>
<method method="method(test.apache.skywalking.testcase.customize.model.Model0,java.lang.String,int.class)" operation_name="/method_3" static="false">
<operation_name_suffix>arg[0].id</operation_name_suffix>
<operation_name_suffix>arg[0].model1.name</operation_name_suffix>
<operation_name_suffix>arg[0].model1.getId()</operation_name_suffix>
<tag key="tag_os">arg[0].os.[1]</tag>
<log key="log_map">arg[0].getM().['k1']</log>
</method>
</class>
<class class_name="test.apache.skywalking.testcase.customize.service.TestService2">
<method method="staticMethod(java.lang.String,int.class)" operation_name="/is_2_static_method" static="true">
<tag key="tag_2_1">arg[0]</tag>
<log key="log_1_1">arg[1]</log>
</method>
<method method="method([Ljava.lang.Object;)" operation_name="/method_4" static="false">
<tag key="tag_4_1">arg[0].[0]</tag>
</method>
<method method="method(java.util.List,int.class)" operation_name="/method_5" static="false">
<tag key="tag_5_1">arg[0].[0]</tag>
<log key="log_5_1">arg[1]</log>
</method>
</class>
</enhanced>
文件中的配置说明。
配置 | 说明 |
---|---|
class_name | 要被增强的类 |
method | 类的拦截器方法 |
operation_name | 如果进行了配置,将用它替代默认的operation_name |
operation_name_suffix | 表示在operation_name后添加动态数据 |
static | 方法是否为静态方法 |
tag | 将在local span中添加一个tag。key的值需要在XML节点上表示。 |
log | 将在local span中添加一个log。key的值需要在XML节点上表示。 |
arg[x] | 表示输入的参数值。比如args[0]表示第一个参数。 |
.[x] | 当正在被解析的对象是Array或List,你可以用这个表达式得到对应index上的对象。 |
.['key'] | 当正在被解析的对象是Map, 你可以用这个表达式得到map的key。 |
!?。≈匾⒁獾悖。?!
?。?!重要注意点?。?!
?。?!重要注意点?。。?/strong>
- 上边第2步,配置plugin.customize.enhance_file=路径,此处路径必须是xml文件的绝对路径;
- 上边第3步,配置method值时,例如“method(java.lang.String,int.class)”,方法参数之间,不能有空格。