From e78ae70c6b2709b48e6bb1a83ec626a20af78b63 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Thu, 22 Jan 2026 12:59:24 -0600 Subject: [PATCH] Move SdkConfigProvider, ExtendedOpenTelemetrySdk to opentelemetry-sdk --- .../incubator/ExtendedOpenTelemetryTest.java | 16 ++--- .../config/InstrumentationConfigUtilTest.java | 10 ++- .../InstrumentationConfigUtilTest.java | 12 ++-- .../DeclarativeConfigurationSpiTest.java | 10 +-- .../DeclarativeConfigurationTest.java | 6 +- .../fileconfig/DeclarativeConfiguration.java | 2 +- .../OpenTelemetryConfigurationFactory.java | 13 ++-- .../OpenTelemetrySdkBuilderUtil.java | 34 --------- .../fileconfig/SdkConfigProvider.java | 71 ------------------- .../DeclarativeConfigurationCreateTest.java | 2 +- ...OpenTelemetryConfigurationFactoryTest.java | 18 +++-- sdk/all/build.gradle.kts | 2 + .../io/opentelemetry/sdk/IncubatingUtil.java | 53 ++++---------- .../sdk/OpenTelemetrySdkBuilder.java | 26 +++---- .../all}/ExtendedOpenTelemetrySdk.java | 14 ++-- .../all/OpenTelemetrySdkBuilderUtil.java | 41 +++++++++++ .../sdk/internal/all/SdkConfigProvider.java | 46 ++++++++++++ 17 files changed, 173 insertions(+), 203 deletions(-) delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetrySdkBuilderUtil.java delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java rename {sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator => sdk/all/src/main/java/io/opentelemetry/sdk/internal/all}/ExtendedOpenTelemetrySdk.java (86%) create mode 100644 sdk/all/src/main/java/io/opentelemetry/sdk/internal/all/OpenTelemetrySdkBuilderUtil.java create mode 100644 sdk/all/src/main/java/io/opentelemetry/sdk/internal/all/SdkConfigProvider.java 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..f3caf5143e8 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.all.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.all.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..77bd48746d6 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.all.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..060247bcef3 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.all.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 d9c52bd5eec..53581519ef4 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.fileconfig.OpenTelemetrySdkBuilderUtil; -import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.internal.all.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.all.SdkConfigProvider; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; @@ -29,7 +29,7 @@ class DeclarativeConfigurationSpiTest { @Test void configFromSpi() { OpenTelemetrySdk expectedSdk = - OpenTelemetrySdkBuilderUtil.setSdkConfigProvider( + OpenTelemetrySdkBuilderUtil.setConfigProvider( OpenTelemetrySdk.builder() .setTracerProvider( SdkTracerProvider.builder() @@ -40,7 +40,7 @@ void configFromSpi() { .addSpanProcessor( SimpleSpanProcessor.create(LoggingSpanExporter.create())) .build()), - SdkConfigProvider.create(new OpenTelemetryConfigurationModel())) + SdkConfigProvider.create(DeclarativeConfigProperties.empty())) .build(); cleanup.addCloseable(expectedSdk); AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder()); 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 6bf280147c0..7e6cd4aef78 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,8 +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.extension.incubator.fileconfig.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.all.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.all.OpenTelemetrySdkBuilderUtil; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; @@ -124,7 +124,7 @@ void configFile_Valid() { OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(); Resource resource = Resource.getDefault().toBuilder().put("service.name", "test").build(); OpenTelemetrySdk expectedSdk = - OpenTelemetrySdkBuilderUtil.setSdkConfigProvider( + OpenTelemetrySdkBuilderUtil.setConfigProvider( OpenTelemetrySdk.builder() .setTracerProvider( SdkTracerProvider.builder() 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..365ece18f8d 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.all.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 023403648bb..c6cd3cb24e4 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.all.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.all.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.all.SdkConfigProvider; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.resources.Resource; import java.util.Objects; @@ -32,10 +35,12 @@ static OpenTelemetryConfigurationFactory getInstance() { @Override public ExtendedOpenTelemetrySdk create( OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) { - SdkConfigProvider sdkConfigProvider = - SdkConfigProvider.create(model, context.getSpiHelper().getComponentLoader()); + DeclarativeConfigProperties modelProperties = + DeclarativeConfiguration.toConfigProperties( + model, context.getSpiHelper().getComponentLoader()); + SdkConfigProvider sdkConfigProvider = SdkConfigProvider.create(modelProperties); OpenTelemetrySdkBuilder builder = - OpenTelemetrySdkBuilderUtil.setSdkConfigProvider( + OpenTelemetrySdkBuilderUtil.setConfigProvider( OpenTelemetrySdk.builder(), sdkConfigProvider); String fileFormat = model.getFileFormat(); if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) { diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetrySdkBuilderUtil.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetrySdkBuilderUtil.java deleted file mode 100644 index c7c162d73ff..00000000000 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetrySdkBuilderUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.extension.incubator.fileconfig; - -import io.opentelemetry.sdk.OpenTelemetrySdkBuilder; -import java.lang.reflect.Method; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class OpenTelemetrySdkBuilderUtil { - - private OpenTelemetrySdkBuilderUtil() {} - - public static OpenTelemetrySdkBuilder setSdkConfigProvider( - OpenTelemetrySdkBuilder builder, SdkConfigProvider sdkConfigProvider) { - try { - Method method = - OpenTelemetrySdkBuilder.class.getDeclaredMethod("setSdkConfigProvider", Object.class); - method.setAccessible(true); - method.invoke(builder, sdkConfigProvider); - return builder; - } catch (NoSuchMethodException - | IllegalAccessException - | java.lang.reflect.InvocationTargetException e) { - throw new IllegalStateException( - "Error calling setSdkConfigProvider on OpenTelemetrySdkBuilder", e); - } - } -} 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 65b3876c05a..00000000000 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java +++ /dev/null @@ -1,71 +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) { - this( - DeclarativeConfiguration.toConfigProperties(model, componentLoader) - .getStructured("instrumentation/development", empty())); - } - - private SdkConfigProvider(DeclarativeConfigProperties instrumentationConfig) { - this.instrumentationConfig = instrumentationConfig; - } - - /** - * 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); - } - - /** - * Create a no-op {@link SdkConfigProvider}. - * - * @return the no-op {@link SdkConfigProvider} - */ - public static ConfigProvider noop() { - return new SdkConfigProvider(DeclarativeConfigProperties.empty()); - } - - @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..4bed87dcf6f 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.all.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 45baa994861..9c28eb6651f 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.all.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.all.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.all.SdkConfigProvider; import io.opentelemetry.sdk.logs.LogLimits; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.metrics.InstrumentSelector; @@ -124,8 +126,9 @@ void create_Defaults() { OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel().withFileFormat("1.0-rc.1"); OpenTelemetrySdk expectedSdk = - OpenTelemetrySdkBuilderUtil.setSdkConfigProvider( - OpenTelemetrySdk.builder(), SdkConfigProvider.create(model)) + OpenTelemetrySdkBuilderUtil.setConfigProvider( + OpenTelemetrySdk.builder(), + SdkConfigProvider.create(DeclarativeConfiguration.toConfigProperties(model))) .build(); cleanup.addCloseable(expectedSdk); @@ -156,8 +159,9 @@ void create_Disabled() { new LogRecordExporterModel() .withOtlpHttp(new OtlpHttpExporterModel())))))); OpenTelemetrySdk expectedSdk = - OpenTelemetrySdkBuilderUtil.setSdkConfigProvider( - OpenTelemetrySdk.builder(), SdkConfigProvider.create(model)) + OpenTelemetrySdkBuilderUtil.setConfigProvider( + OpenTelemetrySdk.builder(), + SdkConfigProvider.create(DeclarativeConfiguration.toConfigProperties(model))) .build(); cleanup.addCloseable(expectedSdk); @@ -260,7 +264,7 @@ void create_Configured() throws NoSuchFieldException, IllegalAccessException { .withAttributeKeys(null))))); OpenTelemetrySdk expectedSdk = - OpenTelemetrySdkBuilderUtil.setSdkConfigProvider( + OpenTelemetrySdkBuilderUtil.setConfigProvider( OpenTelemetrySdk.builder() .setPropagators( ContextPropagators.create( @@ -314,7 +318,7 @@ void create_Configured() throws NoSuchFieldException, IllegalAccessException { InstrumentSelector.builder().setName("instrument-name").build(), View.builder().setName("stream-name").build()) .build()), - SdkConfigProvider.create(model)) + SdkConfigProvider.create(DeclarativeConfiguration.toConfigProperties(model))) .build(); cleanup.addCloseable(expectedSdk); 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 index 8694b045d3f..f844fe335ce 100644 --- a/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java @@ -5,53 +5,26 @@ package io.opentelemetry.sdk; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.internal.all.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.internal.all.SdkConfigProvider; +import javax.annotation.Nullable; /** - * Utilities for interacting with incubating components ({@code - * io.opentelemetry:opentelemetry-api-incubator} and {@code - * io.opentelemetry:opentelemetry-sdk-extension-incubator}), which are 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. + * 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 Object noopSdkConfigProvider() { - try { - Class sdkConfigProviderClass = - Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider"); - Method defaultProviderMethod = sdkConfigProviderClass.getMethod("noop"); - return defaultProviderMethod.invoke(null); - } catch (ClassNotFoundException - | NoSuchMethodException - | IllegalAccessException - | InvocationTargetException e) { - throw new IllegalStateException( - "Failed to create default SdkConfigProvider from incubator", e); - } - } - static OpenTelemetrySdk createExtendedOpenTelemetrySdk( - OpenTelemetrySdk openTelemetrySdk, Object sdkConfigProvider) { - try { - Class extendedSdkClass = - Class.forName("io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk"); - Class sdkConfigProviderClass = - Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider"); - Method createMethod = - extendedSdkClass.getMethod("create", OpenTelemetrySdk.class, sdkConfigProviderClass); - return (OpenTelemetrySdk) - createMethod.invoke( - null, openTelemetrySdk, sdkConfigProviderClass.cast(sdkConfigProvider)); - } catch (ClassNotFoundException - | NoSuchMethodException - | IllegalAccessException - | InvocationTargetException e) { - throw new IllegalStateException( - "Failed to create ExtendedOpenTelemetrySdk from incubator", e); - } + 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 eaed7ff27e2..10e06df90c3 100644 --- a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java @@ -9,6 +9,8 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.sdk.internal.all.OpenTelemetrySdkBuilderUtil; +import io.opentelemetry.sdk.internal.all.SdkConfigProvider; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; import io.opentelemetry.sdk.metrics.SdkMeterProvider; @@ -23,20 +25,14 @@ public final class OpenTelemetrySdkBuilder { @Nullable private SdkTracerProvider tracerProvider; @Nullable private SdkMeterProvider meterProvider; @Nullable private SdkLoggerProvider loggerProvider; - - @Nullable - private Object sdkConfigProvider = - INCUBATOR_AVAILABLE ? IncubatingUtil.noopSdkConfigProvider() : null; + @Nullable private Object configProvider; private static final boolean INCUBATOR_AVAILABLE; static { boolean incubatorAvailable = false; try { - Class.forName( - "io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider", - false, - OpenTelemetrySdkBuilder.class.getClassLoader()); + Class.forName("io.opentelemetry.api.incubator.ExtendedOpenTelemetry"); incubatorAvailable = true; } catch (ClassNotFoundException e) { // Not available @@ -92,9 +88,14 @@ public OpenTelemetrySdkBuilder setPropagators(ContextPropagators propagators) { return this; } - // called via reflection from incubator module - OpenTelemetrySdkBuilder setSdkConfigProvider(Object sdkConfigProvider) { - this.sdkConfigProvider = requireNonNull(sdkConfigProvider); + /** + * 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; } @@ -142,8 +143,7 @@ public OpenTelemetrySdk build() { OpenTelemetrySdk openTelemetrySdk = new OpenTelemetrySdk(tracerProvider, meterProvider, loggerProvider, propagators); return INCUBATOR_AVAILABLE - ? IncubatingUtil.createExtendedOpenTelemetrySdk( - openTelemetrySdk, requireNonNull(sdkConfigProvider)) + ? 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/all/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/all/ExtendedOpenTelemetrySdk.java index f7f838e04cc..330b5dcead9 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/all/ExtendedOpenTelemetrySdk.java @@ -3,19 +3,23 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.sdk.extension.incubator; +package io.opentelemetry.sdk.internal.all; 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/all/OpenTelemetrySdkBuilderUtil.java b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/all/OpenTelemetrySdkBuilderUtil.java new file mode 100644 index 00000000000..18af6273c31 --- /dev/null +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/all/OpenTelemetrySdkBuilderUtil.java @@ -0,0 +1,41 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.internal.all; + +import io.opentelemetry.sdk.OpenTelemetrySdkBuilder; +import io.opentelemetry.sdk.internal.ScopeConfigurator; +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/all/SdkConfigProvider.java b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/all/SdkConfigProvider.java new file mode 100644 index 00000000000..36964683abd --- /dev/null +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/internal/all/SdkConfigProvider.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.internal.all; + +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 + '}'; + } +}