diff --git a/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java b/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java index d52b73c4e081014f479eba13d188765412465c0d..4fb43f382069f5dde7a32c1d4bcb1c4d06a2c2e7 100644 --- a/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java +++ b/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java @@ -9,4 +9,22 @@ public class ComponentsDefine { public static final OfficialComponent HTTPCLIENT = new OfficialComponent(2, "HttpClient"); public static final OfficialComponent DUBBO = new OfficialComponent(3, "Dubbo"); + + public static final OfficialComponent H2 = new OfficialComponent(4, "H2"); + + public static final OfficialComponent MYSQL = new OfficialComponent(5, "Mysql"); + + public static final OfficialComponent ORACLE = new OfficialComponent(6, "ORACLE"); + + public static final OfficialComponent REDIS = new OfficialComponent(7, "Redis"); + + public static final OfficialComponent MOTAN = new OfficialComponent(8, "Motan"); + + public static final OfficialComponent MONGODB = new OfficialComponent(9, "MongoDB"); + + public static final OfficialComponent RESIN = new OfficialComponent(10, "Resin"); + + public static final OfficialComponent FEIGN = new OfficialComponent(11, "Feign"); + + public static final OfficialComponent OKHTTP = new OfficialComponent(12, "OKHttp"); } diff --git a/apm-network/src/test/java/org/skywalking/apm/network/trace/proto/GRPCNoServerTest.java b/apm-network/src/test/java/org/skywalking/apm/network/trace/proto/GRPCNoServerTest.java index 1e4d66d8c08fcee1ec66145597ded70e342c2b30..f0574cc9133405e8c3845a4f65a06ed353e507a0 100644 --- a/apm-network/src/test/java/org/skywalking/apm/network/trace/proto/GRPCNoServerTest.java +++ b/apm-network/src/test/java/org/skywalking/apm/network/trace/proto/GRPCNoServerTest.java @@ -8,7 +8,9 @@ import io.grpc.internal.DnsNameResolverProvider; import io.grpc.netty.NettyChannelBuilder; import io.grpc.stub.StreamObserver; import org.junit.Assert; -import org.skywalking.apm.network.collecor.proto.Downstream; +import org.skywalking.apm.network.proto.Downstream; +import org.skywalking.apm.network.proto.TraceSegmentServiceGrpc; +import org.skywalking.apm.network.proto.UpstreamSegment; /** * @author wusheng diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java index 0d951bec0c3508b0a2d6a55d346ff814f3d7dfb4..4efc51749fcc92f7b75a3ce935ab7966e3d2fad1 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java @@ -155,7 +155,7 @@ public abstract class AbstractTracingSpan implements AbstractSpan { return this; } - public SpanObject.Builder transform(){ + public SpanObject.Builder transform() { SpanObject.Builder spanBuilder = SpanObject.newBuilder(); spanBuilder.setSpanId(this.spanId); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java index f6bc563b97164da40e0bbfe3833c133892dfd067..aae12a8a30a0f1bc0a2a650500fbddf51f0948fd 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java @@ -1,9 +1,6 @@ package org.skywalking.apm.agent.core.context.trace; -import org.skywalking.apm.agent.core.context.util.KeyValuePair; import org.skywalking.apm.agent.core.dictionary.DictionaryUtil; -import org.skywalking.apm.network.proto.SpanObject; -import org.skywalking.apm.network.proto.SpanType; import org.skywalking.apm.network.trace.component.Component; /** diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LocalSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LocalSpan.java index 9f76419e14c4e52a1635c71d10d8741f6945c369..6ef653f891dd5f7e4e01e3b487b68329e5408be1 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LocalSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LocalSpan.java @@ -29,7 +29,7 @@ public class LocalSpan extends AbstractTracingSpan { return this; } - @Override public SpanObject transform() { + @Override public SpanObject.Builder transform() { return null; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java index 49aa98e64c6d79f3462b63bcfa05f381ee52e713..e3b732aff45dd891e858c046ded2bb7ce4aeafd4 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java @@ -3,7 +3,6 @@ package org.skywalking.apm.agent.core.context.trace; import java.util.LinkedList; import java.util.List; import org.skywalking.apm.agent.core.context.util.KeyValuePair; -import org.skywalking.apm.network.proto.KeyWithStringValue; import org.skywalking.apm.network.proto.LogMessage; /** diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegment.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegment.java index 7e34dffad2692b5988d2f4754c9b44a28a0ef200..d1fbc531f597dc291c799a1333009a8a7e4cacef 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegment.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegment.java @@ -13,7 +13,6 @@ import org.skywalking.apm.agent.core.dictionary.PossibleFound; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; import org.skywalking.apm.network.proto.TraceSegmentObject; -import org.skywalking.apm.network.proto.TraceSegmentReference; import org.skywalking.apm.network.proto.UpstreamSegment; /** diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java index 342c9702b83f6938a76e1265fe34ef1c822ec88c..abb5e2a6dbc6fc93f7f776a7137820b609c89a5c 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java @@ -1,11 +1,8 @@ package org.skywalking.apm.agent.core.context.trace; -import java.util.List; import org.skywalking.apm.agent.core.context.ContextCarrier; -import org.skywalking.apm.agent.core.context.ids.DistributedTraceId; import org.skywalking.apm.agent.core.dictionary.DictionaryUtil; import org.skywalking.apm.network.proto.TraceSegmentReference; -import org.skywalking.apm.network.proto.UpstreamSegment; /** * {@link TraceSegmentRef} is like a pointer, which ref to another {@link TraceSegment}, diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java index d4bef8411c017fc3e5ebf7c72ed3e747b73c36a1..3dc7075cb1783ced4ade00d870b96d161d60cb05 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java @@ -1,12 +1,10 @@ package org.skywalking.apm.agent.core.plugin.interceptor.enhance; -import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.FieldAccessor; import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.implementation.SuperMethodCall; import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.matcher.ElementMatchers; import org.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine; import org.skywalking.apm.agent.core.plugin.PluginException; import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; @@ -101,7 +99,7 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi */ if (existedConstructorInterceptPoint) { for (ConstructorInterceptPoint constructorInterceptPoint : constructorInterceptPoints) { - newClassBuilder = newClassBuilder.constructor(ElementMatchers.any()).intercept(SuperMethodCall.INSTANCE + newClassBuilder = newClassBuilder.constructor(constructorInterceptPoint.getConstructorMatcher()).intercept(SuperMethodCall.INSTANCE .andThen(MethodDelegation.withDefaultConfiguration() .to(new ConstructorInter(constructorInterceptPoint.getConstructorInterceptor(), classLoader)) ) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstanceConstructorInterceptor.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstanceConstructorInterceptor.java index 7f63e357069ac830179970d545d49ee72c63fb5c..cbd5edbbf4a69830ea4abaf034b21ad6737aa029 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstanceConstructorInterceptor.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstanceConstructorInterceptor.java @@ -11,5 +11,5 @@ public interface InstanceConstructorInterceptor { /** * Called before the origin constructor invocation. */ - void onConstruct(Object objInst, Object[] allArguments); + void onConstruct(EnhancedInstance objInst, Object[] allArguments); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java index 2b88a27724a8514f587e14b3e94e40d2dad543c0..2b940077c2e4e0ce29239820c69b2d4d856f3296 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java @@ -1,7 +1,6 @@ package org.skywalking.apm.agent.core.remote; import org.skywalking.apm.agent.core.boot.BootService; -import org.skywalking.apm.agent.core.remote.DiscoveryRestServiceClient; /** * The CollectorDiscoveryService is responsible for start {@link DiscoveryRestServiceClient}. diff --git a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java index 24bc72bcad8ba0cb2204390b91f08a38e77cfc52..0c30d8ec40f56828c47532b9526a80b071addf68 100644 --- a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java @@ -16,8 +16,11 @@ import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.skywalking.apm.network.trace.component.ComponentsDefine; /** * {@link DefaultHttpClientInterceptor} intercept the default implementation of http calls by the Feign. @@ -29,32 +32,25 @@ public class DefaultHttpClientInterceptor implements InstanceMethodsAroundInterc private static final String COMPONENT_NAME = "FeignDefaultHttp"; /** - * Get the {@link feign.Request} from {@link EnhancedClassInstanceContext}, then create {@link Span} and set host, + * Get the {@link feign.Request} from {@link EnhancedInstance}, then create {@link AbstractSpan} and set host, * port, kind, component, url from {@link feign.Request}. * Through the reflection of the way, set the http header of context data into {@link feign.Request#headers}. * - * @param context instance context, a class instance only has one {@link EnhancedClassInstanceContext} instance. - * @param interceptorContext method context, includes class name, method name, etc. * @param result change this result, if you want to truncate the method. * @throws Throwable */ - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) throws Throwable { - Request request = (Request)interceptorContext.allArguments()[0]; + @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + Request request = (Request)allArguments[0]; URL url = new URL(request.url()); - AbstractSpan span = ContextManager.createSpan(request.url()); - span.setPeerHost(url.getHost()); - span.setPort(url.getPort()); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.COMPONENT.set(span, COMPONENT_NAME); + ContextCarrier contextCarrier = new ContextCarrier(); + String remotePeer = url.getHost() + ":" + url.getPort(); + AbstractSpan span = ContextManager.createExitSpan(request.url(), contextCarrier, remotePeer); + span.setComponent(ComponentsDefine.FEIGN); Tags.HTTP.METHOD.set(span, request.method()); Tags.URL.set(span, url.getPath()); - Tags.SPAN_LAYER.asHttp(span); - - ContextCarrier contextCarrier = new ContextCarrier(); - ContextManager.inject(contextCarrier); + SpanLayer.asHttp(span); List contextCollection = new ArrayList(); contextCollection.add(contextCarrier.serialize()); @@ -75,34 +71,32 @@ public class DefaultHttpClientInterceptor implements InstanceMethodsAroundInterc /** * Get the status code from {@link Response}, when status code greater than 400, it means there was some errors in * the server. - * Finish the {@link Span}. + * Finish the {@link AbstractSpan}. * - * @param context instance context, a class instance only has one {@link EnhancedClassInstanceContext} instance. - * @param interceptorContext method context, includes class name, method name, etc. * @param ret the method's original return value. * @return * @throws Throwable */ - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) throws Throwable { + @Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { Response response = (Response)ret; int statusCode = response.status(); AbstractSpan span = ContextManager.activeSpan(); if (statusCode >= 400) { - Tags.ERROR.set(span, true); + span.errorOccurred(); + Tags.STATUS_CODE.set(span, statusCode + ""); } - Tags.STATUS_CODE.set(span, statusCode); ContextManager.stopSpan(); return ret; } - @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - Tags.ERROR.set(ContextManager.activeSpan(), true); - ContextManager.activeSpan().log(t); + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan activeSpan = ContextManager.activeSpan(); + activeSpan.log(t); + activeSpan.errorOccurred(); } } diff --git a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/define/DefaultHttpClientInstrumentation.java b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/define/DefaultHttpClientInstrumentation.java index 572d193219d62ed729ab2eb308928755c361b859..1dcf57459e42540e3e2df972d35b0df5692329d2 100644 --- a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/define/DefaultHttpClientInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/define/DefaultHttpClientInstrumentation.java @@ -47,6 +47,10 @@ public class DefaultHttpClientInstrumentation extends ClassInstanceMethodsEnhanc @Override public String getMethodsInterceptor() { return INTERCEPT_CLASS; } + + @Override public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptor.java b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptor.java index d31614e2dc12ee3d65ab4119eb692d900b47e37c..cf89ee02d3f46fb1dd4bab78ca0038f745447603 100644 --- a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptor.java @@ -2,11 +2,9 @@ package org.skywalking.apm.plugin.httpClient.v4; import java.net.MalformedURLException; import java.net.URL; -import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; -import org.apache.http.StatusLine; import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; @@ -18,12 +16,6 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsA import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.skywalking.apm.network.trace.component.ComponentsDefine; -/** - * {@link HttpClientExecuteInterceptor} transport the trace context by call {@link HttpRequest#setHeader(Header)}, - * The {@link Tags#STATUS_CODE} will be set if {@link StatusLine#getStatusCode()} is not equals 200. - * - * @author zhangxin - */ public class HttpClientExecuteInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, @@ -60,9 +52,9 @@ public class HttpClientExecuteInterceptor implements InstanceMethodsAroundInterc HttpResponse response = (HttpResponse)ret; int statusCode = response.getStatusLine().getStatusCode(); AbstractSpan span = ContextManager.activeSpan(); - if (statusCode != 200) { + if (statusCode >= 400) { span.errorOccurred(); - Tags.STATUS_CODE.set(span, statusCode + ""); + Tags.STATUS_CODE.set(span, Integer.toString(statusCode)); } ContextManager.stopSpan(); diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/CallableStatementTracing.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/CallableStatementTracing.java index f6a949093a0aac47c15a5ce80383f196cd90880e..30d82ae34640ccb739b65af181fca253896846b2 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/CallableStatementTracing.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/CallableStatementTracing.java @@ -1,42 +1,35 @@ package org.skywalking.apm.plugin.jdbc; import java.sql.SQLException; +import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; import org.skywalking.apm.util.StringUtil; -/** - * {@link CallableStatementTracing} create span with the {@link Span#operationName} start with - * "JDBC/CallableStatement/"and set {@link ConnectionInfo#dbType} to the {@link Tags#COMPONENT}. - *

- * Notice: {@link Span#peerHost} may be is null if database connection url don't contain multiple hosts. - * - * @author zhangxin - */ public class CallableStatementTracing { public static R execute(java.sql.CallableStatement realStatement, - ConnectionInfo connectInfo, String method, String sql, Executable exec) + ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - AbstractSpan span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/CallableStatement/" + method); - Tags.DB_TYPE.set(span, "sql"); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); - Tags.DB_STATEMENT.set(span, sql); - Tags.SPAN_LAYER.asDB(span); - Tags.COMPONENT.set(span, connectInfo.getDBType()); + String remotePeer; if (!StringUtil.isEmpty(connectInfo.getHosts())) { - span.setPeers(connectInfo.getHosts()); + remotePeer = connectInfo.getHosts(); } else { - span.setPeerHost(connectInfo.getHost()); - span.setPort(connectInfo.getPort()); + remotePeer = connectInfo.getHost() + ":" + connectInfo.getPort(); } + AbstractSpan span = ContextManager.createExitSpan(connectInfo.getDBType() + "/JDBI/CallableStatement/" + method, new ContextCarrier(), remotePeer); + Tags.DB_TYPE.set(span, "sql"); + SpanLayer.asDB(span); + Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); + Tags.DB_STATEMENT.set(span, sql); + span.setComponent(connectInfo.getComponent()); return exec.exe(realStatement, sql); } catch (SQLException e) { AbstractSpan span = ContextManager.activeSpan(); - Tags.ERROR.set(span, true); + span.errorOccurred(); span.log(e); throw e; } finally { diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionInfo.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionInfo.java index 9da6110b92ebfc48fbc59751b933dca56e42aba9..cc5b8e5dff335431feafbad9fa14571606e8f9e3 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionInfo.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionInfo.java @@ -1,5 +1,7 @@ package org.skywalking.apm.plugin.jdbc; +import org.skywalking.apm.network.trace.component.OfficialComponent; + /** * {@link ConnectionInfo} stored the jdbc connection info, the connection info contains db type, host, port, database * name. The {@link #hosts} be null if {@link #host} is not null. @@ -28,17 +30,24 @@ public class ConnectionInfo { */ private String hosts; - public ConnectionInfo(String dbType, String host, int port, String databaseName) { + /** + * Component + */ + private final OfficialComponent component; + + public ConnectionInfo(OfficialComponent component, String dbType, String host, int port, String databaseName) { this.dbType = dbType; this.host = host; this.port = port; this.databaseName = databaseName; + this.component = component; } - public ConnectionInfo(String dbType, String hosts, String databaseName) { + public ConnectionInfo(OfficialComponent component, String dbType, String hosts, String databaseName) { this.dbType = dbType; this.hosts = hosts; this.databaseName = databaseName; + this.component = component; } public String getDBType() { @@ -60,4 +69,9 @@ public class ConnectionInfo { public String getHosts() { return hosts; } + + public OfficialComponent getComponent() { + return component; + } + } diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionTracing.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionTracing.java index b86c6025e2606e025fe59a9a494ee3bae39449e4..c87685ba3bdd644e67746ea0def3ce54e42585e2 100755 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionTracing.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/ConnectionTracing.java @@ -1,43 +1,35 @@ package org.skywalking.apm.plugin.jdbc; +import java.sql.SQLException; +import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; +import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; import org.skywalking.apm.util.StringUtil; -import org.skywalking.apm.agent.core.context.tag.Tags; -import java.sql.SQLException; - -/** - * {@link ConnectionTracing} create span with the {@link Span#operationName} start with - * "JDBC/Connection/"and set {@link ConnectionInfo#dbType} to the {@link Tags#COMPONENT}. - *

- * Notice: {@link Span#peerHost} may be is null if database connection url don't contain multiple hosts. - * - * @author zhangxin - */ public class ConnectionTracing { public static R execute(java.sql.Connection realConnection, - ConnectionInfo connectInfo, String method, String sql, Executable exec) + ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - AbstractSpan span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/Connection/" + method); - Tags.DB_TYPE.set(span, "sql"); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); - Tags.DB_STATEMENT.set(span, sql); - Tags.COMPONENT.set(span, connectInfo.getDBType()); - Tags.SPAN_LAYER.asDB(span); + String remotePeer; if (!StringUtil.isEmpty(connectInfo.getHosts())) { - span.setPeers(connectInfo.getHosts()); + remotePeer = connectInfo.getHosts(); } else { - span.setPeerHost(connectInfo.getHost()); - span.setPort(connectInfo.getPort()); + remotePeer = connectInfo.getHost() + ":" + connectInfo.getPort(); } + AbstractSpan span = ContextManager.createExitSpan(connectInfo.getDBType() + "/JDBI/Connection/" + method, new ContextCarrier(), remotePeer); + Tags.DB_TYPE.set(span, "sql"); + Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); + Tags.DB_STATEMENT.set(span, sql); + span.setComponent(connectInfo.getComponent()); + SpanLayer.asDB(span); return exec.exe(realConnection, sql); } catch (SQLException e) { AbstractSpan span = ContextManager.activeSpan(); - Tags.ERROR.set(span, true); + span.errorOccurred(); span.log(e); throw e; } finally { diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/PreparedStatementTracing.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/PreparedStatementTracing.java index 1b351bffaceebe2f50c6ce0b430a62f9c3a32223..3d94b45aabb509f9c3e7a734b29131c75e5e41cc 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/PreparedStatementTracing.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/PreparedStatementTracing.java @@ -1,42 +1,37 @@ package org.skywalking.apm.plugin.jdbc; import java.sql.SQLException; +import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; import org.skywalking.apm.util.StringUtil; -/** - * {@link PreparedStatementTracing} create span with the {@link Span#operationName} start with - * "JDBC/PreparedStatement/"and set {@link ConnectionInfo#dbType} to the {@link Tags#COMPONENT}. - *

- * Notice: {@link Span#peerHost} may be is null if database connection url don't contain multiple hosts. - * - * @author zhangxin - */ public class PreparedStatementTracing { public static R execute(java.sql.PreparedStatement realStatement, - ConnectionInfo connectInfo, String method, String sql, Executable exec) + ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - AbstractSpan span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/PreparedStatement/" + method); - Tags.DB_TYPE.set(span, "sql"); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); - Tags.DB_STATEMENT.set(span, sql); - Tags.COMPONENT.set(span, connectInfo.getDBType()); + String remotePeer; if (!StringUtil.isEmpty(connectInfo.getHosts())) { - span.setPeers(connectInfo.getHosts()); + remotePeer = connectInfo.getHosts(); } else { - span.setPeerHost(connectInfo.getHost()); - span.setPort(connectInfo.getPort()); + remotePeer = connectInfo.getHost() + ":" + connectInfo.getPort(); } - Tags.SPAN_LAYER.asDB(span); + + AbstractSpan span = ContextManager.createExitSpan(connectInfo.getDBType() + "/JDBI/PreparedStatement/" + method, new ContextCarrier(), remotePeer); + Tags.DB_TYPE.set(span, "sql"); + Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); + Tags.DB_STATEMENT.set(span, sql); + span.setComponent(connectInfo.getComponent()); + + SpanLayer.asDB(span); return exec.exe(realStatement, sql); } catch (SQLException e) { AbstractSpan span = ContextManager.activeSpan(); - Tags.ERROR.set(span, true); + span.errorOccurred(); span.log(e); throw e; } finally { diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/StatementTracing.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/StatementTracing.java index dae0e1e7039f20c12af3ae21a32d7910dcbc621d..6d663d8eb7707fa3b55c5b49693e346b236f43e6 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/StatementTracing.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/StatementTracing.java @@ -1,41 +1,35 @@ package org.skywalking.apm.plugin.jdbc; import java.sql.SQLException; +import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; import org.skywalking.apm.util.StringUtil; -/** - * {@link StatementTracing} create span with the {@link Span#operationName} start with - * "JDBC/Statement/"and set {@link ConnectionInfo#dbType} to the {@link Tags#COMPONENT}. - *

- * Notice: {@link Span#peerHost} may be is null if database connection url don't contain multiple hosts. - * - * @author zhangxin - */ public class StatementTracing { public static R execute(java.sql.Statement realStatement, - ConnectionInfo connectInfo, String method, String sql, Executable exec) + ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - AbstractSpan span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/Statement/" + method); - Tags.DB_TYPE.set(span, "sql"); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); - Tags.DB_STATEMENT.set(span, sql); - Tags.COMPONENT.set(span, connectInfo.getDBType()); - Tags.SPAN_LAYER.asDB(span); + String remotePeer; if (!StringUtil.isEmpty(connectInfo.getHosts())) { - span.setPeers(connectInfo.getHosts()); + remotePeer = connectInfo.getHosts(); } else { - span.setPeerHost(connectInfo.getHost()); - span.setPort(connectInfo.getPort()); + remotePeer = connectInfo.getHost() + ":" + connectInfo.getPort(); } + + AbstractSpan span = ContextManager.createExitSpan(connectInfo.getDBType() + "/JDBI/Statement/" + method, new ContextCarrier(), remotePeer); + Tags.DB_TYPE.set(span, "sql"); + Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); + Tags.DB_STATEMENT.set(span, sql); + span.setComponent(connectInfo.getDBType()); + SpanLayer.asDB(span); return exec.exe(realStatement, sql); } catch (SQLException e) { AbstractSpan span = ContextManager.activeSpan(); - Tags.ERROR.set(span, true); + span.errorOccurred(); span.log(e); throw e; } finally { diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/H2URLParser.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/H2URLParser.java index fe03ca4cdb1ca5140c23e6dfe3b759a8476f5f4e..8c9bc5e0c9992a7d53a0576279947c42b3f65a05 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/H2URLParser.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/H2URLParser.java @@ -1,5 +1,6 @@ package org.skywalking.apm.plugin.jdbc.connectionurl.parser; +import org.skywalking.apm.network.trace.component.ComponentsDefine; import org.skywalking.apm.plugin.jdbc.ConnectionInfo; /** @@ -56,19 +57,19 @@ public class H2URLParser extends AbstractURLParser { public ConnectionInfo parse() { int[] databaseNameRangeIndex = fetchDatabaseNameRangeIndexFromURLForH2FileMode(); if (databaseNameRangeIndex != null) { - return new ConnectionInfo(H2_DB_TYPE, LOCALHOST, -1, fetchDatabaseNameFromURL(databaseNameRangeIndex)); + return new ConnectionInfo(ComponentsDefine.H2, H2_DB_TYPE, LOCALHOST, -1, fetchDatabaseNameFromURL(databaseNameRangeIndex)); } databaseNameRangeIndex = fetchDatabaseNameRangeIndexFromURLForH2MemMode(); if (databaseNameRangeIndex != null) { - return new ConnectionInfo(H2_DB_TYPE, LOCALHOST, -1, fetchDatabaseNameFromURL(databaseNameRangeIndex)); + return new ConnectionInfo(ComponentsDefine.H2, H2_DB_TYPE, LOCALHOST, -1, fetchDatabaseNameFromURL(databaseNameRangeIndex)); } String[] hostAndPort = fetchDatabaseHostsFromURL().split(":"); if (hostAndPort.length == 1) { - return new ConnectionInfo(H2_DB_TYPE, hostAndPort[0], DEFAULT_PORT, fetchDatabaseNameFromURL()); + return new ConnectionInfo(ComponentsDefine.H2, H2_DB_TYPE, hostAndPort[0], DEFAULT_PORT, fetchDatabaseNameFromURL()); } else { - return new ConnectionInfo(H2_DB_TYPE, hostAndPort[0], Integer.valueOf(hostAndPort[1]), fetchDatabaseNameFromURL()); + return new ConnectionInfo(ComponentsDefine.H2, H2_DB_TYPE, hostAndPort[0], Integer.valueOf(hostAndPort[1]), fetchDatabaseNameFromURL()); } } diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java index fe6255f84f9ff2276513813b933aff42168fc09c..e460f56475916bb1c88fe6f3667f4ed0c9205068 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java @@ -1,5 +1,6 @@ package org.skywalking.apm.plugin.jdbc.connectionurl.parser; +import org.skywalking.apm.network.trace.component.ComponentsDefine; import org.skywalking.apm.plugin.jdbc.ConnectionInfo; /** @@ -52,13 +53,13 @@ public class MysqlURLParser extends AbstractURLParser { sb.append(host + ","); } } - return new ConnectionInfo(DB_TYPE, sb.toString(), fetchDatabaseNameFromURL()); + return new ConnectionInfo(ComponentsDefine.MYSQL, DB_TYPE, sb.toString(), fetchDatabaseNameFromURL()); } else { String[] hostAndPort = hostSegment[0].split(":"); if (hostAndPort.length != 1) { - return new ConnectionInfo(DB_TYPE, hostAndPort[0], Integer.valueOf(hostAndPort[1]), fetchDatabaseNameFromURL()); + return new ConnectionInfo(ComponentsDefine.MYSQL, DB_TYPE, hostAndPort[0], Integer.valueOf(hostAndPort[1]), fetchDatabaseNameFromURL()); } else { - return new ConnectionInfo(DB_TYPE, hostAndPort[0], DEFAULT_PORT, fetchDatabaseNameFromURL()); + return new ConnectionInfo(ComponentsDefine.MYSQL, DB_TYPE, hostAndPort[0], DEFAULT_PORT, fetchDatabaseNameFromURL()); } } } diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java index 457a16977442e585537323fce1a8f44315ef7f08..31bc850c27424179f6e267d777d82e28d5b9e721 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java @@ -1,5 +1,6 @@ package org.skywalking.apm.plugin.jdbc.connectionurl.parser; +import org.skywalking.apm.network.trace.component.ComponentsDefine; import org.skywalking.apm.plugin.jdbc.ConnectionInfo; /** @@ -43,9 +44,9 @@ public class OracleURLParser extends AbstractURLParser { String[] hostSegment = splitDatabaseAddress(host); String databaseName = url.substring(hostRangeIndex[1] + 1); if (hostSegment.length == 1) { - return new ConnectionInfo(DB_TYPE, host, DEFAULT_PORT, databaseName); + return new ConnectionInfo(ComponentsDefine.ORACLE, DB_TYPE, host, DEFAULT_PORT, databaseName); } else { - return new ConnectionInfo(DB_TYPE, hostSegment[0], Integer.valueOf(hostSegment[1]), databaseName); + return new ConnectionInfo(ComponentsDefine.ORACLE, DB_TYPE, hostSegment[0], Integer.valueOf(hostSegment[1]), databaseName); } } diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/AbstractDatabaseInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/AbstractDatabaseInstrumentation.java index c7673a6137e5cb654850b5874c275ab9c6aa293c..9d7a3fc0230d8e3615352e95f0b4e4a7107a61c5 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/AbstractDatabaseInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/AbstractDatabaseInstrumentation.java @@ -39,6 +39,10 @@ public abstract class AbstractDatabaseInstrumentation extends ClassInstanceMetho public String getMethodsInterceptor() { return INTERCEPT_CLASS; } + + @Override public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/JDBCDriverInterceptor.java b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/JDBCDriverInterceptor.java index d5f5be32421d71982f00246e95a489a1e01cc66e..15ae0c2a50aecc7cc4bbfff5e99c7acfba188092 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/JDBCDriverInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-plugin/src/main/java/org/skywalking/apm/plugin/jdbc/define/JDBCDriverInterceptor.java @@ -1,12 +1,12 @@ package org.skywalking.apm.plugin.jdbc.define; +import java.sql.Connection; +import java.util.Properties; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.skywalking.apm.plugin.jdbc.SWConnection; -import java.sql.Connection; -import java.util.Properties; - /** * {@link JDBCDriverInterceptor} return {@link SWConnection} when {@link java.sql.Driver} to create connection, * instead of the {@link Connection} instance. @@ -14,23 +14,20 @@ import java.util.Properties; * @author zhangxin */ public class JDBCDriverInterceptor implements InstanceMethodsAroundInterceptor { - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - // do nothing - } - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - return new SWConnection((String) interceptorContext.allArguments()[0], - (Properties) interceptorContext.allArguments()[1], (Connection) ret); + @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + } - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - // do nothing. + @Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + return new SWConnection((String)allArguments[0], + (Properties)allArguments[1], (Connection)ret); } + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + + } } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithHostAndPortArgInterceptor.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithHostAndPortArgInterceptor.java index 79acd06a5fcf7c99b05ce9808d239efcb6ef667d..b9b04a820136c7fa8d949905949786de32f1aab3 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithHostAndPortArgInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithHostAndPortArgInterceptor.java @@ -1,25 +1,14 @@ package org.skywalking.apm.plugin.jedis.v2; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import redis.clients.jedis.HostAndPort; -import static org.skywalking.apm.plugin.jedis.v2.JedisMethodInterceptor.*; - -/** - * {@link JedisClusterConstructorWithHostAndPortArgInterceptor} record the host and port information from {@link - * EnhancedClassInstanceContext#context}, and each host and port will spilt ;. - * - * @author zhangxin - */ public class JedisClusterConstructorWithHostAndPortArgInterceptor implements InstanceConstructorInterceptor { @Override - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { - StringBuilder redisConnInfo = new StringBuilder(); - HostAndPort hostAndPort = (HostAndPort) interceptorContext.allArguments()[0]; - redisConnInfo.append(hostAndPort.toString()); - context.set(KEY_OF_REDIS_CONN_INFO, redisConnInfo.toString()); - context.set(KEY_OF_REDIS_HOST, hostAndPort.getHost()); - context.set(KEY_OF_REDIS_PORT, hostAndPort.getPort()); + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { + HostAndPort hostAndPort = (HostAndPort)allArguments[0]; + objInst.setSkyWalkingDynamicField(hostAndPort.getHost() + ":" + hostAndPort.getPort()); } } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithListHostAndPortArgInterceptor.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithListHostAndPortArgInterceptor.java index 8e86235363183bb9f2066b01cdaeb2532be81ec7..ec9b0fdadfbe7c9a435ddb7700b9f606c6678e84 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithListHostAndPortArgInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisClusterConstructorWithListHostAndPortArgInterceptor.java @@ -1,25 +1,20 @@ package org.skywalking.apm.plugin.jedis.v2; +import java.util.Set; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import redis.clients.jedis.HostAndPort; -import java.util.Set; - -/** - * {@link JedisClusterConstructorWithHostAndPortArgInterceptor} record the host and port information that fetch - * from {@link EnhancedClassInstanceContext#context}, and each host and port will spilt ;. - * - * @author zhangxin - */ public class JedisClusterConstructorWithListHostAndPortArgInterceptor implements InstanceConstructorInterceptor { + @Override - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { StringBuilder redisConnInfo = new StringBuilder(); - Set hostAndPorts = (Set) interceptorContext.allArguments()[0]; + Set hostAndPorts = (Set)allArguments[0]; for (HostAndPort hostAndPort : hostAndPorts) { redisConnInfo.append(hostAndPort.toString()).append(";"); } - context.set(JedisMethodInterceptor.KEY_OF_REDIS_CONN_INFO, redisConnInfo.toString()); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_HOSTS, redisConnInfo.toString()); + + objInst.setSkyWalkingDynamicField(redisConnInfo.toString()); } } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithShardInfoArgInterceptor.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithShardInfoArgInterceptor.java index 549ca1b78d6179a6409809de23822f7f2f50a4c5..df6aeac3c29a7850ca6d5b5afbbc7d411515ab78 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithShardInfoArgInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithShardInfoArgInterceptor.java @@ -1,23 +1,16 @@ package org.skywalking.apm.plugin.jedis.v2; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import redis.clients.jedis.JedisShardInfo; -/** - * {@link JedisClusterConstructorWithHostAndPortArgInterceptor} will record the host - * and port information from {@link EnhancedClassInstanceContext#context}. - * - * @author zhangxin - */ public class JedisConstructorWithShardInfoArgInterceptor implements InstanceConstructorInterceptor { @Override - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { String redisConnInfo; - JedisShardInfo shardInfo = (JedisShardInfo) interceptorContext.allArguments()[0]; + JedisShardInfo shardInfo = (JedisShardInfo)allArguments[0]; redisConnInfo = shardInfo.getHost() + ":" + shardInfo.getPort(); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_CONN_INFO, redisConnInfo); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_HOST, shardInfo.getHost()); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_PORT, shardInfo.getPort()); + objInst.setSkyWalkingDynamicField(redisConnInfo); } } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithStringArgInterceptor.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithStringArgInterceptor.java index 78e6a9d0ea326be4e2f5cc722730722e1826a69d..0e3628c3be93bde07427e113ddefc637f8b1f435 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithStringArgInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithStringArgInterceptor.java @@ -1,25 +1,18 @@ package org.skywalking.apm.plugin.jedis.v2; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -/** - * {@link JedisClusterConstructorWithHostAndPortArgInterceptor} record the host - * and port information from {@link EnhancedClassInstanceContext#context}. - * - * @author zhangxin - */ public class JedisConstructorWithStringArgInterceptor implements InstanceConstructorInterceptor { @Override - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { - String host = (String) interceptorContext.allArguments()[0]; - int port = 6379; - if (interceptorContext.allArguments().length > 1) { - port = (Integer) interceptorContext.allArguments()[1]; + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { + String host = (String)allArguments[0]; + String port = "6379"; + if (allArguments.length > 1) { + port = String.valueOf(allArguments[1]); } - context.set(JedisMethodInterceptor.KEY_OF_REDIS_CONN_INFO, host + ":" + port); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_HOST, host); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_PORT, port); - } + objInst.setSkyWalkingDynamicField(host + ":" + port); + } } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithUriArgInterceptor.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithUriArgInterceptor.java index dfcd8dc2bef219e38014e3ce2cfd719619861063..d84e2034980d7d4908fb25290325cc7dcb168bda 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithUriArgInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisConstructorWithUriArgInterceptor.java @@ -1,24 +1,14 @@ package org.skywalking.apm.plugin.jedis.v2; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; - import java.net.URI; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -/** - * {@link JedisClusterConstructorWithHostAndPortArgInterceptor} record the host and port information that fetch - * from {@link EnhancedClassInstanceContext#context}. - * - * @author zhangxin - */ public class JedisConstructorWithUriArgInterceptor implements InstanceConstructorInterceptor { @Override - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { - String redisConnInfo; - URI uri = (URI) interceptorContext.allArguments()[0]; - redisConnInfo = uri.getHost() + ":" + uri.getPort(); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_CONN_INFO, redisConnInfo); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_HOST, uri.getHost()); - context.set(JedisMethodInterceptor.KEY_OF_REDIS_PORT, uri.getPort()); + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { + URI uri = (URI)allArguments[0]; + objInst.setSkyWalkingDynamicField(uri.getHost() + ":" + uri.getPort()); } } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisMethodInterceptor.java index de20b3731246aa22dbbee5a494f49226b2159990..b0c9f1388c14b16217b02edaa8c31c593b1f06f7 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/JedisMethodInterceptor.java @@ -1,106 +1,40 @@ package org.skywalking.apm.plugin.jedis.v2; +import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.skywalking.apm.agent.core.plugin.interceptor.assist.NoConcurrencyAccessObject; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.skywalking.apm.util.StringUtil; +import org.skywalking.apm.network.trace.component.ComponentsDefine; -/** - * {@link JedisMethodInterceptor} intercept all method of {@link redis.clients.jedis.Jedis} - * or {@link redis.clients.jedis.JedisCluster}. {@link JedisMethodInterceptor} record - * the redis host, operation name and the key of the operation. - * - * @author zhangxin - */ -public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements InstanceMethodsAroundInterceptor { - /** - * The key name that redis connection information in {@link EnhancedClassInstanceContext#context}. - */ - protected static final String KEY_OF_REDIS_CONN_INFO = "REDIS_CONNECTION_INFO"; - /** - * The key name that multiple redis hosts in {@link EnhancedClassInstanceContext#context}. - */ - protected static final String KEY_OF_REDIS_HOSTS = "KEY_OF_REDIS_HOSTS"; - /** - * The key name that redis host in {@link EnhancedClassInstanceContext#context}. - * it will be null if the value that fetch from {@link EnhancedClassInstanceContext#context} - * by using {@link #KEY_OF_REDIS_HOSTS} is not null. - */ - protected static final String KEY_OF_REDIS_HOST = "KEY_OF_REDIS_HOST"; - /** - * The key name that redis port in {@link EnhancedClassInstanceContext#context}. - * It can not be null if the value that fetch from {@link EnhancedClassInstanceContext#context} by - * using {@link #KEY_OF_REDIS_HOST} is not null. - */ - protected static final String KEY_OF_REDIS_PORT = "KEY_OF_REDIS_PORT"; +public class JedisMethodInterceptor implements InstanceMethodsAroundInterceptor { - private static final String REDIS_COMPONENT = "Redis"; + @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + String peer = String.valueOf(objInst.getSkyWalkingDynamicField()); + AbstractSpan span = ContextManager.createExitSpan("Jedis/" + methodName, new ContextCarrier(), peer); + span.setComponent(ComponentsDefine.REDIS); + Tags.DB_TYPE.set(span, "Redis"); + SpanLayer.asDB(span); - @Override - public void beforeMethod(final EnhancedClassInstanceContext context, - final InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { - this.whenEnter(context, interceptorContext); - } - - /** - * set peer host information for the current active span. - */ - private void tagPeer(AbstractSpan span, EnhancedClassInstanceContext context) { - String redisHosts = (String)context.get(KEY_OF_REDIS_HOSTS); - if (!StringUtil.isEmpty(redisHosts)) { - span.setPeers((String)context.get(KEY_OF_REDIS_HOST)); - } else { - span.setPeerHost((String)context.get(KEY_OF_REDIS_HOST)); - Integer port = (Integer)context.get(KEY_OF_REDIS_PORT); - if (port != null) { - span.setPort(port); - } + if (allArguments.length > 0 && allArguments[0] instanceof String) { + Tags.DB_STATEMENT.set(span, methodName + " " + allArguments[0]); } } - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - this.whenExist(context); + @Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + ContextManager.stopSpan(); return ret; } - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - ContextManager.activeSpan().log(t); - } - - @Override - protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - AbstractSpan span = ContextManager.createSpan("Jedis/" + interceptorContext.methodName()); - Tags.COMPONENT.set(span, REDIS_COMPONENT); - Tags.DB_TYPE.set(span, REDIS_COMPONENT); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - tagPeer(span, context); - Tags.SPAN_LAYER.asDB(span); - String host = (String)context.get(KEY_OF_REDIS_HOST); - if (StringUtil.isEmpty(host)) { - span.setPeers((String)context.get(KEY_OF_REDIS_HOSTS)); - } else { - span.setPeerHost(host); - Integer port = (Integer)context.get(KEY_OF_REDIS_PORT); - if (port != null) { - span.setPort(port); - } - } - - if (interceptorContext.allArguments().length > 0 - && interceptorContext.allArguments()[0] instanceof String) { - Tags.DB_STATEMENT.set(span, interceptorContext.methodName() + " " + interceptorContext.allArguments()[0]); - } - } - - @Override - protected void exit() { - ContextManager.stopSpan(); + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan span = ContextManager.activeSpan(); + span.errorOccurred(); + span.log(t); } } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/RedisMethodMatch.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/RedisMethodMatch.java new file mode 100644 index 0000000000000000000000000000000000000000..a6da5d7575bca70791963bcf9c75c66b532a3e39 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/RedisMethodMatch.java @@ -0,0 +1,69 @@ +package org.skywalking.apm.plugin.jedis.v2; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; + +import static net.bytebuddy.matcher.ElementMatchers.named; + +public enum RedisMethodMatch { + INSTANCE; + + private ElementMatcher.Junction getIntersectionalMethodMacher() { + return named("zcount").or(named("sunionstore")).or(named("zunionstore")) + .or(named("del")).or(named("zinterstore")).or(named("echo")) + .or(named("hscan")).or(named("psubscribe")).or(named("type")) + .or(named("sinterstore")).or(named("setex")).or(named("zlexcount")) + .or(named("brpoplpush")).or(named("bitcount")).or(named("llen")) + .or(named("zscan")).or(named("lpushx")).or(named("bitpos")) + .or(named("setnx")).or(named("hvals")).or(named("evalsha")) + .or(named("substr")).or(named("geodist")).or(named("zrangeByLex")) + .or(named("geoadd")).or(named("expire")).or(named("bitop")) + .or(named("zrangeByScore")).or(named("smove")).or(named("lset")) + .or(named("decrBy")).or(named("pttl")).or(named("scan")) + .or(named("zrank")).or(named("blpop")).or(named("rpoplpush")) + .or(named("zremrangeByLex")).or(named("get")).or(named("lpop")) + .or(named("persist")).or(named("scriptExists")).or(named("georadius")) + .or(named("set")).or(named("srandmember")).or(named("incr")).or(named("setbit")) + .or(named("hexists")).or(named("expireAt")).or(named("pexpire")).or(named("zcard")) + .or(named("bitfield")).or(named("zrevrangeByLex")).or(named("sinter")).or(named("srem")) + .or(named("getrange")).or(named("rename")).or(named("zrevrank")).or(named("exists")) + .or(named("setrange")).or(named("zremrangeByRank")).or(named("sadd")).or(named("sdiff")) + .or(named("zrevrange")).or(named("getbit")).or(named("scard")).or(named("sdiffstore")) + .or(named("zrevrangeByScore")).or(named("zincrby")).or(named("rpushx")).or(named("psetex")) + .or(named("zrevrangeWithScores")).or(named("strlen")).or(named("hdel")).or(named("zremrangeByScore")) + .or(named("geohash")).or(named("brpop")).or(named("lrem")).or(named("hlen")).or(named("decr")) + .or(named("scriptLoad")).or(named("lpush")).or(named("lindex")).or(named("zrange")).or(named("incrBy")) + .or(named("getSet")).or(named("ltrim")).or(named("incrByFloat")).or(named("rpop")).or(named("sort")) + .or(named("zrevrangeByScoreWithScores")).or(named("pfadd")).or(named("eval")).or(named("linsert")) + .or(named("pfcount")).or(named("hkeys")).or(named("hsetnx")).or(named("hincrBy")).or(named("hgetAll")) + .or(named("hset")).or(named("spop")).or(named("zrangeWithScores")).or(named("hincrByFloat")) + .or(named("hmset")).or(named("renamenx")).or(named("zrem")).or(named("msetnx")).or(named("hmget")) + .or(named("sunion")).or(named("hget")).or(named("zadd")).or(named("move")).or(named("subscribe")) + .or(named("geopos")).or(named("mset")).or(named("zrangeByScoreWithScores")).or(named("zscore")) + .or(named("pexpireAt")).or(named("georadiusByMember")).or(named("ttl")).or(named("lrange")) + .or(named("smembers")).or(named("pfmerge")).or(named("rpush")).or(named("publish")) + .or(named("mget")).or(named("sscan")).or(named("append")).or(named("sismember")); + } + + public ElementMatcher getJedisMethodMatcher() { + return getIntersectionalMethodMacher().or(named("sentinelMasters")).or(named("clusterReplicate")).or(named("readonly")) + .or(named("randomKey")).or(named("clusterInfo")).or(named("pubsubNumSub")) + .or(named("sentinelSlaves")).or(named("clusterSetSlotImporting")).or(named("clusterSlaves")) + .or(named("clusterFailover")).or(named("clusterSetSlotMigrating")).or(named("watch")) + .or(named("clientKill")).or(named("clusterKeySlot")).or(named("clusterCountKeysInSlot")) + .or(named("sentinelGetMasterAddrByName")).or(named("objectRefcount")).or(named("clusterMeet")) + .or(named("sentinelSet")).or(named("clusterSetSlotNode")).or(named("clusterAddSlots")) + .or(named("pubsubNumPat")).or(named("slowlogGet")).or(named("sentinelReset")).or(named("clusterNodes")) + .or(named("sentinelMonitor")).or(named("configGet")).or(named("objectIdletime")) + .or(named("pubsubChannels")).or(named("getParams")).or(named("sentinelRemove")) + .or(named("migrate")).or(named("clusterForget")).or(named("asking")).or(named("keys")) + .or(named("clientSetname")).or(named("clusterSaveConfig")).or(named("configSet")) + .or(named("dump")).or(named("clusterFlushSlots")).or(named("clusterGetKeysInSlot")) + .or(named("clusterReset")).or(named("restore")).or(named("clusterDelSlots")) + .or(named("sentinelFailover")).or(named("clusterSetSlotStable")).or(named("objectEncoding")); + } + + public ElementMatcher getJedisClusterMethodMatcher() { + return getIntersectionalMethodMacher(); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisClusterInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisClusterInstrumentation.java index a3f73c45c173d26a99d090168ac425593720f07f..5a9ebd9f304578bedfdd3e57cc5de8a3b0e2cd1c 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisClusterInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisClusterInstrumentation.java @@ -1,18 +1,17 @@ package org.skywalking.apm.plugin.jedis.v2.define; +import java.util.Set; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; -import org.skywalking.apm.agent.core.plugin.bytebuddy.AllObjectDefaultMethodsMatch; import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.skywalking.apm.plugin.jedis.v2.JedisClusterConstructorWithHostAndPortArgInterceptor; import org.skywalking.apm.plugin.jedis.v2.JedisClusterConstructorWithListHostAndPortArgInterceptor; import org.skywalking.apm.plugin.jedis.v2.JedisMethodInterceptor; +import org.skywalking.apm.plugin.jedis.v2.RedisMethodMatch; -import java.util.Set; - -import static net.bytebuddy.matcher.ElementMatchers.*; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static org.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; /** @@ -71,13 +70,17 @@ public class JedisClusterInstrumentation extends ClassInstanceMethodsEnhancePlug new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return any().and(not(AllObjectDefaultMethodsMatch.INSTANCE)); + return RedisMethodMatch.INSTANCE.getJedisClusterMethodMatcher(); } @Override public String getMethodsInterceptor() { return METHOD_INTERCEPT_CLASS; } + + @Override public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisInstrumentation.java index 466c5a203084460b9f4a2a99cf30a4d11a930eb4..93e14fc4d1cf545fb6cf329e3011b7843d555a90 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/define/JedisInstrumentation.java @@ -1,19 +1,17 @@ package org.skywalking.apm.plugin.jedis.v2.define; +import java.net.URI; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; -import org.skywalking.apm.agent.core.plugin.bytebuddy.AllObjectDefaultMethodsMatch; import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.skywalking.apm.plugin.jedis.v2.JedisConstructorWithShardInfoArgInterceptor; import org.skywalking.apm.plugin.jedis.v2.JedisConstructorWithUriArgInterceptor; import org.skywalking.apm.plugin.jedis.v2.JedisMethodInterceptor; +import org.skywalking.apm.plugin.jedis.v2.RedisMethodMatch; -import java.net.URI; - -import static net.bytebuddy.matcher.ElementMatchers.*; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static org.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; /** @@ -85,21 +83,17 @@ public class JedisInstrumentation extends ClassInstanceMethodsEnhancePluginDefin new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return not(ElementMatchers.isPrivate() - .or(AllObjectDefaultMethodsMatch.INSTANCE) - .or(named("close")) - .or(named("getDB")) - .or(named("connect")) - .or(named("setDataSource")) - .or(named("resetState")) - .or(named("clusterSlots")) - .or(named("checkIsInMultiOrPipeline"))); + return RedisMethodMatch.INSTANCE.getJedisMethodMatcher(); } @Override public String getMethodsInterceptor() { return JEDIS_METHOD_INTERCET_CLASS; } + + @Override public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBMethodInterceptor.java index 3a176c194d383f43330c8d612d864c59a0863219..ee7cf16df2e9de8daa005f4aa496ea8528896808 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBMethodInterceptor.java @@ -1,10 +1,13 @@ package org.skywalking.apm.plugin.mongodb.v3; import com.mongodb.ReadPreference; +import com.mongodb.ServerAddress; import com.mongodb.bulk.DeleteRequest; import com.mongodb.bulk.InsertRequest; import com.mongodb.bulk.UpdateRequest; import com.mongodb.bulk.WriteRequest; +import com.mongodb.connection.Cluster; +import com.mongodb.connection.ServerDescription; import com.mongodb.operation.CountOperation; import com.mongodb.operation.CreateCollectionOperation; import com.mongodb.operation.CreateIndexesOperation; @@ -27,11 +30,16 @@ import com.mongodb.operation.WriteOperation; import java.util.List; import org.bson.BsonDocument; import org.skywalking.apm.agent.core.conf.Config; +import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.skywalking.apm.network.trace.component.ComponentsDefine; /** * {@link MongoDBMethodInterceptor} intercept method of {@link com.mongodb.Mongo#execute(ReadOperation, ReadPreference)} @@ -40,16 +48,10 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptR * * @author baiyang */ -public class MongoDBMethodInterceptor implements InstanceMethodsAroundInterceptor { +public class MongoDBMethodInterceptor implements InstanceMethodsAroundInterceptor, InstanceConstructorInterceptor { - /** - * The key name that MongoDB host in {@link EnhancedClassInstanceContext#context}. - */ static final String MONGODB_HOST = "MONGODB_HOST"; - /** - * The key name that MongoDB port in {@link EnhancedClassInstanceContext#context}. - */ static final String MONGODB_PORT = "MONGODB_PORT"; private static final String MONGODB_COMPONENT = "MongoDB"; @@ -60,40 +62,6 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto private static final String EMPTY = ""; - @Override - public void beforeMethod(final EnhancedClassInstanceContext context, - final InstanceMethodInvokeContext interceptorContext, final MethodInterceptResult result) { - Object[] arguments = interceptorContext.allArguments(); - - String methodName = arguments[0].getClass().getSimpleName(); - AbstractSpan span = ContextManager.createSpan(METHOD + methodName); - Tags.COMPONENT.set(span, MONGODB_COMPONENT); - Tags.DB_TYPE.set(span, MONGODB_COMPONENT); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.SPAN_LAYER.asDB(span); - - if (Config.Plugin.MongoDB.TRACE_PARAM) { - Tags.DB_STATEMENT.set(span, methodName + " " + this.getTraceParam(arguments[0])); - } - - } - - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - AbstractSpan span = ContextManager.activeSpan(); - span.setPeerHost((String)context.get(MONGODB_HOST)); - span.setPort((Integer)context.get(MONGODB_PORT)); - ContextManager.stopSpan(); - return ret; - } - - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - ContextManager.activeSpan().log(t); - } - /** * Convert ReadOperation interface or WriteOperation interface to the implementation class. Get the method name and * filter info. @@ -101,55 +69,55 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto @SuppressWarnings("rawtypes") private String getTraceParam(Object obj) { if (obj instanceof CountOperation) { - BsonDocument filter = ((CountOperation) obj).getFilter(); + BsonDocument filter = ((CountOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof DistinctOperation) { - BsonDocument filter = ((DistinctOperation) obj).getFilter(); + BsonDocument filter = ((DistinctOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof FindOperation) { - BsonDocument filter = ((FindOperation) obj).getFilter(); + BsonDocument filter = ((FindOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof GroupOperation) { - BsonDocument filter = ((GroupOperation) obj).getFilter(); + BsonDocument filter = ((GroupOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof ListCollectionsOperation) { - BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); + BsonDocument filter = ((ListCollectionsOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof MapReduceWithInlineResultsOperation) { - BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); + BsonDocument filter = ((ListCollectionsOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof DeleteOperation) { - List writeRequestList = ((DeleteOperation) obj).getDeleteRequests(); + List writeRequestList = ((DeleteOperation)obj).getDeleteRequests(); return getFilter(writeRequestList); } else if (obj instanceof InsertOperation) { - List writeRequestList = ((InsertOperation) obj).getInsertRequests(); + List writeRequestList = ((InsertOperation)obj).getInsertRequests(); return getFilter(writeRequestList); } else if (obj instanceof UpdateOperation) { - List writeRequestList = ((UpdateOperation) obj).getUpdateRequests(); + List writeRequestList = ((UpdateOperation)obj).getUpdateRequests(); return getFilter(writeRequestList); } else if (obj instanceof CreateCollectionOperation) { - String filter = ((CreateCollectionOperation) obj).getCollectionName(); + String filter = ((CreateCollectionOperation)obj).getCollectionName(); return limitFilter(filter); } else if (obj instanceof CreateIndexesOperation) { - List filter = ((CreateIndexesOperation) obj).getIndexNames(); + List filter = ((CreateIndexesOperation)obj).getIndexNames(); return limitFilter(filter.toString()); } else if (obj instanceof CreateViewOperation) { - String filter = ((CreateViewOperation) obj).getViewName(); + String filter = ((CreateViewOperation)obj).getViewName(); return limitFilter(filter); } else if (obj instanceof FindAndDeleteOperation) { - BsonDocument filter = ((FindAndDeleteOperation) obj).getFilter(); + BsonDocument filter = ((FindAndDeleteOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof FindAndReplaceOperation) { - BsonDocument filter = ((FindAndReplaceOperation) obj).getFilter(); + BsonDocument filter = ((FindAndReplaceOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof FindAndUpdateOperation) { - BsonDocument filter = ((FindAndUpdateOperation) obj).getFilter(); + BsonDocument filter = ((FindAndUpdateOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof MapReduceToCollectionOperation) { - BsonDocument filter = ((MapReduceToCollectionOperation) obj).getFilter(); + BsonDocument filter = ((MapReduceToCollectionOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof MixedBulkWriteOperation) { - List writeRequestList = ((MixedBulkWriteOperation) obj).getWriteRequests(); + List writeRequestList = ((MixedBulkWriteOperation)obj).getWriteRequests(); return getFilter(writeRequestList); } else { return EMPTY; @@ -160,11 +128,11 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto StringBuilder params = new StringBuilder(); for (WriteRequest request : writeRequestList) { if (request instanceof InsertRequest) { - params.append(((InsertRequest) request).getDocument().toString()).append(","); + params.append(((InsertRequest)request).getDocument().toString()).append(","); } else if (request instanceof DeleteRequest) { - params.append(((DeleteRequest) request).getFilter()).append(","); + params.append(((DeleteRequest)request).getFilter()).append(","); } else if (request instanceof UpdateRequest) { - params.append(((UpdateRequest) request).getFilter()).append(","); + params.append(((UpdateRequest)request).getFilter()).append(","); } if (params.length() > FILTER_LENGTH_LIMIT) { params.append("..."); @@ -183,4 +151,45 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto } } + @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + Object[] arguments = allArguments; + + String executeMethod = arguments[0].getClass().getSimpleName(); + String remotePeer = (String)objInst.getSkyWalkingDynamicField(); + AbstractSpan span = ContextManager.createExitSpan(METHOD + methodName, new ContextCarrier(), remotePeer); + span.setComponent(ComponentsDefine.MONGODB); + Tags.DB_TYPE.set(span, MONGODB_COMPONENT); + SpanLayer.asDB(span); + + if (Config.Plugin.MongoDB.TRACE_PARAM) { + Tags.DB_STATEMENT.set(span, executeMethod + " " + this.getTraceParam(arguments[0])); + } + + } + + @Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + ContextManager.stopSpan(); + return ret; + } + + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan activeSpan = ContextManager.activeSpan(); + activeSpan.errorOccurred(); + activeSpan.log(t); + } + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { + Cluster cluster = (Cluster)allArguments[0]; + StringBuilder peers = new StringBuilder(); + for (ServerDescription description : cluster.getDescription().getServerDescriptions()) { + ServerAddress address = description.getAddress(); + peers.append(address.getHost() + ":" + address.getPort() + ";"); + } + + objInst.setSkyWalkingDynamicField(peers.subSequence(0, peers.length() - 1).toString()); + } } diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java deleted file mode 100644 index bed72e97649039e390f8dc8ae090f34039dde5a0..0000000000000000000000000000000000000000 --- a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.skywalking.apm.plugin.mongodb.v3; - -import com.mongodb.ReadPreference; -import com.mongodb.ServerAddress; -import com.mongodb.binding.ReadBinding; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; - -/** - * {@link MongoDBReadBindingInterceptor} record the host and port information - * from {@link EnhancedClassInstanceContext#context}, - * - * @author baiyang - */ -public class MongoDBReadBindingInterceptor implements - InstanceMethodsAroundInterceptor { - - @Override - public void beforeMethod(EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - } - - /** - * Execute after {@link com.mongodb.Mongo#getReadBinding(ReadPreference)}, - * record the host and port information - */ - @Override - public Object afterMethod(EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext, Object ret) { - ReadBinding readBinding = (ReadBinding) ret; - ServerAddress serverAddress = readBinding.getReadConnectionSource() - .getServerDescription().getAddress(); - String host = serverAddress.getHost(); - Integer port = serverAddress.getPort(); - context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); - context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); - return ret; - } - - @Override - public void handleMethodException(Throwable t, - EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - } - -} diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java deleted file mode 100644 index 9f45e3675e67949391e90965a9521b1cfeba8554..0000000000000000000000000000000000000000 --- a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.skywalking.apm.plugin.mongodb.v3; - -import com.mongodb.ServerAddress; -import com.mongodb.binding.WriteBinding; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; - -/** - * {@link MongoDBWriteBindingInterceptor} record the host and port information from {@link - * EnhancedClassInstanceContext#context} - * - * @author baiyang - */ -public class MongoDBWriteBindingInterceptor implements InstanceMethodsAroundInterceptor { - - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - } - - /** - * Execute after {@link com.mongodb.Mongo#getWriteBinding()}, - * record the host and port information - */ - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - WriteBinding writeBinding = (WriteBinding) ret; - ServerAddress serverAddress = writeBinding.getWriteConnectionSource().getServerDescription().getAddress(); - String host = serverAddress.getHost(); - Integer port = serverAddress.getPort(); - context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); - context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); - return ret; - } - - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - } - -} diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/define/MongoDBInstrumentation.java b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/define/MongoDBInstrumentation.java index 9ac6bac127628d4b11cf215577d3bef5be06ab7e..5dba13495a4b703ef67bedee992ed1a015578847 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/define/MongoDBInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/src/main/java/org/skywalking/apm/plugin/mongodb/v3/define/MongoDBInstrumentation.java @@ -1,33 +1,36 @@ package org.skywalking.apm.plugin.mongodb.v3.define; +import com.mongodb.connection.Cluster; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import org.skywalking.apm.plugin.mongodb.v3.MongoDBMethodInterceptor; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -/** - * {@link MongoDBInstrumentation} presents that skywalking intercepts {@link com.mongodb.Mongo#execute(com.mongodb.operation.ReadOperation, - * com.mongodb.ReadPreference)},{@link com.mongodb.Mongo#execute(com.mongodb.operation.WriteOperation)} by using {@link MongoDBMethodInterceptor}. - * - * @author baiyang - */ public class MongoDBInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "com.mongodb.Mongo"; - private static final String MONGDB_READ_BINDING_CLASS = "org.skywalking.apm.plugin.mongodb.v3.MongoDBReadBindingInterceptor"; - - private static final String MONGDB_WRITE_BINDING_CLASS = "org.skywalking.apm.plugin.mongodb.v3.MongoDBWriteBindingInterceptor"; - private static final String MONGDB_METHOD_INTERCET_CLASS = "org.skywalking.apm.plugin.mongodb.v3.MongoDBMethodInterceptor"; @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return null; + return new ConstructorInterceptPoint[] { + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArgument(1, Cluster.class); + } + + @Override + public String getConstructorInterceptor() { + return MONGDB_METHOD_INTERCET_CLASS; + } + } + }; } @Override @@ -43,28 +46,13 @@ public class MongoDBInstrumentation extends ClassInstanceMethodsEnhancePluginDef public String getMethodsInterceptor() { return MONGDB_METHOD_INTERCET_CLASS; } - }, new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named("getReadBinding"); - } @Override - public String getMethodsInterceptor() { - return MONGDB_READ_BINDING_CLASS; - } - }, new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named("getWriteBinding"); - } - - @Override - public String getMethodsInterceptor() { - return MONGDB_WRITE_BINDING_CLASS; - } + public boolean isOverrideArgs() { + return false; } - }; + } + }; } @Override diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanConsumerInterceptor.java b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanConsumerInterceptor.java index 73e7da2d77bcd335c7a03dfea8c917f78d67f69f..0cbb94cdf076d336fd733efa4595695c20423bc8 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanConsumerInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanConsumerInterceptor.java @@ -8,71 +8,60 @@ import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.skywalking.apm.network.trace.component.ComponentsDefine; /** * {@link MotanProviderInterceptor} create span by fetch request url from - * {@link EnhancedClassInstanceContext#context} and transport serialized context + * {@link EnhancedInstance#getSkyWalkingDynamicField()} and transport serialized context * data to provider side through {@link Request#setAttachment(String, String)}. * * @author zhangxin */ public class MotanConsumerInterceptor implements InstanceConstructorInterceptor, InstanceMethodsAroundInterceptor { - - /** - * The - */ - private static final String KEY_NAME_OF_REQUEST_URL = "REQUEST_URL"; - - /** - * Motan component - */ - private static final String MOTAN_COMPONENT = "Motan"; - @Override - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { - context.set(KEY_NAME_OF_REQUEST_URL, interceptorContext.allArguments()[1]); + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { + objInst.setSkyWalkingDynamicField(allArguments[1]); } @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - URL url = (URL) context.get(KEY_NAME_OF_REQUEST_URL); - Request request = (Request) interceptorContext.allArguments()[0]; - if (url != null) { - AbstractSpan span = ContextManager.createSpan(generateOperationName(url, request)); - span.setPeerHost(url.getHost()); - span.setPort(url.getPort()); - Tags.COMPONENT.set(span, MOTAN_COMPONENT); - Tags.URL.set(span, url.getIdentity()); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.SPAN_LAYER.asRPCFramework(span); + public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + URL url = (URL)objInst.getSkyWalkingDynamicField(); + Request request = (Request)allArguments[0]; + if (url != null) { ContextCarrier contextCarrier = new ContextCarrier(); - ContextManager.inject(contextCarrier); + String remotePeer = url.getHost() + " :" + url.getPort(); + AbstractSpan span = ContextManager.createExitSpan(generateOperationName(url, request), contextCarrier, remotePeer); + span.setComponent(ComponentsDefine.MOTAN); + Tags.URL.set(span, url.getIdentity()); + SpanLayer.asRPCFramework(span); request.setAttachment(Config.Plugin.Propagation.HEADER_NAME, contextCarrier.serialize()); } } - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - Response response = (Response) ret; + @Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + Response response = (Response)ret; if (response != null && response.getException() != null) { AbstractSpan span = ContextManager.activeSpan(); - Tags.ERROR.set(span, true); + span.errorOccurred(); span.log(response.getException()); } ContextManager.stopSpan(); return ret; } - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - ContextManager.activeSpan().log(t); + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan span = ContextManager.activeSpan(); + span.errorOccurred(); + span.log(t); } /** @@ -84,5 +73,4 @@ public class MotanConsumerInterceptor implements InstanceConstructorInterceptor, return new StringBuilder(serviceURI.getPath()).append(".").append(request.getMethodName()).append("(") .append(request.getParamtersDesc()).append(")").toString(); } - } diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanProviderInterceptor.java b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanProviderInterceptor.java index b0a09c2530feb896d237757d848b939e23f8f45c..58bb0bf5419a02d22aec401ffbae0cc221260a1d 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanProviderInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/MotanProviderInterceptor.java @@ -5,11 +5,12 @@ import com.weibo.api.motan.rpc.Response; import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; -import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.skywalking.apm.util.StringUtil; +import org.skywalking.apm.network.trace.component.ComponentsDefine; /** * Current trace segment will ref the trace segment if the serialized trace context that fetch from {@link @@ -21,44 +22,35 @@ import org.skywalking.apm.util.StringUtil; * @author zhangxin */ public class MotanProviderInterceptor implements InstanceMethodsAroundInterceptor { - /** - * Motan component - */ - private static final String MOTAN_COMPONENT = "Motan"; - - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - Request request = (Request) interceptorContext.allArguments()[0]; - AbstractSpan span = ContextManager.createSpan(generateViewPoint(request)); - Tags.COMPONENT.set(span, MOTAN_COMPONENT); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); - Tags.SPAN_LAYER.asRPCFramework(span); + @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + Request request = (Request)allArguments[0]; String serializedContextData = request.getAttachments().get(Config.Plugin.Propagation.HEADER_NAME); - if (!StringUtil.isEmpty(serializedContextData)) { - ContextManager.extract(new ContextCarrier().deserialize(serializedContextData)); - } + ContextCarrier contextCarrier = new ContextCarrier().deserialize(serializedContextData); + AbstractSpan span = ContextManager.createEntrySpan(generateViewPoint(request), contextCarrier); + SpanLayer.asRPCFramework(span); + span.setComponent(ComponentsDefine.MOTAN); } - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - Response response = (Response) ret; + @Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + Response response = (Response)ret; if (response != null && response.getException() != null) { AbstractSpan span = ContextManager.activeSpan(); span.log(response.getException()); - Tags.ERROR.set(span, true); + span.errorOccurred(); } ContextManager.stopSpan(); return ret; } - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - ContextManager.activeSpan().log(t); + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan activeSpan = ContextManager.activeSpan(); + activeSpan.errorOccurred(); + activeSpan.log(t); } private static String generateViewPoint(Request request) { diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanConsumerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanConsumerInstrumentation.java index f6fbc0fade7e135609408e7a888f2ffc2eb1bd18..4eb8b5334dc1c32a75d5373bb7c1faf73b32b8ef 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanConsumerInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanConsumerInstrumentation.java @@ -44,6 +44,10 @@ public class MotanConsumerInstrumentation extends ClassInstanceMethodsEnhancePlu public String getMethodsInterceptor() { return INVOKE_INTERCEPT_CLASS; } + + @Override public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanProviderInstrumentation.java b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanProviderInstrumentation.java index bb126a69526337c02af7e9fedb3e49ff0e113fce..1b54709a25aa9a7c08531f3418089fd6ae1571a1 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanProviderInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/main/java/org/skywalking/apm/plugin/motan/define/MotanProviderInstrumentation.java @@ -69,6 +69,10 @@ public class MotanProviderInstrumentation extends ClassInstanceMethodsEnhancePlu public String getMethodsInterceptor() { return PROVIDER_INVOKE_INTERCEPT_CLASS; } + + @Override public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/RealCallInterceptor.java b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/RealCallInterceptor.java index 5460fb246e2895a3b8fb52ab070436f5eb38b9dd..f32a43e9bace40e2b58b20d835bd870acc9626c7 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/RealCallInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/RealCallInterceptor.java @@ -3,6 +3,7 @@ package org.skywalking.apm.plugin.okhttp.v3; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import okhttp3.Headers; +import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -11,9 +12,12 @@ import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.skywalking.apm.network.trace.component.ComponentsDefine; /** * {@link RealCallInterceptor} intercept the synchronous http calls by the discovery of okhttp. @@ -22,49 +26,37 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptR */ public class RealCallInterceptor implements InstanceMethodsAroundInterceptor, InstanceConstructorInterceptor { - private static final String COMPONENT_NAME = "OKHttp"; - - private static final String REQUEST_CONTEXT_KEY = "SWRequestContextKey"; - /** * Intercept the {@link okhttp3.RealCall#RealCall(OkHttpClient, Request, boolean)}, then put the second argument of - * {@link okhttp3.Request} into {@link EnhancedClassInstanceContext} with the key of {@link - * RealCallInterceptor#REQUEST_CONTEXT_KEY}. + * {@link okhttp3.Request} into {@link EnhancedInstance}. * - * @param context a new added instance field - * @param interceptorContext constructor invocation context. + * @param objInst a new added instance field + * @param allArguments constructor invocation context. */ @Override - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { - context.set(REQUEST_CONTEXT_KEY, interceptorContext.allArguments()[1]); + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { + objInst.setSkyWalkingDynamicField(allArguments[1]); } /** - * Get the {@link okhttp3.Request} from {@link EnhancedClassInstanceContext}, then create {@link Span} and set host, + * Get the {@link okhttp3.Request} from {@link EnhancedInstance}, then create {@link AbstractSpan} and set host, * port, kind, component, url from {@link okhttp3.Request}. * Through the reflection of the way, set the http header of context data into {@link okhttp3.Request#headers}. * - * @param context instance context, a class instance only has one {@link EnhancedClassInstanceContext} instance. - * @param interceptorContext method context, includes class name, method name, etc. * @param result change this result, if you want to truncate the method. * @throws Throwable */ - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) throws Throwable { - Request request = (Request)context.get(REQUEST_CONTEXT_KEY); - - AbstractSpan span = ContextManager.createSpan(request.url().uri().toString()); - span.setPeerHost(request.url().host()); - span.setPort(request.url().port()); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.COMPONENT.set(span, COMPONENT_NAME); - Tags.HTTP.METHOD.set(span, request.method()); - Tags.URL.set(span, request.url().url().getPath()); - Tags.SPAN_LAYER.asHttp(span); + @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + Request request = (Request)objInst.getSkyWalkingDynamicField(); ContextCarrier contextCarrier = new ContextCarrier(); - ContextManager.inject(contextCarrier); + HttpUrl requestUrl = request.url(); + AbstractSpan span = ContextManager.createExitSpan(requestUrl.uri().toString(), contextCarrier, requestUrl.host() + ":" + requestUrl.port()); + span.setComponent(ComponentsDefine.OKHTTP); + Tags.HTTP.METHOD.set(span, request.method()); + Tags.URL.set(span, requestUrl.url().getPath()); + SpanLayer.asHttp(span); Field headersField = Request.class.getDeclaredField("headers"); Field modifiersField = Field.class.getDeclaredField("modifiers"); @@ -79,34 +71,31 @@ public class RealCallInterceptor implements InstanceMethodsAroundInterceptor, In /** * Get the status code from {@link Response}, when status code greater than 400, it means there was some errors in * the server. - * Finish the {@link Span}. + * Finish the {@link AbstractSpan}. * - * @param context instance context, a class instance only has one {@link EnhancedClassInstanceContext} instance. - * @param interceptorContext method context, includes class name, method name, etc. * @param ret the method's original return value. * @return * @throws Throwable */ @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) throws Throwable { + public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { Response response = (Response)ret; int statusCode = response.code(); AbstractSpan span = ContextManager.activeSpan(); if (statusCode >= 400) { - Tags.ERROR.set(span, true); + span.errorOccurred(); + Tags.STATUS_CODE.set(span, Integer.toString(statusCode)); } - Tags.STATUS_CODE.set(span, statusCode); ContextManager.stopSpan(); return ret; } - @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - Tags.ERROR.set(ContextManager.activeSpan(), true); - ContextManager.activeSpan().log(t); + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + } } diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/define/RealCallInstrumentation.java b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/define/RealCallInstrumentation.java index 59a526143760423847a2980bc43e5f199e605d15..c7c14bb5ea95d3994587fb7df3f9be3ef0ddad5a 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/define/RealCallInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/src/main/java/org/skywalking/apm/plugin/okhttp/v3/define/RealCallInstrumentation.java @@ -58,6 +58,10 @@ public class RealCallInstrumentation extends ClassInstanceMethodsEnhancePluginDe @Override public String getMethodsInterceptor() { return INTERCEPT_CLASS; } + + @Override public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/ResinV3Interceptor.java b/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/ResinV3Interceptor.java index fedd69f8c5e7c9b6d5db654add3979196df815f9..f7aa984a6566efa74b805fa2282c121d31180073 100644 --- a/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/ResinV3Interceptor.java +++ b/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/ResinV3Interceptor.java @@ -7,9 +7,11 @@ import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.skywalking.apm.util.StringUtil; +import org.skywalking.apm.network.trace.component.ComponentsDefine; /** * {@link ResinV3Interceptor} intercept method of{@link com.caucho.server.dispatch.ServletInvocation#service(javax.servlet.ServletRequest, @@ -18,28 +20,37 @@ import org.skywalking.apm.util.StringUtil; * @author baiyang */ public class ResinV3Interceptor implements InstanceMethodsAroundInterceptor { - /** - * Resin component. - */ - public static final String RESIN_COMPONENT = "Resin"; - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - Object[] args = interceptorContext.allArguments(); - CauchoRequest request = (CauchoRequest)args[0]; - AbstractSpan span = ContextManager.createSpan(request.getPageURI()); - Tags.COMPONENT.set(span, RESIN_COMPONENT); - span.setPeerHost(request.getServerName()); - span.setPort(request.getServerPort()); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); + @Override public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + CauchoRequest request = (CauchoRequest)allArguments[0]; + String tracingHeaderValue = request.getHeader(Config.Plugin.Propagation.HEADER_NAME); + ContextCarrier contextCarrier = new ContextCarrier().deserialize(tracingHeaderValue); + AbstractSpan span = ContextManager.createEntrySpan(request.getPageURI(), contextCarrier); + span.setComponent(ComponentsDefine.RESIN); Tags.URL.set(span, appendRequestURL(request)); - Tags.SPAN_LAYER.asHttp(span); + SpanLayer.asHttp(span); + } - String tracingHeaderValue = request.getHeader(Config.Plugin.Propagation.HEADER_NAME); - if (!StringUtil.isEmpty(tracingHeaderValue)) { - ContextManager.extract(new ContextCarrier().deserialize(tracingHeaderValue)); + @Override public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + HttpResponse response = (HttpResponse)allArguments[1]; + AbstractSpan span = ContextManager.activeSpan(); + + if (response.getStatusCode() >= 400) { + Tags.STATUS_CODE.set(span, Integer.toString(response.getStatusCode())); + span.errorOccurred(); } + ContextManager.stopSpan(); + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan activeSpan = ContextManager.activeSpan(); + activeSpan.log(t); + activeSpan.errorOccurred(); } /** @@ -58,26 +69,4 @@ public class ResinV3Interceptor implements InstanceMethodsAroundInterceptor { sb.append(request.getPageURI()); return sb.toString(); } - - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - HttpResponse response = (HttpResponse)interceptorContext.allArguments()[1]; - AbstractSpan span = ContextManager.activeSpan(); - Tags.STATUS_CODE.set(span, response.getStatusCode()); - - if (response.getStatusCode() != 200) { - Tags.ERROR.set(span, true); - } - ContextManager.stopSpan(); - return ret; - } - - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - AbstractSpan span = ContextManager.activeSpan(); - span.log(t); - Tags.ERROR.set(span, true); - } } diff --git a/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/define/ResinV3Instrumentation.java b/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/define/ResinV3Instrumentation.java index 7b1369ef1efcf91d22003acd065bd80cc2950a83..cc5a2ff84920766b85076f8fd63ae25ba48cbe0e 100644 --- a/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/define/ResinV3Instrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/resin-3.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v3/define/ResinV3Instrumentation.java @@ -39,6 +39,11 @@ public class ResinV3Instrumentation extends ClassInstanceMethodsEnhancePluginDef public String getMethodsInterceptor() { return METHOD_INTERCET_CLASS; } + + @Override + public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/ResinV4Interceptor.java b/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/ResinV4Interceptor.java index daf1414666f0ec6e94288f99ae791c7590b57359..a080a33f9d31120bc0723e91fe512f41a1603d95 100644 --- a/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/ResinV4Interceptor.java +++ b/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/ResinV4Interceptor.java @@ -7,36 +7,48 @@ import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; import org.skywalking.apm.agent.core.context.tag.Tags; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.skywalking.apm.util.StringUtil; +import org.skywalking.apm.network.trace.component.ComponentsDefine; /** * Created by Baiyang on 2017/5/2. */ public class ResinV4Interceptor implements InstanceMethodsAroundInterceptor { - /** - * Resin component. - */ - public static final String RESIN_COMPONENT = "Resin"; - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - Object[] args = interceptorContext.allArguments(); - CauchoRequest request = (CauchoRequest)args[0]; - AbstractSpan span = ContextManager.createSpan(request.getPageURI()); - Tags.COMPONENT.set(span, RESIN_COMPONENT); - span.setPeerHost(request.getServerName()); - span.setPort(request.getServerPort()); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); + public void beforeMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + CauchoRequest request = (CauchoRequest)allArguments[0]; + String tracingHeaderValue = request.getHeader(Config.Plugin.Propagation.HEADER_NAME); + ContextCarrier contextCarrier = new ContextCarrier().deserialize(tracingHeaderValue); + AbstractSpan span = ContextManager.createEntrySpan(request.getPageURI(), contextCarrier); + span.setComponent(ComponentsDefine.RESIN); Tags.URL.set(span, appendRequestURL(request)); - Tags.SPAN_LAYER.asHttp(span); + SpanLayer.asHttp(span); - String tracingHeaderValue = request.getHeader(Config.Plugin.Propagation.HEADER_NAME); - if (!StringUtil.isEmpty(tracingHeaderValue)) { - ContextManager.extract(new ContextCarrier().deserialize(tracingHeaderValue)); + } + + @Override + public Object afterMethod(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + HttpServletResponse response = (HttpServletResponse)allArguments[1]; + AbstractSpan span = ContextManager.activeSpan(); + + if (response.getStatus() >= 400) { + Tags.STATUS_CODE.set(span, Integer.toString(response.getStatus())); + span.errorOccurred(); } + ContextManager.stopSpan(); + return ret; + } + + @Override public void handleMethodException(EnhancedInstance objInst, String methodName, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan activeSpan = ContextManager.activeSpan(); + activeSpan.log(t); + activeSpan.errorOccurred(); } /** @@ -55,26 +67,4 @@ public class ResinV4Interceptor implements InstanceMethodsAroundInterceptor { sb.append(request.getPageURI()); return sb.toString(); } - - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - HttpServletResponse response = (HttpServletResponse)interceptorContext.allArguments()[1]; - AbstractSpan span = ContextManager.activeSpan(); - Tags.STATUS_CODE.set(span, response.getStatus()); - - if (response.getStatus() != 200) { - Tags.ERROR.set(span, true); - } - ContextManager.stopSpan(); - return ret; - } - - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - AbstractSpan span = ContextManager.activeSpan(); - span.log(t); - Tags.ERROR.set(span, true); - } } diff --git a/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/define/ResinV4Instrumentation.java b/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/define/ResinV4Instrumentation.java index 8f130247e329853a928420c83c3ca42719e036da..e54559cc73425053407d9b6693244d75f06f4360 100644 --- a/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/define/ResinV4Instrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/resin-4.x-plugin/src/main/java/org/skywalking/apm/plugin/resin/v4/define/ResinV4Instrumentation.java @@ -38,6 +38,11 @@ public class ResinV4Instrumentation extends ClassInstanceMethodsEnhancePluginDef public String getMethodsInterceptor() { return METHOD_INTERCET_CLASS; } + + @Override + public boolean isOverrideArgs() { + return false; + } } }; } diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/org/skywalking/apm/plugin/tomcat78x/TomcatInterceptor.java b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/org/skywalking/apm/plugin/tomcat78x/TomcatInterceptor.java index c59e700f919799e6e7ac0b62dc0713a5a03eb9f8..803635b7a239e5b5e071b7e2aebdb05177326a21 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/org/skywalking/apm/plugin/tomcat78x/TomcatInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/org/skywalking/apm/plugin/tomcat78x/TomcatInterceptor.java @@ -50,9 +50,9 @@ public class TomcatInterceptor implements InstanceMethodsAroundInterceptor { HttpServletResponse response = (HttpServletResponse)allArguments[1]; AbstractSpan span = ContextManager.activeSpan(); - if (response.getStatus() != 200) { + if (response.getStatus() >= 400) { span.errorOccurred(); - Tags.STATUS_CODE.set(span, response.getStatus() + ""); + Tags.STATUS_CODE.set(span, Integer.toString(response.getStatus())); } ContextManager.stopSpan(); return ret;