1. 概述
1.1 SkyWalking 是什么?
FROM http://skywalking.apache.org/
分布式系統(tǒng)的應(yīng)用程序性能監(jiān)視工具笼平,專為微服務(wù)园骆、云原生架構(gòu)和基于容器(Docker、K8s寓调、Mesos)架構(gòu)而設(shè)計(jì)锌唾。
提供分布式追蹤、服務(wù)網(wǎng)格遙測分析夺英、度量聚合和可視化一體化解決方案晌涕。
—— 官網(wǎng)
1.2 目的
本文主要利用SkyWalking對(duì)分布式應(yīng)用進(jìn)行請(qǐng)求鏈路監(jiān)控,為后續(xù)的性能優(yōu)化提供指南痛悯。
1.3 參考鏈接
- SkyWalking官網(wǎng):推薦讀一讀“博客”欄目
- Github
- 中文文檔
- skywalking-docker
1.4 版本
本文使用skywalking版本為最新的8.1.0
2. 安裝
本文使用 skywalking-docker倉庫的腳本進(jìn)行安裝試用余黎。首先進(jìn)入倉庫,選擇你需要的版本载萌,下載對(duì)應(yīng)的 docker-compose.yml 文件到本地惧财。
可根據(jù)實(shí)際情況,對(duì)docker-compose.yml文件進(jìn)行適當(dāng)?shù)男薷摹?/strong>
此處扭仁,我們默認(rèn)不該動(dòng)任何內(nèi)容垮衷。
啟動(dòng)容器:
docker-compose -d
首次執(zhí)行的話,可能需要拉取鏡像乖坠,請(qǐng)耐心等待搀突。
啟動(dòng)完成。訪問 http://127.0.0.1:8080熊泵,正常訪問即表示安裝成功仰迁。
3. 集成
3.1 下載skywalking程序
此處我們使用8.1.0版本甸昏。訪問https://github.com/apache/skywalking/releases,點(diǎn)擊下載8.1.0版本的壓縮包徐许。
下載 完成后施蜜,進(jìn)行解壓,項(xiàng)目目錄如下:
后續(xù)绊寻,我們主要關(guān)注agent文件夾花墩,這里面包含了探針代理工具包、相關(guān)插件及其配置文件澄步。
3.2 本地集成
我們以idea作為開發(fā)工具冰蘑,進(jìn)行agent的集成。
首先村缸,我們準(zhǔn)備一個(gè)Spring boot應(yīng)用祠肥;
然后配置jvm的啟動(dòng)參數(shù);
# 代理包絕對(duì)路徑
-javaagent:/your/path/apache-skywalking-apm-bin/agent/skywalking-agent.jar
# 項(xiàng)目名稱
-Dskywalking.agent.service_name=demo
# sw后臺(tái)服務(wù)地址
-Dskywalking.collector.backend_service=127.0.0.1:11800
全部配置參數(shù)參見:agent安裝與配置
最后啟動(dòng)并訪問測試http服務(wù)梯皿,稍等一會(huì)兒仇箱,skywalking的頁面即可看到監(jiān)控信息。
3.3 遠(yuǎn)程集成
遠(yuǎn)程應(yīng)用的集成东羹,需要注意的是剂桥,要把“agent整個(gè)文件夾”復(fù)制到遠(yuǎn)程服務(wù)器,然后按照本地集成的方法属提,將jvm啟動(dòng)參數(shù)配置到容器的配置文件权逗,例如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 自定義增強(qiáng)監(jiān)控
自定義增強(qiáng)功能冤议,可以通過xml配置的方式斟薇,實(shí)現(xiàn)對(duì)方法(端點(diǎn))的監(jiān)控。例如:我們需用監(jiān)控socket請(qǐng)求的信息恕酸,但是目前skywalking沒有監(jiān)控socket的插件堪滨,所以我們可以用自定義增強(qiáng)的方法來采集處理請(qǐng)求的方法。
如何配置
實(shí)現(xiàn)對(duì)類的自定義增強(qiáng)需要以下幾步蕊温。
- 激活插件袱箱,將插件從optional-plugins/apm-customize-enhance-plugin.jar移動(dòng)到plugin/apm-customize-enhance-plugin.jar。
- 在agent.config中配置plugin.customize.enhance_file寿弱,指明增強(qiáng)規(guī)則文件犯眠,比如/absolute/path/to/customize_enhance.xml。
- 在customize_enhance.xml中配置增強(qiáng)規(guī)則症革。
<?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 | 要被增強(qiáng)的類 |
method | 類的攔截器方法 |
operation_name | 如果進(jìn)行了配置鸯旁,將用它替代默認(rèn)的operation_name |
operation_name_suffix | 表示在operation_name后添加動(dòng)態(tài)數(shù)據(jù) |
static | 方法是否為靜態(tài)方法 |
tag | 將在local span中添加一個(gè)tag噪矛。key的值需要在XML節(jié)點(diǎn)上表示量蕊。 |
log | 將在local span中添加一個(gè)log。key的值需要在XML節(jié)點(diǎn)上表示艇挨。 |
arg[x] | 表示輸入的參數(shù)值残炮。比如args[0]表示第一個(gè)參數(shù)。 |
.[x] | 當(dāng)正在被解析的對(duì)象是Array或List缩滨,你可以用這個(gè)表達(dá)式得到對(duì)應(yīng)index上的對(duì)象势就。 |
.['key'] | 當(dāng)正在被解析的對(duì)象是Map, 你可以用這個(gè)表達(dá)式得到map的key。 |
B雎0搿!重要注意點(diǎn)2嗑蕖>顺!
K境馈;史蕖!重要注意點(diǎn)L谷浴w⑺浮!
7痹a;摹!重要注意點(diǎn)6屠搿F糖汀!
- 上邊第2步汽纠,配置plugin.customize.enhance_file=路徑卫键,此處路徑必須是xml文件的絕對(duì)路徑;
- 上邊第3步虱朵,配置method值時(shí)莉炉,例如“method(java.lang.String,int.class)”,方法參數(shù)之間碴犬,不能有空格絮宁。