Skip to content

Commit 59ef480

Browse files
zeitlingerjsuerethjack-berg
authored andcommitted
Extended opentelemetry (open-telemetry#7496)
Co-authored-by: Josh Suereth <[email protected]> Co-authored-by: jack-berg <[email protected]> Co-authored-by: Josh Suereth <[email protected]>
1 parent 8052d43 commit 59ef480

File tree

12 files changed

+343
-235
lines changed

12 files changed

+343
-235
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.api.incubator;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.api.incubator.config.ConfigProvider;
10+
11+
/** Extension to {@link OpenTelemetry} with experimental APIs. */
12+
public interface ExtendedOpenTelemetry extends OpenTelemetry {
13+
/** Returns the {@link ConfigProvider} for this {@link OpenTelemetry}. */
14+
default ConfigProvider getConfigProvider() {
15+
return ConfigProvider.noop();
16+
}
17+
}
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,10 @@
11
Comparing source compatibility of opentelemetry-sdk-1.55.0-SNAPSHOT.jar against opentelemetry-sdk-1.54.0.jar
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC NON_FINAL (<- FINAL) io.opentelemetry.sdk.OpenTelemetrySdk (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.logs.LoggerProvider getLogsBridge()
5+
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.metrics.MeterProvider getMeterProvider()
6+
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.context.propagation.ContextPropagators getPropagators()
7+
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.logs.SdkLoggerProvider getSdkLoggerProvider()
8+
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.metrics.SdkMeterProvider getSdkMeterProvider()
9+
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.trace.SdkTracerProvider getSdkTracerProvider()
10+
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.trace.TracerProvider getTracerProvider()

sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
1414
import io.opentelemetry.internal.testing.CleanupExtension;
1515
import io.opentelemetry.sdk.OpenTelemetrySdk;
16+
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
17+
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
1619
import io.opentelemetry.sdk.resources.Resource;
1720
import io.opentelemetry.sdk.trace.SdkTracerProvider;
1821
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@@ -25,15 +28,17 @@ class DeclarativeConfigurationSpiTest {
2528

2629
@Test
2730
void configFromSpi() {
28-
OpenTelemetrySdk expectedSdk =
29-
OpenTelemetrySdk.builder()
30-
.setTracerProvider(
31-
SdkTracerProvider.builder()
32-
.setResource(
33-
Resource.getDefault().toBuilder().put("service.name", "test").build())
34-
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
35-
.build())
36-
.build();
31+
ExtendedOpenTelemetrySdk expectedSdk =
32+
ExtendedOpenTelemetrySdk.create(
33+
OpenTelemetrySdk.builder()
34+
.setTracerProvider(
35+
SdkTracerProvider.builder()
36+
.setResource(
37+
Resource.getDefault().toBuilder().put("service.name", "test").build())
38+
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
39+
.build())
40+
.build(),
41+
SdkConfigProvider.create(new OpenTelemetryConfigurationModel()));
3742
cleanup.addCloseable(expectedSdk);
3843
AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder());
3944
Thread thread = new Thread();

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
3434
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
3535
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
36+
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
3637
import io.opentelemetry.sdk.resources.Resource;
3738
import io.opentelemetry.sdk.trace.SdkTracerProvider;
3839
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@@ -117,16 +118,6 @@ void configFile_Valid() {
117118
ConfigProperties config =
118119
DefaultConfigProperties.createFromMap(
119120
Collections.singletonMap("otel.experimental.config.file", configFilePath.toString()));
120-
OpenTelemetrySdk expectedSdk =
121-
OpenTelemetrySdk.builder()
122-
.setTracerProvider(
123-
SdkTracerProvider.builder()
124-
.setResource(
125-
Resource.getDefault().toBuilder().put("service.name", "test").build())
126-
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
127-
.build())
128-
.build();
129-
cleanup.addCloseable(expectedSdk);
130121
AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder());
131122
Thread thread = new Thread();
132123
doReturn(thread).when(builder).shutdownHook(any());
@@ -135,8 +126,20 @@ void configFile_Valid() {
135126
builder.setConfig(config).build();
136127
cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
137128

138-
assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString())
139-
.isEqualTo(expectedSdk.toString());
129+
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
130+
ExtendedOpenTelemetrySdk expectedSdk =
131+
ExtendedOpenTelemetrySdk.create(
132+
OpenTelemetrySdk.builder()
133+
.setTracerProvider(
134+
SdkTracerProvider.builder()
135+
.setResource(
136+
Resource.getDefault().toBuilder().put("service.name", "test").build())
137+
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
138+
.build())
139+
.build(),
140+
((ExtendedOpenTelemetrySdk) openTelemetrySdk).getSdkConfigProvider());
141+
cleanup.addCloseable(expectedSdk);
142+
assertThat(openTelemetrySdk.toString()).hasToString(expectedSdk.toString());
140143
// AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from
141144
// file
142145
assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault());
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.extension.incubator;
7+
8+
import io.opentelemetry.api.incubator.ExtendedOpenTelemetry;
9+
import io.opentelemetry.api.incubator.config.ConfigProvider;
10+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
11+
import io.opentelemetry.sdk.OpenTelemetrySdk;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
13+
import java.io.Closeable;
14+
import javax.annotation.Nullable;
15+
import javax.annotation.concurrent.ThreadSafe;
16+
17+
/** A new interface for creating OpenTelemetrySdk that supports getting {@link ConfigProvider}. */
18+
public final class ExtendedOpenTelemetrySdk extends OpenTelemetrySdk
19+
implements ExtendedOpenTelemetry, Closeable {
20+
21+
private final OpenTelemetrySdk openTelemetrySdk;
22+
private final ObfuscatedConfigProvider configProvider;
23+
24+
private ExtendedOpenTelemetrySdk(
25+
OpenTelemetrySdk openTelemetrySdk, SdkConfigProvider configProvider) {
26+
super(
27+
openTelemetrySdk.getSdkTracerProvider(),
28+
openTelemetrySdk.getSdkMeterProvider(),
29+
openTelemetrySdk.getSdkLoggerProvider(),
30+
openTelemetrySdk.getPropagators());
31+
this.openTelemetrySdk = openTelemetrySdk;
32+
this.configProvider = new ObfuscatedConfigProvider(configProvider);
33+
}
34+
35+
public static ExtendedOpenTelemetrySdk create(
36+
OpenTelemetrySdk openTelemetrySdk, SdkConfigProvider sdkConfigProvider) {
37+
return new ExtendedOpenTelemetrySdk(openTelemetrySdk, sdkConfigProvider);
38+
}
39+
40+
@Override
41+
public ConfigProvider getConfigProvider() {
42+
return configProvider;
43+
}
44+
45+
/** Returns the {@link SdkConfigProvider} for this {@link ExtendedOpenTelemetrySdk}. */
46+
public SdkConfigProvider getSdkConfigProvider() {
47+
return configProvider.unobfuscate();
48+
}
49+
50+
@Override
51+
public String toString() {
52+
return "ExtendedOpenTelemetrySdk{"
53+
+ "openTelemetrySdk="
54+
+ openTelemetrySdk
55+
+ ", configProvider="
56+
+ configProvider.unobfuscate()
57+
+ "}";
58+
}
59+
60+
/**
61+
* This class allows the SDK to unobfuscate an obfuscated provider.
62+
*
63+
* <p>Static global providers are obfuscated when they are returned from the API to prevent users
64+
* from casting them to their SDK specific implementation. For example, we do not want users to
65+
* use patterns like {@code (SdkConfigProvider) openTelemetry.getConfigProvider()}.
66+
*/
67+
@ThreadSafe
68+
private static class ObfuscatedConfigProvider implements ConfigProvider {
69+
70+
private final SdkConfigProvider delegate;
71+
72+
private ObfuscatedConfigProvider(SdkConfigProvider delegate) {
73+
this.delegate = delegate;
74+
}
75+
76+
@Override
77+
@Nullable
78+
public DeclarativeConfigProperties getInstrumentationConfig() {
79+
return delegate.getInstrumentationConfig();
80+
}
81+
82+
private SdkConfigProvider unobfuscate() {
83+
return delegate;
84+
}
85+
}
86+
}

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.opentelemetry.sdk.OpenTelemetrySdk;
1616
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1717
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
18+
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
1819
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
1920
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel;
2021
import io.opentelemetry.sdk.trace.samplers.Sampler;
@@ -82,7 +83,7 @@ private DeclarativeConfiguration() {}
8283
*
8384
* @throws DeclarativeConfigException if unable to parse or interpret
8485
*/
85-
public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) {
86+
public static ExtendedOpenTelemetrySdk parseAndCreate(InputStream inputStream) {
8687
OpenTelemetryConfigurationModel configurationModel = parse(inputStream);
8788
return create(configurationModel);
8889
}
@@ -95,7 +96,8 @@ public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) {
9596
* @return the {@link OpenTelemetrySdk}
9697
* @throws DeclarativeConfigException if unable to interpret
9798
*/
98-
public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurationModel) {
99+
public static ExtendedOpenTelemetrySdk create(
100+
OpenTelemetryConfigurationModel configurationModel) {
99101
return create(configurationModel, DEFAULT_COMPONENT_LOADER);
100102
}
101103

@@ -109,7 +111,7 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat
109111
* @return the {@link OpenTelemetrySdk}
110112
* @throws DeclarativeConfigException if unable to interpret
111113
*/
112-
public static OpenTelemetrySdk create(
114+
public static ExtendedOpenTelemetrySdk create(
113115
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
114116
SpiHelper spiHelper = SpiHelper.create(componentLoader);
115117

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
99
import io.opentelemetry.sdk.OpenTelemetrySdk;
1010
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
11+
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
1112
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
1213
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1314
import io.opentelemetry.sdk.resources.Resource;
1415
import java.util.Objects;
1516
import java.util.regex.Pattern;
1617

1718
final class OpenTelemetryConfigurationFactory
18-
implements Factory<OpenTelemetryConfigurationModel, OpenTelemetrySdk> {
19+
implements Factory<OpenTelemetryConfigurationModel, ExtendedOpenTelemetrySdk> {
1920

2021
private static final Pattern SUPPORTED_FILE_FORMATS = Pattern.compile("^(0.4)|(1.0(-rc.\\d*)?)$");
2122

@@ -29,8 +30,9 @@ static OpenTelemetryConfigurationFactory getInstance() {
2930
}
3031

3132
@Override
32-
public OpenTelemetrySdk create(
33+
public ExtendedOpenTelemetrySdk create(
3334
OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) {
35+
SdkConfigProvider sdkConfigProvider = SdkConfigProvider.create(model);
3436
OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder();
3537
String fileFormat = model.getFileFormat();
3638
if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) {
@@ -41,7 +43,7 @@ public OpenTelemetrySdk create(
4143
// behavior for experimental properties.
4244

4345
if (Objects.equals(true, model.getDisabled())) {
44-
return builder.build();
46+
return ExtendedOpenTelemetrySdk.create(builder.build(), sdkConfigProvider);
4547
}
4648

4749
if (model.getPropagator() != null) {
@@ -88,6 +90,7 @@ public OpenTelemetrySdk create(
8890
.build()));
8991
}
9092

91-
return context.addCloseable(builder.build());
93+
OpenTelemetrySdk openTelemetrySdk = context.addCloseable(builder.build());
94+
return ExtendedOpenTelemetrySdk.create(openTelemetrySdk, sdkConfigProvider);
9295
}
9396
}

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,9 @@ public static SdkConfigProvider create(
5050
public DeclarativeConfigProperties getInstrumentationConfig() {
5151
return instrumentationConfig;
5252
}
53+
54+
@Override
55+
public String toString() {
56+
return "SdkConfigProvider{" + "instrumentationConfig=" + instrumentationConfig + '}';
57+
}
5358
}

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1616
import io.opentelemetry.common.ComponentLoader;
1717
import io.opentelemetry.internal.testing.CleanupExtension;
18-
import io.opentelemetry.sdk.OpenTelemetrySdk;
18+
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
1919
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
2020
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
2121
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
@@ -157,7 +157,7 @@ void create_ModelCustomizer() {
157157
.withProcessors(
158158
Collections.singletonList(
159159
new SpanProcessorModel().withAdditionalProperty("test", null))));
160-
OpenTelemetrySdk sdk =
160+
ExtendedOpenTelemetrySdk sdk =
161161
DeclarativeConfiguration.create(
162162
model,
163163
// customizer is TestDeclarativeConfigurationCustomizerProvider

0 commit comments

Comments
 (0)