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..73514616cb3 --- /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} that supports getting {@link ConfigProvider}. */ +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 407cc500462..0126773a2c9 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt @@ -1,2 +1,3 @@ Comparing source compatibility of opentelemetry-sdk-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-1.52.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 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..4a3307cd901 --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdk.java @@ -0,0 +1,72 @@ +/* + * 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.context.propagation.ContextPropagators; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; +import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +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 class ExtendedOpenTelemetrySdk extends OpenTelemetrySdk + implements ExtendedOpenTelemetry, Closeable { + + private final ObfuscatedConfigProvider configProvider; + + public ExtendedOpenTelemetrySdk( + SdkTracerProvider tracerProvider, + SdkMeterProvider meterProvider, + SdkLoggerProvider loggerProvider, + ContextPropagators propagators, + SdkConfigProvider configProvider) { + super(tracerProvider, meterProvider, loggerProvider, propagators); + this.configProvider = new ObfuscatedConfigProvider(configProvider); + } + + @Override + public ConfigProvider getConfigProvider() { + return configProvider.unobfuscate(); + } + + /** + * This class allows the SDK to unobfuscate an obfuscated static global 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 (SdkMeterProvider) openTelemetry.getMeterProvider()}. + */ + @ThreadSafe + // Visible for testing + static class ObfuscatedConfigProvider implements ConfigProvider { + + private final SdkConfigProvider delegate; + + ObfuscatedConfigProvider(SdkConfigProvider delegate) { + this.delegate = delegate; + } + + @Override + @Nullable + public DeclarativeConfigProperties getInstrumentationConfig() { + if (delegate == null) { + return null; + } + return delegate.getInstrumentationConfig(); + } + + public SdkConfigProvider unobfuscate() { + return delegate; + } + } +} diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdkBuilder.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdkBuilder.java new file mode 100644 index 00000000000..f18ba80e533 --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdkBuilder.java @@ -0,0 +1,129 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.OpenTelemetrySdkBuilder; +import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; +import java.io.Closeable; +import java.util.Objects; +import java.util.function.Consumer; + +/** An builder for creating an {@link ExtendedOpenTelemetrySdk} instance. */ +public final class ExtendedOpenTelemetrySdkBuilder { + private final SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder(); + private final SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder(); + private final SdkLoggerProviderBuilder loggerProviderBuilder = SdkLoggerProvider.builder(); + private ContextPropagators propagators = ContextPropagators.noop(); + private SdkConfigProvider configProvider = + SdkConfigProvider.create(new OpenTelemetryConfigurationModel()); + private Consumer closeableConsumer = + closeable -> { + // Default no-op closeable consumer + }; + + /** Sets the {@link ContextPropagators} to use. */ + public ExtendedOpenTelemetrySdkBuilder setPropagators(ContextPropagators propagators) { + this.propagators = Objects.requireNonNull(propagators, "propagators must not be null"); + return this; + } + + /** Sets the {@link ConfigProvider} to use. */ + public ExtendedOpenTelemetrySdkBuilder setConfigProvider(SdkConfigProvider configProvider) { + this.configProvider = Objects.requireNonNull(configProvider, "configProvider must not be null"); + return this; + } + + public ExtendedOpenTelemetrySdkBuilder setCloseableConsumer(Consumer configurator) { + this.closeableConsumer = Objects.requireNonNull(configurator, "configurator must not be null"); + return this; + } + + /** + * Applies a consumer callback to configure the TracerProvider being built for this OpenTelemetry. + * + * @param configurator A callback fleshing out tracers. + * @return this + */ + public ExtendedOpenTelemetrySdkBuilder withTracerProvider( + Consumer configurator) { + configurator.accept(this.tracerProviderBuilder); + return this; + } + + /** + * Applies a consumer callback to configure the MeterProvider being built for this OpenTelemetry. + * + * @param configurator A callback fleshing out meters. + * @return this + */ + public ExtendedOpenTelemetrySdkBuilder withMeterProvider( + Consumer configurator) { + configurator.accept(this.meterProviderBuilder); + return this; + } + + /** + * Applies a consumer callback to configure the LoggerProvider being built for this OpenTelemetry. + * + * @param configurator A callback fleshing out meters. + * @return this + */ + public ExtendedOpenTelemetrySdkBuilder withLoggerProvider( + Consumer configurator) { + configurator.accept(this.loggerProviderBuilder); + return this; + } + + /** + * Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link + * OpenTelemetrySdkBuilder}. This SDK is not registered as the global {@link + * io.opentelemetry.api.OpenTelemetry}. It is recommended that you register one SDK using {@link + * OpenTelemetrySdkBuilder#buildAndRegisterGlobal()} for use by instrumentation that requires + * access to a global instance of {@link io.opentelemetry.api.OpenTelemetry}. + * + * @see GlobalOpenTelemetry + */ + public ExtendedOpenTelemetrySdk build() { + SdkTracerProvider tracerProvider = tracerProviderBuilder.build(); + SdkMeterProvider meterProvider = meterProviderBuilder.build(); + SdkLoggerProvider loggerProvider = loggerProviderBuilder.build(); + closeableConsumer.accept(tracerProvider); + closeableConsumer.accept(meterProvider); + closeableConsumer.accept(loggerProvider); + ExtendedOpenTelemetrySdk sdk = + new ExtendedOpenTelemetrySdk( + tracerProvider, meterProvider, loggerProvider, propagators, configProvider); + closeableConsumer.accept(sdk); + return sdk; + } + + /** + * Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link + * OpenTelemetrySdkBuilder} and registers it as the global {@link + * io.opentelemetry.api.OpenTelemetry}. An exception will be thrown if this method is attempted to + * be called multiple times in the lifecycle of an application - ensure you have only one SDK for + * use as the global instance. If you need to configure multiple SDKs for tests, use {@link + * GlobalOpenTelemetry#resetForTest()} between them. + * + * @see GlobalOpenTelemetry + */ + public ExtendedOpenTelemetrySdk buildAndRegisterGlobal() { + ExtendedOpenTelemetrySdk sdk = build(); + GlobalOpenTelemetry.set(sdk); + return sdk; + } +} diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java index 9cc697ecaea..8f69f77a205 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import java.io.Closeable; @@ -39,6 +40,10 @@ List getCloseables() { return Collections.unmodifiableList(closeables); } + ComponentLoader getComponentLoader() { + return spiHelper.getComponentLoader(); + } + /** * Find a registered {@link ComponentProvider} with {@link ComponentProvider#getType()} matching * {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link 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 494138bdaa4..ba15984357d 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/LoggerProviderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java index 98b06f4700e..638170498bb 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java @@ -15,14 +15,12 @@ import io.opentelemetry.sdk.internal.ScopeConfigurator; import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder; import io.opentelemetry.sdk.logs.LogLimits; -import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; import io.opentelemetry.sdk.logs.internal.LoggerConfig; import io.opentelemetry.sdk.logs.internal.SdkLoggerProviderUtil; import java.util.List; -final class LoggerProviderFactory - implements Factory { +final class LoggerProviderFactory { private static final LoggerProviderFactory INSTANCE = new LoggerProviderFactory(); @@ -32,14 +30,13 @@ static LoggerProviderFactory getInstance() { return INSTANCE; } - @Override - public SdkLoggerProviderBuilder create( - LoggerProviderAndAttributeLimits model, DeclarativeConfigContext context) { - SdkLoggerProviderBuilder builder = SdkLoggerProvider.builder(); - + public void configure( + SdkLoggerProviderBuilder builder, + LoggerProviderAndAttributeLimits model, + DeclarativeConfigContext context) { LoggerProviderModel loggerProviderModel = model.getLoggerProvider(); if (loggerProviderModel == null) { - return builder; + return; } LogLimits logLimits = @@ -84,8 +81,6 @@ public SdkLoggerProviderBuilder create( } SdkLoggerProviderUtil.setLoggerConfigurator(builder, configuratorBuilder.build()); } - - return builder; } private static class LoggerConfigFactory diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactory.java index a19ab7e5c99..6accc4544bf 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactory.java @@ -17,15 +17,13 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel; import io.opentelemetry.sdk.internal.ScopeConfigurator; import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder; -import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector; import io.opentelemetry.sdk.metrics.internal.MeterConfig; import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil; import java.util.List; -final class MeterProviderFactory implements Factory { - +final class MeterProviderFactory { private static final MeterProviderFactory INSTANCE = new MeterProviderFactory(); private MeterProviderFactory() {} @@ -34,11 +32,8 @@ static MeterProviderFactory getInstance() { return INSTANCE; } - @Override - public SdkMeterProviderBuilder create( - MeterProviderModel model, DeclarativeConfigContext context) { - SdkMeterProviderBuilder builder = SdkMeterProvider.builder(); - + public void configure( + SdkMeterProviderBuilder builder, MeterProviderModel model, DeclarativeConfigContext context) { List readerModels = model.getReaders(); if (readerModels != null) { readerModels.forEach( @@ -94,8 +89,6 @@ public SdkMeterProviderBuilder create( } SdkMeterProviderUtil.setMeterConfigurator(builder, configuratorBuilder.build()); } - - return builder; } private static class MeterConfigFactory 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 c61ecd432b8..f07a0d14c99 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 @@ -6,15 +6,18 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; 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.ExtendedOpenTelemetrySdkBuilder; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; import io.opentelemetry.sdk.resources.Resource; import java.util.Objects; 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*)?)$"); @@ -28,9 +31,9 @@ static OpenTelemetryConfigurationFactory getInstance() { } @Override - public OpenTelemetrySdk create( + public ExtendedOpenTelemetrySdk create( OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) { - OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder(); + ExtendedOpenTelemetrySdkBuilder builder = new ExtendedOpenTelemetrySdkBuilder(); String fileFormat = model.getFileFormat(); if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) { throw new DeclarativeConfigException( @@ -43,49 +46,54 @@ public OpenTelemetrySdk create( return builder.build(); } + builder.setCloseableConsumer(context::addCloseable); + builder.setConfigProvider(SdkConfigProvider.create(model, context.getComponentLoader())); + if (model.getPropagator() != null) { builder.setPropagators( PropagatorFactory.getInstance().create(model.getPropagator(), context)); } - Resource resource = Resource.getDefault(); + Resource resource; if (model.getResource() != null) { resource = ResourceFactory.getInstance().create(model.getResource(), context); + } else { + resource = Resource.getDefault(); } - if (model.getLoggerProvider() != null) { - builder.setLoggerProvider( - context.addCloseable( + LoggerProviderModel loggerProvider = model.getLoggerProvider(); + if (loggerProvider != null) { + builder.withLoggerProvider( + sdkLoggerProviderBuilder -> LoggerProviderFactory.getInstance() - .create( + .configure( + sdkLoggerProviderBuilder.setResource(resource), LoggerProviderAndAttributeLimits.create( - model.getAttributeLimits(), model.getLoggerProvider()), - context) - .setResource(resource) - .build())); + model.getAttributeLimits(), loggerProvider), + context)); } - if (model.getTracerProvider() != null) { - builder.setTracerProvider( - context.addCloseable( + TracerProviderModel tracerProvider = model.getTracerProvider(); + if (tracerProvider != null) { + builder.withTracerProvider( + sdkTracerProviderBuilder -> TracerProviderFactory.getInstance() - .create( + .configure( + sdkTracerProviderBuilder.setResource(resource), TracerProviderAndAttributeLimits.create( - model.getAttributeLimits(), model.getTracerProvider()), - context) - .setResource(resource) - .build())); + model.getAttributeLimits(), tracerProvider), + context)); } - if (model.getMeterProvider() != null) { - builder.setMeterProvider( - context.addCloseable( + MeterProviderModel meterProvider = model.getMeterProvider(); + if (meterProvider != null) { + builder.withMeterProvider( + sdkMeterProviderBuilder -> MeterProviderFactory.getInstance() - .create(model.getMeterProvider(), context) - .setResource(resource) - .build())); + .configure( + sdkMeterProviderBuilder.setResource(resource), meterProvider, context)); } - return context.addCloseable(builder.build()); + return builder.build(); } } 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/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactory.java index 68210f92b07..d25d602461d 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactory.java @@ -14,7 +14,6 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; import io.opentelemetry.sdk.internal.ScopeConfigurator; import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder; -import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.SpanLimits; import io.opentelemetry.sdk.trace.internal.SdkTracerProviderUtil; @@ -22,8 +21,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import java.util.List; -final class TracerProviderFactory - implements Factory { +final class TracerProviderFactory { private static final TracerProviderFactory INSTANCE = new TracerProviderFactory(); @@ -33,13 +31,13 @@ static TracerProviderFactory getInstance() { return INSTANCE; } - @Override - public SdkTracerProviderBuilder create( - TracerProviderAndAttributeLimits model, DeclarativeConfigContext context) { - SdkTracerProviderBuilder builder = SdkTracerProvider.builder(); + public void configure( + SdkTracerProviderBuilder builder, + TracerProviderAndAttributeLimits model, + DeclarativeConfigContext context) { TracerProviderModel tracerProviderModel = model.getTracerProvider(); if (tracerProviderModel == null) { - return builder; + return; } SpanLimits spanLimits = @@ -90,8 +88,6 @@ public SdkTracerProviderBuilder create( } SdkTracerProviderUtil.setTracerConfigurator(builder, configuratorBuilder.build()); } - - return builder; } private static class TracerConfigFactory 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/LoggerProviderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java index 65761fd5c9c..5a67b746eee 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java @@ -25,6 +25,7 @@ import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder; import io.opentelemetry.sdk.logs.LogLimits; import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; import io.opentelemetry.sdk.logs.internal.LoggerConfig; import java.io.Closeable; import java.util.ArrayList; @@ -50,11 +51,13 @@ void create(LoggerProviderAndAttributeLimits model, SdkLoggerProvider expectedPr List closeables = new ArrayList<>(); cleanup.addCloseable(expectedProvider); - SdkLoggerProvider provider = LoggerProviderFactory.getInstance().create(model, context).build(); + SdkLoggerProviderBuilder builder = SdkLoggerProvider.builder(); + LoggerProviderFactory.getInstance().configure(builder, model, context); + SdkLoggerProvider provider = builder.build(); cleanup.addCloseable(provider); cleanup.addCloseables(closeables); - assertThat(provider.toString()).isEqualTo(expectedProvider.toString()); + assertThat(provider).hasToString(expectedProvider.toString()); } private static Stream createArguments() { diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactoryTest.java index 93abfd7615b..f06a4f755da 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactoryTest.java @@ -26,6 +26,7 @@ import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder; import io.opentelemetry.sdk.metrics.InstrumentSelector; import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; import io.opentelemetry.sdk.metrics.View; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import io.opentelemetry.sdk.metrics.internal.MeterConfig; @@ -53,11 +54,13 @@ void create(MeterProviderModel model, SdkMeterProvider expectedProvider) { List closeables = new ArrayList<>(); cleanup.addCloseable(expectedProvider); - SdkMeterProvider provider = MeterProviderFactory.getInstance().create(model, context).build(); + SdkMeterProviderBuilder builder = SdkMeterProvider.builder(); + MeterProviderFactory.getInstance().configure(builder, model, context); + SdkMeterProvider provider = builder.build(); cleanup.addCloseable(provider); cleanup.addCloseables(closeables); - assertThat(provider.toString()).isEqualTo(expectedProvider.toString()); + assertThat(provider).hasToString(expectedProvider.toString()); } private static Stream createArguments() { 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 ba535627c0a..1a6d6483812 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 @@ -22,8 +22,9 @@ import io.opentelemetry.extension.trace.propagation.JaegerPropagator; import io.opentelemetry.extension.trace.propagation.OtTracePropagator; 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.ExtendedOpenTelemetrySdkBuilder; 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; @@ -53,11 +54,8 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel; import io.opentelemetry.sdk.logs.LogLimits; -import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.metrics.InstrumentSelector; -import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.View; -import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SpanLimits; import java.io.Closeable; import java.util.ArrayList; @@ -117,25 +115,29 @@ 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 = + new ExtendedOpenTelemetrySdkBuilder() + .setConfigProvider(SdkConfigProvider.create(model)) + .build(); 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(); + ExtendedOpenTelemetrySdk expectedSdk = new ExtendedOpenTelemetrySdkBuilder().build(); cleanup.addCloseable(expectedSdk); - OpenTelemetrySdk sdk = + ExtendedOpenTelemetrySdk sdk = OpenTelemetryConfigurationFactory.getInstance() .create( new OpenTelemetryConfigurationModel() @@ -157,7 +159,7 @@ void create_Disabled() { cleanup.addCloseable(sdk); cleanup.addCloseables(closeables); - assertThat(sdk.toString()).isEqualTo(expectedSdk.toString()); + assertThat(sdk).hasToString(expectedSdk.toString()); } @Test @@ -172,8 +174,87 @@ void create_Configured() { .put("shape", "square") .put("order", "second") .build(); - OpenTelemetrySdk expectedSdk = - OpenTelemetrySdk.builder() + + 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 = + new ExtendedOpenTelemetrySdkBuilder() + .setConfigProvider(SdkConfigProvider.create(model)) .setPropagators( ContextPropagators.create( TextMapPropagator.composite( @@ -183,141 +264,57 @@ void create_Configured() { B3Propagator.injectingMultiHeaders(), B3Propagator.injectingSingleHeader(), JaegerPropagator.getInstance()))) - .setLoggerProvider( - SdkLoggerProvider.builder() - .setResource(expectedResource) - .setLogLimits( - () -> - LogLimits.builder() - .setMaxAttributeValueLength(1) - .setMaxNumberOfAttributes(2) + .withLoggerProvider( + sdkLoggerProviderBuilder -> + sdkLoggerProviderBuilder + .setResource(expectedResource) + .setLogLimits( + () -> + LogLimits.builder() + .setMaxAttributeValueLength(1) + .setMaxNumberOfAttributes(2) + .build()) + .addLogRecordProcessor( + io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor.builder( + OtlpHttpLogRecordExporter.getDefault()) + .build())) + .withTracerProvider( + sdkTracerProviderBuilder -> + sdkTracerProviderBuilder + .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())) + .withMeterProvider( + sdkMeterProviderBuilder -> + sdkMeterProviderBuilder + .setResource(expectedResource) + .registerMetricReader( + io.opentelemetry.sdk.metrics.export.PeriodicMetricReader.builder( + OtlpHttpMetricExporter.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()) + .registerView( + InstrumentSelector.builder().setName("instrument-name").build(), + View.builder().setName("stream-name").build())) .build(); 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-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactoryTest.java index d565b408baa..19e59443c53 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TracerProviderFactoryTest.java @@ -54,11 +54,13 @@ void create(TracerProviderAndAttributeLimits model, SdkTracerProvider expectedPr List closeables = new ArrayList<>(); cleanup.addCloseable(expectedProvider); - SdkTracerProvider provider = TracerProviderFactory.getInstance().create(model, context).build(); + SdkTracerProviderBuilder builder = SdkTracerProvider.builder(); + TracerProviderFactory.getInstance().configure(builder, model, context); + SdkTracerProvider provider = builder.build(); cleanup.addCloseable(provider); cleanup.addCloseables(closeables); - assertThat(provider.toString()).isEqualTo(expectedProvider.toString()); + assertThat(provider).hasToString(expectedProvider.toString()); } private static Stream createArguments() { diff --git a/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java b/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java new file mode 100644 index 00000000000..0ada6e9f55d --- /dev/null +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java @@ -0,0 +1,22 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk; + +import javax.annotation.Nullable; + +/** + * Utilities for interacting with {@code io.opentelemetry:opentelemetry-api-incubator}, which is not + * guaranteed to be present on the classpath. For all methods, callers MUST first separately + * reflectively confirm that the incubator is available on the classpath. + */ +final class IncubatingUtil { + private IncubatingUtil() {} + + @Nullable + static OpenTelemetrySdk createExtendedOpenTelemetrySdk() { + return null; + } +} 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..225972a09c3 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, 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\\{.*}}"); } }