目录

插件作用:自定义增强任意类里的任意方法,从而实现对任意类里任意方法的监控。

使用

举个例子,有一个类,定义如下:

1
2
3
4
5
6
public class TestService1 {
public static void staticMethod(String str0, int count, Map m, List l, Object[] os) {
// 业务逻辑
}
...
}

那么,想要对该方法进行监控,则可如下操作:

移动jar包

optional-plugins/apm-customize-enhance-plugin-6.5.0.jar 移动到 plugins 目录

编写增强规则

创建一个文件,名为例如 customize_enhance.xml ,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<enhanced>
<class class_name="test.apache.skywalking.testcase.customize.service.TestService1">
<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>
</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。

特别需要注意的是method的写法:

  • 基本类型: 基本类型.class ,例如: int.class

  • 非基本类型: 类的完全限定名称 ,例如:java.lang.String

  • 数组:可以写个数组打印一下,就知道格式了,例如:

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    String[] s = new String[]{};
    System.out.println(s);

    int [] x = new int []{};
    System.out.println(x);
    }

    结果:

    1
    2
    [Ljava.lang.String;@1b0375b3
    [[email protected]2f7c7260

    因此,对于String类型的数组,就可以写成 [Ljava.lang.String; ;对于int类型的数组,则写成 [I

配置

agent.config中添加配置:

1
plugin.customize.enhance_file=customize_enhance.xml的绝对路径

Bonus ^_^

apm-trace-ignore-plugin

相关文章