Skip to content

Commit 798bdd5

Browse files
authored
config properties support for spring starter clients (#11605)
1 parent a7dbc71 commit 798bdd5

File tree

158 files changed

+869
-540
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

158 files changed

+869
-540
lines changed

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java

+21
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.google.errorprone.annotations.CanIgnoreReturnValue;
99
import io.opentelemetry.api.OpenTelemetry;
1010
import io.opentelemetry.context.propagation.TextMapSetter;
11+
import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig;
1112
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics;
1213
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor;
1314
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
@@ -29,6 +30,7 @@
2930
import java.util.Set;
3031
import java.util.function.Consumer;
3132
import java.util.function.Function;
33+
import java.util.function.Supplier;
3234
import javax.annotation.Nullable;
3335

3436
/**
@@ -192,4 +194,23 @@ public Instrumenter<REQUEST, RESPONSE> build() {
192194
public OpenTelemetry getOpenTelemetry() {
193195
return openTelemetry;
194196
}
197+
198+
@CanIgnoreReturnValue
199+
public DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> configure(CommonConfig config) {
200+
set(config::getKnownHttpRequestMethods, this::setKnownMethods);
201+
set(config::getClientRequestHeaders, this::setCapturedRequestHeaders);
202+
set(config::getClientResponseHeaders, this::setCapturedResponseHeaders);
203+
set(config::getPeerServiceResolver, this::setPeerServiceResolver);
204+
set(
205+
config::shouldEmitExperimentalHttpClientTelemetry,
206+
this::setEmitExperimentalHttpClientMetrics);
207+
return this;
208+
}
209+
210+
private static <T> void set(Supplier<T> supplier, Consumer<T> consumer) {
211+
T t = supplier.get();
212+
if (t != null) {
213+
consumer.accept(t);
214+
}
215+
}
195216
}

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/CommonConfig.java instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java

+2-8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.bootstrap.internal;
6+
package io.opentelemetry.instrumentation.api.incubator.config.internal;
77

88
import static java.util.Collections.emptyMap;
99

@@ -21,12 +21,6 @@
2121
*/
2222
public final class CommonConfig {
2323

24-
private static final CommonConfig instance = new CommonConfig(InstrumentationConfig.get());
25-
26-
public static CommonConfig get() {
27-
return instance;
28-
}
29-
3024
private final PeerServiceResolver peerServiceResolver;
3125
private final List<String> clientRequestHeaders;
3226
private final List<String> clientResponseHeaders;
@@ -41,7 +35,7 @@ public static CommonConfig get() {
4135
private final String loggingSpanIdKey;
4236
private final String loggingTraceFlagsKey;
4337

44-
CommonConfig(InstrumentationConfig config) {
38+
public CommonConfig(InstrumentationConfig config) {
4539
peerServiceResolver =
4640
PeerServiceResolver.create(
4741
config.getMap("otel.instrumentation.common.peer-service-mapping", emptyMap()));

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/EnduserConfig.java instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/EnduserConfig.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.bootstrap.internal;
6+
package io.opentelemetry.instrumentation.api.incubator.config.internal;
77

88
import java.util.Objects;
99

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/InstrumentationConfig.java instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/InstrumentationConfig.java

+12-42
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.bootstrap.internal;
6+
package io.opentelemetry.instrumentation.api.incubator.config.internal;
77

88
import static java.util.Collections.emptyList;
9-
import static java.util.Objects.requireNonNull;
109

1110
import java.time.Duration;
1211
import java.util.List;
1312
import java.util.Map;
14-
import java.util.logging.Logger;
1513
import javax.annotation.Nullable;
1614

1715
/**
@@ -28,72 +26,44 @@
2826
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
2927
* at any time.
3028
*/
31-
public abstract class InstrumentationConfig {
32-
33-
private static final Logger logger = Logger.getLogger(InstrumentationConfig.class.getName());
34-
35-
private static final InstrumentationConfig DEFAULT = new EmptyInstrumentationConfig();
36-
37-
// lazy initialized, so that javaagent can set it
38-
private static volatile InstrumentationConfig instance = DEFAULT;
39-
40-
/**
41-
* Sets the instrumentation configuration singleton. This method is only supposed to be called
42-
* once, during the agent initialization, just before {@link InstrumentationConfig#get()} is used
43-
* for the first time.
44-
*
45-
* <p>This method is internal and is hence not for public use. Its API is unstable and can change
46-
* at any time.
47-
*/
48-
public static void internalInitializeConfig(InstrumentationConfig config) {
49-
if (instance != DEFAULT) {
50-
logger.warning("InstrumentationConfig#instance was already set earlier");
51-
return;
52-
}
53-
instance = requireNonNull(config);
54-
}
55-
56-
/** Returns the global instrumentation configuration. */
57-
public static InstrumentationConfig get() {
58-
return instance;
59-
}
29+
public interface InstrumentationConfig {
6030

6131
/**
6232
* Returns a string-valued configuration property or {@code null} if a property with name {@code
6333
* name} has not been configured.
6434
*/
6535
@Nullable
66-
public abstract String getString(String name);
36+
String getString(String name);
6737

6838
/**
6939
* Returns a string-valued configuration property or {@code defaultValue} if a property with name
7040
* {@code name} has not been configured.
7141
*/
72-
public abstract String getString(String name, String defaultValue);
42+
String getString(String name, String defaultValue);
7343

7444
/**
7545
* Returns a boolean-valued configuration property or {@code defaultValue} if a property with name
7646
* {@code name} has not been configured.
7747
*/
78-
public abstract boolean getBoolean(String name, boolean defaultValue);
48+
boolean getBoolean(String name, boolean defaultValue);
7949

8050
/**
8151
* Returns an integer-valued configuration property or {@code defaultValue} if a property with
8252
* name {@code name} has not been configured or when parsing has failed.
8353
*/
84-
public abstract int getInt(String name, int defaultValue);
54+
int getInt(String name, int defaultValue);
8555

8656
/**
8757
* Returns a long-valued configuration property or {@code defaultValue} if a property with name
8858
* {@code name} has not been configured or when parsing has failed.
8959
*/
90-
public abstract long getLong(String name, long defaultValue);
60+
long getLong(String name, long defaultValue);
9161

9262
/**
9363
* Returns a double-valued configuration property or {@code defaultValue} if a property with name
9464
* {@code name} has not been configured or when parsing has failed.
9565
*/
96-
public abstract double getDouble(String name, double defaultValue);
66+
double getDouble(String name, double defaultValue);
9767

9868
/**
9969
* Returns a duration-valued configuration property or {@code defaultValue} if a property with
@@ -113,13 +83,13 @@ public static InstrumentationConfig get() {
11383
*
11484
* <p>Examples: 10s, 20ms, 5000
11585
*/
116-
public abstract Duration getDuration(String name, Duration defaultValue);
86+
Duration getDuration(String name, Duration defaultValue);
11787

11888
/**
11989
* This is the same as calling {@code getList(String, List)} with the defaultValue equal to the
12090
* emptyList()/
12191
*/
122-
public List<String> getList(String name) {
92+
default List<String> getList(String name) {
12393
return getList(name, emptyList());
12494
}
12595

@@ -128,13 +98,13 @@ public List<String> getList(String name) {
12898
* {@code name} has not been configured. The format of the original value must be comma-separated,
12999
* e.g. {@code one,two,three}. The returned list is unmodifiable.
130100
*/
131-
public abstract List<String> getList(String name, List<String> defaultValue);
101+
List<String> getList(String name, List<String> defaultValue);
132102

133103
/**
134104
* Returns a map-valued configuration property or {@code defaultValue} if a property with name
135105
* {@code name} has not been configured or when parsing has failed. The format of the original
136106
* value must be comma-separated for each key, with an '=' separating the key and value, e.g.
137107
* {@code key=value,anotherKey=anotherValue}. The returned map is unmodifiable.
138108
*/
139-
public abstract Map<String, String> getMap(String name, Map<String, String> defaultValue);
109+
Map<String, String> getMap(String name, Map<String, String> defaultValue);
140110
}

instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
1818
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
1919
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
20-
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
20+
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
2121
import io.opentelemetry.javaagent.instrumentation.akkahttp.AkkaHttpUtil;
2222

2323
public final class AkkaHttpServerSingletons {
@@ -31,21 +31,21 @@ public final class AkkaHttpServerSingletons {
3131
GlobalOpenTelemetry.get(),
3232
AkkaHttpUtil.instrumentationName(),
3333
HttpSpanNameExtractor.builder(httpAttributesGetter)
34-
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
34+
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods())
3535
.build())
3636
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
3737
.addAttributesExtractor(
3838
HttpServerAttributesExtractor.builder(httpAttributesGetter)
39-
.setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders())
40-
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
41-
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
39+
.setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders())
40+
.setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders())
41+
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods())
4242
.build())
4343
.addOperationMetrics(HttpServerMetrics.get())
4444
.addContextCustomizer(
4545
HttpServerRoute.builder(httpAttributesGetter)
46-
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
46+
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods())
4747
.build());
48-
if (CommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) {
48+
if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) {
4949
builder
5050
.addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter))
5151
.addOperationMetrics(HttpServerExperimentalMetrics.get());

instrumentation/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/OpenTelemetryFilter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboTelemetry;
1010
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboClientNetworkAttributesGetter;
1111
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor;
12-
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
12+
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
1313
import org.apache.dubbo.common.extension.Activate;
1414
import org.apache.dubbo.rpc.Filter;
1515
import org.apache.dubbo.rpc.Invocation;
@@ -27,7 +27,7 @@ public OpenTelemetryFilter() {
2727
.addAttributesExtractor(
2828
PeerServiceAttributesExtractor.create(
2929
new DubboClientNetworkAttributesGetter(),
30-
CommonConfig.get().getPeerServiceResolver()))
30+
AgentCommonConfig.get().getPeerServiceResolver()))
3131
.build()
3232
.newFilter();
3333
}

instrumentation/apache-shenyu-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheshenyu/v2_4/MetaDataHelper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import io.opentelemetry.api.trace.Span;
1010
import io.opentelemetry.context.Context;
1111
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
12-
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
12+
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
1313
import org.apache.shenyu.common.dto.MetaData;
1414

1515
public final class MetaDataHelper {
@@ -58,7 +58,7 @@ public final class MetaDataHelper {
5858

5959
static {
6060
CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES =
61-
InstrumentationConfig.get()
61+
AgentInstrumentationConfig.get()
6262
.getBoolean("otel.instrumentation.apache-shenyu.experimental-span-attributes", false);
6363
}
6464

instrumentation/armeria/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaSingletons.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor;
1212
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTelemetry;
1313
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaHttpClientAttributesGetter;
14-
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
14+
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
1515
import java.util.function.Function;
1616

1717
// Holds singleton references to decorators to match against during suppression.
@@ -24,19 +24,19 @@ public final class ArmeriaSingletons {
2424
static {
2525
ArmeriaTelemetry telemetry =
2626
ArmeriaTelemetry.builder(GlobalOpenTelemetry.get())
27-
.setCapturedClientRequestHeaders(CommonConfig.get().getClientRequestHeaders())
28-
.setCapturedClientResponseHeaders(CommonConfig.get().getClientResponseHeaders())
29-
.setCapturedServerRequestHeaders(CommonConfig.get().getServerRequestHeaders())
30-
.setCapturedServerResponseHeaders(CommonConfig.get().getServerResponseHeaders())
31-
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
27+
.setCapturedClientRequestHeaders(AgentCommonConfig.get().getClientRequestHeaders())
28+
.setCapturedClientResponseHeaders(AgentCommonConfig.get().getClientResponseHeaders())
29+
.setCapturedServerRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders())
30+
.setCapturedServerResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders())
31+
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods())
3232
.addClientAttributeExtractor(
3333
HttpClientPeerServiceAttributesExtractor.create(
3434
ArmeriaHttpClientAttributesGetter.INSTANCE,
35-
CommonConfig.get().getPeerServiceResolver()))
35+
AgentCommonConfig.get().getPeerServiceResolver()))
3636
.setEmitExperimentalHttpClientMetrics(
37-
CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry())
37+
AgentCommonConfig.get().shouldEmitExperimentalHttpClientTelemetry())
3838
.setEmitExperimentalHttpServerMetrics(
39-
CommonConfig.get().shouldEmitExperimentalHttpServerTelemetry())
39+
AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry())
4040
.build();
4141

4242
CLIENT_DECORATOR = telemetry.newClientDecorator();

instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaInstrumentationHelper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1111
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaEventsInstrumenterFactory;
1212
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaSqsInstrumenterFactory;
13-
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
13+
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
1414

1515
public final class AwsLambdaInstrumentationHelper {
1616

1717
private static final io.opentelemetry.instrumentation.awslambdacore.v1_0.internal
1818
.AwsLambdaFunctionInstrumenter
1919
FUNCTION_INSTRUMENTER =
2020
AwsLambdaEventsInstrumenterFactory.createInstrumenter(
21-
GlobalOpenTelemetry.get(), CommonConfig.get().getKnownHttpRequestMethods());
21+
GlobalOpenTelemetry.get(), AgentCommonConfig.get().getKnownHttpRequestMethods());
2222

2323
public static io.opentelemetry.instrumentation.awslambdacore.v1_0.internal
2424
.AwsLambdaFunctionInstrumenter

instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import io.opentelemetry.context.Context;
1515
import io.opentelemetry.context.Scope;
1616
import io.opentelemetry.instrumentation.awssdk.v1_11.AwsSdkTelemetry;
17+
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
1718
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
18-
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
1919

2020
/**
2121
* A {@link RequestHandler2} for use in the agent. Unlike library instrumentation, the agent will
@@ -36,7 +36,7 @@ public class TracingRequestHandler extends RequestHandler2 {
3636
public static final RequestHandler2 tracingHandler =
3737
AwsSdkTelemetry.builder(GlobalOpenTelemetry.get())
3838
.setCaptureExperimentalSpanAttributes(
39-
InstrumentationConfig.get()
39+
AgentInstrumentationConfig.get()
4040
.getBoolean("otel.instrumentation.aws-sdk.experimental-span-attributes", false))
4141
.setMessagingReceiveInstrumentationEnabled(
4242
ExperimentalConfig.get().messagingReceiveInstrumentationEnabled())

instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/autoconfigure/AwsSdkSingletons.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import io.opentelemetry.api.GlobalOpenTelemetry;
1111
import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil;
1212
import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry;
13+
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
1314
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
14-
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
1515
import java.util.List;
1616

1717
public final class AwsSdkSingletons {
@@ -28,7 +28,7 @@ public final class AwsSdkSingletons {
2828

2929
private static boolean hasAgentConfiguration() {
3030
try {
31-
Class.forName("io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig");
31+
Class.forName("io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig");
3232
return true;
3333
} catch (ClassNotFoundException e) {
3434
return false;
@@ -69,7 +69,7 @@ private static boolean recordIndividualHttpError() {
6969

7070
private static boolean getBoolean(String name, boolean defaultValue) {
7171
if (HAS_INSTRUMENTATION_CONFIG) {
72-
return InstrumentationConfig.get().getBoolean(name, defaultValue);
72+
return AgentInstrumentationConfig.get().getBoolean(name, defaultValue);
7373
} else {
7474
return ConfigPropertiesUtil.getBoolean(name, defaultValue);
7575
}

0 commit comments

Comments
 (0)