blob: 12d011848292e538725a6d80fa6cfd9121f16f4c [file] [log] [blame] [view]
## Support custom enhance
Here is an optional plugin `apm-customize-enhance-plugin`
## Introduce
SkyWalking has provided [Java agent plugin development guide](Java-Plugin-Development-Guide.md) to help developers to build new plugin.
This plugin is not designed for replacement but for user convenience. The behaviour is very similar with [@Trace toolkit](Application-toolkit-trace.md), but without code change requirement, and more powerful, such as provide tag and log.
## How to configure
Implementing enhancements to custom classes requires two steps.
1. Active the plugin, move the `optional-plugins/apm-customize-enhance-plugin.jar` to `plugin/apm-customize-enhance-plugin.jar`.
2. Set `plugin.customize.enhance_file` in agent.config, which targets to rule file, such as `/absolute/path/to/customize_enhance.xml`.
3. Set enhancement rules in `customize_enhance.xml`.
```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>
<method method="retString(java.lang.String)" operation_name="/retString" static="false">
<tag key="tag_ret">returnedObj</tag>
<log key="log_map">returnedObj</log>
</method>
<method method="retModel0(test.apache.skywalking.apm.testcase.customize.model.Model0)"
operation_name="/retModel0" static="false">
<tag key="tag_ret">returnedObj.model1.id</tag>
<log key="log_map">returnedObj.model1.getId()</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>
<method method="retArray([Ljava.lang.Object;)" operation_name="/retArray" static="false">
<tag key="tag_ret">returnedObj.[0]</tag>
<log key="log_map">returnedObj.[1]</log>
</method>
<method method="retList(java.util.List)" operation_name="/retList" static="false">
<tag key="tag_ret">returnedObj.[0]</tag>
<log key="log_map">returnedObj.[1]</log>
</method>
<method method="retMap(java.util.Map)" operation_name="/retMap" static="false">
<tag key="tag_ret">returnedObj.['k1']</tag>
<log key="log_map">returnedObj.['k2']</log>
</method>
</class>
</enhanced>
- Explanation of the configuration in the file
| configuration | explanation |
|:----------------- |:---------------|
| class_name | The enhanced class |
| method | The interceptor method of the class |
| operation_name | If fill it out, will use it instead of the default operation_name. |
| operation_name\_suffix | What it means adding dynamic data after the operation_name. |
| static | Is this method static. |
| tag | Will add a tag in local span. The value of key needs to be represented on the XML node. |
| log | Will add a log in local span. The value of key needs to be represented on the XML node. |
| arg[x] | What it means is to get the input arguments. such as arg[0] is means get first arguments. |
| .[x] | When the parsing object is Array or List, you can use it to get the object at the specified index. |
| .['key'] | When the parsing object is Map, you can get the map 'key' through it.|
| returnedObj | What it means is to get the return value. |