Skip to content

Commit a15659d

Browse files
authored
add method to retrieve instrumentation configuration by name (#7927)
1 parent 2d38562 commit a15659d

File tree

5 files changed

+147
-0
lines changed

5 files changed

+147
-0
lines changed

api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,49 @@
77

88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.api.incubator.config.ConfigProvider;
10+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1011

1112
/** Extension to {@link OpenTelemetry} with experimental APIs. */
1213
public interface ExtendedOpenTelemetry extends OpenTelemetry {
1314
/** Returns the {@link ConfigProvider} for this {@link OpenTelemetry}. */
1415
default ConfigProvider getConfigProvider() {
1516
return ConfigProvider.noop();
1617
}
18+
19+
/**
20+
* Returns the {@link DeclarativeConfigProperties} for a specific instrumentation by name. If no
21+
* configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is
22+
* returned.
23+
*
24+
* <p>For example, {@code getInstrumentationConfig("foo")} returns the node:
25+
*
26+
* <pre>{@code
27+
* instrumentation/development:
28+
* java:
29+
* foo:
30+
* }</pre>
31+
*
32+
* @param name the name of the instrumentation
33+
* @return the {@link DeclarativeConfigProperties} for the given instrumentation name
34+
*/
35+
default DeclarativeConfigProperties getInstrumentationConfig(String name) {
36+
return getConfigProvider().getInstrumentationConfig(name);
37+
}
38+
39+
/**
40+
* Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration.
41+
*
42+
* <pre>{@code
43+
* instrumentation/development:
44+
* general:
45+
* }</pre>
46+
*
47+
* <p>If the general configuration is not available, an empty {@link DeclarativeConfigProperties}
48+
* is returned.
49+
*
50+
* @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration
51+
*/
52+
default DeclarativeConfigProperties getGeneralInstrumentationConfig() {
53+
return getConfigProvider().getGeneralInstrumentationConfig();
54+
}
1755
}

api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,43 @@ public interface ConfigProvider {
2828
*/
2929
DeclarativeConfigProperties getInstrumentationConfig();
3030

31+
/**
32+
* Returns the {@link DeclarativeConfigProperties} for a specific instrumentation by name. If no
33+
* configuration is available for the given name, an empty {@link DeclarativeConfigProperties} is
34+
* returned.
35+
*
36+
* <p>For example, {@code getInstrumentationConfig("foo")} returns the node:
37+
*
38+
* <pre>{@code
39+
* instrumentation/development:
40+
* java:
41+
* foo:
42+
* }</pre>
43+
*
44+
* @param name the name of the instrumentation
45+
* @return the {@link DeclarativeConfigProperties} for the given instrumentation name
46+
*/
47+
default DeclarativeConfigProperties getInstrumentationConfig(String name) {
48+
return getInstrumentationConfig().get("java").get(name);
49+
}
50+
51+
/**
52+
* Returns the {@link DeclarativeConfigProperties} for general instrumentation configuration.
53+
*
54+
* <pre>{@code
55+
* instrumentation/development:
56+
* general:
57+
* }</pre>
58+
*
59+
* <p>If the general configuration is not available, an empty {@link DeclarativeConfigProperties}
60+
* is returned.
61+
*
62+
* @return the {@link DeclarativeConfigProperties} for the general instrumentation configuration
63+
*/
64+
default DeclarativeConfigProperties getGeneralInstrumentationConfig() {
65+
return getInstrumentationConfig().get("general");
66+
}
67+
3168
/** Returns a no-op {@link ConfigProvider}. */
3269
static ConfigProvider noop() {
3370
return DeclarativeConfigProperties::empty;

api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,12 @@ void noopEquality() {
1717
ConfigProvider noop = ConfigProvider.noop();
1818
assertThat(ConfigProvider.noop()).isSameAs(noop);
1919
}
20+
21+
@Test
22+
void instrumentationConfigFallback() {
23+
ConfigProvider configProvider = ConfigProvider.noop();
24+
assertThat(configProvider.getInstrumentationConfig()).isNotNull();
25+
assertThat(configProvider.getInstrumentationConfig("servlet")).isNotNull();
26+
assertThat(configProvider.getGeneralInstrumentationConfig()).isNotNull();
27+
}
2028
}

api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
package io.opentelemetry.api.incubator;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.mockito.Mockito.spy;
10+
import static org.mockito.Mockito.when;
911

1012
import io.opentelemetry.api.GlobalOpenTelemetry;
1113
import io.opentelemetry.api.OpenTelemetry;
14+
import io.opentelemetry.api.incubator.config.ConfigProvider;
1215
import io.opentelemetry.api.incubator.logs.ExtendedDefaultLoggerProvider;
1316
import io.opentelemetry.api.incubator.logs.ExtendedLogger;
1417
import io.opentelemetry.api.incubator.metrics.ExtendedDefaultMeterProvider;
@@ -22,8 +25,12 @@
2225
import io.opentelemetry.context.propagation.ContextPropagators;
2326
import io.opentelemetry.sdk.OpenTelemetrySdk;
2427
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
28+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
2529
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
2630
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
31+
import java.io.ByteArrayInputStream;
32+
import java.nio.charset.StandardCharsets;
33+
import java.util.Arrays;
2734
import org.junit.jupiter.api.BeforeEach;
2835
import org.junit.jupiter.api.Test;
2936

@@ -70,4 +77,50 @@ private static void assertIsExtended(OpenTelemetry openTelemetry) {
7077
assertThat(openTelemetry.getLogsBridge().get("test")).isInstanceOf(ExtendedLogger.class);
7178
assertThat(openTelemetry.getTracer("test")).isInstanceOf(ExtendedTracer.class);
7279
}
80+
81+
@Test
82+
void instrumentationConfig() {
83+
String configYaml =
84+
"instrumentation/development:\n"
85+
+ " general:\n"
86+
+ " http:\n"
87+
+ " client:\n"
88+
+ " request_captured_headers:\n"
89+
+ " - client-request-header1\n"
90+
+ " - client-request-header2\n"
91+
+ " java:\n"
92+
+ " example:\n"
93+
+ " property: \"value\"";
94+
95+
OpenTelemetryConfigurationModel configuration =
96+
DeclarativeConfiguration.parse(
97+
new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8)));
98+
SdkConfigProvider configProvider = SdkConfigProvider.create(configuration);
99+
ExtendedOpenTelemetry openTelemetry =
100+
ExtendedOpenTelemetrySdk.create(OpenTelemetrySdk.builder().build(), configProvider);
101+
102+
// shortcuts to get specific instrumentation config
103+
assertThat(openTelemetry.getInstrumentationConfig("example").getString("property"))
104+
.isEqualTo("value");
105+
assertThat(
106+
openTelemetry
107+
.getGeneralInstrumentationConfig()
108+
.get("http")
109+
.get("client")
110+
.getScalarList("request_captured_headers", String.class))
111+
.isEqualTo(Arrays.asList("client-request-header1", "client-request-header2"));
112+
}
113+
114+
@Test
115+
void instrumentationConfigFallback() {
116+
ConfigProvider configProvider = ConfigProvider.noop();
117+
// cannot create ExtendedOpenTelemetry with noop ConfigProvider right now,
118+
// but will be possible once stable API is available
119+
ExtendedOpenTelemetry openTelemetry = spy(ExtendedOpenTelemetry.class);
120+
when(openTelemetry.getConfigProvider()).thenReturn(configProvider);
121+
122+
assertThat(configProvider.getInstrumentationConfig()).isNotNull();
123+
assertThat(openTelemetry.getInstrumentationConfig("servlet")).isNotNull();
124+
assertThat(openTelemetry.getGeneralInstrumentationConfig()).isNotNull();
125+
}
73126
}

sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,5 +224,16 @@ void configFile_ConfigProvider() {
224224
assertThat(InstrumentationConfigUtil.javaInstrumentationConfig(globalConfigProvider, "example"))
225225
.isNotNull()
226226
.satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value"));
227+
228+
// shortcuts to get specific instrumentation config
229+
assertThat(globalConfigProvider.getInstrumentationConfig("example").getString("key"))
230+
.isEqualTo("value");
231+
assertThat(
232+
globalConfigProvider
233+
.getGeneralInstrumentationConfig()
234+
.get("http")
235+
.get("client")
236+
.getScalarList("request_captured_headers", String.class))
237+
.isEqualTo(Arrays.asList("Content-Type", "Accept"));
227238
}
228239
}

0 commit comments

Comments
 (0)