From 3b6a12515a2d6cd78aca3f8b85626c732272f7e3 Mon Sep 17 00:00:00 2001 From: daojun Date: Wed, 7 Dec 2022 19:08:25 +0800 Subject: [PATCH 1/3] clean message context after message is recycled --- .../MessageRecycleMethodInterceptor.java | 25 +++++++++++++++++ .../define/BaseMessageInstrumentation.java | 27 +++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java new file mode 100644 index 0000000000..b46829d1e8 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java @@ -0,0 +1,25 @@ +package org.apache.skywalking.apm.plugin.pulsar.common; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; + +import java.lang.reflect.Method; + +public class MessageRecycleMethodInterceptor implements InstanceMethodsAroundInterceptor { + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + // NOOP + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { + objInst.setSkyWalkingDynamicField(null); + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + // NOOP + } +} diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/define/BaseMessageInstrumentation.java b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/define/BaseMessageInstrumentation.java index 6122d04e86..e534ec0ec4 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/define/BaseMessageInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/define/BaseMessageInstrumentation.java @@ -18,6 +18,10 @@ package org.apache.skywalking.apm.plugin.pulsar.common.define; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; import net.bytebuddy.description.method.MethodDescription; @@ -42,10 +46,12 @@ public class BaseMessageInstrumentation extends ClassInstanceMethodsEnhancePlugi public static final String ENHANCE_CLASS = "org.apache.pulsar.client.impl.MessageImpl"; public static final String CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.pulsar.common.MessageConstructorInterceptor"; + public static final String ENHANCE_METHOD = "recycle"; + public static final String METHOD_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.pulsar.common.MessageRecycleMethodInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[] { + return new ConstructorInterceptPoint[]{ new ConstructorInterceptPoint() { @Override public ElementMatcher getConstructorMatcher() { @@ -62,7 +68,24 @@ public String getConstructorInterceptor() { @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[0]; + return new InstanceMethodsInterceptPoint[]{ + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return isMethod().and(named(ENHANCE_METHOD)).and(isPublic()).and(takesArguments(0)); + } + + @Override + public String getMethodsInterceptor() { + return METHOD_INTERCEPTOR_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; } @Override From 7dec28f937fe230317f552bcbff34a6356a5c646 Mon Sep 17 00:00:00 2001 From: daojun Date: Wed, 7 Dec 2022 19:29:14 +0800 Subject: [PATCH 2/3] add license header --- .../MessageRecycleMethodInterceptor.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java index b46829d1e8..4d45aa0403 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.skywalking.apm.plugin.pulsar.common; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; From 9d5681a24c3c6edd0b436ef0ac3f1d46b17ffc6a Mon Sep 17 00:00:00 2001 From: daojun Date: Wed, 7 Dec 2022 19:40:13 +0800 Subject: [PATCH 3/3] review fix --- .../pulsar/common/MessageRecycleMethodInterceptor.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java index 4d45aa0403..c9ecd02a96 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/pulsar-common/src/main/java/org/apache/skywalking/apm/plugin/pulsar/common/MessageRecycleMethodInterceptor.java @@ -18,21 +18,19 @@ package org.apache.skywalking.apm.plugin.pulsar.common; +import java.lang.reflect.Method; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import java.lang.reflect.Method; - public class MessageRecycleMethodInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - // NOOP + objInst.setSkyWalkingDynamicField(null); } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - objInst.setSkyWalkingDynamicField(null); return ret; }