diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java index b8ff8ce9289..017e691946d 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ExtendedOpenTelemetryTest.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.api.incubator.logs.ExtendedDefaultLoggerProvider; import io.opentelemetry.api.incubator.logs.ExtendedLogger; import io.opentelemetry.api.incubator.metrics.ExtendedDefaultMeterProvider; @@ -24,10 +25,9 @@ import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; -import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.internal.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.SdkConfigProvider; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -67,7 +67,7 @@ void globalOpenTelemetry() { GlobalOpenTelemetry.set( ExtendedOpenTelemetrySdk.create( OpenTelemetrySdk.builder().build(), - SdkConfigProvider.create(new OpenTelemetryConfigurationModel()))); + SdkConfigProvider.create(DeclarativeConfigProperties.empty()))); assertThat(GlobalOpenTelemetry.get()).isInstanceOf(ExtendedOpenTelemetry.class); } @@ -92,10 +92,10 @@ void instrumentationConfig() { + " example:\n" + " property: \"value\""; - OpenTelemetryConfigurationModel configuration = - DeclarativeConfiguration.parse( - new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8))); - SdkConfigProvider configProvider = SdkConfigProvider.create(configuration); + SdkConfigProvider configProvider = + SdkConfigProvider.create( + DeclarativeConfiguration.toConfigProperties( + new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8)))); ExtendedOpenTelemetry openTelemetry = ExtendedOpenTelemetrySdk.create(OpenTelemetrySdk.builder().build(), configProvider); diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtilTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtilTest.java index 67f454bd29a..18fc13888db 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtilTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtilTest.java @@ -9,9 +9,8 @@ import com.google.common.collect.ImmutableMap; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; -import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.YamlDeclarativeConfigProperties; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.internal.SdkConfigProvider; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -61,10 +60,9 @@ class InstrumentationConfigUtilTest { toConfigProvider("instrumentation/development:\n general:\n http:\n"); private static ConfigProvider toConfigProvider(String configYaml) { - OpenTelemetryConfigurationModel configuration = - DeclarativeConfiguration.parse( - new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8))); - return SdkConfigProvider.create(configuration); + return SdkConfigProvider.create( + DeclarativeConfiguration.toConfigProperties( + new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8)))); } @Test diff --git a/api/incubator/src/testConvertToModel/java/io/opentelemetry/api/incubator/InstrumentationConfigUtilTest.java b/api/incubator/src/testConvertToModel/java/io/opentelemetry/api/incubator/InstrumentationConfigUtilTest.java index f4c3ca3353a..8e294ee4c7a 100644 --- a/api/incubator/src/testConvertToModel/java/io/opentelemetry/api/incubator/InstrumentationConfigUtilTest.java +++ b/api/incubator/src/testConvertToModel/java/io/opentelemetry/api/incubator/InstrumentationConfigUtilTest.java @@ -15,11 +15,11 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; -import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalInstrumentationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.internal.SdkConfigProvider; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -130,11 +130,13 @@ private static ConfigProvider withInstrumentationConfig( ExperimentalLanguageSpecificInstrumentationModel javaConfig = new ExperimentalLanguageSpecificInstrumentationModel(); javaConfig.setAdditionalProperty(instrumentationName, instrumentationConfig); + DeclarativeConfigProperties modelProperties = + DeclarativeConfiguration.toConfigProperties( + new OpenTelemetryConfigurationModel() + .withInstrumentationDevelopment( + new ExperimentalInstrumentationModel().withJava(javaConfig))); - return SdkConfigProvider.create( - new OpenTelemetryConfigurationModel() - .withInstrumentationDevelopment( - new ExperimentalInstrumentationModel().withJava(javaConfig))); + return SdkConfigProvider.create(modelProperties); } private static class Model { 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 85e79634b61..314fa4666b9 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 @@ -10,12 +10,12 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; 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.internal.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.SdkConfigProvider; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; @@ -28,17 +28,20 @@ class DeclarativeConfigurationSpiTest { @Test void configFromSpi() { - 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())); + OpenTelemetrySdk expectedSdk = + OpenTelemetrySdkBuilderUtil.setConfigProvider( + OpenTelemetrySdk.builder() + .setTracerProvider( + SdkTracerProvider.builder() + .setResource( + Resource.getDefault().toBuilder() + .put("service.name", "test") + .build()) + .addSpanProcessor( + SimpleSpanProcessor.create(LoggingSpanExporter.create())) + .build()), + SdkConfigProvider.create(DeclarativeConfigProperties.empty())) + .build(); cleanup.addCloseable(expectedSdk); AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder()); Thread thread = new Thread(); diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java index 6feacb1a889..ee313c33a61 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java @@ -91,7 +91,7 @@ void globalOpenTelemetry_AutoConfigureEnabled() { private static OpenTelemetry unobfuscate(OpenTelemetry openTelemetry) { try { Field delegateField = - Class.forName("io.opentelemetry.api.GlobalOpenTelemetry$ObfuscatedOpenTelemetry") + Class.forName("io.opentelemetry.api.incubator.internal.ObfuscatedExtendedOpenTelemetry") .getDeclaredField("delegate"); delegateField.setAccessible(true); Object delegate = delegateField.get(openTelemetry); 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 3eb7f3914c5..3081ca9cff7 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 @@ -29,7 +29,8 @@ 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.internal.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.OpenTelemetrySdkBuilderUtil; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; @@ -122,16 +123,18 @@ void configFile_Valid() { OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(); Resource resource = Resource.getDefault().toBuilder().put("service.name", "test").build(); - ExtendedOpenTelemetrySdk expectedSdk = - ExtendedOpenTelemetrySdk.create( - OpenTelemetrySdk.builder() - .setTracerProvider( - SdkTracerProvider.builder() - .setResource(resource) - .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) - .build()) - .build(), - ((ExtendedOpenTelemetrySdk) openTelemetrySdk).getSdkConfigProvider()); + OpenTelemetrySdk expectedSdk = + OpenTelemetrySdkBuilderUtil.setConfigProvider( + OpenTelemetrySdk.builder() + .setTracerProvider( + SdkTracerProvider.builder() + .setResource(resource) + .addSpanProcessor( + SimpleSpanProcessor.create(LoggingSpanExporter.create())) + .build()), + ((ExtendedOpenTelemetrySdk) openTelemetrySdk).getSdkConfigProvider()) + .build(); + cleanup.addCloseable(expectedSdk); assertThat(openTelemetrySdk.toString()).hasToString(expectedSdk.toString()); // AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from 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 7a643630c7b..6e67bd0bdb4 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 @@ -16,9 +16,9 @@ import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; 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.internal.ExtendedOpenTelemetrySdk; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.io.Closeable; import java.io.IOException; 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 a7d0a015bfd..649df9abb98 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,10 +6,13 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; 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.internal.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.SdkConfigProvider; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.resources.Resource; import java.util.Objects; @@ -32,9 +35,13 @@ static OpenTelemetryConfigurationFactory getInstance() { @Override public ExtendedOpenTelemetrySdk create( OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) { - SdkConfigProvider sdkConfigProvider = - SdkConfigProvider.create(model, context.getSpiHelper().getComponentLoader()); - OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder(); + DeclarativeConfigProperties modelProperties = + DeclarativeConfiguration.toConfigProperties( + model, context.getSpiHelper().getComponentLoader()); + SdkConfigProvider sdkConfigProvider = SdkConfigProvider.create(modelProperties); + OpenTelemetrySdkBuilder builder = + OpenTelemetrySdkBuilderUtil.setConfigProvider( + OpenTelemetrySdk.builder(), sdkConfigProvider); String fileFormat = model.getFileFormat(); if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) { throw new DeclarativeConfigException( @@ -44,7 +51,7 @@ public ExtendedOpenTelemetrySdk create( // behavior for experimental properties. if (Objects.equals(true, model.getDisabled())) { - return ExtendedOpenTelemetrySdk.create(builder.build(), sdkConfigProvider); + return (ExtendedOpenTelemetrySdk) builder.build(); } if (model.getPropagator() != null) { @@ -92,7 +99,6 @@ public ExtendedOpenTelemetrySdk create( .build())); } - OpenTelemetrySdk openTelemetrySdk = context.addCloseable(builder.build()); - return ExtendedOpenTelemetrySdk.create(openTelemetrySdk, sdkConfigProvider); + return (ExtendedOpenTelemetrySdk) context.addCloseable(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 deleted file mode 100644 index cc1b3c2f3c1..00000000000 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.extension.incubator.fileconfig; - -import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.common.ComponentLoader; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; - -/** SDK implementation of {@link ConfigProvider}. */ -public final class SdkConfigProvider implements ConfigProvider { - - private final DeclarativeConfigProperties instrumentationConfig; - - private SdkConfigProvider( - OpenTelemetryConfigurationModel model, ComponentLoader componentLoader) { - DeclarativeConfigProperties configProperties = - DeclarativeConfiguration.toConfigProperties(model, componentLoader); - this.instrumentationConfig = - configProperties.getStructured("instrumentation/development", empty()); - } - - /** - * Create a {@link SdkConfigProvider} from the {@code model}. - * - * @param model the configuration model - * @return the {@link SdkConfigProvider} - */ - public static SdkConfigProvider create(OpenTelemetryConfigurationModel model) { - return create(model, ComponentLoader.forClassLoader(SdkConfigProvider.class.getClassLoader())); - } - - /** - * Create a {@link SdkConfigProvider} from the {@code model}. - * - * @param model the configuration model - * @param componentLoader the component loader used to load SPIs - * @return the {@link SdkConfigProvider} - */ - public static SdkConfigProvider create( - OpenTelemetryConfigurationModel model, ComponentLoader componentLoader) { - return new SdkConfigProvider(model, componentLoader); - } - - @Override - 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 2efc5265f75..32445285793 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 @@ -20,10 +20,10 @@ import io.opentelemetry.internal.testing.slf4j.SuppressLogger; 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.OpenTelemetryConfigurationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; +import io.opentelemetry.sdk.internal.ExtendedOpenTelemetrySdk; import io.opentelemetry.sdk.trace.samplers.ParentBasedSamplerBuilder; import java.io.ByteArrayInputStream; import java.io.File; 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 eefa575cc5e..f809d423561 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,7 +24,6 @@ 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; @@ -53,6 +52,9 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel; +import io.opentelemetry.sdk.internal.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.SdkConfigProvider; import io.opentelemetry.sdk.logs.LogLimits; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.metrics.InstrumentSelector; @@ -123,9 +125,11 @@ void create_Defaults() { List closeables = new ArrayList<>(); OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel().withFileFormat("1.0-rc.1"); - ExtendedOpenTelemetrySdk expectedSdk = - ExtendedOpenTelemetrySdk.create( - OpenTelemetrySdk.builder().build(), SdkConfigProvider.create(model)); + OpenTelemetrySdk expectedSdk = + OpenTelemetrySdkBuilderUtil.setConfigProvider( + OpenTelemetrySdk.builder(), + SdkConfigProvider.create(DeclarativeConfiguration.toConfigProperties(model))) + .build(); cleanup.addCloseable(expectedSdk); ExtendedOpenTelemetrySdk sdk = @@ -154,9 +158,11 @@ void create_Disabled() { .withExporter( new LogRecordExporterModel() .withOtlpHttp(new OtlpHttpExporterModel())))))); - ExtendedOpenTelemetrySdk expectedSdk = - ExtendedOpenTelemetrySdk.create( - OpenTelemetrySdk.builder().build(), SdkConfigProvider.create(model)); + OpenTelemetrySdk expectedSdk = + OpenTelemetrySdkBuilderUtil.setConfigProvider( + OpenTelemetrySdk.builder(), + SdkConfigProvider.create(DeclarativeConfiguration.toConfigProperties(model))) + .build(); cleanup.addCloseable(expectedSdk); ExtendedOpenTelemetrySdk sdk = @@ -257,63 +263,64 @@ void create_Configured() throws NoSuchFieldException, IllegalAccessException { .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) + OpenTelemetrySdk expectedSdk = + OpenTelemetrySdkBuilderUtil.setConfigProvider( + 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()) + .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()) - .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(), - SdkConfigProvider.create(model)); + .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()), + SdkConfigProvider.create(DeclarativeConfiguration.toConfigProperties(model))) + .build(); + cleanup.addCloseable(expectedSdk); ExtendedOpenTelemetrySdk sdk = diff --git a/sdk/all/build.gradle.kts b/sdk/all/build.gradle.kts index 88d18b78ac7..e6ceffa6dbe 100644 --- a/sdk/all/build.gradle.kts +++ b/sdk/all/build.gradle.kts @@ -17,6 +17,8 @@ dependencies { api(project(":sdk:metrics")) api(project(":sdk:logs")) + compileOnly(project(":api:incubator")) + annotationProcessor("com.google.auto.value:auto-value") testAnnotationProcessor("com.google.auto.value:auto-value") 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..281c065f64c --- /dev/null +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.internal.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.SdkConfigProvider; +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() {} + + static OpenTelemetrySdk createExtendedOpenTelemetrySdk( + OpenTelemetrySdk openTelemetrySdk, @Nullable Object sdkConfigProvider) { + SdkConfigProvider resolvedConfigProvider = + sdkConfigProvider == null + ? SdkConfigProvider.create(DeclarativeConfigProperties.empty()) + : (SdkConfigProvider) sdkConfigProvider; + return ExtendedOpenTelemetrySdk.create(openTelemetrySdk, resolvedConfigProvider); + } +} diff --git a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java index f8f079acd6e..c7168599554 100644 --- a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java @@ -5,8 +5,12 @@ package io.opentelemetry.sdk; +import static java.util.Objects.requireNonNull; + import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.sdk.internal.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.SdkConfigProvider; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; import io.opentelemetry.sdk.metrics.SdkMeterProvider; @@ -21,6 +25,20 @@ public final class OpenTelemetrySdkBuilder { @Nullable private SdkTracerProvider tracerProvider; @Nullable private SdkMeterProvider meterProvider; @Nullable private SdkLoggerProvider loggerProvider; + @Nullable private Object configProvider; + + private static final boolean INCUBATOR_AVAILABLE; + + static { + boolean incubatorAvailable = false; + try { + Class.forName("io.opentelemetry.api.incubator.ExtendedOpenTelemetry"); + incubatorAvailable = true; + } catch (ClassNotFoundException e) { + // Not available + } + INCUBATOR_AVAILABLE = incubatorAvailable; + } /** * Package protected to disallow direct initialization. @@ -66,7 +84,18 @@ public OpenTelemetrySdkBuilder setLoggerProvider(SdkLoggerProvider loggerProvide /** Sets the {@link ContextPropagators} to use. */ public OpenTelemetrySdkBuilder setPropagators(ContextPropagators propagators) { - this.propagators = propagators; + this.propagators = requireNonNull(propagators); + return this; + } + + /** + * Sets the {@link SdkConfigProvider} to use. + * + *

This method is experimental so not public. You may reflectively call it using {@link + * OpenTelemetrySdkBuilderUtil#setConfigProvider(OpenTelemetrySdkBuilder, SdkConfigProvider)}. + */ + OpenTelemetrySdkBuilder setConfigProvider(SdkConfigProvider configProvider) { + this.configProvider = requireNonNull(configProvider); return this; } @@ -111,6 +140,10 @@ public OpenTelemetrySdk build() { loggerProvider = SdkLoggerProvider.builder().build(); } - return new OpenTelemetrySdk(tracerProvider, meterProvider, loggerProvider, propagators); + OpenTelemetrySdk openTelemetrySdk = + new OpenTelemetrySdk(tracerProvider, meterProvider, loggerProvider, propagators); + return INCUBATOR_AVAILABLE + ? IncubatingUtil.createExtendedOpenTelemetrySdk(openTelemetrySdk, configProvider) + : openTelemetrySdk; } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdk.java b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/ExtendedOpenTelemetrySdk.java similarity index 86% rename from sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdk.java rename to sdk/all/src/main/java/io/opentelemetry/sdk/internal/ExtendedOpenTelemetrySdk.java index f7f838e04cc..dc89b116108 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/ExtendedOpenTelemetrySdk.java +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/ExtendedOpenTelemetrySdk.java @@ -3,19 +3,23 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.sdk.extension.incubator; +package io.opentelemetry.sdk.internal; 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.concurrent.ThreadSafe; -/** A new interface for creating OpenTelemetrySdk that supports getting {@link ConfigProvider}. */ +/** + * {@link ExtendedOpenTelemetrySdk} is SDK implementation of {@link ExtendedOpenTelemetry}. + * + *

This class is internal and experimental. Its APIs are unstable and can change at any time. Its + * APIs (or a version of them) may be promoted to the public stable API in the future, but no + * guarantees are made. + */ public final class ExtendedOpenTelemetrySdk extends OpenTelemetrySdk - implements ExtendedOpenTelemetry, Closeable { + implements ExtendedOpenTelemetry { private final OpenTelemetrySdk openTelemetrySdk; private final ObfuscatedConfigProvider configProvider; diff --git a/sdk/all/src/main/java/io/opentelemetry/sdk/internal/OpenTelemetrySdkBuilderUtil.java b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/OpenTelemetrySdkBuilderUtil.java new file mode 100644 index 00000000000..ff017d64fc0 --- /dev/null +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/OpenTelemetrySdkBuilderUtil.java @@ -0,0 +1,40 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.internal; + +import io.opentelemetry.sdk.OpenTelemetrySdkBuilder; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * A collection of methods that allow use of experimental features prior to availability in public + * APIs. + * + *

This class is internal and experimental. Its APIs are unstable and can change at any time. Its + * APIs (or a version of them) may be promoted to the public stable API in the future, but no + * guarantees are made. + */ +public final class OpenTelemetrySdkBuilderUtil { + + private OpenTelemetrySdkBuilderUtil() {} + + /** Reflectively set the {@link ScopeConfigurator} to the {@link SdkTracerProvider}. */ + public static OpenTelemetrySdkBuilder setConfigProvider( + OpenTelemetrySdkBuilder builder, SdkConfigProvider configProvider) { + try { + Method method = + OpenTelemetrySdkBuilder.class.getDeclaredMethod( + "setConfigProvider", SdkConfigProvider.class); + method.setAccessible(true); + method.invoke(builder, configProvider); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + throw new IllegalStateException( + "Error calling setConfigProvider on OpenTelemetrySdkBuilder", e); + } + return builder; + } +} diff --git a/sdk/all/src/main/java/io/opentelemetry/sdk/internal/SdkConfigProvider.java b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/SdkConfigProvider.java new file mode 100644 index 00000000000..a5399ed4a23 --- /dev/null +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/SdkConfigProvider.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.internal; + +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; + +/** + * SDK implementation of {@link ConfigProvider}. + * + *

This class is internal and experimental. Its APIs are unstable and can change at any time. Its + * APIs (or a version of them) may be promoted to the public stable API in the future, but no + * guarantees are made. + */ +public final class SdkConfigProvider implements ConfigProvider { + + private final DeclarativeConfigProperties instrumentationConfig; + + private SdkConfigProvider(DeclarativeConfigProperties openTelemetryConfigModel) { + this.instrumentationConfig = openTelemetryConfigModel.get("instrumentation/development"); + } + + /** + * Create a {@link SdkConfigProvider}. + * + * @param openTelemetryConfigModel {@link DeclarativeConfigProperties} corresponding to the {@code + * OpenTelemetryConfiguration} type, i.e. the root node. + * @return the {@link SdkConfigProvider} instance + */ + public static SdkConfigProvider create(DeclarativeConfigProperties openTelemetryConfigModel) { + return new SdkConfigProvider(openTelemetryConfigModel); + } + + @Override + public DeclarativeConfigProperties getInstrumentationConfig() { + return instrumentationConfig; + } + + @Override + public String toString() { + return "SdkConfigProvider{" + "instrumentationConfig=" + instrumentationConfig + '}'; + } +}