From 32c17c96f16333fd0254ffa032a49fea14e05fa6 Mon Sep 17 00:00:00 2001 From: Zixin Zhou Date: Thu, 30 Jan 2025 14:57:57 +0800 Subject: [PATCH] [#noissue] Add specific filter for Instrument --- .../bootstrap/instrument/InstrumentClass.java | 4 +++ .../profiler/instrument/ASMClass.java | 24 ++++++++++++++++++ .../instrument/ASMClassNodeAdapter.java | 8 ++++++ .../profiler/instrument/ASMNestedClass.java | 10 ++++++++ .../instrument/ASMClassNodeAdapterTest.java | 2 +- .../profiler/instrument/ASMClassTest.java | 25 ++++++++++++++++++- .../profiler/instrument/mock/ArgsClass.java | 12 +++++++++ 7 files changed, 83 insertions(+), 2 deletions(-) diff --git a/agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/instrument/InstrumentClass.java b/agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/instrument/InstrumentClass.java index 1724cf746a6c..b8ac64d739eb 100644 --- a/agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/instrument/InstrumentClass.java +++ b/agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/instrument/InstrumentClass.java @@ -38,6 +38,8 @@ public interface InstrumentClass { InstrumentMethod getConstructor(String... parameterTypes); + InstrumentMethod getConstructor(MethodFilter filter); + List getDeclaredConstructors(); List getDeclaredMethods(); @@ -45,6 +47,8 @@ public interface InstrumentClass { List getDeclaredMethods(MethodFilter filter); InstrumentMethod getDeclaredMethod(String name, String... parameterTypes); + + InstrumentMethod getDeclaredMethod(String name, MethodFilter filter); @Deprecated InstrumentMethod getLambdaMethod(String... parameterTypes); diff --git a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClass.java b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClass.java index dd04417a67e7..a77ae727b963 100644 --- a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClass.java +++ b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClass.java @@ -161,11 +161,35 @@ public List getDeclaredMethods(final MethodFilter methodFilter return candidateList; } + @Override + public InstrumentMethod getDeclaredMethod(final String methodName, final MethodFilter methodFilter) { + Objects.requireNonNull(methodName, "name"); + Objects.requireNonNull(methodFilter, "methodFilter"); + + final List declaredMethod = this.classNode.getDeclaredMethod(methodName); + if (declaredMethod.isEmpty()) { + return null; + } + for (ASMMethodNodeAdapter methodNode : declaredMethod) { + final InstrumentMethod method = new ASMMethod(this.engineComponent, this.pluginContext, this, methodNode); + if (methodFilter.accept(method)) { + return method; + } + } + + return null; + } + @Override public InstrumentMethod getConstructor(final String... parameterTypes) { return getDeclaredMethod("", parameterTypes); } + @Override + public InstrumentMethod getConstructor(final MethodFilter methodFilter) { + return getDeclaredMethod("", methodFilter); + } + @Override public List getDeclaredConstructors() { final List candidateList = new ArrayList<>(); diff --git a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapter.java b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapter.java index 54e710aec467..435375e0eddd 100644 --- a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapter.java +++ b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapter.java @@ -188,6 +188,14 @@ public ASMMethodNodeAdapter getDeclaredMethod(final String methodName, final Str return findDeclaredMethod(methodName, desc); } + public List getDeclaredMethod(final String methodName) { + if (this.skipCode) { + throw new IllegalStateException("not supported operation, skipCode option is true."); + } + + return findDeclaredMethod(methodName); + } + public List getDeclaredConstructors() { if (this.skipCode) { throw new IllegalStateException("not supported operation, skipCode option is true."); diff --git a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMNestedClass.java b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMNestedClass.java index e0cce658662a..f3551621468b 100644 --- a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMNestedClass.java +++ b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMNestedClass.java @@ -74,6 +74,11 @@ public InstrumentMethod getDeclaredMethod(String name, String... parameterTypes) return null; } + @Override + public InstrumentMethod getDeclaredMethod(String name, MethodFilter filter) { + return null; + } + @Override @Deprecated public InstrumentMethod getLambdaMethod(String... parameterTypes) { @@ -110,6 +115,11 @@ public InstrumentMethod getConstructor(String... parameterTypes) { return null; } + @Override + public InstrumentMethod getConstructor(MethodFilter filter) { + return null; + } + @Override public List getDeclaredConstructors() { return null; diff --git a/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapterTest.java b/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapterTest.java index 521cc2900fd8..38fc2016492e 100644 --- a/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapterTest.java +++ b/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassNodeAdapterTest.java @@ -253,7 +253,7 @@ public void getDeclaredMethod() { ASMClassNodeAdapter adapter = ASMClassNodeAdapter.get(pluginClassInputStreamProvider, ASMClassNodeLoader.getClassLoader(), getClass().getProtectionDomain(), "com/navercorp/pinpoint/profiler/instrument/mock/ArgsClass"); List constructors = adapter.getDeclaredConstructors(); - assertThat(constructors).hasSize(2); + assertThat(constructors).hasSize(4); assertEquals("ArgsClass", constructors.get(0).getName()); assertEquals("ArgsClass", constructors.get(1).getName()); diff --git a/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassTest.java b/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassTest.java index 0edbe80065d3..2bdb2c649796 100644 --- a/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassTest.java +++ b/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/ASMClassTest.java @@ -93,6 +93,7 @@ import org.objectweb.asm.tree.ClassNode; import java.io.InputStream; +import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -256,18 +257,40 @@ public void getDeclaredMethods() throws Exception { assertEquals("arg", methods.get(0).getName()); } + @Test + public void getSpecificDeclaredMethod() throws Exception { + ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass"); + InstrumentMethod method1 = clazz.getDeclaredMethod("argSpecificMethod", MethodFilters.chain( + MethodFilters.argAt(1, "long") + )); + assertNotNull(method1); + assertEquals(2, method1.getParameterTypes().length); + assertEquals("int", method1.getParameterTypes()[0]); + } + @Test public void getDeclaredConstructors() throws Exception { ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass"); List constructors = clazz.getDeclaredConstructors(); assertNotNull(constructors); - assertThat(constructors).hasSize(2); + assertThat(constructors).hasSize(4); assertEquals("ArgsClass", constructors.get(0).getName()); assertEquals("ArgsClass", constructors.get(1).getName()); assertArrayEquals(new String[]{"int"}, constructors.get(1).getParameterTypes()); } + @Test + public void getSpecificDeclaredConstructor() throws Exception { + ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass"); + InstrumentMethod constructor = clazz.getConstructor(MethodFilters.chain( + MethodFilters.name("ArgsClass"), + MethodFilters.argAt(1, "int") + )); + assertNotNull(constructor); + assertEquals("java.lang.String", constructor.getParameterTypes()[0]); + } + @Test public void hasDeclaredMethod() throws Exception { ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass"); diff --git a/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/mock/ArgsClass.java b/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/mock/ArgsClass.java index 97107b584a2e..ff269ea2e0eb 100644 --- a/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/mock/ArgsClass.java +++ b/agent-module/profiler/src/test/java/com/navercorp/pinpoint/profiler/instrument/mock/ArgsClass.java @@ -9,6 +9,12 @@ public ArgsClass() { public ArgsClass(int a) { } + public ArgsClass(String a) { + } + + public ArgsClass(String a, int b) { + } + public void arg() { } @@ -109,4 +115,10 @@ public void argObject4(String a, Integer b, Long c, Float d) { public void argString5(String a, String b, String c, String d, String e) { } + public void argSpecificMethod(int a) { + } + + public void argSpecificMethod(int a, long b) { + } + } \ No newline at end of file