diff --git a/src/main/java/io/github/artlibs/autotrace4j/interceptor/impl/DubboConsumerInterceptor.java b/src/main/java/io/github/artlibs/autotrace4j/interceptor/impl/DubboConsumerInterceptor.java new file mode 100644 index 0000000..1ad974c --- /dev/null +++ b/src/main/java/io/github/artlibs/autotrace4j/interceptor/impl/DubboConsumerInterceptor.java @@ -0,0 +1,63 @@ +package io.github.artlibs.autotrace4j.interceptor.impl; + +import io.github.artlibs.autotrace4j.context.AutoTraceCtx; +import io.github.artlibs.autotrace4j.context.MethodWrapper; +import io.github.artlibs.autotrace4j.context.ReflectUtils; +import io.github.artlibs.autotrace4j.interceptor.base.AbstractInstanceInterceptor; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; + +import java.lang.reflect.Method; +import java.util.Objects; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +/** + * Dubbo Consumer Interceptor + * + * @author orangewest + * @since 2024-07-30 + */ +public class DubboConsumerInterceptor extends AbstractInstanceInterceptor { + + /** + * {@inheritDoc} + */ + @Override + public ElementMatcher typeMatcher() { + return named("org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter"); + } + + /** + * {@inheritDoc} + */ + @Override + public ElementMatcher methodMatcher() { + return ElementMatchers.isPublic() + .and(named("invoke") + .and(takesArgument(0, named("org.apache.dubbo.rpc.Invoker"))) + .and(takesArgument(1, named("org.apache.dubbo.rpc.Invocation"))) + ); + } + + /** + * {@inheritDoc} + */ + @Override + public void onMethodEnter(Object thiz, Object[] allArgs, Method originMethod) throws Exception { + String traceId = AutoTraceCtx.getTraceId(); + if (Objects.nonNull(traceId)) { + MethodWrapper methodWrapper = ReflectUtils.getMethodWrapper(allArgs[1] + , "setAttachment", String.class, String.class); + methodWrapper.invoke(AutoTraceCtx.ATO_TRACE_ID, traceId); + final String spanId = AutoTraceCtx.getSpanId(); + if (Objects.nonNull(spanId)) { + methodWrapper.invoke(AutoTraceCtx.ATO_SPAN_ID, spanId); + } + } + } + +} diff --git a/src/main/java/io/github/artlibs/autotrace4j/interceptor/impl/DubboProviderInterceptor.java b/src/main/java/io/github/artlibs/autotrace4j/interceptor/impl/DubboProviderInterceptor.java new file mode 100644 index 0000000..c42874b --- /dev/null +++ b/src/main/java/io/github/artlibs/autotrace4j/interceptor/impl/DubboProviderInterceptor.java @@ -0,0 +1,61 @@ +package io.github.artlibs.autotrace4j.interceptor.impl; + +import io.github.artlibs.autotrace4j.context.AutoTraceCtx; +import io.github.artlibs.autotrace4j.context.MethodWrapper; +import io.github.artlibs.autotrace4j.context.ReflectUtils; +import io.github.artlibs.autotrace4j.interceptor.base.AbstractInstanceInterceptor; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; + +import java.lang.reflect.Method; +import java.util.Objects; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +/** + * Dubbo Provider Interceptor + * + * @author orangewest + * @since 2024-07-30 + */ +public class DubboProviderInterceptor extends AbstractInstanceInterceptor { + + /** + * {@inheritDoc} + */ + @Override + public ElementMatcher typeMatcher() { + return named("org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter"); + } + + /** + * {@inheritDoc} + */ + @Override + public ElementMatcher methodMatcher() { + return ElementMatchers.isPublic() + .and(named("invoke") + .and(takesArgument(0, named("org.apache.dubbo.rpc.Invoker"))) + .and(takesArgument(1, named("org.apache.dubbo.rpc.Invocation"))) + ); + } + + /** + * {@inheritDoc} + */ + @Override + public void onMethodEnter(Object thiz, Object[] allArgs, Method originMethod) throws Exception { + MethodWrapper methodWrapper = ReflectUtils.getMethodWrapper(allArgs[1] + , "getAttachment", String.class); + final String traceId = methodWrapper.invoke(AutoTraceCtx.ATO_TRACE_ID); + if (Objects.nonNull(traceId)) { + AutoTraceCtx.setTraceId(traceId); + AutoTraceCtx.setParentSpanId(methodWrapper.invoke(AutoTraceCtx.ATO_SPAN_ID)); + AutoTraceCtx.setSpanId(AutoTraceCtx.generate()); + } + } + +}