利用SkyWalking对分布式应用进行监控

1. 概述

1.1 SkyWalking 是什么?

FROM http://skywalking.apache.org/
分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
—— 官网

1.2 目的

本文主要利用SkyWalking对分布式应用进行请求链路监控,为后续的性能优化提供指南。

1.3 参考链接

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的启动参数;

编辑启动配置文件
配置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的插件,所以我们可以用自定义增强的方法来采集处理请求的方法。

如何配置

实现对类的自定义增强需要以下几步。

  1. 激活插件,将插件从optional-plugins/apm-customize-enhance-plugin.jar移动到plugin/apm-customize-enhance-plugin.jar。
  2. 在agent.config中配置plugin.customize.enhance_file,指明增强规则文件,比如/absolute/path/to/customize_enhance.xml。
  3. 在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>

  1. 上边第2步,配置plugin.customize.enhance_file=路径,此处路径必须是xml文件的绝对路径;
  2. 上边第3步,配置method值时,例如“method(java.lang.String,int.class)”,方法参数之间,不能有空格。
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351