Hi the SkyWalking Community
I’m writing to propose some changes in the Java agent instrumentation APIs,
nowadays, we’re using anonymous inner classes (AIC) as follows:
```java
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return new ConstructorInterceptPoint[] {
new ConstructorInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getConstructorMatcher() {
return any();
}
@Override
public String getConstructorInterceptor() {
return
"org.apache.skywalking.apm.plugin.elasticsearch.v5.GenericActionConstructorInterceptor";
}
}
};
}
```
There’re some disadvantages with AIC:
1. Every AIC (`new ConstructorInterceptPoint()`) in every plugin definition is
a completely unique class, as they are compiled into something like
`ActiveMQConsumerInstrumentation$1.class` and
`ActiveMQConsumerInstrumentation$2.class`, and thus loading them requires more
metaspace, small though.
2. The API is somewhat verbose, and exposes too many concepts, like
`ConstructorsInterceptPoint`, `StaticMethodsInterceptPoint`,
`InstanceMethodsInterceptPoint`, we can have a unified API to provide all of
these.
Hereby I propose the new APIs, which eliminates the unnecessary classes, and
should be more semantic, like this:
```java
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return Intercept.constructor(takesArgumentWithType(0,
CONSTRUCTOR_INTERCEPT_TYPE))
.with(CONSTRUCTOR_INTERCEPTOR_CLASS)
.build();
}
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return Intercept.instanceMethod(named(ENHANCE_METHOD)
.and(takesArgumentWithType(0,
"javax.jms.Destination"))
.and(takesArgumentWithType(1,
"javax.jms.Message")))
.with(INTERCEPTOR_CLASS)
.build();
}
public StaticMethodsInterceptPoint[] getStaticMethodsInterceptPoints() {
return Intercept.staticMethod(named("makeWrapper"))
.with("org.apache.skywalking.apm.plugin.dubbo.patch.MakeWrapperInterceptor")
.build();
}
```
We could keep the old APIs there and mark them as deprecated for compatibility,
or simply replace them with the new APIs, what do you think?
If there is no objection from the community, I can open an issue to track this.
GitHub @kezhenxu94
Apache SkyWalking, Apache Dubbo