Skip to content

Commit 8ead80d

Browse files
committed
use ConfigPropertiesBridge for spring starter
1 parent 47ebb94 commit 8ead80d

File tree

26 files changed

+530
-240
lines changed

26 files changed

+530
-240
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.internal.config;
7+
8+
import java.util.function.Consumer;
9+
import java.util.function.Supplier;
10+
11+
/**
12+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
13+
* any time.
14+
*/
15+
public final class CommonConfigSetter {
16+
private CommonConfigSetter() {}
17+
18+
public static <T> void set(Supplier<T> supplier, Consumer<T> consumer) {
19+
T t = supplier.get();
20+
if (t != null) {
21+
consumer.accept(t);
22+
}
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.internal.config;
7+
8+
import static java.util.Collections.emptyMap;
9+
10+
import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants;
11+
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver;
12+
import io.opentelemetry.instrumentation.api.internal.HttpConstants;
13+
import java.util.ArrayList;
14+
import java.util.HashSet;
15+
import java.util.List;
16+
import java.util.Set;
17+
18+
/**
19+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
20+
* any time.
21+
*/
22+
public final class CoreCommonConfig {
23+
24+
private final PeerServiceResolver peerServiceResolver;
25+
private final List<String> clientRequestHeaders;
26+
private final List<String> clientResponseHeaders;
27+
private final List<String> serverRequestHeaders;
28+
private final List<String> serverResponseHeaders;
29+
private final Set<String> knownHttpRequestMethods;
30+
private final EnduserConfig enduserConfig;
31+
private final boolean statementSanitizationEnabled;
32+
private final boolean emitExperimentalHttpClientTelemetry;
33+
private final boolean emitExperimentalHttpServerTelemetry;
34+
private final String loggingTraceIdKey;
35+
private final String loggingSpanIdKey;
36+
private final String loggingTraceFlagsKey;
37+
38+
public CoreCommonConfig(CoreInstrumentationConfig config) {
39+
peerServiceResolver =
40+
PeerServiceResolver.create(
41+
config.getMap("otel.instrumentation.common.peer-service-mapping", emptyMap()));
42+
43+
clientRequestHeaders =
44+
config.getList("otel.instrumentation.http.client.capture-request-headers");
45+
clientResponseHeaders =
46+
config.getList("otel.instrumentation.http.client.capture-response-headers");
47+
serverRequestHeaders =
48+
config.getList("otel.instrumentation.http.server.capture-request-headers");
49+
serverResponseHeaders =
50+
config.getList("otel.instrumentation.http.server.capture-response-headers");
51+
knownHttpRequestMethods =
52+
new HashSet<>(
53+
config.getList(
54+
"otel.instrumentation.http.known-methods",
55+
new ArrayList<>(HttpConstants.KNOWN_METHODS)));
56+
statementSanitizationEnabled =
57+
config.getBoolean("otel.instrumentation.common.db-statement-sanitizer.enabled", true);
58+
emitExperimentalHttpClientTelemetry =
59+
config.getBoolean("otel.instrumentation.http.client.emit-experimental-telemetry", false);
60+
emitExperimentalHttpServerTelemetry =
61+
config.getBoolean("otel.instrumentation.http.server.emit-experimental-telemetry", false);
62+
enduserConfig = new EnduserConfig(config);
63+
loggingTraceIdKey =
64+
config.getString(
65+
"otel.instrumentation.common.logging.trace-id", LoggingContextConstants.TRACE_ID);
66+
loggingSpanIdKey =
67+
config.getString(
68+
"otel.instrumentation.common.logging.span-id", LoggingContextConstants.SPAN_ID);
69+
loggingTraceFlagsKey =
70+
config.getString(
71+
"otel.instrumentation.common.logging.trace-flags", LoggingContextConstants.TRACE_FLAGS);
72+
}
73+
74+
public PeerServiceResolver getPeerServiceResolver() {
75+
return peerServiceResolver;
76+
}
77+
78+
public List<String> getClientRequestHeaders() {
79+
return clientRequestHeaders;
80+
}
81+
82+
public List<String> getClientResponseHeaders() {
83+
return clientResponseHeaders;
84+
}
85+
86+
public List<String> getServerRequestHeaders() {
87+
return serverRequestHeaders;
88+
}
89+
90+
public List<String> getServerResponseHeaders() {
91+
return serverResponseHeaders;
92+
}
93+
94+
public Set<String> getKnownHttpRequestMethods() {
95+
return knownHttpRequestMethods;
96+
}
97+
98+
public EnduserConfig getEnduserConfig() {
99+
return enduserConfig;
100+
}
101+
102+
public boolean isStatementSanitizationEnabled() {
103+
return statementSanitizationEnabled;
104+
}
105+
106+
public boolean shouldEmitExperimentalHttpClientTelemetry() {
107+
return emitExperimentalHttpClientTelemetry;
108+
}
109+
110+
public boolean shouldEmitExperimentalHttpServerTelemetry() {
111+
return emitExperimentalHttpServerTelemetry;
112+
}
113+
114+
public String getTraceIdKey() {
115+
return loggingTraceIdKey;
116+
}
117+
118+
public String getSpanIdKey() {
119+
return loggingSpanIdKey;
120+
}
121+
122+
public String getTraceFlagsKey() {
123+
return loggingTraceFlagsKey;
124+
}
125+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.internal.config;
7+
8+
import static java.util.Collections.emptyList;
9+
10+
import java.time.Duration;
11+
import java.util.List;
12+
import java.util.Map;
13+
import javax.annotation.Nullable;
14+
15+
/**
16+
* Represents the global instrumentation configuration consisting of system properties, environment
17+
* variables, contents of the agent configuration file and properties defined by the {@code
18+
* ConfigPropertySource} SPI implementations.
19+
*
20+
* <p>In case any {@code get*()} method variant gets called for the same property more than once
21+
* (e.g. each time an advice class executes) it is suggested to cache the result instead of
22+
* repeatedly calling {@link CoreInstrumentationConfig}. Instrumentation configuration does not
23+
* change during the runtime so retrieving the property once and storing its result in a static
24+
* final field allows JIT to do its magic and remove some code branches.
25+
*
26+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
27+
* at any time.
28+
*/
29+
public interface CoreInstrumentationConfig {
30+
31+
/**
32+
* Returns a string-valued configuration property or {@code null} if a property with name {@code
33+
* name} has not been configured.
34+
*/
35+
@Nullable
36+
String getString(String name);
37+
38+
/**
39+
* Returns a string-valued configuration property or {@code defaultValue} if a property with name
40+
* {@code name} has not been configured.
41+
*/
42+
String getString(String name, String defaultValue);
43+
44+
/**
45+
* Returns a boolean-valued configuration property or {@code defaultValue} if a property with name
46+
* {@code name} has not been configured.
47+
*/
48+
boolean getBoolean(String name, boolean defaultValue);
49+
50+
/**
51+
* Returns an integer-valued configuration property or {@code defaultValue} if a property with
52+
* name {@code name} has not been configured or when parsing has failed.
53+
*/
54+
int getInt(String name, int defaultValue);
55+
56+
/**
57+
* Returns a long-valued configuration property or {@code defaultValue} if a property with name
58+
* {@code name} has not been configured or when parsing has failed.
59+
*/
60+
long getLong(String name, long defaultValue);
61+
62+
/**
63+
* Returns a double-valued configuration property or {@code defaultValue} if a property with name
64+
* {@code name} has not been configured or when parsing has failed.
65+
*/
66+
double getDouble(String name, double defaultValue);
67+
68+
/**
69+
* Returns a duration-valued configuration property or {@code defaultValue} if a property with
70+
* name {@code name} has not been configured or when parsing has failed.
71+
*
72+
* <p>Durations can be of the form "{number}{unit}", where unit is one of:
73+
*
74+
* <ul>
75+
* <li>ms
76+
* <li>s
77+
* <li>m
78+
* <li>h
79+
* <li>d
80+
* </ul>
81+
*
82+
* <p>If no unit is specified, milliseconds is the assumed duration unit.
83+
*
84+
* <p>Examples: 10s, 20ms, 5000
85+
*/
86+
Duration getDuration(String name, Duration defaultValue);
87+
88+
/**
89+
* This is the same as calling {@code getList(String, List)} with the defaultValue equal to the
90+
* emptyList()/
91+
*/
92+
default List<String> getList(String name) {
93+
return getList(name, emptyList());
94+
}
95+
96+
/**
97+
* Returns a list-valued configuration property or {@code defaultValue} if a property with name
98+
* {@code name} has not been configured. The format of the original value must be comma-separated,
99+
* e.g. {@code one,two,three}. The returned list is unmodifiable.
100+
*/
101+
List<String> getList(String name, List<String> defaultValue);
102+
103+
/**
104+
* Returns a map-valued configuration property or {@code defaultValue} if a property with name
105+
* {@code name} has not been configured or when parsing has failed. The format of the original
106+
* value must be comma-separated for each key, with an '=' separating the key and value, e.g.
107+
* {@code key=value,anotherKey=anotherValue}. The returned map is unmodifiable.
108+
*/
109+
Map<String, String> getMap(String name, Map<String, String> defaultValue);
110+
}

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

Lines changed: 2 additions & 2 deletions
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.internal.config;
77

88
import java.util.Objects;
99

@@ -39,7 +39,7 @@ public class EnduserConfig {
3939
private final boolean roleEnabled;
4040
private final boolean scopeEnabled;
4141

42-
EnduserConfig(InstrumentationConfig instrumentationConfig) {
42+
EnduserConfig(CoreInstrumentationConfig instrumentationConfig) {
4343
Objects.requireNonNull(instrumentationConfig, "instrumentationConfig must not be null");
4444

4545
/*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.internal.instrumenter;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.instrumentation.api.incubator.builder.AbstractHttpClientTelemetryBuilder;
10+
import io.opentelemetry.instrumentation.api.incubator.internal.config.CoreCommonConfig;
11+
import java.util.function.Consumer;
12+
import java.util.function.Supplier;
13+
14+
/**
15+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
16+
* any time.
17+
*/
18+
public class HttpClientInstrumenterBuilder {
19+
private HttpClientInstrumenterBuilder() {}
20+
21+
@CanIgnoreReturnValue
22+
public static <T extends AbstractHttpClientTelemetryBuilder<?, ?, ?>> T configure(
23+
CoreCommonConfig config, T builder) {
24+
set(config::getKnownHttpRequestMethods, builder::setKnownMethods);
25+
set(config::getClientRequestHeaders, builder::setCapturedRequestHeaders);
26+
set(config::getClientResponseHeaders, builder::setCapturedResponseHeaders);
27+
set(config::getPeerServiceResolver, builder::setPeerServiceResolver);
28+
set(
29+
config::shouldEmitExperimentalHttpClientTelemetry,
30+
builder::setEmitExperimentalHttpClientMetrics);
31+
return builder;
32+
}
33+
34+
private static <T> void set(Supplier<T> supplier, Consumer<T> consumer) {
35+
T t = supplier.get();
36+
if (t != null) {
37+
consumer.accept(t);
38+
}
39+
}
40+
}

instrumentation/external-annotations/javaagent-unit-tests/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ plugins {
44

55
dependencies {
66
testImplementation(project(":instrumentation-api"))
7+
testImplementation(project(":instrumentation-api-incubator"))
78
testImplementation(project(":javaagent-extension-api"))
89
testImplementation(project(":javaagent-tooling"))
910
testImplementation(project(":instrumentation:external-annotations:javaagent"))

instrumentation/external-annotations/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/extannotations/IncludeTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import static org.assertj.core.api.Assertions.assertThat;
1010
import static org.mockito.Mockito.when;
1111

12-
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
12+
import io.opentelemetry.instrumentation.api.incubator.internal.config.CoreInstrumentationConfig;
1313
import java.util.Arrays;
1414
import java.util.Collections;
1515
import java.util.HashSet;
@@ -25,7 +25,7 @@
2525
@ExtendWith(MockitoExtension.class)
2626
class IncludeTest {
2727

28-
@Mock InstrumentationConfig config;
28+
@Mock CoreInstrumentationConfig config;
2929

3030
@ParameterizedTest
3131
@MethodSource("provideArguments")

instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/ExternalAnnotationInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import io.opentelemetry.context.Context;
1919
import io.opentelemetry.context.Scope;
20+
import io.opentelemetry.instrumentation.api.incubator.internal.config.CoreInstrumentationConfig;
2021
import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod;
2122
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
2223
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
@@ -113,7 +114,7 @@ public void transform(TypeTransformer transformer) {
113114
}
114115

115116
// visible for testing
116-
static Set<String> configureAdditionalTraceAnnotations(InstrumentationConfig config) {
117+
static Set<String> configureAdditionalTraceAnnotations(CoreInstrumentationConfig config) {
117118
String configString = config.getString(TRACE_ANNOTATIONS_CONFIG);
118119
if (configString == null) {
119120
return Collections.unmodifiableSet(new HashSet<>(DEFAULT_ANNOTATIONS));

instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import io.opentelemetry.api.GlobalOpenTelemetry;
1111
import io.opentelemetry.api.logs.LogRecordBuilder;
12+
import io.opentelemetry.instrumentation.api.incubator.internal.config.CoreInstrumentationConfig;
1213
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor;
1314
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper;
1415
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
@@ -30,7 +31,7 @@ public final class Log4jHelper {
3031
private static final boolean captureExperimentalAttributes;
3132

3233
static {
33-
InstrumentationConfig config = InstrumentationConfig.get();
34+
CoreInstrumentationConfig config = InstrumentationConfig.get();
3435

3536
captureExperimentalAttributes =
3637
config.getBoolean("otel.instrumentation.log4j-appender.experimental-log-attributes", false);

instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackSingletons.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

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

10+
import io.opentelemetry.instrumentation.api.incubator.internal.config.CoreInstrumentationConfig;
1011
import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
1112
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
1213
import java.util.List;
@@ -16,7 +17,7 @@ public final class LogbackSingletons {
1617
private static final LoggingEventMapper mapper;
1718

1819
static {
19-
InstrumentationConfig config = InstrumentationConfig.get();
20+
CoreInstrumentationConfig config = InstrumentationConfig.get();
2021

2122
boolean captureExperimentalAttributes =
2223
config.getBoolean(

0 commit comments

Comments
 (0)