Skip to content

Commit

Permalink
[#9179] Backport: Update vert.x plugin for 4.x
Browse files Browse the repository at this point in the history
  • Loading branch information
jaehong-kim committed Sep 14, 2022
1 parent 2c51d9e commit de16095
Show file tree
Hide file tree
Showing 14 changed files with 307 additions and 261 deletions.
5 changes: 5 additions & 0 deletions agent-testweb/vertx-4-plugin-testweb/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@
<artifactId>vertx-web</artifactId>
<version>${vertx.version}</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web-client</artifactId>
<version>${vertx.version}</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.net.SelfSignedCertificate;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.client.WebClient;

import java.util.concurrent.TimeUnit;

Expand All @@ -44,6 +45,7 @@ public void start(Promise<Void> startPromise) throws Exception {
Router router = Router.router(vertx);

router.get("/").handler(routingContext -> {
System.out.println("## WELCOME");
routingContext.response().end("Welcome pinpoint vert.x HTTP server test.");
});
router.get("/request").handler(routingContext -> {
Expand All @@ -52,11 +54,11 @@ public void start(Promise<Void> startPromise) throws Exception {
});
router.get("/request/local").handler(routingContext -> {
request(18080, "localhost", "/");
routingContext.response().end("Request http://localhost:18080/");
routingContext.response().end("Request http://localhost:18080");
});
router.get("/request/https").handler(routingContext -> {
request(443, "naver.com", "/");
routingContext.response().end("Request http://naver.com:80/");
routingContext.response().end("Request https://naver.com:80/");
});
router.get("/noresponse").handler(routingContext -> {
});
Expand Down Expand Up @@ -109,7 +111,7 @@ private void executeBlockingRequest(HttpServerRequest request) {
vertx.executeBlocking(new Handler<Promise<Object>>() {
@Override
public void handle(Promise<Object> objectFuture) {
request(80, "naver.com", "/");
request(28080, "localhost", "/client/get");
request.response().end("Execute blocking request.");
}
}, false, null);
Expand Down Expand Up @@ -138,14 +140,9 @@ private void sleep(int waiteSeconds) {
}

public void request(int port, String host, String uri) {
final HttpClient client = vertx.createHttpClient();

client.request(HttpMethod.GET, port, host, uri, new Handler<AsyncResult<HttpClientRequest>>() {
@Override
public void handle(AsyncResult<HttpClientRequest> asyncResult) {
System.out.println("## Result=" + asyncResult.result());

}
});
WebClient client = WebClient.create(vertx);
client.get(port, host, uri).timeout(Long.MAX_VALUE).send()
.onSuccess(event -> System.out.println("##Received response with status code=" + event.statusCode()))
.onFailure(event -> System.out.println("##Something went wrong=" + event.getMessage()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package com.navercorp.pinpoint.plugin.vertx;

public interface SamplingRateFlag {
public interface SamplingRateFlagAccessor {
void _$PINPOINT$_setSamplingRateFlag(Boolean samplingRateFlag);
Boolean _$PINPOINT$_getSamplingRateFlag();
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,20 @@
import com.navercorp.pinpoint.plugin.vertx.interceptor.ContextImplRunOnContextInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HandleExceptionInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HandlerInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.Http1xClientConnectionCreateRequestInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.Http1xClientConnectionConstructorInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.Http1xClientConnectionCreateRequest38Interceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.Http1xClientConnectionCreateRequest4xInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientImplDoRequestInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientImplDoRequestInterceptorV4;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientImplInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientRequestImplConstructorInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientRequestImplDoHandleResponseInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientRequestImplHandleResponseInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientRequestImplInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientResponseImplInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpClientStreamInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpServerRequestImplHandleEndInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.HttpServerResponseImplInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.PromiseImplInterceptor;
import com.navercorp.pinpoint.plugin.vertx.interceptor.ServerConnectionHandleRequestInterceptor;

import java.security.ProtectionDomain;
Expand All @@ -73,7 +75,7 @@ public void setup(ProfilerPluginSetupContext context) {
}

// 3.3 <= x <= 3.5
logger.info("Enable VertxPlugin. version range=[3.3, 3.5.0]");
logger.info("Enable VertxPlugin. version range=[3.3, 4.2.2]");
logger.info("{} config:{}", this.getClass().getSimpleName(), config);

// for vertx.io 3.3.x, 3.4.x
Expand All @@ -100,6 +102,8 @@ public void setup(ProfilerPluginSetupContext context) {
addContextImpl("io.vertx.core.impl.EventLoopContext");
addContextImpl("io.vertx.core.impl.MultiThreadedWorkerContext");
addContextImpl("io.vertx.core.impl.WorkerContext");
// 4.x
addContextImpl("io.vertx.core.impl.DuplicatedContext");
}

if (config.isEnableHttpServer()) {
Expand Down Expand Up @@ -128,7 +132,6 @@ public void setup(ProfilerPluginSetupContext context) {
addHttpClientRequestImpl();
addHttpClientStream();
addHttpClientResponseImpl();
addPromiseImpl();
}
}

Expand Down Expand Up @@ -202,17 +205,20 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
if (executeBlockingMethod1 != null) {
executeBlockingMethod1.addInterceptor(ContextImplExecuteBlockingInterceptor.class);
}

final InstrumentMethod executeBlockingMethod2 = target.getDeclaredMethod("executeBlocking", "io.vertx.core.Handler", "boolean", "io.vertx.core.Handler");
if (executeBlockingMethod2 != null) {
executeBlockingMethod2.addInterceptor(ContextImplExecuteBlockingInterceptor.class);
}

// internal
final InstrumentMethod executeBlockingMethod3 = target.getDeclaredMethod("executeBlocking", "io.vertx.core.Handler", "io.vertx.core.impl.TaskQueue", "io.vertx.core.Handler");
if (executeBlockingMethod3 != null) {
executeBlockingMethod3.addInterceptor(ContextImplExecuteBlockingInterceptor.class);
}
// 4.x
final InstrumentMethod executeBlockingMethod4 = target.getDeclaredMethod("executeBlocking", "io.vertx.core.impl.ContextInternal", "io.vertx.core.Handler", "io.vertx.core.impl.WorkerPool", "io.vertx.core.impl.TaskQueue");
if (executeBlockingMethod4 != null) {
executeBlockingMethod4.addInterceptor(ContextImplExecuteBlockingInterceptor.class);
}

// skip executeFromIO()
return target.toBytecode();
Expand Down Expand Up @@ -283,14 +289,10 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
final InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);
target.addField(AsyncContextAccessor.class);

final InstrumentMethod endMethod = target.getDeclaredMethod("end");
if (endMethod != null) {
endMethod.addInterceptor(HttpServerResponseImplInterceptor.class);
}

final InstrumentMethod endBufferMethod = target.getDeclaredMethod("end", "io.vertx.core.buffer.Buffer");
if (endBufferMethod != null) {
endBufferMethod.addInterceptor(HttpServerResponseImplInterceptor.class);
for (InstrumentMethod method : target.getDeclaredMethods(MethodFilters.name("end"))) {
if (method != null) {
method.addScopedInterceptor(HttpServerResponseImplInterceptor.class, "HttpServerResponseEnd");
}
}

final InstrumentMethod closeMethod = target.getDeclaredMethod("close");
Expand Down Expand Up @@ -334,7 +336,7 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
final InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);
// 4.x
target.addField(AsyncContextAccessor.class);
target.addField(SamplingRateFlag.class);
target.addField(SamplingRateFlagAccessor.class);

for (InstrumentMethod method : target.getDeclaredMethods(MethodFilters.name("requestAbs", "request", "get", "getAbs", "getNow", "post", "postAbs", "head", "headAbs", "headNow", "options", "optionsAbs", "optionsNow", "put", "putAbs", "delete", "deleteAbs"))) {
if (method != null) {
Expand All @@ -347,25 +349,21 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
if (doRequestMethod != null) {
doRequestMethod.addInterceptor(HttpClientImplDoRequestInterceptor.class);
}

// 3.4.0, 3.4.1
final InstrumentMethod createRequestMethod1 = target.getDeclaredMethod("createRequest", "io.vertx.core.http.HttpMethod", "java.lang.String", "int", "java.lang.Boolean", "java.lang.String", "io.vertx.core.MultiMap");
if (createRequestMethod1 != null) {
createRequestMethod1.addScopedInterceptor(HttpClientImplDoRequestInterceptor.class, VertxConstants.HTTP_CLIENT_CREATE_REQUEST_SCOPE);
}

// 3.4.2
final InstrumentMethod createRequestMethod2 = target.getDeclaredMethod("createRequest", "io.vertx.core.http.HttpMethod", "java.lang.String", "java.lang.String", "int", "java.lang.Boolean", "java.lang.String", "io.vertx.core.MultiMap");
if (createRequestMethod2 != null) {
createRequestMethod2.addScopedInterceptor(HttpClientImplDoRequestInterceptor.class, VertxConstants.HTTP_CLIENT_CREATE_REQUEST_SCOPE);
}

// 3.7
final InstrumentMethod createRequestMethod3 = target.getDeclaredMethod("createRequest", "io.vertx.core.http.HttpMethod", "io.vertx.core.net.SocketAddress", "java.lang.String", "java.lang.String", "int", "java.lang.Boolean", "java.lang.String", "io.vertx.core.MultiMap");
if (createRequestMethod3 != null) {
createRequestMethod3.addScopedInterceptor(HttpClientImplDoRequestInterceptor.class, VertxConstants.HTTP_CLIENT_CREATE_REQUEST_SCOPE);
}

// 4.x
final InstrumentMethod doRequestMethod2 = target.getDeclaredMethod("doRequest", "io.vertx.core.http.HttpMethod", "io.vertx.core.net.SocketAddress", "io.vertx.core.net.SocketAddress", "java.lang.String", "int", "java.lang.Boolean", "java.lang.String", "io.vertx.core.MultiMap", "long", "java.lang.Boolean", "io.vertx.core.net.ProxyOptions", "io.vertx.core.impl.future.PromiseInternal");
if (doRequestMethod2 != null) {
Expand All @@ -389,7 +387,6 @@ public static class HttpClientRequestImplTransform implements TransformCallback
public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
final InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);
target.addField(AsyncContextAccessor.class);
target.addField(SamplingRateFlag.class);

// 4.x
InstrumentMethod constructor = target.getConstructor("io.vertx.core.http.impl.HttpClientImpl", "io.vertx.core.http.impl.HttpClientStream", "io.vertx.core.impl.future.PromiseInternal", "boolean", "io.vertx.core.http.HttpMethod", "io.vertx.core.net.SocketAddress", "java.lang.String", "int", "java.lang.String");
Expand All @@ -407,6 +404,16 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
method.addInterceptor(HttpClientRequestImplDoHandleResponseInterceptor.class);
}
}
// 3.8+
InstrumentMethod handleResponseMethod1 = target.getDeclaredMethod("handleResponse", "io.vertx.core.http.HttpClientResponse", "long");
if (handleResponseMethod1 != null) {
handleResponseMethod1.addInterceptor(HttpClientRequestImplHandleResponseInterceptor.class);
}
// 4.x
InstrumentMethod handleResponseMethod2 = target.getDeclaredMethod("handleResponse", "io.vertx.core.Promise", "io.vertx.core.http.HttpClientResponse", "long");
if (handleResponseMethod2 != null) {
handleResponseMethod2.addInterceptor(HttpClientRequestImplHandleResponseInterceptor.class);
}

// for stream.writeHead(), stream.writeHeadWithContent(), headersCompletionHandler.
final InstrumentMethod connectedMethod = target.getDeclaredMethod("connected", "io.vertx.core.http.impl.HttpClientStream", "io.vertx.core.Handler");
Expand Down Expand Up @@ -452,18 +459,34 @@ public static class ClientConnectionTransform implements TransformCallback {
@Override
public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
final InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);
target.addField(SamplingRateFlagAccessor.class);

// 4.x
InstrumentMethod constructorMethod = target.getConstructor("io.vertx.core.http.HttpVersion", "io.vertx.core.http.impl.HttpClientImpl", "io.netty.channel.ChannelHandlerContext", "boolean", "io.vertx.core.net.SocketAddress", "io.vertx.core.impl.ContextInternal", "io.vertx.core.spi.metrics.ClientMetrics");
if(constructorMethod != null) {
constructorMethod.addInterceptor(Http1xClientConnectionConstructorInterceptor.class);
}

// add pinpoint headers.
// private void prepareRequestHeaders(HttpRequest request, String hostHeader, boolean chunked)
final InstrumentMethod prepareHeadersMethod = target.getDeclaredMethod("prepareHeaders", "io.netty.handler.codec.http.HttpRequest", "java.lang.String", "boolean");
if (prepareHeadersMethod != null) {
prepareHeadersMethod.addInterceptor(HttpClientStreamInterceptor.class);
}

// 3.7
// 3.8+
// private HttpRequest createRequest (HttpMethod method, String rawMethod, String uri, MultiMap headerMap, String hostHeader, boolean chunked)
final InstrumentMethod createRequestMethod = target.getDeclaredMethod("createRequest", "io.vertx.core.http.HttpMethod", "java.lang.String", "java.lang.String", "io.vertx.core.MultiMap", "java.lang.String", "boolean");
if (createRequestMethod != null) {
createRequestMethod.addInterceptor(Http1xClientConnectionCreateRequestInterceptor.class);
createRequestMethod.addInterceptor(Http1xClientConnectionCreateRequest38Interceptor.class);
}
// 4.x
// private HttpRequest createRequest (HttpMethod method, String uri, MultiMap headerMap, String authority,boolean chunked, ByteBuf buf,boolean end)
final InstrumentMethod createRequestMethod2 = target.getDeclaredMethod("createRequest", "io.vertx.core.http.HttpMethod", "java.lang.String", "io.vertx.core.MultiMap", "java.lang.String", "boolean", "io.netty.buffer.ByteBuf", "boolean");
if (createRequestMethod2 != null) {
createRequestMethod2.addInterceptor(Http1xClientConnectionCreateRequest4xInterceptor.class);
}

return target.toBytecode();
}
}
Expand All @@ -483,7 +506,10 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
if (handleEndMethod != null) {
handleEndMethod.addInterceptor(HttpClientResponseImplInterceptor.class);
}

final InstrumentMethod handleEndMethod2 = target.getDeclaredMethod("handleEnd", "io.vertx.core.MultiMap");
if (handleEndMethod2 != null) {
handleEndMethod2.addInterceptor(HttpClientResponseImplInterceptor.class);
}
final InstrumentMethod handleExceptionMethod = target.getDeclaredMethod("handleException", "java.lang.Throwable");
if (handleExceptionMethod != null) {
handleExceptionMethod.addInterceptor(HandleExceptionInterceptor.class);
Expand All @@ -493,26 +519,6 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
}
}

private void addPromiseImpl() {
// 4.x
transformTemplate.transform("io.vertx.core.impl.future.PromiseImpl", PromiseImplTransform.class);
}

public static class PromiseImplTransform implements TransformCallback {

@Override
public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
final InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);

final InstrumentMethod tryComplete = target.getDeclaredMethod("tryComplete", "java.lang.Object");
if (tryComplete != null) {
tryComplete.addInterceptor(PromiseImplInterceptor.class);
}

return target.toBytecode();
}
}

@Override
public void setTransformTemplate(MatchableTransformTemplate transformTemplate) {
this.transformTemplate = transformTemplate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public ContextImplExecuteBlockingInterceptor(final TraceContext traceContext, fi
}

@Override
protected void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) {
public void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) {
if (!validate(args)) {
return;
}
Expand Down Expand Up @@ -87,17 +87,21 @@ private AsyncContextAccessorHandlers getAsyncContextAccessorHandlers(final Objec
if (args[0] instanceof AsyncContextAccessor) {
handlers.blockingCodeHandler = (AsyncContextAccessor) args[0];
}

if (args[2] instanceof AsyncContextAccessor) {
handlers.resultHandler = (AsyncContextAccessor) args[2];
}
} else if (length == 4) {
// ContextInternal context, Handler<Promise<T>> blockingCodeHandler, WorkerPool workerPool, TaskQueue queue
if (args[1] instanceof AsyncContextAccessor) {
handlers.blockingCodeHandler = (AsyncContextAccessor) args[1];
}
}

return handlers;
}

@Override
protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) {
public void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) {
recorder.recordApi(methodDescriptor);
recorder.recordServiceType(VertxConstants.VERTX_INTERNAL);
recorder.recordException(throwable);
Expand Down
Loading

0 comments on commit de16095

Please # to comment.