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\\{.*}}"); } }