diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java
new file mode 100644
index 00000000000..6509e4f4865
--- /dev/null
+++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetry.java
@@ -0,0 +1,17 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.api.incubator;
+
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.incubator.config.ConfigProvider;
+
+/** Extension to {@link OpenTelemetry} with experimental APIs. */
+public interface ExtendedOpenTelemetry extends OpenTelemetry {
+ /** Returns the {@link ConfigProvider} for this {@link OpenTelemetry}. */
+ default ConfigProvider getConfigProvider() {
+ return ConfigProvider.noop();
+ }
+}
diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt
index d848519f75c..c581f3303f6 100644
--- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt
+++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt
@@ -1,2 +1,10 @@
Comparing source compatibility of opentelemetry-sdk-1.55.0-SNAPSHOT.jar against opentelemetry-sdk-1.54.0.jar
-No changes.
\ No newline at end of file
+*** MODIFIED CLASS: PUBLIC NON_FINAL (<- FINAL) io.opentelemetry.sdk.OpenTelemetrySdk (not serializable)
+ === CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+ *** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.logs.LoggerProvider getLogsBridge()
+ *** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.metrics.MeterProvider getMeterProvider()
+ *** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.context.propagation.ContextPropagators getPropagators()
+ *** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.logs.SdkLoggerProvider getSdkLoggerProvider()
+ *** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.metrics.SdkMeterProvider getSdkMeterProvider()
+ *** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.trace.SdkTracerProvider getSdkTracerProvider()
+ *** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.trace.TracerProvider getTracerProvider()
diff --git a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java
index a3f0d6892ac..72a3eacac25 100644
--- a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java
+++ b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java
@@ -13,6 +13,9 @@
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.internal.testing.CleanupExtension;
import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
+import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
+import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@@ -25,15 +28,17 @@ class DeclarativeConfigurationSpiTest {
@Test
void configFromSpi() {
- OpenTelemetrySdk expectedSdk =
- OpenTelemetrySdk.builder()
- .setTracerProvider(
- SdkTracerProvider.builder()
- .setResource(
- Resource.getDefault().toBuilder().put("service.name", "test").build())
- .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
- .build())
- .build();
+ ExtendedOpenTelemetrySdk expectedSdk =
+ ExtendedOpenTelemetrySdk.create(
+ OpenTelemetrySdk.builder()
+ .setTracerProvider(
+ SdkTracerProvider.builder()
+ .setResource(
+ Resource.getDefault().toBuilder().put("service.name", "test").build())
+ .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
+ .build())
+ .build(),
+ SdkConfigProvider.create(new OpenTelemetryConfigurationModel()));
cleanup.addCloseable(expectedSdk);
AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder());
Thread thread = new Thread();
diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
index 62d00718e7b..a062ca30af8 100644
--- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
+++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
@@ -33,6 +33,7 @@
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
+import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@@ -117,16 +118,6 @@ void configFile_Valid() {
ConfigProperties config =
DefaultConfigProperties.createFromMap(
Collections.singletonMap("otel.experimental.config.file", configFilePath.toString()));
- OpenTelemetrySdk expectedSdk =
- OpenTelemetrySdk.builder()
- .setTracerProvider(
- SdkTracerProvider.builder()
- .setResource(
- Resource.getDefault().toBuilder().put("service.name", "test").build())
- .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
- .build())
- .build();
- cleanup.addCloseable(expectedSdk);
AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder());
Thread thread = new Thread();
doReturn(thread).when(builder).shutdownHook(any());
@@ -135,8 +126,20 @@ void configFile_Valid() {
builder.setConfig(config).build();
cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
- assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString())
- .isEqualTo(expectedSdk.toString());
+ OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
+ ExtendedOpenTelemetrySdk expectedSdk =
+ ExtendedOpenTelemetrySdk.create(
+ OpenTelemetrySdk.builder()
+ .setTracerProvider(
+ SdkTracerProvider.builder()
+ .setResource(
+ Resource.getDefault().toBuilder().put("service.name", "test").build())
+ .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
+ .build())
+ .build(),
+ ((ExtendedOpenTelemetrySdk) openTelemetrySdk).getSdkConfigProvider());
+ cleanup.addCloseable(expectedSdk);
+ assertThat(openTelemetrySdk.toString()).hasToString(expectedSdk.toString());
// AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from
// file
assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault());
diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdk.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdk.java
new file mode 100644
index 00000000000..5b24dbfd035
--- /dev/null
+++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdk.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.sdk.extension.incubator;
+
+import io.opentelemetry.api.incubator.ExtendedOpenTelemetry;
+import io.opentelemetry.api.incubator.config.ConfigProvider;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
+import java.io.Closeable;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.ThreadSafe;
+
+/** A new interface for creating OpenTelemetrySdk that supports getting {@link ConfigProvider}. */
+public final class ExtendedOpenTelemetrySdk extends OpenTelemetrySdk
+ implements ExtendedOpenTelemetry, Closeable {
+
+ private final OpenTelemetrySdk openTelemetrySdk;
+ private final ObfuscatedConfigProvider configProvider;
+
+ private ExtendedOpenTelemetrySdk(
+ OpenTelemetrySdk openTelemetrySdk, SdkConfigProvider configProvider) {
+ super(
+ openTelemetrySdk.getSdkTracerProvider(),
+ openTelemetrySdk.getSdkMeterProvider(),
+ openTelemetrySdk.getSdkLoggerProvider(),
+ openTelemetrySdk.getPropagators());
+ this.openTelemetrySdk = openTelemetrySdk;
+ this.configProvider = new ObfuscatedConfigProvider(configProvider);
+ }
+
+ public static ExtendedOpenTelemetrySdk create(
+ OpenTelemetrySdk openTelemetrySdk, SdkConfigProvider sdkConfigProvider) {
+ return new ExtendedOpenTelemetrySdk(openTelemetrySdk, sdkConfigProvider);
+ }
+
+ @Override
+ public ConfigProvider getConfigProvider() {
+ return configProvider;
+ }
+
+ /** Returns the {@link SdkConfigProvider} for this {@link ExtendedOpenTelemetrySdk}. */
+ public SdkConfigProvider getSdkConfigProvider() {
+ return configProvider.unobfuscate();
+ }
+
+ @Override
+ public String toString() {
+ return "ExtendedOpenTelemetrySdk{"
+ + "openTelemetrySdk="
+ + openTelemetrySdk
+ + ", configProvider="
+ + configProvider.unobfuscate()
+ + "}";
+ }
+
+ /**
+ * This class allows the SDK to unobfuscate an obfuscated provider.
+ *
+ *
Static global providers are obfuscated when they are returned from the API to prevent users
+ * from casting them to their SDK specific implementation. For example, we do not want users to
+ * use patterns like {@code (SdkConfigProvider) openTelemetry.getConfigProvider()}.
+ */
+ @ThreadSafe
+ private static class ObfuscatedConfigProvider implements ConfigProvider {
+
+ private final SdkConfigProvider delegate;
+
+ private ObfuscatedConfigProvider(SdkConfigProvider delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ @Nullable
+ public DeclarativeConfigProperties getInstrumentationConfig() {
+ return delegate.getInstrumentationConfig();
+ }
+
+ private SdkConfigProvider unobfuscate() {
+ return delegate;
+ }
+ }
+}
diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java
index a4b336b8b94..96ddf9109b4 100644
--- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java
+++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java
@@ -15,6 +15,7 @@
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
+import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel;
import io.opentelemetry.sdk.trace.samplers.Sampler;
@@ -82,7 +83,7 @@ private DeclarativeConfiguration() {}
*
* @throws DeclarativeConfigException if unable to parse or interpret
*/
- public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) {
+ public static ExtendedOpenTelemetrySdk parseAndCreate(InputStream inputStream) {
OpenTelemetryConfigurationModel configurationModel = parse(inputStream);
return create(configurationModel);
}
@@ -95,7 +96,8 @@ public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) {
* @return the {@link OpenTelemetrySdk}
* @throws DeclarativeConfigException if unable to interpret
*/
- public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurationModel) {
+ public static ExtendedOpenTelemetrySdk create(
+ OpenTelemetryConfigurationModel configurationModel) {
return create(configurationModel, DEFAULT_COMPONENT_LOADER);
}
@@ -109,7 +111,7 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat
* @return the {@link OpenTelemetrySdk}
* @throws DeclarativeConfigException if unable to interpret
*/
- public static OpenTelemetrySdk create(
+ public static ExtendedOpenTelemetrySdk create(
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
SpiHelper spiHelper = SpiHelper.create(componentLoader);
diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java
index f2f659e90ad..f00762917b9 100644
--- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java
+++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java
@@ -8,6 +8,7 @@
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
+import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.resources.Resource;
@@ -15,7 +16,7 @@
import java.util.regex.Pattern;
final class OpenTelemetryConfigurationFactory
- implements Factory {
+ implements Factory {
private static final Pattern SUPPORTED_FILE_FORMATS = Pattern.compile("^(0.4)|(1.0(-rc.\\d*)?)$");
@@ -29,8 +30,9 @@ static OpenTelemetryConfigurationFactory getInstance() {
}
@Override
- public OpenTelemetrySdk create(
+ public ExtendedOpenTelemetrySdk create(
OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) {
+ SdkConfigProvider sdkConfigProvider = SdkConfigProvider.create(model);
OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder();
String fileFormat = model.getFileFormat();
if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) {
@@ -41,7 +43,7 @@ public OpenTelemetrySdk create(
// behavior for experimental properties.
if (Objects.equals(true, model.getDisabled())) {
- return builder.build();
+ return ExtendedOpenTelemetrySdk.create(builder.build(), sdkConfigProvider);
}
if (model.getPropagator() != null) {
@@ -88,6 +90,7 @@ public OpenTelemetrySdk create(
.build()));
}
- return context.addCloseable(builder.build());
+ OpenTelemetrySdk openTelemetrySdk = context.addCloseable(builder.build());
+ return ExtendedOpenTelemetrySdk.create(openTelemetrySdk, sdkConfigProvider);
}
}
diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java
index 9bc5192a787..561800d9949 100644
--- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java
+++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java
@@ -50,4 +50,9 @@ public static SdkConfigProvider create(
public DeclarativeConfigProperties getInstrumentationConfig() {
return instrumentationConfig;
}
+
+ @Override
+ public String toString() {
+ return "SdkConfigProvider{" + "instrumentationConfig=" + instrumentationConfig + '}';
+ }
}
diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java
index b72c0bc8ebe..6c7a01022ba 100644
--- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java
+++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java
@@ -15,7 +15,7 @@
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.internal.testing.CleanupExtension;
-import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
@@ -157,7 +157,7 @@ void create_ModelCustomizer() {
.withProcessors(
Collections.singletonList(
new SpanProcessorModel().withAdditionalProperty("test", null))));
- OpenTelemetrySdk sdk =
+ ExtendedOpenTelemetrySdk sdk =
DeclarativeConfiguration.create(
model,
// customizer is TestDeclarativeConfigurationCustomizerProvider
diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java
index a14431bf679..bd48b5a11fe 100644
--- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java
+++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java
@@ -24,6 +24,7 @@
import io.opentelemetry.internal.testing.CleanupExtension;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
+import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOnSamplerModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessorModel;
@@ -118,47 +119,50 @@ private static Stream fileFormatArgs() {
@Test
void create_Defaults() {
List closeables = new ArrayList<>();
- OpenTelemetrySdk expectedSdk = OpenTelemetrySdk.builder().build();
+ OpenTelemetryConfigurationModel model =
+ new OpenTelemetryConfigurationModel().withFileFormat("1.0-rc.1");
+ ExtendedOpenTelemetrySdk expectedSdk =
+ ExtendedOpenTelemetrySdk.create(
+ OpenTelemetrySdk.builder().build(), SdkConfigProvider.create(model));
cleanup.addCloseable(expectedSdk);
- OpenTelemetrySdk sdk =
- OpenTelemetryConfigurationFactory.getInstance()
- .create(new OpenTelemetryConfigurationModel().withFileFormat("1.0-rc.1"), context);
+ ExtendedOpenTelemetrySdk sdk =
+ OpenTelemetryConfigurationFactory.getInstance().create(model, context);
cleanup.addCloseable(sdk);
cleanup.addCloseables(closeables);
- assertThat(sdk.toString()).isEqualTo(expectedSdk.toString());
+ assertThat(sdk).hasToString(expectedSdk.toString());
}
@Test
void create_Disabled() {
List closeables = new ArrayList<>();
- OpenTelemetrySdk expectedSdk = OpenTelemetrySdk.builder().build();
+ OpenTelemetryConfigurationModel model =
+ new OpenTelemetryConfigurationModel()
+ .withFileFormat("1.0-rc.1")
+ .withDisabled(true)
+ // Logger provider configuration should be ignored since SDK is disabled
+ .withLoggerProvider(
+ new LoggerProviderModel()
+ .withProcessors(
+ Collections.singletonList(
+ new LogRecordProcessorModel()
+ .withSimple(
+ new SimpleLogRecordProcessorModel()
+ .withExporter(
+ new LogRecordExporterModel()
+ .withOtlpHttp(new OtlpHttpExporterModel()))))));
+ ExtendedOpenTelemetrySdk expectedSdk =
+ ExtendedOpenTelemetrySdk.create(
+ OpenTelemetrySdk.builder().build(), SdkConfigProvider.create(model));
cleanup.addCloseable(expectedSdk);
- OpenTelemetrySdk sdk =
- OpenTelemetryConfigurationFactory.getInstance()
- .create(
- new OpenTelemetryConfigurationModel()
- .withFileFormat("1.0-rc.1")
- .withDisabled(true)
- // Logger provider configuration should be ignored since SDK is disabled
- .withLoggerProvider(
- new LoggerProviderModel()
- .withProcessors(
- Collections.singletonList(
- new LogRecordProcessorModel()
- .withSimple(
- new SimpleLogRecordProcessorModel()
- .withExporter(
- new LogRecordExporterModel()
- .withOtlpHttp(
- new OtlpHttpExporterModel())))))),
- context);
+ ExtendedOpenTelemetrySdk sdk =
+ OpenTelemetryConfigurationFactory.getInstance().create(model, context);
cleanup.addCloseable(sdk);
cleanup.addCloseables(closeables);
- assertThat(sdk.toString()).isEqualTo(expectedSdk.toString());
+ assertThat(sdk).hasToString(expectedSdk.toString());
}
@Test
@@ -173,152 +177,148 @@ void create_Configured() {
.put("shape", "square")
.put("order", "second")
.build();
- OpenTelemetrySdk expectedSdk =
- OpenTelemetrySdk.builder()
- .setPropagators(
- ContextPropagators.create(
- TextMapPropagator.composite(
- W3CTraceContextPropagator.getInstance(),
- W3CBaggagePropagator.getInstance(),
- OtTracePropagator.getInstance(),
- B3Propagator.injectingMultiHeaders(),
- B3Propagator.injectingSingleHeader(),
- JaegerPropagator.getInstance())))
- .setLoggerProvider(
- SdkLoggerProvider.builder()
- .setResource(expectedResource)
- .setLogLimits(
- () ->
- LogLimits.builder()
- .setMaxAttributeValueLength(1)
- .setMaxNumberOfAttributes(2)
+
+ OpenTelemetryConfigurationModel model =
+ new OpenTelemetryConfigurationModel()
+ .withFileFormat("1.0-rc.1")
+ .withPropagator(
+ new PropagatorModel()
+ .withCompositeList("tracecontext,baggage,ottrace,b3multi,b3,jaeger"))
+ .withResource(
+ new ResourceModel()
+ .withDetectionDevelopment(
+ new ExperimentalResourceDetectionModel()
+ .withDetectors(
+ Arrays.asList(
+ new ExperimentalResourceDetectorModel()
+ .withAdditionalProperty("order_first", null),
+ new ExperimentalResourceDetectorModel()
+ .withAdditionalProperty("order_second", null),
+ new ExperimentalResourceDetectorModel()
+ .withAdditionalProperty("shape_color", null))))
+ .withAttributes(
+ Arrays.asList(
+ new AttributeNameValueModel()
+ .withName("service.name")
+ .withValue("my-service"),
+ new AttributeNameValueModel().withName("key").withValue("val"))))
+ .withLoggerProvider(
+ new LoggerProviderModel()
+ .withLimits(
+ new LogRecordLimitsModel()
+ .withAttributeValueLengthLimit(1)
+ .withAttributeCountLimit(2))
+ .withProcessors(
+ Collections.singletonList(
+ new LogRecordProcessorModel()
+ .withBatch(
+ new BatchLogRecordProcessorModel()
+ .withExporter(
+ new LogRecordExporterModel()
+ .withOtlpHttp(new OtlpHttpExporterModel()))))))
+ .withTracerProvider(
+ new TracerProviderModel()
+ .withLimits(
+ new SpanLimitsModel()
+ .withAttributeCountLimit(1)
+ .withAttributeValueLengthLimit(2)
+ .withEventCountLimit(3)
+ .withLinkCountLimit(4)
+ .withEventAttributeCountLimit(5)
+ .withLinkAttributeCountLimit(6))
+ .withSampler(new SamplerModel().withAlwaysOn(new AlwaysOnSamplerModel()))
+ .withProcessors(
+ Collections.singletonList(
+ new SpanProcessorModel()
+ .withBatch(
+ new BatchSpanProcessorModel()
+ .withExporter(
+ new SpanExporterModel()
+ .withOtlpHttp(new OtlpHttpExporterModel()))))))
+ .withMeterProvider(
+ new MeterProviderModel()
+ .withReaders(
+ Collections.singletonList(
+ new MetricReaderModel()
+ .withPeriodic(
+ new PeriodicMetricReaderModel()
+ .withExporter(
+ new PushMetricExporterModel()
+ .withOtlpHttp(new OtlpHttpMetricExporterModel())))))
+ .withViews(
+ Collections.singletonList(
+ new ViewModel()
+ .withSelector(
+ new ViewSelectorModel().withInstrumentName("instrument-name"))
+ .withStream(
+ new ViewStreamModel()
+ .withName("stream-name")
+ .withAttributeKeys(null)))));
+
+ ExtendedOpenTelemetrySdk expectedSdk =
+ ExtendedOpenTelemetrySdk.create(
+ OpenTelemetrySdk.builder()
+ .setPropagators(
+ ContextPropagators.create(
+ TextMapPropagator.composite(
+ W3CTraceContextPropagator.getInstance(),
+ W3CBaggagePropagator.getInstance(),
+ OtTracePropagator.getInstance(),
+ B3Propagator.injectingMultiHeaders(),
+ B3Propagator.injectingSingleHeader(),
+ JaegerPropagator.getInstance())))
+ .setLoggerProvider(
+ SdkLoggerProvider.builder()
+ .setResource(expectedResource)
+ .setLogLimits(
+ () ->
+ LogLimits.builder()
+ .setMaxAttributeValueLength(1)
+ .setMaxNumberOfAttributes(2)
+ .build())
+ .addLogRecordProcessor(
+ io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor.builder(
+ OtlpHttpLogRecordExporter.getDefault())
.build())
- .addLogRecordProcessor(
- io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor.builder(
- OtlpHttpLogRecordExporter.getDefault())
- .build())
- .build())
- .setTracerProvider(
- SdkTracerProvider.builder()
- .setResource(expectedResource)
- .setSpanLimits(
- SpanLimits.builder()
- .setMaxNumberOfAttributes(1)
- .setMaxAttributeValueLength(2)
- .setMaxNumberOfEvents(3)
- .setMaxNumberOfLinks(4)
- .setMaxNumberOfAttributesPerEvent(5)
- .setMaxNumberOfAttributesPerLink(6)
- .build())
- .setSampler(alwaysOn())
- .addSpanProcessor(
- io.opentelemetry.sdk.trace.export.BatchSpanProcessor.builder(
- OtlpHttpSpanExporter.getDefault())
- .build())
- .build())
- .setMeterProvider(
- SdkMeterProvider.builder()
- .setResource(expectedResource)
- .registerMetricReader(
- io.opentelemetry.sdk.metrics.export.PeriodicMetricReader.builder(
- OtlpHttpMetricExporter.getDefault())
- .build())
- .registerView(
- InstrumentSelector.builder().setName("instrument-name").build(),
- View.builder().setName("stream-name").build())
- .build())
- .build();
+ .build())
+ .setTracerProvider(
+ SdkTracerProvider.builder()
+ .setResource(expectedResource)
+ .setSpanLimits(
+ SpanLimits.builder()
+ .setMaxNumberOfAttributes(1)
+ .setMaxAttributeValueLength(2)
+ .setMaxNumberOfEvents(3)
+ .setMaxNumberOfLinks(4)
+ .setMaxNumberOfAttributesPerEvent(5)
+ .setMaxNumberOfAttributesPerLink(6)
+ .build())
+ .setSampler(alwaysOn())
+ .addSpanProcessor(
+ io.opentelemetry.sdk.trace.export.BatchSpanProcessor.builder(
+ OtlpHttpSpanExporter.getDefault())
+ .build())
+ .build())
+ .setMeterProvider(
+ SdkMeterProvider.builder()
+ .setResource(expectedResource)
+ .registerMetricReader(
+ io.opentelemetry.sdk.metrics.export.PeriodicMetricReader.builder(
+ OtlpHttpMetricExporter.getDefault())
+ .build())
+ .registerView(
+ InstrumentSelector.builder().setName("instrument-name").build(),
+ View.builder().setName("stream-name").build())
+ .build())
+ .build(),
+ SdkConfigProvider.create(model));
cleanup.addCloseable(expectedSdk);
- OpenTelemetrySdk sdk =
- OpenTelemetryConfigurationFactory.getInstance()
- .create(
- new OpenTelemetryConfigurationModel()
- .withFileFormat("1.0-rc.1")
- .withPropagator(
- new PropagatorModel()
- .withCompositeList("tracecontext,baggage,ottrace,b3multi,b3,jaeger"))
- .withResource(
- new ResourceModel()
- .withDetectionDevelopment(
- new ExperimentalResourceDetectionModel()
- .withDetectors(
- Arrays.asList(
- new ExperimentalResourceDetectorModel()
- .withAdditionalProperty("order_first", null),
- new ExperimentalResourceDetectorModel()
- .withAdditionalProperty("order_second", null),
- new ExperimentalResourceDetectorModel()
- .withAdditionalProperty("shape_color", null))))
- .withAttributes(
- Arrays.asList(
- new AttributeNameValueModel()
- .withName("service.name")
- .withValue("my-service"),
- new AttributeNameValueModel()
- .withName("key")
- .withValue("val"))))
- .withLoggerProvider(
- new LoggerProviderModel()
- .withLimits(
- new LogRecordLimitsModel()
- .withAttributeValueLengthLimit(1)
- .withAttributeCountLimit(2))
- .withProcessors(
- Collections.singletonList(
- new LogRecordProcessorModel()
- .withBatch(
- new BatchLogRecordProcessorModel()
- .withExporter(
- new LogRecordExporterModel()
- .withOtlpHttp(
- new OtlpHttpExporterModel()))))))
- .withTracerProvider(
- new TracerProviderModel()
- .withLimits(
- new SpanLimitsModel()
- .withAttributeCountLimit(1)
- .withAttributeValueLengthLimit(2)
- .withEventCountLimit(3)
- .withLinkCountLimit(4)
- .withEventAttributeCountLimit(5)
- .withLinkAttributeCountLimit(6))
- .withSampler(
- new SamplerModel().withAlwaysOn(new AlwaysOnSamplerModel()))
- .withProcessors(
- Collections.singletonList(
- new SpanProcessorModel()
- .withBatch(
- new BatchSpanProcessorModel()
- .withExporter(
- new SpanExporterModel()
- .withOtlpHttp(
- new OtlpHttpExporterModel()))))))
- .withMeterProvider(
- new MeterProviderModel()
- .withReaders(
- Collections.singletonList(
- new MetricReaderModel()
- .withPeriodic(
- new PeriodicMetricReaderModel()
- .withExporter(
- new PushMetricExporterModel()
- .withOtlpHttp(
- new OtlpHttpMetricExporterModel())))))
- .withViews(
- Collections.singletonList(
- new ViewModel()
- .withSelector(
- new ViewSelectorModel()
- .withInstrumentName("instrument-name"))
- .withStream(
- new ViewStreamModel()
- .withName("stream-name")
- .withAttributeKeys(null))))),
- context);
+ ExtendedOpenTelemetrySdk sdk =
+ OpenTelemetryConfigurationFactory.getInstance().create(model, context);
cleanup.addCloseable(sdk);
cleanup.addCloseables(closeables);
- assertThat(sdk.toString()).isEqualTo(expectedSdk.toString());
+ assertThat(sdk).hasToString(expectedSdk.toString());
}
}
diff --git a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java
index 81c1c3dd8c1..667f5abe14c 100644
--- a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java
+++ b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java
@@ -28,7 +28,7 @@
/** The SDK implementation of {@link OpenTelemetry}. */
@ThreadSafe
-public final class OpenTelemetrySdk implements OpenTelemetry, Closeable {
+public class OpenTelemetrySdk implements OpenTelemetry, Closeable {
private static final Logger LOGGER = Logger.getLogger(OpenTelemetrySdk.class.getName());
@@ -38,7 +38,7 @@ public final class OpenTelemetrySdk implements OpenTelemetry, Closeable {
private final ObfuscatedLoggerProvider loggerProvider;
private final ContextPropagators propagators;
- OpenTelemetrySdk(
+ protected OpenTelemetrySdk(
SdkTracerProvider tracerProvider,
SdkMeterProvider meterProvider,
SdkLoggerProvider loggerProvider,
@@ -58,27 +58,27 @@ public static OpenTelemetrySdkBuilder builder() {
}
@Override
- public TracerProvider getTracerProvider() {
+ public final TracerProvider getTracerProvider() {
return tracerProvider;
}
/** Returns the {@link SdkTracerProvider} for this {@link OpenTelemetrySdk}. */
- public SdkTracerProvider getSdkTracerProvider() {
+ public final SdkTracerProvider getSdkTracerProvider() {
return tracerProvider.unobfuscate();
}
@Override
- public MeterProvider getMeterProvider() {
+ public final MeterProvider getMeterProvider() {
return meterProvider;
}
/** Returns the {@link SdkMeterProvider} for this {@link OpenTelemetrySdk}. */
- public SdkMeterProvider getSdkMeterProvider() {
+ public final SdkMeterProvider getSdkMeterProvider() {
return meterProvider.unobfuscate();
}
@Override
- public LoggerProvider getLogsBridge() {
+ public final LoggerProvider getLogsBridge() {
return loggerProvider;
}
@@ -87,12 +87,12 @@ public LoggerProvider getLogsBridge() {
*
* @since 1.19.0
*/
- public SdkLoggerProvider getSdkLoggerProvider() {
+ public final SdkLoggerProvider getSdkLoggerProvider() {
return loggerProvider.unobfuscate();
}
@Override
- public ContextPropagators getPropagators() {
+ public final ContextPropagators getPropagators() {
return propagators;
}
diff --git a/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java b/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java
index 8fb5eafdf47..c6a48a0dbad 100644
--- a/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java
+++ b/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java
@@ -406,34 +406,13 @@ void stringRepresentation() {
.setPropagators(ContextPropagators.create(propagator))
.build();
+ // Test that toString delegates to underlying classes, and make sure their toString is also
+ // nice.
assertThat(sdk.toString())
- .isEqualTo(
- "OpenTelemetrySdk{"
- + "tracerProvider=SdkTracerProvider{"
- + "clock=SystemClock{}, "
- + "idGenerator=RandomIdGenerator{}, "
- + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, "
- + "spanLimitsSupplier=SpanLimitsValue{maxNumberOfAttributes=128, maxNumberOfEvents=128, maxNumberOfLinks=128, maxNumberOfAttributesPerEvent=128, maxNumberOfAttributesPerLink=128, maxAttributeValueLength=2147483647}, "
- + "sampler=ParentBased{root:AlwaysOnSampler,remoteParentSampled:AlwaysOnSampler,remoteParentNotSampled:AlwaysOffSampler,localParentSampled:AlwaysOnSampler,localParentNotSampled:AlwaysOffSampler}, "
- + "spanProcessor=SimpleSpanProcessor{spanExporter=MultiSpanExporter{spanExporters=[MockSpanExporter{}, MockSpanExporter{}]}, exportUnsampledSpans=false}, "
- + "tracerConfigurator=ScopeConfiguratorImpl{conditions=[]}"
- + "}, "
- + "meterProvider=SdkMeterProvider{"
- + "clock=SystemClock{}, "
- + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, "
- + "metricReaders=[PeriodicMetricReader{exporter=MockMetricExporter{}, intervalNanos=60000000000}], "
- + "metricProducers=[], "
- + "views=[RegisteredView{instrumentSelector=InstrumentSelector{instrumentName=instrument}, view=View{name=new-instrument, aggregation=DefaultAggregation, attributesProcessor=NoopAttributesProcessor{}, cardinalityLimit=2000}}], "
- + "meterConfigurator=ScopeConfiguratorImpl{conditions=[]}"
- + "}, "
- + "loggerProvider=SdkLoggerProvider{"
- + "clock=SystemClock{}, "
- + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, "
- + "logLimits=LogLimits{maxNumberOfAttributes=128, maxAttributeValueLength=2147483647}, "
- + "logRecordProcessor=SimpleLogRecordProcessor{logRecordExporter=MultiLogRecordExporter{logRecordExporters=[MockLogRecordExporter{}, MockLogRecordExporter{}]}}, "
- + "loggerConfigurator=ScopeConfiguratorImpl{conditions=[]}"
- + "}, "
- + "propagators=DefaultContextPropagators{textMapPropagator=MockTextMapPropagator{}}"
- + "}");
+ .matches("OpenTelemetrySdk\\{.*}")
+ .matches("OpenTelemetrySdk\\{tracerProvider=SdkTracerProvider\\{.*}.*}")
+ .matches("OpenTelemetrySdk\\{.*, meterProvider=SdkMeterProvider\\{.*}.*}")
+ .matches("OpenTelemetrySdk\\{.*, loggerProvider=SdkLoggerProvider\\{.*}.*}")
+ .matches("OpenTelemetrySdk\\{.*, propagators=DefaultContextPropagators\\{.*}}");
}
}