美文网首页监控与优化服务监控和治理trace
利用SkyWalking对分布式应用进行监控

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

作者: 咦咦咦萨 | 来源:发表于2020-08-31 14:03 被阅读0次

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。

!!!重要注意点!!!
!!!重要注意点!!!
!!!重要注意点!!!

  1. 上边第2步,配置plugin.customize.enhance_file=路径,此处路径必须是xml文件的绝对路径;
  2. 上边第3步,配置method值时,例如“method(java.lang.String,int.class)”,方法参数之间,不能有空格

相关文章

网友评论

    本文标题:利用SkyWalking对分布式应用进行监控

    本文链接:https://www.haomeiwen.com/subject/xslusktx.html