diff --git a/agent-testweb/vertx-4-plugin-testweb/pom.xml b/agent-testweb/vertx-4-plugin-testweb/pom.xml index 53a0e114d8a1..9234cbc9bd2a 100644 --- a/agent-testweb/vertx-4-plugin-testweb/pom.xml +++ b/agent-testweb/vertx-4-plugin-testweb/pom.xml @@ -51,6 +51,11 @@ vertx-web ${vertx.version} + + io.vertx + vertx-web-client + ${vertx.version} + diff --git a/agent-testweb/vertx-4-plugin-testweb/src/main/java/com/pinpoint/test/plugin/Vertx4PluginTestStarter.java b/agent-testweb/vertx-4-plugin-testweb/src/main/java/com/pinpoint/test/plugin/Vertx4PluginTestStarter.java index e88844c41f75..a37cf6f7c1e8 100644 --- a/agent-testweb/vertx-4-plugin-testweb/src/main/java/com/pinpoint/test/plugin/Vertx4PluginTestStarter.java +++ b/agent-testweb/vertx-4-plugin-testweb/src/main/java/com/pinpoint/test/plugin/Vertx4PluginTestStarter.java @@ -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; @@ -44,6 +45,7 @@ public void start(Promise 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 -> { @@ -52,11 +54,11 @@ public void start(Promise 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 -> { }); @@ -109,7 +111,7 @@ private void executeBlockingRequest(HttpServerRequest request) { vertx.executeBlocking(new Handler>() { @Override public void handle(Promise objectFuture) { - request(80, "naver.com", "/"); + request(28080, "localhost", "/client/get"); request.response().end("Execute blocking request."); } }, false, null); @@ -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>() { - @Override - public void handle(AsyncResult 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())); } } \ No newline at end of file diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/SamplingRateFlag.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/SamplingRateFlagAccessor.java similarity index 94% rename from plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/SamplingRateFlag.java rename to plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/SamplingRateFlagAccessor.java index d87f3b5e8601..1faff8eabb6b 100644 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/SamplingRateFlag.java +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/SamplingRateFlagAccessor.java @@ -16,7 +16,7 @@ package com.navercorp.pinpoint.plugin.vertx; -public interface SamplingRateFlag { +public interface SamplingRateFlagAccessor { void _$PINPOINT$_setSamplingRateFlag(Boolean samplingRateFlag); Boolean _$PINPOINT$_getSamplingRateFlag(); } diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/VertxPlugin.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/VertxPlugin.java index e3519b58920b..a5ab7ba10d50 100644 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/VertxPlugin.java +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/VertxPlugin.java @@ -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; @@ -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 @@ -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()) { @@ -128,7 +132,6 @@ public void setup(ProfilerPluginSetupContext context) { addHttpClientRequestImpl(); addHttpClientStream(); addHttpClientResponseImpl(); - addPromiseImpl(); } } @@ -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(); @@ -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"); @@ -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) { @@ -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) { @@ -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"); @@ -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"); @@ -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(); } } @@ -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); @@ -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; diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/ContextImplExecuteBlockingInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/ContextImplExecuteBlockingInterceptor.java index 548ea4aca116..369a2b6ad03b 100644 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/ContextImplExecuteBlockingInterceptor.java +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/ContextImplExecuteBlockingInterceptor.java @@ -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; } @@ -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> 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); diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionConstructorInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionConstructorInterceptor.java new file mode 100644 index 000000000000..806667f9074a --- /dev/null +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionConstructorInterceptor.java @@ -0,0 +1,47 @@ +/* + * Copyright 2022 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.navercorp.pinpoint.plugin.vertx.interceptor; + +import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; +import com.navercorp.pinpoint.bootstrap.logging.PLogger; +import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; +import com.navercorp.pinpoint.common.util.ArrayArgumentUtils; +import com.navercorp.pinpoint.plugin.vertx.SamplingRateFlagAccessor; + +public class Http1xClientConnectionConstructorInterceptor implements AroundInterceptor { + private final PLogger logger = PLoggerFactory.getLogger(getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + @Override + public void before(Object target, Object[] args) { + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (isDebug) { + logger.afterInterceptor(target, args, result, throwable); + } + + final SamplingRateFlagAccessor samplingRateFlagAccessor = ArrayArgumentUtils.getArgument(args, 1, SamplingRateFlagAccessor.class); + if (samplingRateFlagAccessor != null) { + Boolean samplingRateFlag = samplingRateFlagAccessor._$PINPOINT$_getSamplingRateFlag(); + if (target instanceof SamplingRateFlagAccessor) { + ((SamplingRateFlagAccessor) target)._$PINPOINT$_setSamplingRateFlag(samplingRateFlag); + } + } + } +} diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequest38Interceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequest38Interceptor.java new file mode 100644 index 000000000000..642efb125d68 --- /dev/null +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequest38Interceptor.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.navercorp.pinpoint.plugin.vertx.interceptor; + +import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; +import com.navercorp.pinpoint.bootstrap.context.TraceContext; +import com.navercorp.pinpoint.common.util.ArrayArgumentUtils; + +public class Http1xClientConnectionCreateRequest38Interceptor extends Http1xClientConnectionCreateRequestInterceptor { + + public Http1xClientConnectionCreateRequest38Interceptor(TraceContext traceContext, MethodDescriptor descriptor) { + super(traceContext, descriptor); + } + + @Override + String getHost(Object[] args) { + return ArrayArgumentUtils.getArgument(args, 4, String.class, "UNKNOWN"); + } +} diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequest4xInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequest4xInterceptor.java new file mode 100644 index 000000000000..2259876411ce --- /dev/null +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequest4xInterceptor.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.navercorp.pinpoint.plugin.vertx.interceptor; + +import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; +import com.navercorp.pinpoint.bootstrap.context.TraceContext; +import com.navercorp.pinpoint.common.util.ArrayArgumentUtils; + +public class Http1xClientConnectionCreateRequest4xInterceptor extends Http1xClientConnectionCreateRequestInterceptor { + + public Http1xClientConnectionCreateRequest4xInterceptor(TraceContext traceContext, MethodDescriptor descriptor) { + super(traceContext, descriptor); + } + + @Override + String getHost(Object[] args) { + return ArrayArgumentUtils.getArgument(args, 3, String.class, "UNKNOWN"); + } +} diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequestInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequestInterceptor.java index 9996db590d3e..2c9ab44d83ed 100644 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequestInterceptor.java +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/Http1xClientConnectionCreateRequestInterceptor.java @@ -34,9 +34,8 @@ import com.navercorp.pinpoint.bootstrap.plugin.request.util.CookieExtractor; import com.navercorp.pinpoint.bootstrap.plugin.request.util.CookieRecorder; import com.navercorp.pinpoint.bootstrap.plugin.request.util.CookieRecorderFactory; -import com.navercorp.pinpoint.common.util.ArrayArgumentUtils; -import com.navercorp.pinpoint.common.util.ArrayUtils; import com.navercorp.pinpoint.plugin.vertx.HttpRequestClientHeaderAdaptor; +import com.navercorp.pinpoint.plugin.vertx.SamplingRateFlagAccessor; import com.navercorp.pinpoint.plugin.vertx.VertxConstants; import com.navercorp.pinpoint.plugin.vertx.VertxCookieExtractor; import com.navercorp.pinpoint.plugin.vertx.VertxHttpClientConfig; @@ -44,7 +43,7 @@ import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpRequest; -public class Http1xClientConnectionCreateRequestInterceptor implements AroundInterceptor { +public abstract class Http1xClientConnectionCreateRequestInterceptor implements AroundInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); @@ -54,6 +53,8 @@ public class Http1xClientConnectionCreateRequestInterceptor implements AroundInt private final CookieRecorder cookieRecorder; private final RequestTraceWriter requestTraceWriter; + abstract String getHost(Object[] args); + public Http1xClientConnectionCreateRequestInterceptor(TraceContext traceContext, MethodDescriptor descriptor) { this.traceContext = traceContext; this.descriptor = descriptor; @@ -75,6 +76,10 @@ public void before(Object target, Object[] args) { logger.beforeInterceptor(target, args); } + if (Boolean.FALSE == isSamplingRate(target)) { + return; + } + final Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -99,16 +104,19 @@ public void after(Object target, Object[] args, Object result, Throwable throwab logger.afterInterceptor(target, args, result, throwable); } + if (Boolean.FALSE == isSamplingRate(target)) { + writeSamplingRateFalse(result); + return; + } + final Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; } if (!trace.canSampled()) { - if (result instanceof HttpRequest) { - final HttpRequest request = (HttpRequest) result; - requestTraceWriter.write(request); - } + // Defense + writeSamplingRateFalse(result); return; } @@ -128,8 +136,7 @@ public void after(Object target, Object[] args, Object result, Throwable throwab return; } - String host = ArrayArgumentUtils.getArgument(args, 4, String.class, "UNKNOWN"); - + final String host = getHost(args); // generate next trace id. final TraceId nextId = trace.getTraceId().getNextTraceId(); recorder.recordNextSpanId(nextId.getSpanId()); @@ -146,17 +153,27 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } } - private boolean validate(final Object[] args, final Object result) { - if (ArrayUtils.getLength(args) < 5) { - logger.debug("Invalid args object. args={}.", args); - return false; + private boolean isSamplingRate(Object target) { + if (target instanceof SamplingRateFlagAccessor) { + final SamplingRateFlagAccessor samplingRateFlagAccessor = (SamplingRateFlagAccessor) target; + if (samplingRateFlagAccessor != null) { + final Boolean samplingRateFlag = samplingRateFlagAccessor._$PINPOINT$_getSamplingRateFlag(); + if (samplingRateFlag != null) { + return samplingRateFlag; + } + } } + return true; + } - if (!(args[4] instanceof String)) { - logger.debug("Invalid args[4] object. args[4]={}.", args[4]); - return false; + private void writeSamplingRateFalse(Object result) { + if (result instanceof HttpRequest) { + final HttpRequest request = (HttpRequest) result; + requestTraceWriter.write(request); } + } + private boolean validate(final Object[] args, final Object result) { if (!(result instanceof HttpRequest)) { logger.debug("Invalid result object. {}.", result); return false; diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptor.java index bf9ad6737b4c..7e5963063859 100644 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptor.java +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptor.java @@ -113,6 +113,10 @@ public void after(Object target, Object[] args, Object result, Throwable throwab logger.debug("Set asyncContext {}", asyncContext); } } + } catch(Throwable t) { + if (logger.isWarnEnabled()) { + logger.warn("AFTER. Caused:{}", t.getMessage(), t); + } } finally { trace.traceBlockEnd(); } @@ -151,6 +155,12 @@ private String toHostAndPort(final Object[] args) { final int port = (Integer) args[3]; return HostAndPort.toHostAndPortString(host, port); } + } else if(length == 8) { + if (args[3] instanceof String && args[4] instanceof Integer) { + final String host = (String) args[3]; + final int port = (Integer) args[4]; + return HostAndPort.toHostAndPortString(host, port); + } } if (isDebug) { diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptorV4.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptorV4.java index a236162ee46c..ad53a76dd36e 100644 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptorV4.java +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientImplDoRequestInterceptorV4.java @@ -25,16 +25,11 @@ import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; import com.navercorp.pinpoint.bootstrap.logging.PLogger; import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.plugin.request.ClientHeaderAdaptor; -import com.navercorp.pinpoint.bootstrap.plugin.request.DefaultRequestTraceWriter; -import com.navercorp.pinpoint.bootstrap.plugin.request.RequestTraceWriter; import com.navercorp.pinpoint.common.plugin.util.HostAndPort; import com.navercorp.pinpoint.common.trace.AnnotationKey; import com.navercorp.pinpoint.common.util.ArrayUtils; -import com.navercorp.pinpoint.plugin.vertx.HttpClientRequestClientHeaderAdaptor; -import com.navercorp.pinpoint.plugin.vertx.SamplingRateFlag; +import com.navercorp.pinpoint.plugin.vertx.SamplingRateFlagAccessor; import com.navercorp.pinpoint.plugin.vertx.VertxConstants; -import io.vertx.core.http.HttpClientRequest; public class HttpClientImplDoRequestInterceptorV4 implements AroundInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); @@ -42,14 +37,10 @@ public class HttpClientImplDoRequestInterceptorV4 implements AroundInterceptor { private final TraceContext traceContext; private final MethodDescriptor methodDescriptor; - private final RequestTraceWriter requestTraceWriter; public HttpClientImplDoRequestInterceptorV4(TraceContext traceContext, MethodDescriptor descriptor) { this.traceContext = traceContext; this.methodDescriptor = descriptor; - - ClientHeaderAdaptor clientHeaderAdaptor = new HttpClientRequestClientHeaderAdaptor(); - this.requestTraceWriter = new DefaultRequestTraceWriter<>(clientHeaderAdaptor, traceContext); } @Override @@ -64,9 +55,9 @@ public void before(Object target, Object[] args) { } if (!trace.canSampled()) { - if (target instanceof SamplingRateFlag) { + if (target instanceof SamplingRateFlagAccessor) { // 4.x - ((SamplingRateFlag) target)._$PINPOINT$_setSamplingRateFlag(Boolean.FALSE); + ((SamplingRateFlagAccessor) target)._$PINPOINT$_setSamplingRateFlag(Boolean.FALSE); } return; } @@ -121,6 +112,12 @@ private String toHostAndPort(final Object[] args) { final int port = (Integer) args[4]; return HostAndPort.toHostAndPortString(host, port); } + } else if(length == 13) { + if (args[3] instanceof String && args[4] instanceof Integer) { + final String host = (String) args[3]; + final int port = (Integer) args[4]; + return HostAndPort.toHostAndPortString(host, port); + } } if (isDebug) { diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientRequestImplConstructorInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientRequestImplConstructorInterceptor.java index 8787ba8b98d7..0c639de1ffb1 100644 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientRequestImplConstructorInterceptor.java +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientRequestImplConstructorInterceptor.java @@ -19,24 +19,16 @@ import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessor; import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessorUtils; import com.navercorp.pinpoint.bootstrap.context.AsyncContext; -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; import com.navercorp.pinpoint.bootstrap.logging.PLogger; import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; import com.navercorp.pinpoint.common.util.ArrayUtils; -import com.navercorp.pinpoint.plugin.vertx.SamplingRateFlag; public class HttpClientRequestImplConstructorInterceptor implements AroundInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); - private final TraceContext traceContext; - private final MethodDescriptor methodDescriptor; - - public HttpClientRequestImplConstructorInterceptor(TraceContext traceContext, MethodDescriptor descriptor) { - this.traceContext = traceContext; - this.methodDescriptor = descriptor; + public HttpClientRequestImplConstructorInterceptor() { } @Override @@ -56,9 +48,5 @@ public void after(Object target, Object[] args, Object result, Throwable throwab if (asyncContext != null) { ((AsyncContextAccessor)target)._$PINPOINT$_setAsyncContext(asyncContext); } - if (arg instanceof SamplingRateFlag) { - final Boolean samplingRateFlag = ((SamplingRateFlag)(args[0]))._$PINPOINT$_getSamplingRateFlag(); - ((SamplingRateFlag)target)._$PINPOINT$_setSamplingRateFlag(samplingRateFlag); - } } } \ No newline at end of file diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientRequestImplHandleResponseInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientRequestImplHandleResponseInterceptor.java new file mode 100644 index 000000000000..421241e76949 --- /dev/null +++ b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/HttpClientRequestImplHandleResponseInterceptor.java @@ -0,0 +1,70 @@ +/* + * Copyright 2022 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.navercorp.pinpoint.plugin.vertx.interceptor; + +import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessor; +import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessorUtils; +import com.navercorp.pinpoint.bootstrap.context.AsyncContext; +import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; +import com.navercorp.pinpoint.bootstrap.context.TraceContext; +import com.navercorp.pinpoint.bootstrap.interceptor.AsyncContextSpanEventSimpleAroundInterceptor; +import com.navercorp.pinpoint.common.trace.AnnotationKey; +import com.navercorp.pinpoint.common.util.ArrayArgumentUtils; +import com.navercorp.pinpoint.common.util.ArrayUtils; +import com.navercorp.pinpoint.plugin.vertx.VertxConstants; +import com.navercorp.pinpoint.plugin.vertx.VertxHttpClientConfig; +import io.vertx.core.http.impl.HttpClientResponseImpl; + +/** + * @author jaehong.kim + */ +public class HttpClientRequestImplHandleResponseInterceptor extends AsyncContextSpanEventSimpleAroundInterceptor { + + private boolean statusCode; + + public HttpClientRequestImplHandleResponseInterceptor(TraceContext traceContext, MethodDescriptor methodDescriptor) { + super(traceContext, methodDescriptor); + + final VertxHttpClientConfig config = new VertxHttpClientConfig(traceContext.getProfilerConfig()); + this.statusCode = config.isStatusCode(); + } + + @Override + public void doInBeforeTrace(SpanEventRecorder recorder, AsyncContext asyncContext, Object target, Object[] args) { + // 3.8+ + HttpClientResponseImpl response = ArrayArgumentUtils.getArgument(args, 0, HttpClientResponseImpl.class); + if (response == null) { + // 4.x + response = ArrayArgumentUtils.getArgument(args, 1, HttpClientResponseImpl.class); + } + if (response == null) { + return; + } + + if (statusCode) { + recorder.recordAttribute(AnnotationKey.HTTP_STATUS_CODE, response.statusCode()); + } + AsyncContextAccessorUtils.setAsyncContext(asyncContext, response); + } + + @Override + public void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { + recorder.recordApi(methodDescriptor); + recorder.recordServiceType(VertxConstants.VERTX_HTTP_CLIENT_INTERNAL); + recorder.recordException(throwable); + } +} \ No newline at end of file diff --git a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/PromiseImplInterceptor.java b/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/PromiseImplInterceptor.java deleted file mode 100644 index 1971bfbb31c9..000000000000 --- a/plugins/vertx/src/main/java/com/navercorp/pinpoint/plugin/vertx/interceptor/PromiseImplInterceptor.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2021 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.plugin.vertx.interceptor; - -import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessor; -import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessorUtils; -import com.navercorp.pinpoint.bootstrap.context.AsyncContext; -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.context.TraceId; -import com.navercorp.pinpoint.bootstrap.interceptor.AsyncContextSpanEventSimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.plugin.request.ClientHeaderAdaptor; -import com.navercorp.pinpoint.bootstrap.plugin.request.ClientRequestAdaptor; -import com.navercorp.pinpoint.bootstrap.plugin.request.ClientRequestRecorder; -import com.navercorp.pinpoint.bootstrap.plugin.request.ClientRequestWrapper; -import com.navercorp.pinpoint.bootstrap.plugin.request.ClientRequestWrapperAdaptor; -import com.navercorp.pinpoint.bootstrap.plugin.request.DefaultRequestTraceWriter; -import com.navercorp.pinpoint.bootstrap.plugin.request.RequestTraceWriter; -import com.navercorp.pinpoint.bootstrap.plugin.request.util.CookieExtractor; -import com.navercorp.pinpoint.bootstrap.plugin.request.util.CookieRecorder; -import com.navercorp.pinpoint.bootstrap.plugin.request.util.CookieRecorderFactory; -import com.navercorp.pinpoint.common.util.ArrayUtils; -import com.navercorp.pinpoint.plugin.vertx.HttpClientRequestClientHeaderAdaptor; -import com.navercorp.pinpoint.plugin.vertx.HttpClientRequestCookieExtractor; -import com.navercorp.pinpoint.plugin.vertx.HttpClientRequestWrapper; -import com.navercorp.pinpoint.plugin.vertx.SamplingRateFlag; -import com.navercorp.pinpoint.plugin.vertx.VertxConstants; -import com.navercorp.pinpoint.plugin.vertx.VertxHttpClientConfig; -import io.vertx.core.http.HttpClientRequest; - -public class PromiseImplInterceptor extends AsyncContextSpanEventSimpleAroundInterceptor { - - private final ClientRequestRecorder clientRequestRecorder; - private final CookieRecorder cookieRecorder; - private final RequestTraceWriter requestTraceWriter; - - public PromiseImplInterceptor(TraceContext traceContext, MethodDescriptor descriptor) { - super(traceContext, descriptor); - - final VertxHttpClientConfig config = new VertxHttpClientConfig(traceContext.getProfilerConfig()); - ClientRequestAdaptor clientRequestAdaptor = ClientRequestWrapperAdaptor.INSTANCE; - this.clientRequestRecorder = new ClientRequestRecorder<>(config.isParam(), clientRequestAdaptor); - - CookieExtractor cookieExtractor = new HttpClientRequestCookieExtractor(); - this.cookieRecorder = CookieRecorderFactory.newCookieRecorder(config.getHttpDumpConfig(), cookieExtractor); - - ClientHeaderAdaptor clientHeaderAdaptor = new HttpClientRequestClientHeaderAdaptor(); - this.requestTraceWriter = new DefaultRequestTraceWriter<>(clientHeaderAdaptor, traceContext); - } - - @Override - public void doInBeforeTrace(SpanEventRecorder recorder, AsyncContext asyncContext, Object target, Object[] args) { - final HttpClientRequest request = (HttpClientRequest) args[0]; - String host = request.getHost(); - if (host == null) { - host = "UNKNOWN"; - } - - // generate next trace id. - final TraceId nextId = asyncContext.currentAsyncTraceObject().getTraceId().getNextTraceId(); - recorder.recordNextSpanId(nextId.getSpanId()); - requestTraceWriter.write(request, nextId, host); - } - - @Override - public AsyncContext getAsyncContext(Object target, Object[] args) { - if (isSamplingRateFalse(args)) { - final HttpClientRequest request = (HttpClientRequest) args[0]; - this.requestTraceWriter.write(request); - return null; - } - - if (validate(args)) { - return AsyncContextAccessorUtils.getAsyncContext(args, 0); - } - return null; - } - - @Override - public void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { - recorder.recordApi(methodDescriptor); - recorder.recordException(throwable); - recorder.recordServiceType(VertxConstants.VERTX_HTTP_CLIENT); - - final HttpClientRequest request = (HttpClientRequest) args[0]; - String host = request.getHost(); - if (host == null) { - host = "UNKNOWN"; - } - - final ClientRequestWrapper clientRequest = new HttpClientRequestWrapper(request, host); - this.clientRequestRecorder.record(recorder, clientRequest, throwable); - this.cookieRecorder.record(recorder, request, throwable); - } - - @Override - public AsyncContext getAsyncContext(Object target, Object[] args, Object result, Throwable throwable) { - if (isSamplingRateFalse(args)) { - return null; - } - - if (validate(args)) { - return AsyncContextAccessorUtils.getAsyncContext(args, 0); - } - return null; - } - - private boolean isSamplingRateFalse(final Object[] args) { - if (ArrayUtils.getLength(args) < 1) { - return false; - } - - if (Boolean.FALSE == (args[0] instanceof SamplingRateFlag)) { - return false; - } - final Boolean samplingRateFlag = ((SamplingRateFlag) args[0])._$PINPOINT$_getSamplingRateFlag(); - if (samplingRateFlag == null || Boolean.FALSE != samplingRateFlag) { - return false; - } - - if (Boolean.FALSE == (args[0] instanceof HttpClientRequest)) { - return false; - } - - return true; - } - - private boolean validate(final Object[] args) { - if (ArrayUtils.getLength(args) < 1) { - logger.debug("Invalid args object. args={}.", args); - return false; - } - - if (!(args[0] instanceof AsyncContextAccessor)) { - logger.debug("Invalid args[0] object. args[0]={}.", args[0]); - return false; - } - - if (!(args[0] instanceof HttpClientRequest)) { - logger.debug("Invalid args[0] object. {}.", args[0]); - return false; - } - - return true; - } -}