Skip to content

Commit 7b4c56d

Browse files
committed
Support extensions for attributesExtractors, contextCustomizers and operationListeners
1 parent 01b84ce commit 7b4c56d

File tree

4 files changed

+104
-0
lines changed

4 files changed

+104
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.instrumenter;
7+
8+
import java.util.List;
9+
10+
public interface ConditionalAttributesExtractorProvider {
11+
List<String> supportedNames();
12+
13+
<REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> get();
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.instrumenter;
7+
8+
import java.util.List;
9+
10+
public interface ConditionalContextCustomizerProvider {
11+
List<String> supportedNames();
12+
13+
<REQUEST> ContextCustomizer<REQUEST> get();
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.instrumenter;
7+
8+
import java.util.List;
9+
10+
public interface ConditionalOperationMetricsProvider {
11+
List<String> supportedNames();
12+
13+
OperationMetrics get();
14+
}

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

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
import io.opentelemetry.instrumentation.api.internal.SpanKey;
2828
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
2929
import java.util.ArrayList;
30+
import java.util.HashMap;
3031
import java.util.List;
32+
import java.util.Map;
33+
import java.util.ServiceLoader;
3134
import java.util.Set;
3235
import java.util.logging.Logger;
3336
import java.util.stream.Collectors;
@@ -69,6 +72,41 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
6972
boolean propagateOperationListenersToOnEnd = false;
7073
boolean enabled = true;
7174

75+
private static final Map<String, List<ConditionalContextCustomizerProvider>>
76+
CONTEXT_CUSTOMIZER_MAP = new HashMap<>();
77+
private static final Map<String, List<ConditionalAttributesExtractorProvider>>
78+
ATTRIBUTES_EXTRACTOR_MAP = new HashMap<>();
79+
private static final Map<String, List<ConditionalOperationMetricsProvider>>
80+
OPERATION_METRICS_MAP = new HashMap<>();
81+
82+
static {
83+
ServiceLoader.load(ConditionalContextCustomizerProvider.class)
84+
.forEach(
85+
provider -> {
86+
for (String name : provider.supportedNames()) {
87+
CONTEXT_CUSTOMIZER_MAP.computeIfAbsent(name, k -> new ArrayList<>()).add(provider);
88+
}
89+
});
90+
91+
ServiceLoader.load(ConditionalAttributesExtractorProvider.class)
92+
.forEach(
93+
provider -> {
94+
for (String name : provider.supportedNames()) {
95+
ATTRIBUTES_EXTRACTOR_MAP
96+
.computeIfAbsent(name, k -> new ArrayList<>())
97+
.add(provider);
98+
}
99+
});
100+
101+
ServiceLoader.load(ConditionalOperationMetricsProvider.class)
102+
.forEach(
103+
provider -> {
104+
for (String name : provider.supportedNames()) {
105+
OPERATION_METRICS_MAP.computeIfAbsent(name, k -> new ArrayList<>()).add(provider);
106+
}
107+
});
108+
}
109+
72110
InstrumenterBuilder(
73111
OpenTelemetry openTelemetry,
74112
String instrumentationName,
@@ -78,6 +116,30 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
78116
this.spanNameExtractor = spanNameExtractor;
79117
this.instrumentationVersion =
80118
EmbeddedInstrumentationProperties.findVersion(instrumentationName);
119+
120+
List<ConditionalContextCustomizerProvider> contextProviders =
121+
CONTEXT_CUSTOMIZER_MAP.get(instrumentationName);
122+
if (contextProviders != null) {
123+
for (ConditionalContextCustomizerProvider provider : contextProviders) {
124+
addContextCustomizer(provider.get());
125+
}
126+
}
127+
128+
List<ConditionalAttributesExtractorProvider> attributeProviders =
129+
ATTRIBUTES_EXTRACTOR_MAP.get(instrumentationName);
130+
if (attributeProviders != null) {
131+
for (ConditionalAttributesExtractorProvider provider : attributeProviders) {
132+
addAttributesExtractor(provider.get());
133+
}
134+
}
135+
136+
List<ConditionalOperationMetricsProvider> metricsProviders =
137+
OPERATION_METRICS_MAP.get(instrumentationName);
138+
if (metricsProviders != null) {
139+
for (ConditionalOperationMetricsProvider provider : metricsProviders) {
140+
addOperationMetrics(provider.get());
141+
}
142+
}
81143
}
82144

83145
/**

0 commit comments

Comments
 (0)