Skip to content

Commit 7109962

Browse files
committed
Optimize codes
1 parent da46f57 commit 7109962

File tree

5 files changed

+56
-21
lines changed

5 files changed

+56
-21
lines changed

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,9 +302,8 @@ private Instrumenter<REQUEST, RESPONSE> buildInstrumenter(
302302
List<InstrumentationCustomizer> customizers =
303303
INSTRUMENTATION_CUSTOMIZER_MAP.entrySet().stream()
304304
.filter(entry -> entry.getKey().test(instrumentationName))
305-
.map(Map.Entry::getValue)
306-
.findFirst()
307-
.orElse(null);
305+
.flatMap(entry -> entry.getValue().stream())
306+
.collect(Collectors.toList());
308307
if (customizers != null) {
309308
for (InstrumentationCustomizer customizer : customizers) {
310309
if (customizer.getContextCustomizer() != null) {
@@ -313,6 +312,9 @@ private Instrumenter<REQUEST, RESPONSE> buildInstrumenter(
313312
if (customizer.getAttributesExtractor() != null) {
314313
addAttributesExtractor(customizer.getAttributesExtractor());
315314
}
315+
if (customizer.getAttributesExtractors() != null) {
316+
addAttributesExtractors(customizer.getAttributesExtractors());
317+
}
316318
if (customizer.getOperationMetrics() != null) {
317319
addOperationMetrics(customizer.getOperationMetrics());
318320
}

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumentationCustomizer.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
1010
import io.opentelemetry.instrumentation.api.instrumenter.OperationMetrics;
1111
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
12+
import java.util.List;
1213
import java.util.function.Predicate;
14+
import javax.annotation.Nullable;
1315

1416
/**
1517
* A service provider interface (SPI) for providing customizations for instrumentation, including
@@ -55,6 +57,23 @@ default <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> getAttributes
5557
return null;
5658
}
5759

60+
/**
61+
* Returns a list of {@link AttributesExtractor}s that will extract attributes from requests and
62+
* responses during the instrumentation process.
63+
*
64+
* <p>This allows providing multiple extractors for a single instrumentation. The default
65+
* implementation returns {@code null} for backward compatibility.
66+
*
67+
* @param <REQUEST> the type of request object used by the instrumented library
68+
* @param <RESPONSE> the type of response object used by the instrumented library
69+
* @return a list of attributes extractors, or null if not applicable
70+
*/
71+
@Nullable
72+
default <REQUEST, RESPONSE>
73+
List<AttributesExtractor<REQUEST, RESPONSE>> getAttributesExtractors() {
74+
return null;
75+
}
76+
5877
/**
5978
* Returns a new instance of a {@link ContextCustomizer} that will customize the tracing context
6079
* during request processing.

instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/internal/InstrumentationCustomizerTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
1212
import io.opentelemetry.instrumentation.api.instrumenter.OperationMetrics;
1313
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
14+
import java.util.Collections;
15+
import java.util.List;
1416
import java.util.function.Predicate;
1517
import org.junit.jupiter.api.BeforeEach;
1618
import org.junit.jupiter.api.Test;
@@ -50,6 +52,13 @@ AttributesExtractor<REQUEST, RESPONSE> getAttributesExtractor() {
5052
return (AttributesExtractor<REQUEST, RESPONSE>) attributesExtractor;
5153
}
5254

55+
@Override
56+
public <REQUEST, RESPONSE>
57+
List<AttributesExtractor<REQUEST, RESPONSE>> getAttributesExtractors() {
58+
return Collections.singletonList(
59+
(AttributesExtractor<REQUEST, RESPONSE>) attributesExtractor);
60+
}
61+
5362
@Override
5463
public <REQUEST> ContextCustomizer<REQUEST> getContextCustomizer() {
5564
return (ContextCustomizer<REQUEST>) contextCustomizer;
@@ -82,6 +91,12 @@ void testGetAttributesExtractor() {
8291
assertThat(extractor).isSameAs(attributesExtractor);
8392
}
8493

94+
@Test
95+
void testGetAttributesExtractors() {
96+
List<AttributesExtractor<Object, Object>> extractors = customizer.getAttributesExtractors();
97+
assertThat(extractors).containsExactly(attributesExtractor);
98+
}
99+
85100
@Test
86101
void testGetContextCustomizer() {
87102
assertThat(customizer.getContextCustomizer()).isSameAs(contextCustomizer);

javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,11 @@
66
package io.opentelemetry.javaagent.bootstrap;
77

88
import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil;
9-
import io.opentelemetry.instrumentation.api.internal.ServiceLoaderUtil;
109
import java.io.File;
1110
import java.lang.instrument.Instrumentation;
1211
import java.lang.reflect.Constructor;
1312
import java.security.PrivilegedAction;
1413
import java.security.PrivilegedExceptionAction;
15-
import java.util.ArrayList;
16-
import java.util.List;
17-
import java.util.ServiceLoader;
1814
import javax.annotation.Nullable;
1915

2016
/**
@@ -66,7 +62,6 @@ public Void run() {
6662
public Void run() throws Exception {
6763
agentClassLoader = createAgentClassLoader("inst", javaagentFile);
6864
agentStarter = createAgentStarter(agentClassLoader, inst, javaagentFile);
69-
setLoaderFunction();
7065
if (!fromPremain || !delayAgentStart()) {
7166
agentStarter.start();
7267
agentStarted = true;
@@ -217,19 +212,6 @@ private static AgentStarter createAgentStarter(
217212
constructor.newInstance(instrumentation, javaagentFile, isSecurityManagerSupportEnabled);
218213
}
219214

220-
/** Sets a custom loader function for the ServiceLoaderUtil to use the agentClassLoader. */
221-
private static void setLoaderFunction() {
222-
ServiceLoaderUtil.setLoaderFunction(
223-
clazz -> {
224-
List<Object> instances = new ArrayList<>();
225-
ServiceLoader<?> serviceLoader = ServiceLoader.load(clazz, agentClassLoader);
226-
for (Object instance : serviceLoader) {
227-
instances.add(instance);
228-
}
229-
return instances;
230-
});
231-
}
232-
233215
private AgentInitializer() {}
234216

235217
@SuppressWarnings("SystemOut")

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.javaagent.tooling;
77

88
import io.opentelemetry.context.Context;
9+
import io.opentelemetry.instrumentation.api.internal.ServiceLoaderUtil;
910
import io.opentelemetry.instrumentation.api.internal.cache.weaklockfree.WeakConcurrentMapCleaner;
1011
import io.opentelemetry.javaagent.bootstrap.AgentInitializer;
1112
import io.opentelemetry.javaagent.bootstrap.AgentStarter;
@@ -16,6 +17,8 @@
1617
import java.lang.instrument.Instrumentation;
1718
import java.lang.instrument.UnmodifiableClassException;
1819
import java.security.ProtectionDomain;
20+
import java.util.ArrayList;
21+
import java.util.List;
1922
import java.util.ServiceLoader;
2023
import org.objectweb.asm.ClassReader;
2124
import org.objectweb.asm.ClassVisitor;
@@ -72,6 +75,7 @@ public void start() {
7275

7376
EarlyInitAgentConfig earlyConfig = EarlyInitAgentConfig.create();
7477
extensionClassLoader = createExtensionClassLoader(getClass().getClassLoader(), earlyConfig);
78+
setLoaderFunction();
7579

7680
String loggerImplementationName = earlyConfig.getString("otel.javaagent.logging");
7781
// default to the built-in stderr slf4j-simple logger
@@ -246,4 +250,17 @@ public void visitMethodInsn(
246250
return hookInserted ? cw.toByteArray() : null;
247251
}
248252
}
253+
254+
/** Sets a custom loader function for the ServiceLoaderUtil to use the agentClassLoader. */
255+
private void setLoaderFunction() {
256+
ServiceLoaderUtil.setLoaderFunction(
257+
clazz -> {
258+
List<Object> instances = new ArrayList<>();
259+
ServiceLoader<?> serviceLoader = ServiceLoader.load(clazz, extensionClassLoader);
260+
for (Object instance : serviceLoader) {
261+
instances.add(instance);
262+
}
263+
return instances;
264+
});
265+
}
249266
}

0 commit comments

Comments
 (0)