From c5cdc1c2e8b88ee7d6cbcf6fadf81a7b4b0eda16 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Tue, 2 Jul 2024 15:07:48 -0500 Subject: [PATCH 1/5] Introduce ConfigProvider API --- api/incubator/build.gradle.kts | 5 + .../api/incubator/config/ConfigProvider.java | 37 ++++ .../config/GlobalConfigProvider.java | 60 +++++++ .../config/InstrumentationConfigUtil.java | 117 ++++++++++++ .../config/StructuredConfigException.java | 22 +++ .../config}/StructuredConfigProperties.java | 38 ++-- .../YamlStructuredConfigProperties.java | 50 ++++-- .../config/GlobalConfigProviderTest.java | 49 +++++ .../config/InstrumentationConfigUtilTest.java | 169 ++++++++++++++++++ .../YamlStructuredConfigPropertiesTest.java | 5 +- exporters/prometheus/build.gradle.kts | 1 + .../internal/PrometheusComponentProvider.java | 2 +- .../autoconfigure-spi/build.gradle.kts | 1 + .../spi/internal/ComponentProvider.java | 1 + .../AutoConfiguredOpenTelemetrySdk.java | 15 +- ...AutoConfiguredOpenTelemetrySdkBuilder.java | 35 ++-- .../internal/AutoConfigureUtil.java | 14 +- .../autoconfigure/FileConfigurationTest.java | 51 ++++-- sdk-extensions/incubator/build.gradle.kts | 1 + .../fileconfig/AggregationFactory.java | 6 +- .../fileconfig/AttributesFactory.java | 10 +- .../fileconfig/FileConfigProvider.java | 38 ++++ .../incubator/fileconfig/FileConfigUtil.java | 12 +- .../fileconfig/FileConfiguration.java | 17 +- .../fileconfig/InstrumentSelectorFactory.java | 8 +- .../fileconfig/LogRecordExporterFactory.java | 4 +- .../fileconfig/LogRecordProcessorFactory.java | 4 +- .../fileconfig/MetricExporterFactory.java | 6 +- .../fileconfig/MetricReaderFactory.java | 8 +- .../OpenTelemetryConfigurationFactory.java | 5 +- .../incubator/fileconfig/SamplerFactory.java | 4 +- .../fileconfig/SpanExporterFactory.java | 4 +- .../fileconfig/SpanProcessorFactory.java | 4 +- .../fileconfig/TextMapPropagatorFactory.java | 6 +- .../incubator/fileconfig/ViewFactory.java | 4 +- .../fileconfig/AttributesFactoryTest.java | 4 +- .../FileConfigurationCreateTest.java | 4 +- .../FileConfigurationParseTest.java | 4 +- .../InstrumentSelectorFactoryTest.java | 6 +- .../LogRecordExporterFactoryTest.java | 4 +- .../LogRecordProcessorFactoryTest.java | 4 +- .../fileconfig/MetricExporterFactoryTest.java | 6 +- .../fileconfig/MetricReaderFactoryTest.java | 10 +- ...OpenTelemetryConfigurationFactoryTest.java | 4 +- .../fileconfig/SamplerFactoryTest.java | 4 +- .../fileconfig/SpanExporterFactoryTest.java | 4 +- .../fileconfig/SpanProcessorFactoryTest.java | 4 +- .../TextMapPropagatorFactoryTest.java | 6 +- .../incubator/fileconfig/ViewFactoryTest.java | 4 +- 49 files changed, 720 insertions(+), 161 deletions(-) create mode 100644 api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java create mode 100644 api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java create mode 100644 api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java create mode 100644 api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigException.java rename {sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal => api/incubator/src/main/java/io/opentelemetry/api/incubator/config}/StructuredConfigProperties.java (79%) rename {sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig => api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal}/YamlStructuredConfigProperties.java (84%) create mode 100644 api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java create mode 100644 api/incubator/src/test/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtilTest.java rename {sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig => api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal}/YamlStructuredConfigPropertiesTest.java (97%) create mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java diff --git a/api/incubator/build.gradle.kts b/api/incubator/build.gradle.kts index 3dfa0e79a3c..b11db3809a5 100644 --- a/api/incubator/build.gradle.kts +++ b/api/incubator/build.gradle.kts @@ -14,6 +14,11 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") + // To use parsed config file as input for YamlStructuredConfigPropertiesTest + testImplementation(project(":sdk-extensions:incubator")) + // TODO (jack-berg): Why is this dependency not brought in as transitive dependency of :sdk-extensions:incubator? + testImplementation("com.fasterxml.jackson.core:jackson-databind") + testImplementation(project(":sdk:testing")) testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java new file mode 100644 index 00000000000..1a909634bf8 --- /dev/null +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +import javax.annotation.Nullable; +import javax.annotation.concurrent.ThreadSafe; + +/** + * A registry for accessing configuration. + * + *

The name Provider is for consistency with other languages and it is NOT loaded + * using reflection. + * + *

See {@link InstrumentationConfigUtil} for convenience methods for extracting config from + * {@link ConfigProvider}. + */ +@ThreadSafe +public interface ConfigProvider { + + /** + * Returns the {@link StructuredConfigProperties} corresponding to instrumentation + * config, or {@code null} if file configuration is not used. + * + * @return the instrumentation {@link StructuredConfigProperties} + */ + @Nullable + StructuredConfigProperties getInstrumentationConfig(); + + /** Returns a no-op {@link ConfigProvider}. */ + static ConfigProvider noop() { + return () -> null; + } +} diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java new file mode 100644 index 00000000000..8f52a6bdbeb --- /dev/null +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java @@ -0,0 +1,60 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import java.util.concurrent.atomic.AtomicReference; +import javax.annotation.Nullable; + +/** + * This class provides a temporary global accessor for {@link ConfigProvider} until the config API + * is marked stable. It will eventually be merged into {@link GlobalOpenTelemetry}. + */ +// We intentionally assign to be used for error reporting. +@SuppressWarnings("StaticAssignmentOfThrowable") +public final class GlobalConfigProvider { + + private static final AtomicReference instance = + new AtomicReference<>(ConfigProvider.noop()); + + @SuppressWarnings("NonFinalStaticField") + @Nullable + private static volatile Throwable setInstanceCaller; + + private GlobalConfigProvider() {} + + /** Returns the globally registered {@link ConfigProvider}. */ + // instance cannot be set to null + @SuppressWarnings("NullAway") + public static ConfigProvider get() { + return instance.get(); + } + + /** + * Sets the global {@link ConfigProvider}. Future calls to {@link #get()} will return the provided + * {@link ConfigProvider} instance. This should be called once as early as possible in your + * application initialization logic. + */ + public static void set(ConfigProvider configProvider) { + boolean changed = instance.compareAndSet(ConfigProvider.noop(), configProvider); + if (!changed && (configProvider != ConfigProvider.noop())) { + throw new IllegalStateException( + "GlobalConfigProvider.set has already been called. GlobalConfigProvider.set " + + "must be called only once before any calls to GlobalConfigProvider.get. " + + "Previous invocation set to cause of this exception.", + setInstanceCaller); + } + setInstanceCaller = new Throwable(); + } + + /** + * Unsets the global {@link ConfigProvider}. This is only meant to be used from tests which need + * to reconfigure {@link ConfigProvider}. + */ + public static void resetForTest() { + instance.set(ConfigProvider.noop()); + } +} diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java new file mode 100644 index 00000000000..6b50e0b34d1 --- /dev/null +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java @@ -0,0 +1,117 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.annotation.Nullable; + +/** + * A collection of convenience methods to extract instrumentation config from {@link + * ConfigProvider#getInstrumentationConfig()}. + */ +public class InstrumentationConfigUtil { + + // TODO (jack-berg): add helper function to access nested structures with dot notation + + /** + * Return a map representation of the peer service map entries in {@code + * .instrumentation.general.peer.service_mapping}, or null if none is configured. + */ + @Nullable + public static Map peerServiceMapping(ConfigProvider configProvider) { + Optional> optServiceMappingList = + Optional.ofNullable(configProvider.getInstrumentationConfig()) + .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) + .map(generalConfig -> generalConfig.getStructured("peer")) + .map(httpConfig -> httpConfig.getStructuredList("service_mapping")); + if (!optServiceMappingList.isPresent()) { + return null; + } + Map serviceMapping = new HashMap<>(); + optServiceMappingList + .get() + .forEach( + entry -> { + String peer = entry.getString("peer"); + String service = entry.getString("service"); + if (peer != null && service != null) { + serviceMapping.put(peer, service); + } + }); + return serviceMapping; + } + + /** + * Return {@code .instrumentation.general.http.client.request_captured_headers}, or null if none + * is configured. + */ + @Nullable + public static List httpClientRequestCapturedHeaders(ConfigProvider configProvider) { + return Optional.ofNullable(configProvider.getInstrumentationConfig()) + .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) + .map(generalConfig -> generalConfig.getStructured("http")) + .map(httpConfig -> httpConfig.getStructured("client")) + .map(clientConfig -> clientConfig.getScalarList("request_captured_headers", String.class)) + .orElse(null); + } + + /** + * Return {@code .instrumentation.general.http.client.response_captured_headers}, or null if none + * is configured. + */ + @Nullable + public static List httpClientResponseCapturedHeaders(ConfigProvider configProvider) { + return Optional.ofNullable(configProvider.getInstrumentationConfig()) + .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) + .map(generalConfig -> generalConfig.getStructured("http")) + .map(httpConfig -> httpConfig.getStructured("client")) + .map(clientConfig -> clientConfig.getScalarList("response_captured_headers", String.class)) + .orElse(null); + } + + /** + * Return {@code .instrumentation.general.http.server.request_captured_headers}, or null if none + * is configured. + */ + @Nullable + public static List httpServerRequestCapturedHeaders(ConfigProvider configProvider) { + return Optional.ofNullable(configProvider.getInstrumentationConfig()) + .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) + .map(generalConfig -> generalConfig.getStructured("http")) + .map(httpConfig -> httpConfig.getStructured("server")) + .map(clientConfig -> clientConfig.getScalarList("request_captured_headers", String.class)) + .orElse(null); + } + + /** + * Return {@code .instrumentation.general.http.server.response_captured_headers}, or null if none + * is configured. + */ + @Nullable + public static List httpSeverResponseCapturedHeaders(ConfigProvider configProvider) { + return Optional.ofNullable(configProvider.getInstrumentationConfig()) + .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) + .map(generalConfig -> generalConfig.getStructured("http")) + .map(httpConfig -> httpConfig.getStructured("server")) + .map(clientConfig -> clientConfig.getScalarList("response_captured_headers", String.class)) + .orElse(null); + } + + /** Return {@code .instrumentation.java.}, or null if none is configured. */ + @Nullable + public static StructuredConfigProperties javaInstrumentationConfig( + ConfigProvider configProvider, String instrumentationName) { + return Optional.ofNullable(configProvider.getInstrumentationConfig()) + .map(instrumentationConfig -> instrumentationConfig.getStructured("java")) + .map(generalConfig -> generalConfig.getStructured(instrumentationName)) + .orElse(null); + } + + private InstrumentationConfigUtil() {} +} diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigException.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigException.java new file mode 100644 index 00000000000..b819daf2d76 --- /dev/null +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigException.java @@ -0,0 +1,22 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +/** An exception that is thrown if the user-provided file configuration is invalid. */ +public final class StructuredConfigException extends RuntimeException { + + private static final long serialVersionUID = 3036584181551130522L; + + /** Create a new configuration exception with specified {@code message} and without a cause. */ + public StructuredConfigException(String message) { + super(message); + } + + /** Create a new configuration exception with specified {@code message} and {@code cause}. */ + public StructuredConfigException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/StructuredConfigProperties.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigProperties.java similarity index 79% rename from sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/StructuredConfigProperties.java rename to api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigProperties.java index ad1e3b5de3c..81dc84e4c2c 100644 --- a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/StructuredConfigProperties.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigProperties.java @@ -3,12 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.sdk.autoconfigure.spi.internal; +package io.opentelemetry.api.incubator.config; import static io.opentelemetry.api.internal.ConfigUtil.defaultIfNull; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import java.util.List; import java.util.Set; import javax.annotation.Nullable; @@ -28,7 +26,7 @@ public interface StructuredConfigProperties { * Returns a {@link String} configuration property. * * @return null if the property has not been configured - * @throws ConfigurationException if the property is not a valid scalar string + * @throws StructuredConfigException if the property is not a valid scalar string */ @Nullable String getString(String name); @@ -38,7 +36,7 @@ public interface StructuredConfigProperties { * * @return a {@link String} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws ConfigurationException if the property is not a valid scalar string + * @throws StructuredConfigException if the property is not a valid scalar string */ default String getString(String name, String defaultValue) { return defaultIfNull(getString(name), defaultValue); @@ -49,7 +47,7 @@ default String getString(String name, String defaultValue) { * {@link Boolean#parseBoolean(String)} for handling the values. * * @return null if the property has not been configured - * @throws ConfigurationException if the property is not a valid scalar boolean + * @throws StructuredConfigException if the property is not a valid scalar boolean */ @Nullable Boolean getBoolean(String name); @@ -59,7 +57,7 @@ default String getString(String name, String defaultValue) { * * @return a {@link Boolean} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws ConfigurationException if the property is not a valid scalar boolean + * @throws StructuredConfigException if the property is not a valid scalar boolean */ default boolean getBoolean(String name, boolean defaultValue) { return defaultIfNull(getBoolean(name), defaultValue); @@ -72,7 +70,7 @@ default boolean getBoolean(String name, boolean defaultValue) { * {@link Long#intValue()} which may result in loss of precision. * * @return null if the property has not been configured - * @throws ConfigurationException if the property is not a valid scalar integer + * @throws StructuredConfigException if the property is not a valid scalar integer */ @Nullable Integer getInt(String name); @@ -85,7 +83,7 @@ default boolean getBoolean(String name, boolean defaultValue) { * * @return a {@link Integer} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws ConfigurationException if the property is not a valid scalar integer + * @throws StructuredConfigException if the property is not a valid scalar integer */ default int getInt(String name, int defaultValue) { return defaultIfNull(getInt(name), defaultValue); @@ -95,7 +93,7 @@ default int getInt(String name, int defaultValue) { * Returns a {@link Long} configuration property. * * @return null if the property has not been configured - * @throws ConfigurationException if the property is not a valid scalar long + * @throws StructuredConfigException if the property is not a valid scalar long */ @Nullable Long getLong(String name); @@ -105,7 +103,7 @@ default int getInt(String name, int defaultValue) { * * @return a {@link Long} configuration property or {@code defaultValue} if a property with {@code * name} has not been configured - * @throws ConfigurationException if the property is not a valid scalar long + * @throws StructuredConfigException if the property is not a valid scalar long */ default long getLong(String name, long defaultValue) { return defaultIfNull(getLong(name), defaultValue); @@ -115,7 +113,7 @@ default long getLong(String name, long defaultValue) { * Returns a {@link Double} configuration property. * * @return null if the property has not been configured - * @throws ConfigurationException if the property is not a valid scalar double + * @throws StructuredConfigException if the property is not a valid scalar double */ @Nullable Double getDouble(String name); @@ -125,7 +123,7 @@ default long getLong(String name, long defaultValue) { * * @return a {@link Double} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws ConfigurationException if the property is not a valid scalar double + * @throws StructuredConfigException if the property is not a valid scalar double */ default double getDouble(String name, double defaultValue) { return defaultIfNull(getDouble(name), defaultValue); @@ -139,8 +137,8 @@ default double getDouble(String name, double defaultValue) { * @param scalarType the scalar type, one of {@link String}, {@link Boolean}, {@link Long} or * {@link Double} * @return a {@link List} configuration property, or null if the property has not been configured - * @throws ConfigurationException if the property is not a valid sequence of scalars, or if {@code - * scalarType} is not supported + * @throws StructuredConfigException if the property is not a valid sequence of scalars, or if + * {@code scalarType} is not supported */ @Nullable List getScalarList(String name, Class scalarType); @@ -149,10 +147,12 @@ default double getDouble(String name, double defaultValue) { * Returns a {@link List} configuration property. Entries which are not strings are converted to * their string representation. * - * @see ConfigProperties#getList(String name) + * @param name the property name + * @param scalarType the scalar type, one of {@link String}, {@link Boolean}, {@link Long} or + * {@link Double} * @return a {@link List} configuration property or {@code defaultValue} if a property with {@code * name} has not been configured - * @throws ConfigurationException if the property is not a valid sequence of scalars + * @throws StructuredConfigException if the property is not a valid sequence of scalars */ default List getScalarList(String name, Class scalarType, List defaultValue) { return defaultIfNull(getScalarList(name, scalarType), defaultValue); @@ -163,7 +163,7 @@ default List getScalarList(String name, Class scalarType, List defa * * @return a map-valued configuration property, or {@code null} if {@code name} has not been * configured - * @throws ConfigurationException if the property is not a mapping + * @throws StructuredConfigException if the property is not a mapping */ @Nullable StructuredConfigProperties getStructured(String name); @@ -173,7 +173,7 @@ default List getScalarList(String name, Class scalarType, List defa * * @return a list of map-valued configuration property, or {@code null} if {@code name} has not * been configured - * @throws ConfigurationException if the property is not a sequence of mappings + * @throws StructuredConfigException if the property is not a sequence of mappings */ @Nullable List getStructuredList(String name); diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlStructuredConfigProperties.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java similarity index 84% rename from sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlStructuredConfigProperties.java rename to api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java index 6475bbe1698..10d775dbb66 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlStructuredConfigProperties.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java @@ -3,14 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.sdk.extension.incubator.fileconfig; +package io.opentelemetry.api.incubator.config.internal; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; +import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -26,41 +25,45 @@ * Implementation of {@link StructuredConfigProperties} which uses a file configuration model as a * source. * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + * * @see #getStructured(String) Accessing nested maps * @see #getStructuredList(String) Accessing lists of maps - * @see FileConfiguration#toConfigProperties(Object) Converting configuration model to properties */ -final class YamlStructuredConfigProperties implements StructuredConfigProperties { +public final class YamlStructuredConfigProperties implements StructuredConfigProperties { /** Values are {@link #isPrimitive(Object)}, {@link List} of scalars. */ private final Map simpleEntries; private final Map> listEntries; private final Map mapEntries; + private final Set nullKeys; private YamlStructuredConfigProperties( Map simpleEntries, Map> listEntries, - Map mapEntries) { + Map mapEntries, + Set nullKeys) { this.simpleEntries = simpleEntries; this.listEntries = listEntries; this.mapEntries = mapEntries; + this.nullKeys = nullKeys; } /** * Create a {@link YamlStructuredConfigProperties} from the {@code properties} map. * - *

{@code properties} is expected to be the output of YAML parsing (i.e. with Jackson {@link + *

{@code properties} is expected to be the output of YAML parsing (i.e. with Jackson {@code * com.fasterxml.jackson.databind.ObjectMapper}), and have values which are scalars, lists of * scalars, lists of maps, and maps. - * - * @see FileConfiguration#toConfigProperties(OpenTelemetryConfiguration) */ @SuppressWarnings("unchecked") - static YamlStructuredConfigProperties create(Map properties) { + public static YamlStructuredConfigProperties create(Map properties) { Map simpleEntries = new HashMap<>(); Map> listEntries = new HashMap<>(); Map mapEntries = new HashMap<>(); + Set nullKeys = new HashSet<>(); for (Map.Entry entry : properties.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); @@ -85,13 +88,17 @@ static YamlStructuredConfigProperties create(Map properties) { mapEntries.put(key, configProperties); continue; } - throw new ConfigurationException( + if (value == null) { + nullKeys.add(key); + continue; + } + throw new StructuredConfigException( "Unable to initialize ExtendedConfigProperties. Key \"" + key + "\" has unrecognized object type " + value.getClass().getName()); } - return new YamlStructuredConfigProperties(simpleEntries, listEntries, mapEntries); + return new YamlStructuredConfigProperties(simpleEntries, listEntries, mapEntries, nullKeys); } private static boolean isPrimitiveList(Object object) { @@ -178,7 +185,7 @@ public Double getDouble(String name) { @SuppressWarnings("unchecked") public List getScalarList(String name, Class scalarType) { if (!SUPPORTED_SCALAR_TYPES.contains(scalarType)) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unsupported scalar type " + scalarType.getName() + ". Supported types include " @@ -266,6 +273,7 @@ public Set getPropertyKeys() { keys.addAll(simpleEntries.keySet()); keys.addAll(listEntries.keySet()); keys.addAll(mapEntries.keySet()); + keys.addAll(nullKeys); return Collections.unmodifiableSet(keys); } @@ -275,6 +283,20 @@ public String toString() { simpleEntries.forEach((key, value) -> joiner.add(key + "=" + value)); listEntries.forEach((key, value) -> joiner.add(key + "=" + value)); mapEntries.forEach((key, value) -> joiner.add(key + "=" + value)); + nullKeys.forEach((key) -> joiner.add(key + "=null")); return joiner.toString(); } + + /** + * Returns a map representation of this {@link YamlStructuredConfigProperties}, which is useful + * for testing. + */ + public Map asMap() { + Map response = new HashMap<>(); + response.putAll(simpleEntries); + response.putAll(listEntries); + response.putAll(mapEntries); + nullKeys.forEach(key -> response.put(key, null)); + return Collections.unmodifiableMap(response); + } } diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java new file mode 100644 index 00000000000..ad61f43722f --- /dev/null +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import io.opentelemetry.api.incubator.config.internal.YamlStructuredConfigProperties; +import java.util.Collections; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class GlobalConfigProviderTest { + + @BeforeAll + static void beforeClass() { + GlobalConfigProvider.resetForTest(); + } + + @AfterEach + void after() { + GlobalConfigProvider.resetForTest(); + } + + @Test + void setAndGet() { + assertThat(GlobalConfigProvider.get()).isEqualTo(ConfigProvider.noop()); + ConfigProvider configProvider = + () -> YamlStructuredConfigProperties.create(Collections.emptyMap()); + GlobalConfigProvider.set(configProvider); + assertThat(GlobalConfigProvider.get()).isSameAs(configProvider); + } + + @Test + void setThenSet() { + GlobalConfigProvider.set(() -> YamlStructuredConfigProperties.create(Collections.emptyMap())); + assertThatThrownBy( + () -> + GlobalConfigProvider.set( + () -> YamlStructuredConfigProperties.create(Collections.emptyMap()))) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("GlobalConfigProvider.set has already been called") + .hasStackTraceContaining("setThenSet"); + } +} 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 new file mode 100644 index 00000000000..b18f90d8c8d --- /dev/null +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtilTest.java @@ -0,0 +1,169 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.common.collect.ImmutableMap; +import io.opentelemetry.api.incubator.config.internal.YamlStructuredConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class InstrumentationConfigUtilTest { + + /** + * See kitchen-sink.yaml. + */ + private static final String kitchenSinkInstrumentationConfig = + "instrumentation:\n" + + " general:\n" + + " peer:\n" + + " service_mapping:\n" + + " - peer: 1.2.3.4\n" + + " service: FooService\n" + + " - peer: 2.3.4.5\n" + + " service: BarService\n" + + " http:\n" + + " client:\n" + + " request_captured_headers:\n" + + " - client-request-header1\n" + + " - client-request-header2\n" + + " response_captured_headers:\n" + + " - client-response-header1\n" + + " - client-response-header2\n" + + " server:\n" + + " request_captured_headers:\n" + + " - server-request-header1\n" + + " - server-request-header2\n" + + " response_captured_headers:\n" + + " - server-response-header1\n" + + " - server-response-header2\n" + + " java:\n" + + " example:\n" + + " property: \"value\""; + + private static final ConfigProvider kitchenSinkConfigProvider = + toConfigProvider(kitchenSinkInstrumentationConfig); + private static final ConfigProvider emptyInstrumentationConfigProvider = + toConfigProvider("instrumentation:\n"); + private static final ConfigProvider emptyGeneralConfigProvider = + toConfigProvider("instrumentation:\n general:\n"); + private static final ConfigProvider emptyHttpConfigProvider = + toConfigProvider("instrumentation:\n general:\n http:\n"); + + private static ConfigProvider toConfigProvider(String configYaml) { + OpenTelemetryConfiguration configuration = + FileConfiguration.parse( + new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8))); + return FileConfigProvider.create(configuration); + } + + @Test + void peerServiceMapping() { + assertThat(InstrumentationConfigUtil.peerServiceMapping(kitchenSinkConfigProvider)) + .isEqualTo(ImmutableMap.of("1.2.3.4", "FooService", "2.3.4.5", "BarService")); + assertThat(InstrumentationConfigUtil.peerServiceMapping(emptyInstrumentationConfigProvider)) + .isNull(); + assertThat(InstrumentationConfigUtil.peerServiceMapping(emptyGeneralConfigProvider)).isNull(); + assertThat(InstrumentationConfigUtil.peerServiceMapping(emptyHttpConfigProvider)).isNull(); + } + + @Test + void httpClientRequestCapturedHeaders() { + assertThat( + InstrumentationConfigUtil.httpClientRequestCapturedHeaders(kitchenSinkConfigProvider)) + .isEqualTo(Arrays.asList("client-request-header1", "client-request-header2")); + assertThat( + InstrumentationConfigUtil.httpClientRequestCapturedHeaders( + emptyInstrumentationConfigProvider)) + .isNull(); + assertThat( + InstrumentationConfigUtil.httpClientRequestCapturedHeaders(emptyGeneralConfigProvider)) + .isNull(); + assertThat(InstrumentationConfigUtil.httpClientRequestCapturedHeaders(emptyHttpConfigProvider)) + .isNull(); + } + + @Test + void httpClientResponseCapturedHeaders() { + assertThat( + InstrumentationConfigUtil.httpClientResponseCapturedHeaders(kitchenSinkConfigProvider)) + .isEqualTo(Arrays.asList("client-response-header1", "client-response-header2")); + assertThat( + InstrumentationConfigUtil.httpClientResponseCapturedHeaders( + emptyInstrumentationConfigProvider)) + .isNull(); + assertThat( + InstrumentationConfigUtil.httpClientResponseCapturedHeaders(emptyGeneralConfigProvider)) + .isNull(); + assertThat(InstrumentationConfigUtil.httpClientResponseCapturedHeaders(emptyHttpConfigProvider)) + .isNull(); + } + + @Test + void httpServerRequestCapturedHeaders() { + assertThat( + InstrumentationConfigUtil.httpServerRequestCapturedHeaders(kitchenSinkConfigProvider)) + .isEqualTo(Arrays.asList("server-request-header1", "server-request-header2")); + assertThat( + InstrumentationConfigUtil.httpServerRequestCapturedHeaders( + emptyInstrumentationConfigProvider)) + .isNull(); + assertThat( + InstrumentationConfigUtil.httpServerRequestCapturedHeaders(emptyGeneralConfigProvider)) + .isNull(); + assertThat(InstrumentationConfigUtil.httpServerRequestCapturedHeaders(emptyHttpConfigProvider)) + .isNull(); + } + + @Test + void httpServerResponseCapturedHeaders() { + assertThat( + InstrumentationConfigUtil.httpSeverResponseCapturedHeaders(kitchenSinkConfigProvider)) + .isEqualTo(Arrays.asList("server-response-header1", "server-response-header2")); + assertThat( + InstrumentationConfigUtil.httpSeverResponseCapturedHeaders( + emptyInstrumentationConfigProvider)) + .isNull(); + assertThat( + InstrumentationConfigUtil.httpSeverResponseCapturedHeaders(emptyGeneralConfigProvider)) + .isNull(); + assertThat(InstrumentationConfigUtil.httpSeverResponseCapturedHeaders(emptyHttpConfigProvider)) + .isNull(); + } + + @Test + void javaInstrumentationConfig() { + assertThat( + InstrumentationConfigUtil.javaInstrumentationConfig( + kitchenSinkConfigProvider, "example")) + .isNotNull() + .isInstanceOfSatisfying( + YamlStructuredConfigProperties.class, + exampleConfig -> + assertThat(exampleConfig.asMap()).isEqualTo(ImmutableMap.of("property", "value"))); + assertThat( + InstrumentationConfigUtil.javaInstrumentationConfig(kitchenSinkConfigProvider, "foo")) + .isNull(); + assertThat( + InstrumentationConfigUtil.javaInstrumentationConfig( + emptyInstrumentationConfigProvider, "example")) + .isNull(); + assertThat( + InstrumentationConfigUtil.javaInstrumentationConfig( + emptyGeneralConfigProvider, "example")) + .isNull(); + assertThat( + InstrumentationConfigUtil.javaInstrumentationConfig(emptyHttpConfigProvider, "example")) + .isNull(); + } +} diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlStructuredConfigPropertiesTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigPropertiesTest.java similarity index 97% rename from sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlStructuredConfigPropertiesTest.java rename to api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigPropertiesTest.java index 5c4f3d71333..d2076e36b43 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlStructuredConfigPropertiesTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigPropertiesTest.java @@ -3,12 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.sdk.extension.incubator.fileconfig; +package io.opentelemetry.api.incubator.config.internal; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableSet; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; diff --git a/exporters/prometheus/build.gradle.kts b/exporters/prometheus/build.gradle.kts index b0e9809ebcc..045b14f954a 100644 --- a/exporters/prometheus/build.gradle.kts +++ b/exporters/prometheus/build.gradle.kts @@ -9,6 +9,7 @@ otelJava.moduleName.set("io.opentelemetry.exporter.prometheus") dependencies { api(project(":sdk:metrics")) + implementation(project(":api:incubator")) implementation(project(":exporters:common")) implementation(project(":sdk-extensions:autoconfigure-spi")) implementation("io.prometheus:prometheus-metrics-exporter-httpserver") diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java index dc57d2bcbe3..66f4df20caf 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java @@ -5,10 +5,10 @@ package io.opentelemetry.exporter.prometheus.internal; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; import io.opentelemetry.exporter.prometheus.PrometheusHttpServer; import io.opentelemetry.exporter.prometheus.PrometheusHttpServerBuilder; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; import io.opentelemetry.sdk.metrics.export.MetricReader; /** diff --git a/sdk-extensions/autoconfigure-spi/build.gradle.kts b/sdk-extensions/autoconfigure-spi/build.gradle.kts index 53b10f0a104..32985cdf4e9 100644 --- a/sdk-extensions/autoconfigure-spi/build.gradle.kts +++ b/sdk-extensions/autoconfigure-spi/build.gradle.kts @@ -8,4 +8,5 @@ otelJava.moduleName.set("io.opentelemetry.sdk.autoconfigure.spi") dependencies { api(project(":sdk:all")) + compileOnly(project(":api:incubator")) } diff --git a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java index 344dc18267c..eb3432b8e52 100644 --- a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java +++ b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.autoconfigure.spi.internal; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; import io.opentelemetry.sdk.trace.export.SpanExporter; /** diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java index 6751da7ad7f..182336ad8bf 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java @@ -8,9 +8,9 @@ import com.google.auto.value.AutoValue; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; import io.opentelemetry.sdk.resources.Resource; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -48,9 +48,8 @@ static AutoConfiguredOpenTelemetrySdk create( OpenTelemetrySdk sdk, Resource resource, @Nullable ConfigProperties config, - @Nullable StructuredConfigProperties structuredConfigProperties) { - return new AutoValue_AutoConfiguredOpenTelemetrySdk( - sdk, resource, config, structuredConfigProperties); + @Nullable ConfigProvider configProvider) { + return new AutoValue_AutoConfiguredOpenTelemetrySdk(sdk, resource, config, configProvider); } /** @@ -70,19 +69,19 @@ static AutoConfiguredOpenTelemetrySdk create( * Returns the {@link ConfigProperties} used for auto-configuration, or {@code null} if file * configuration was used. * - * @see #getStructuredConfig() + * @see #getConfigProvider() */ @Nullable abstract ConfigProperties getConfig(); /** - * Returns the {@link StructuredConfigProperties} used for auto-configuration, or {@code null} if - * file configuration was not used. + * Returns the {@link ConfigProvider} representing the config used for auto-configuration, or + * {@code null} if file configuration was not used. * * @see #getConfig() */ @Nullable - abstract StructuredConfigProperties getStructuredConfig(); + abstract ConfigProvider getConfigProvider(); AutoConfiguredOpenTelemetrySdk() {} } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java index 7fd5d515f4c..05b1893a891 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java @@ -8,6 +8,9 @@ import static java.util.Objects.requireNonNull; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.GlobalConfigProvider; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -21,7 +24,6 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; @@ -49,6 +51,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; @@ -431,7 +434,8 @@ public AutoConfiguredOpenTelemetrySdk build() { AutoConfiguredOpenTelemetrySdk fromFileConfiguration = maybeConfigureFromFile(config); if (fromFileConfiguration != null) { maybeRegisterShutdownHook(fromFileConfiguration.getOpenTelemetrySdk()); - maybeSetAsGlobal(fromFileConfiguration.getOpenTelemetrySdk()); + maybeSetAsGlobal( + fromFileConfiguration.getOpenTelemetrySdk(), fromFileConfiguration.getConfigProvider()); return fromFileConfiguration; } @@ -503,7 +507,7 @@ public AutoConfiguredOpenTelemetrySdk build() { } maybeRegisterShutdownHook(openTelemetrySdk); - maybeSetAsGlobal(openTelemetrySdk); + maybeSetAsGlobal(openTelemetrySdk, null); callAutoConfigureListeners(spiHelper, openTelemetrySdk); return AutoConfiguredOpenTelemetrySdk.create(openTelemetrySdk, resource, config, null); @@ -554,27 +558,34 @@ private static AutoConfiguredOpenTelemetrySdk maybeConfigureFromFile(ConfigPrope "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration"); Method create = configurationFactory.getMethod("create", openTelemetryConfiguration); OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model); - Method toConfigProperties = - configurationFactory.getMethod("toConfigProperties", openTelemetryConfiguration); - StructuredConfigProperties structuredConfigProperties = - (StructuredConfigProperties) toConfigProperties.invoke(null, model); + Class fileConfigProvider = + Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigProvider"); + Method createFileConfigProvider = + fileConfigProvider.getMethod("create", openTelemetryConfiguration); + ConfigProvider configProvider = (ConfigProvider) createFileConfigProvider.invoke(null, model); // Note: can't access file configuration resource without reflection so setting a dummy // resource return AutoConfiguredOpenTelemetrySdk.create( - sdk, Resource.getDefault(), null, structuredConfigProperties); + sdk, Resource.getDefault(), null, configProvider); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { throw new ConfigurationException( "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?", e); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); - if (cause instanceof ConfigurationException) { - throw (ConfigurationException) cause; + if (cause instanceof StructuredConfigException) { + throw toConfigurationException((StructuredConfigException) cause); } throw new ConfigurationException("Unexpected error configuring from file", e); } } + private static ConfigurationException toConfigurationException( + StructuredConfigException exception) { + String message = Objects.requireNonNull(exception.getMessage()); + return new ConfigurationException(message, exception); + } + private void maybeRegisterShutdownHook(OpenTelemetrySdk openTelemetrySdk) { if (!registerShutdownHook) { return; @@ -582,13 +593,15 @@ private void maybeRegisterShutdownHook(OpenTelemetrySdk openTelemetrySdk) { Runtime.getRuntime().addShutdownHook(shutdownHook(openTelemetrySdk)); } - private void maybeSetAsGlobal(OpenTelemetrySdk openTelemetrySdk) { + private void maybeSetAsGlobal( + OpenTelemetrySdk openTelemetrySdk, @Nullable ConfigProvider configProvider) { if (!setResultAsGlobal) { return; } GlobalOpenTelemetry.set(openTelemetrySdk); GlobalEventLoggerProvider.set( SdkEventLoggerProvider.create(openTelemetrySdk.getSdkLoggerProvider())); + GlobalConfigProvider.set(configProvider != null ? configProvider : ConfigProvider.noop()); logger.log( Level.FINE, "Global OpenTelemetry set to {0} by autoconfiguration", openTelemetrySdk); } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java index fe18ac8d41b..88af5f303cf 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java @@ -5,10 +5,10 @@ package io.opentelemetry.sdk.autoconfigure.internal; +import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.function.Function; @@ -41,21 +41,21 @@ public static ConfigProperties getConfig( } /** - * Returns the {@link StructuredConfigProperties} used for auto-configuration when file based + * Returns the {@link ConfigProvider} resulting from auto-configuration when file based * configuration is used. * - * @return the config properties, or {@code null} if file based configuration is NOT used + * @return the {@link ConfigProvider}, or {@code null} if file based configuration is NOT used */ @Nullable - public static StructuredConfigProperties getStructuredConfig( + public static ConfigProvider getConfigProvider( AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { try { - Method method = AutoConfiguredOpenTelemetrySdk.class.getDeclaredMethod("getStructuredConfig"); + Method method = AutoConfiguredOpenTelemetrySdk.class.getDeclaredMethod("getConfigProvider"); method.setAccessible(true); - return (StructuredConfigProperties) method.invoke(autoConfiguredOpenTelemetrySdk); + return (ConfigProvider) method.invoke(autoConfiguredOpenTelemetrySdk); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { throw new IllegalStateException( - "Error calling getStructuredConfig on AutoConfiguredOpenTelemetrySdk", e); + "Error calling getConfigProvider on AutoConfiguredOpenTelemetrySdk", e); } } diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java index 639f2955da3..18c96bd5b9d 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java @@ -18,6 +18,10 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.GlobalConfigProvider; +import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.ContextPropagators; @@ -25,10 +29,10 @@ import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; 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.autoconfigure.spi.internal.StructuredConfigProperties; import io.opentelemetry.sdk.logs.internal.SdkEventLoggerProvider; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; @@ -37,6 +41,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; import java.util.Collections; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -68,14 +73,21 @@ void setup() throws IOException { + " - simple:\n" + " exporter:\n" + " console: {}\n" - + "other:\n" - + " str_key: str_value\n" - + " map_key:\n" - + " str_key1: str_value1\n"; + + "instrumentation:\n" + + " general:\n" + + " http:\n" + + " client:\n" + + " request_captured_headers:\n" + + " - Content-Type\n" + + " - Accept\n" + + " java:\n" + + " example:\n" + + " key: value\n"; configFilePath = tempDir.resolve("otel-config.yaml"); Files.write(configFilePath, yaml.getBytes(StandardCharsets.UTF_8)); GlobalOpenTelemetry.resetForTest(); GlobalEventLoggerProvider.resetForTest(); + GlobalConfigProvider.resetForTest(); } @Test @@ -145,6 +157,8 @@ void configFile_setResultAsGlobalFalse() { assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isNotSameAs(openTelemetrySdk); assertThat(GlobalEventLoggerProvider.get()) .isNotSameAs(openTelemetrySdk.getSdkLoggerProvider()); + assertThat(GlobalConfigProvider.get()) + .isNotSameAs(autoConfiguredOpenTelemetrySdk.getConfigProvider()); } @Test @@ -163,6 +177,8 @@ void configFile_setResultAsGlobalTrue() { .isInstanceOf(SdkEventLoggerProvider.class) .extracting("delegateLoggerProvider") .isSameAs(openTelemetrySdk.getSdkLoggerProvider()); + assertThat(GlobalConfigProvider.get()) + .isSameAs(autoConfiguredOpenTelemetrySdk.getConfigProvider()); } @Test @@ -189,7 +205,7 @@ void configFile_Error(@TempDir Path tempDir) throws IOException { } @Test - void configFile_StructuredConfigProperties() { + void configFile_ConfigProvider() { ConfigProperties config = DefaultConfigProperties.createFromMap( Collections.singletonMap("otel.experimental.config.file", configFilePath.toString())); @@ -200,14 +216,19 @@ void configFile_StructuredConfigProperties() { cleanup.addCloseable(openTelemetrySdk); // getConfig() should return ExtendedConfigProperties generic representation of the config file - StructuredConfigProperties structuredConfigProps = - autoConfiguredOpenTelemetrySdk.getStructuredConfig(); - assertThat(structuredConfigProps).isNotNull(); - StructuredConfigProperties otherProps = structuredConfigProps.getStructured("other"); - assertThat(otherProps).isNotNull(); - assertThat(otherProps.getString("str_key")).isEqualTo("str_value"); - StructuredConfigProperties otherMapKeyProps = otherProps.getStructured("map_key"); - assertThat(otherMapKeyProps).isNotNull(); - assertThat(otherMapKeyProps.getString("str_key1")).isEqualTo("str_value1"); + ConfigProvider globalConfigProvider = GlobalConfigProvider.get(); + assertThat(globalConfigProvider) + .isNotNull() + .isSameAs(AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk)); + StructuredConfigProperties instrumentationConfig = + globalConfigProvider.getInstrumentationConfig(); + assertThat(instrumentationConfig).isNotNull(); + + // Extract instrumentation config from ConfigProvider + assertThat(InstrumentationConfigUtil.httpClientRequestCapturedHeaders(globalConfigProvider)) + .isEqualTo(Arrays.asList("Content-Type", "Accept")); + assertThat(InstrumentationConfigUtil.javaInstrumentationConfig(globalConfigProvider, "example")) + .isNotNull() + .satisfies(exampleConfig -> assertThat(exampleConfig.getString("key")).isEqualTo("value")); } } diff --git a/sdk-extensions/incubator/build.gradle.kts b/sdk-extensions/incubator/build.gradle.kts index 847a3b039e6..aa0f3ed61fe 100644 --- a/sdk-extensions/incubator/build.gradle.kts +++ b/sdk-extensions/incubator/build.gradle.kts @@ -25,6 +25,7 @@ dependencies { implementation("org.snakeyaml:snakeyaml-engine") // io.opentelemetry.sdk.extension.incubator.fileconfig + implementation(project(":api:incubator")) implementation("com.fasterxml.jackson.core:jackson-databind") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") implementation(project(":sdk-extensions:autoconfigure")) diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java index 726177d65a6..876d437d7c8 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java @@ -5,8 +5,8 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Aggregation; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Base2ExponentialBucketHistogram; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExplicitBucketHistogram; @@ -56,7 +56,7 @@ public io.opentelemetry.sdk.metrics.Aggregation create( return io.opentelemetry.sdk.metrics.Aggregation.base2ExponentialBucketHistogram( maxSize, maxScale); } catch (IllegalArgumentException e) { - throw new ConfigurationException("Invalid exponential bucket histogram", e); + throw new StructuredConfigException("Invalid exponential bucket histogram", e); } } ExplicitBucketHistogram explicitBucketHistogram = model.getExplicitBucketHistogram(); @@ -68,7 +68,7 @@ public io.opentelemetry.sdk.metrics.Aggregation create( try { return io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram(boundaries); } catch (IllegalArgumentException e) { - throw new ConfigurationException("Invalid explicit bucket histogram", e); + throw new StructuredConfigException("Invalid explicit bucket histogram", e); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java index 22a9273cd8f..81d7cf706cc 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java @@ -9,8 +9,8 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Attributes; import java.io.Closeable; import java.util.List; @@ -46,7 +46,7 @@ public io.opentelemetry.api.common.Attributes create( .forEach( (key, value) -> { if (value == null) { - throw new ConfigurationException( + throw new StructuredConfigException( "Error processing attribute with key \"" + key + "\": unexpected null value"); } if (value instanceof String) { @@ -124,7 +124,7 @@ public io.opentelemetry.api.common.Attributes create( return; } } - throw new ConfigurationException( + throw new StructuredConfigException( "Error processing attribute with key \"" + key + "\": unrecognized value type " @@ -138,13 +138,13 @@ private static void checkAllEntriesOfType(String key, List values, Class e values.forEach( value -> { if (value == null) { - throw new ConfigurationException( + throw new StructuredConfigException( "Error processing attribute with key \"" + key + "\": unexpected null element in value"); } if (!expectedType.isAssignableFrom(value.getClass())) { - throw new ConfigurationException( + throw new StructuredConfigException( "Error processing attribute with key \"" + key + "\": expected value entries to be of type " diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java new file mode 100644 index 00000000000..7db388ba4c2 --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; +import javax.annotation.Nullable; + +/** File configuration implementation for {@link ConfigProvider}. */ +public final class FileConfigProvider implements ConfigProvider { + + @Nullable private final StructuredConfigProperties instrumentationConfig; + + private FileConfigProvider(OpenTelemetryConfiguration model) { + StructuredConfigProperties configProperties = FileConfiguration.toConfigProperties(model); + this.instrumentationConfig = configProperties.getStructured("instrumentation"); + } + + /** + * Create a {@link FileConfigProvider} from the {@code model}. + * + * @param model the configuration model + * @return the {@link FileConfigProvider} + */ + public static FileConfigProvider create(OpenTelemetryConfiguration model) { + return new FileConfigProvider(model); + } + + @Nullable + @Override + public StructuredConfigProperties getInstrumentationConfig() { + return instrumentationConfig; + } +} diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java index 7b5bcd9ca2d..a952485ce73 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java @@ -5,10 +5,10 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; import java.io.Closeable; import java.util.List; import java.util.function.Function; @@ -39,7 +39,7 @@ static T assertNotNull(@Nullable T object, String description) { * {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link * ComponentProvider#create(StructuredConfigProperties)} with the given {@code model}. * - * @throws ConfigurationException if no matching providers are found, or if multiple are found + * @throws StructuredConfigException if no matching providers are found, or if multiple are found * (i.e. conflict), or if {@link ComponentProvider#create(StructuredConfigProperties)} throws */ @SuppressWarnings({"unchecked", "rawtypes"}) @@ -56,11 +56,11 @@ static T loadComponent(SpiHelper spiHelper, Class type, String name, Obje componentProvider.getType() == type && name.equals(componentProvider.getName())) .collect(Collectors.toList()); if (matchedProviders.isEmpty()) { - throw new ConfigurationException( + throw new StructuredConfigException( "No component provider detected for " + type.getName() + " with name \"" + name + "\"."); } if (matchedProviders.size() > 1) { - throw new ConfigurationException( + throw new StructuredConfigException( "Component provider conflict. Multiple providers detected for " + type.getName() + " with name \"" @@ -79,7 +79,7 @@ static T loadComponent(SpiHelper spiHelper, Class type, String name, Obje try { return provider.create(config); } catch (Throwable throwable) { - throw new ConfigurationException( + throw new StructuredConfigException( "Error configuring " + type.getName() + " with name \"" + name + "\"", throwable); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java index 82888ed5735..8baddfb1845 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java @@ -9,10 +9,11 @@ import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.internal.YamlStructuredConfigProperties; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; -import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; import java.io.Closeable; import java.io.IOException; @@ -68,7 +69,7 @@ private FileConfiguration() {} /** * Combines {@link #parse(InputStream)} and {@link #create(OpenTelemetryConfiguration)}. * - * @throws ConfigurationException if unable to parse or interpret + * @throws StructuredConfigException if unable to parse or interpret */ public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) { OpenTelemetryConfiguration configurationModel = parse(inputStream); @@ -81,7 +82,7 @@ public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) { * * @param configurationModel the configuration model * @return the {@link OpenTelemetrySdk} - * @throws ConfigurationException if unable to interpret + * @throws StructuredConfigException if unable to interpret */ public static OpenTelemetrySdk create(OpenTelemetryConfiguration configurationModel) { List closeables = new ArrayList<>(); @@ -103,10 +104,10 @@ public static OpenTelemetrySdk create(OpenTelemetryConfiguration configurationMo "Error closing " + closeable.getClass().getName() + ": " + ex.getMessage()); } } - if (e instanceof ConfigurationException) { + if (e instanceof StructuredConfigException) { throw e; } - throw new ConfigurationException("Unexpected configuration error", e); + throw new StructuredConfigException("Unexpected configuration error", e); } } @@ -116,13 +117,13 @@ public static OpenTelemetrySdk create(OpenTelemetryConfiguration configurationMo *

Before parsing, environment variable substitution is performed as described in {@link * EnvSubstitutionConstructor}. * - * @throws ConfigurationException if unable to parse + * @throws StructuredConfigException if unable to parse */ public static OpenTelemetryConfiguration parse(InputStream configuration) { try { return parse(configuration, System.getenv()); } catch (RuntimeException e) { - throw new ConfigurationException("Unable to parse configuration input stream", e); + throw new StructuredConfigException("Unable to parse configuration input stream", e); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java index ec117228b64..86572f14ce2 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java @@ -5,8 +5,8 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Selector; import io.opentelemetry.sdk.metrics.InstrumentSelector; import io.opentelemetry.sdk.metrics.InstrumentSelectorBuilder; @@ -29,7 +29,7 @@ static InstrumentSelectorFactory getInstance() { public InstrumentSelector create( @Nullable Selector model, SpiHelper spiHelper, List closeables) { if (model == null) { - throw new ConfigurationException("selector must not be null"); + throw new StructuredConfigException("selector must not be null"); } InstrumentSelectorBuilder builder = InstrumentSelector.builder(); @@ -41,7 +41,7 @@ public InstrumentSelector create( try { instrumentType = InstrumentType.valueOf(model.getInstrumentType().name()); } catch (IllegalArgumentException e) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unrecognized instrument type: " + model.getInstrumentType(), e); } builder.setType(instrumentType); @@ -59,7 +59,7 @@ public InstrumentSelector create( try { return builder.build(); } catch (IllegalArgumentException e) { - throw new ConfigurationException("Invalid selector", e); + throw new StructuredConfigException("Invalid selector", e); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java index 3469ec61e36..0aeefc2eba0 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java @@ -7,10 +7,10 @@ import static java.util.stream.Collectors.joining; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; 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.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Otlp; @@ -52,7 +52,7 @@ public LogRecordExporter create( // TODO(jack-berg): add support for generic SPI exporters if (!model.getAdditionalProperties().isEmpty()) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unrecognized log record exporter(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java index 5971d8537a9..3b2b446c6b1 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java @@ -7,8 +7,8 @@ import static java.util.stream.Collectors.joining; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporter; import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor; @@ -85,7 +85,7 @@ public LogRecordProcessor create( // TODO: add support for generic log record processors if (!model.getAdditionalProperties().isEmpty()) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unrecognized log record processor(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java index 7d187f8a057..4c974bbb861 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java @@ -7,10 +7,10 @@ import static java.util.stream.Collectors.joining; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; 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.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpMetric; @@ -57,12 +57,12 @@ public MetricExporter create( } if (model.getPrometheus() != null) { - throw new ConfigurationException("prometheus exporter not supported in this context"); + throw new StructuredConfigException("prometheus exporter not supported in this context"); } // TODO(jack-berg): add support for generic SPI exporters if (!model.getAdditionalProperties().isEmpty()) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unrecognized metric exporter(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java index 77750920cf2..7896fc61cce 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java @@ -5,8 +5,8 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricExporter; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReader; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Prometheus; @@ -47,7 +47,7 @@ public MetricReader create( if (periodicModel != null) { MetricExporter exporterModel = periodicModel.getExporter(); if (exporterModel == null) { - throw new ConfigurationException("exporter required for periodic reader"); + throw new StructuredConfigException("exporter required for periodic reader"); } io.opentelemetry.sdk.metrics.export.MetricExporter metricExporter = MetricExporterFactory.getInstance().create(exporterModel, spiHelper, closeables); @@ -67,7 +67,7 @@ public MetricReader create( if (pullModel != null) { MetricExporter exporterModel = pullModel.getExporter(); if (exporterModel == null) { - throw new ConfigurationException("exporter required for pull reader"); + throw new StructuredConfigException("exporter required for pull reader"); } Prometheus prometheusModel = exporterModel.getPrometheus(); if (prometheusModel != null) { @@ -77,7 +77,7 @@ public MetricReader create( return FileConfigUtil.addAndReturn(closeables, metricReader); } - throw new ConfigurationException("prometheus is the only currently supported pull reader"); + throw new StructuredConfigException("prometheus is the only currently supported pull reader"); } return null; 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 cb2b52a8472..74ad62545c7 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 @@ -5,10 +5,10 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.OpenTelemetrySdkBuilder; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; import io.opentelemetry.sdk.resources.Resource; import java.io.Closeable; @@ -37,7 +37,8 @@ public OpenTelemetrySdk create( } if (!"0.1".equals(model.getFileFormat())) { - throw new ConfigurationException("Unsupported file format. Supported formats include: 0.1"); + throw new StructuredConfigException( + "Unsupported file format. Supported formats include: 0.1"); } if (Objects.equals(Boolean.TRUE, model.getDisabled())) { diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java index 8d881c2d03e..04d8c90ba94 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java @@ -7,10 +7,10 @@ import static java.util.stream.Collectors.joining; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; 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.autoconfigure.spi.traces.ConfigurableSamplerProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.JaegerRemote; @@ -118,7 +118,7 @@ public Sampler create( // TODO(jack-berg): add support for generic SPI samplers if (!model.getAdditionalProperties().isEmpty()) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unrecognized sampler(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java index 8a3b8cc6dce..06a2bcb39e4 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java @@ -7,10 +7,10 @@ import static java.util.stream.Collectors.joining; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; 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.autoconfigure.spi.traces.ConfigurableSpanExporterProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Otlp; @@ -62,7 +62,7 @@ public SpanExporter create( // TODO(jack-berg): add support for generic SPI exporters if (!model.getAdditionalProperties().isEmpty()) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unrecognized span exporter(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java index 59b78370ae6..6c875e1e50f 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java @@ -7,8 +7,8 @@ import static java.util.stream.Collectors.joining; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporter; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; @@ -84,7 +84,7 @@ public SpanProcessor create( // TODO: add support for generic span processors if (!model.getAdditionalProperties().isEmpty()) { - throw new ConfigurationException( + throw new StructuredConfigException( "Unrecognized span processor(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java index 4451ac98516..dae01cc6246 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java @@ -6,12 +6,12 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import java.io.Closeable; import java.util.Arrays; @@ -40,7 +40,7 @@ public TextMapPropagator create( if (model.contains("none")) { if (model.size() > 1) { - throw new ConfigurationException( + throw new StructuredConfigException( "propagators contains \"none\" along with other propagators"); } return TextMapPropagator.noop(); @@ -73,6 +73,6 @@ private static TextMapPropagator getPropagator( if (spiPropagator != null) { return spiPropagator; } - throw new ConfigurationException("Unrecognized propagator: " + name); + throw new StructuredConfigException("Unrecognized propagator: " + name); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactory.java index 77a66833761..13177c70453 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactory.java @@ -5,8 +5,8 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Stream; import io.opentelemetry.sdk.metrics.View; import io.opentelemetry.sdk.metrics.ViewBuilder; @@ -28,7 +28,7 @@ static ViewFactory getInstance() { @Override public View create(@Nullable Stream model, SpiHelper spiHelper, List closeables) { if (model == null) { - throw new ConfigurationException("stream must not be null"); + throw new StructuredConfigException("stream must not be null"); } ViewBuilder builder = View.builder(); diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java index dc32aa6fe28..3705fa49564 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java @@ -9,8 +9,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Attributes; import java.util.Arrays; import java.util.Collections; @@ -37,7 +37,7 @@ void create_InvalidAttributes(Attributes model, String expectedMessage) { () -> AttributesFactory.getInstance() .create(model, mock(SpiHelper.class), Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessageContaining(expectedMessage); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java index 7699752b109..2b6f8e06a88 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java @@ -12,8 +12,8 @@ import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; import io.github.netmikey.logunit.api.LogCapturer; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.internal.testing.CleanupExtension; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -117,7 +117,7 @@ void parseAndCreate_Exception_CleansUpPartials() { () -> FileConfiguration.parseAndCreate( new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8)))) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized log record exporter(s): [foo]"); logCapturer.assertContains( "Error encountered interpreting configuration model. Closing partially configured components."); diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java index bfb0fe09f1b..f645a2d231b 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Aggregation; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOff; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOn; @@ -70,7 +70,7 @@ void parse_BadInputStream() { () -> FileConfiguration.parseAndCreate( new ByteArrayInputStream("foo".getBytes(StandardCharsets.UTF_8)))) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unable to parse configuration input stream"); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java index c10b6394bc4..cb72a212e2c 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java @@ -9,8 +9,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Selector; import io.opentelemetry.sdk.metrics.InstrumentSelector; import io.opentelemetry.sdk.metrics.InstrumentType; @@ -25,7 +25,7 @@ void create_Null() { () -> InstrumentSelectorFactory.getInstance() .create(null, mock(SpiHelper.class), Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("selector must not be null"); } @@ -35,7 +35,7 @@ void create_Defaults() { () -> InstrumentSelectorFactory.getInstance() .create(new Selector(), mock(SpiHelper.class), Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Invalid selector"); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java index 721421c8552..73431b52102 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java @@ -15,12 +15,12 @@ import com.google.common.collect.ImmutableMap; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Headers; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Otlp; @@ -186,7 +186,7 @@ void create_SpiExporter() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized log record exporter(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java index 043533117b2..293d7abd4f2 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java @@ -9,10 +9,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessor; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporter; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessor; @@ -169,7 +169,7 @@ void create_SpiProcessor() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, closeables)) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized log record processor(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java index 6470239bfdf..c761ed8c5ab 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java @@ -15,13 +15,13 @@ import com.google.common.collect.ImmutableMap; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.exporter.logging.LoggingMetricExporter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Console; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Headers; @@ -229,7 +229,7 @@ void create_PrometheusExporter() { .withPrometheus(new Prometheus()), spiHelper, new ArrayList<>())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("prometheus exporter not supported in this context"); cleanup.addCloseables(closeables); } @@ -247,7 +247,7 @@ void create_SpiExporter() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized metric exporter(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java index 3bd03e33c8d..c372f994078 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java @@ -11,11 +11,11 @@ import static org.mockito.Mockito.verify; import io.github.netmikey.logunit.api.LogCapturer; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.exporter.prometheus.PrometheusHttpServer; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricExporter; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReader; @@ -58,7 +58,7 @@ void create_PeriodicNullExporter() { new MetricReader().withPeriodic(new PeriodicMetricReader()), spiHelper, Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("exporter required for periodic reader"); } @@ -180,7 +180,7 @@ void create_InvalidPullReader() { new MetricReader().withPull(new PullMetricReader()), spiHelper, Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("exporter required for pull reader"); assertThatThrownBy( @@ -191,7 +191,7 @@ void create_InvalidPullReader() { .withPull(new PullMetricReader().withExporter(new MetricExporter())), spiHelper, Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("prometheus is the only currently supported pull reader"); assertThatThrownBy( @@ -204,7 +204,7 @@ void create_InvalidPullReader() { .withExporter(new MetricExporter().withOtlp(new OtlpMetric()))), spiHelper, Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("prometheus is the only currently supported pull reader"); } 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 ac249c94b9a..2645de061c0 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 @@ -10,6 +10,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -22,7 +23,6 @@ import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOn; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Attributes; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessor; @@ -95,7 +95,7 @@ void create_InvalidFileFormat() { () -> OpenTelemetryConfigurationFactory.getInstance() .create(testCase, spiHelper, closeables)) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unsupported file format. Supported formats include: 0.1"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java index c5c45eb1ae6..2d12801ca23 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java @@ -9,10 +9,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOff; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOn; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.JaegerRemote; @@ -135,7 +135,7 @@ void create_SpiExporter() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized sampler(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java index 09c47433003..ecca542d746 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java @@ -15,6 +15,7 @@ import com.google.common.collect.ImmutableMap; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; @@ -22,7 +23,6 @@ import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Console; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Headers; @@ -269,7 +269,7 @@ void create_SpiExporter() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized span exporter(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java index 3c6059cc714..85f67831bc5 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java @@ -9,10 +9,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchSpanProcessor; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Otlp; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleSpanProcessor; @@ -169,7 +169,7 @@ void create_SpiProcessor() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, closeables)) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized span processor(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java index a0a0f6de49d..7d06110abff 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java @@ -9,13 +9,13 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.extension.trace.propagation.B3Propagator; import io.opentelemetry.extension.trace.propagation.JaegerPropagator; import io.opentelemetry.extension.trace.propagation.OtTracePropagator; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -67,7 +67,7 @@ void create_NoneAndOther() { () -> TextMapPropagatorFactory.getInstance() .create(Arrays.asList("none", "foo"), spiHelper, Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("propagators contains \"none\" along with other propagators"); } @@ -77,7 +77,7 @@ void create_UnknownSpiPropagator() { () -> TextMapPropagatorFactory.getInstance() .create(Collections.singletonList("foo"), spiHelper, Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("Unrecognized propagator: foo"); } } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactoryTest.java index e04d5460a2d..4b5a56e9577 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ViewFactoryTest.java @@ -9,8 +9,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; +import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Aggregation; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExplicitBucketHistogram; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Stream; @@ -28,7 +28,7 @@ void create_Null() { () -> ViewFactory.getInstance() .create(null, mock(SpiHelper.class), Collections.emptyList())) - .isInstanceOf(ConfigurationException.class) + .isInstanceOf(StructuredConfigException.class) .hasMessage("stream must not be null"); } From a624c709787576f0d2702a4c9d79481209ba57a4 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Wed, 31 Jul 2024 18:13:26 -0500 Subject: [PATCH 2/5] partially incorporate pr feedback --- .../api/incubator/config/ConfigProvider.java | 2 +- .../config/GlobalConfigProvider.java | 2 ++ .../config/InstrumentationConfigUtil.java | 26 ++++++++++++++++--- .../YamlStructuredConfigProperties.java | 5 +--- .../api/incubator/ConfigProviderTest.java | 20 ++++++++++++++ .../config/GlobalConfigProviderTest.java | 9 +++---- ...AutoConfiguredOpenTelemetrySdkBuilder.java | 12 +++++---- 7 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 1a909634bf8..29cbbb4ce6e 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -23,7 +23,7 @@ public interface ConfigProvider { /** * Returns the {@link StructuredConfigProperties} corresponding to instrumentation - * config, or {@code null} if file configuration is not used. + * config, or {@code null} if unavailable. * * @return the instrumentation {@link StructuredConfigProperties} */ diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java index 8f52a6bdbeb..60c5b945f46 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java @@ -37,6 +37,8 @@ public static ConfigProvider get() { * Sets the global {@link ConfigProvider}. Future calls to {@link #get()} will return the provided * {@link ConfigProvider} instance. This should be called once as early as possible in your * application initialization logic. + * + * @throws IllegalStateException when called more than once */ public static void set(ConfigProvider configProvider) { boolean changed = instance.compareAndSet(ConfigProvider.noop(), configProvider); diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java index 6b50e0b34d1..36e4f014745 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java @@ -5,7 +5,7 @@ package io.opentelemetry.api.incubator.config; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -22,6 +22,8 @@ public class InstrumentationConfigUtil { /** * Return a map representation of the peer service map entries in {@code * .instrumentation.general.peer.service_mapping}, or null if none is configured. + * + * @throws StructuredConfigException if an unexpected type is encountered accessing the property */ @Nullable public static Map peerServiceMapping(ConfigProvider configProvider) { @@ -33,7 +35,7 @@ public static Map peerServiceMapping(ConfigProvider configProvid if (!optServiceMappingList.isPresent()) { return null; } - Map serviceMapping = new HashMap<>(); + Map serviceMapping = new LinkedHashMap<>(); optServiceMappingList .get() .forEach( @@ -44,12 +46,14 @@ public static Map peerServiceMapping(ConfigProvider configProvid serviceMapping.put(peer, service); } }); - return serviceMapping; + return serviceMapping.isEmpty() ? null : serviceMapping; } /** * Return {@code .instrumentation.general.http.client.request_captured_headers}, or null if none * is configured. + * + * @throws StructuredConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpClientRequestCapturedHeaders(ConfigProvider configProvider) { @@ -58,12 +62,15 @@ public static List httpClientRequestCapturedHeaders(ConfigProvider confi .map(generalConfig -> generalConfig.getStructured("http")) .map(httpConfig -> httpConfig.getStructured("client")) .map(clientConfig -> clientConfig.getScalarList("request_captured_headers", String.class)) + .filter(list -> !list.isEmpty()) .orElse(null); } /** * Return {@code .instrumentation.general.http.client.response_captured_headers}, or null if none * is configured. + * + * @throws StructuredConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpClientResponseCapturedHeaders(ConfigProvider configProvider) { @@ -72,12 +79,15 @@ public static List httpClientResponseCapturedHeaders(ConfigProvider conf .map(generalConfig -> generalConfig.getStructured("http")) .map(httpConfig -> httpConfig.getStructured("client")) .map(clientConfig -> clientConfig.getScalarList("response_captured_headers", String.class)) + .filter(list -> !list.isEmpty()) .orElse(null); } /** * Return {@code .instrumentation.general.http.server.request_captured_headers}, or null if none * is configured. + * + * @throws StructuredConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpServerRequestCapturedHeaders(ConfigProvider configProvider) { @@ -86,12 +96,15 @@ public static List httpServerRequestCapturedHeaders(ConfigProvider confi .map(generalConfig -> generalConfig.getStructured("http")) .map(httpConfig -> httpConfig.getStructured("server")) .map(clientConfig -> clientConfig.getScalarList("request_captured_headers", String.class)) + .filter(list -> !list.isEmpty()) .orElse(null); } /** * Return {@code .instrumentation.general.http.server.response_captured_headers}, or null if none * is configured. + * + * @throws StructuredConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpSeverResponseCapturedHeaders(ConfigProvider configProvider) { @@ -100,10 +113,15 @@ public static List httpSeverResponseCapturedHeaders(ConfigProvider confi .map(generalConfig -> generalConfig.getStructured("http")) .map(httpConfig -> httpConfig.getStructured("server")) .map(clientConfig -> clientConfig.getScalarList("response_captured_headers", String.class)) + .filter(list -> !list.isEmpty()) .orElse(null); } - /** Return {@code .instrumentation.java.}, or null if none is configured. */ + /** + * Return {@code .instrumentation.java.}, or null if none is configured. + * + * @throws StructuredConfigException if an unexpected type is encountered accessing the property + */ @Nullable public static StructuredConfigProperties javaInstrumentationConfig( ConfigProvider configProvider, String instrumentationName) { diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java index 10d775dbb66..dfad95405ca 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java @@ -287,10 +287,7 @@ public String toString() { return joiner.toString(); } - /** - * Returns a map representation of this {@link YamlStructuredConfigProperties}, which is useful - * for testing. - */ + /** Returns a map representation of this, which is useful for testing. */ public Map asMap() { Map response = new HashMap<>(); response.putAll(simpleEntries); diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java new file mode 100644 index 00000000000..9c9e4bf41e1 --- /dev/null +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/ConfigProviderTest.java @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.incubator.config.ConfigProvider; +import org.junit.jupiter.api.Test; + +class ConfigProviderTest { + + @Test + void noopEquality() { + ConfigProvider noop = ConfigProvider.noop(); + assertThat(ConfigProvider.noop()).isSameAs(noop); + } +} diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java index ad61f43722f..cd75352c96f 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java @@ -37,11 +37,10 @@ void setAndGet() { @Test void setThenSet() { - GlobalConfigProvider.set(() -> YamlStructuredConfigProperties.create(Collections.emptyMap())); - assertThatThrownBy( - () -> - GlobalConfigProvider.set( - () -> YamlStructuredConfigProperties.create(Collections.emptyMap()))) + ConfigProvider configProvider = + () -> YamlStructuredConfigProperties.create(Collections.emptyMap()); + GlobalConfigProvider.set(configProvider); + assertThatThrownBy(() -> GlobalConfigProvider.set(configProvider)) .isInstanceOf(IllegalStateException.class) .hasMessageContaining("GlobalConfigProvider.set has already been called") .hasStackTraceContaining("setThenSet"); diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java index 05b1893a891..9218fd35ca7 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java @@ -52,6 +52,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; @@ -435,7 +436,9 @@ public AutoConfiguredOpenTelemetrySdk build() { if (fromFileConfiguration != null) { maybeRegisterShutdownHook(fromFileConfiguration.getOpenTelemetrySdk()); maybeSetAsGlobal( - fromFileConfiguration.getOpenTelemetrySdk(), fromFileConfiguration.getConfigProvider()); + fromFileConfiguration.getOpenTelemetrySdk(), + Optional.ofNullable(fromFileConfiguration.getConfigProvider()) + .orElse(ConfigProvider.noop())); return fromFileConfiguration; } @@ -507,7 +510,7 @@ public AutoConfiguredOpenTelemetrySdk build() { } maybeRegisterShutdownHook(openTelemetrySdk); - maybeSetAsGlobal(openTelemetrySdk, null); + maybeSetAsGlobal(openTelemetrySdk, ConfigProvider.noop()); callAutoConfigureListeners(spiHelper, openTelemetrySdk); return AutoConfiguredOpenTelemetrySdk.create(openTelemetrySdk, resource, config, null); @@ -593,15 +596,14 @@ private void maybeRegisterShutdownHook(OpenTelemetrySdk openTelemetrySdk) { Runtime.getRuntime().addShutdownHook(shutdownHook(openTelemetrySdk)); } - private void maybeSetAsGlobal( - OpenTelemetrySdk openTelemetrySdk, @Nullable ConfigProvider configProvider) { + private void maybeSetAsGlobal(OpenTelemetrySdk openTelemetrySdk, ConfigProvider configProvider) { if (!setResultAsGlobal) { return; } GlobalOpenTelemetry.set(openTelemetrySdk); GlobalEventLoggerProvider.set( SdkEventLoggerProvider.create(openTelemetrySdk.getSdkLoggerProvider())); - GlobalConfigProvider.set(configProvider != null ? configProvider : ConfigProvider.noop()); + GlobalConfigProvider.set(configProvider); logger.log( Level.FINE, "Global OpenTelemetry set to {0} by autoconfiguration", openTelemetrySdk); } From 0389e1ca6d0ef6ce84cd2b8dfb7f24b564094edc Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Wed, 21 Aug 2024 09:26:09 -0500 Subject: [PATCH 3/5] Rename to declarative configuration --- .../api/incubator/config/ConfigProvider.java | 8 +-- ...n.java => DeclarativeConfigException.java} | 8 +-- ....java => DeclarativeConfigProperties.java} | 42 ++++++------ .../config/GlobalConfigProvider.java | 5 +- .../config/InstrumentationConfigUtil.java | 16 ++--- ...a => YamlDeclarativeConfigProperties.java} | 67 ++++++++++--------- .../config/GlobalConfigProviderTest.java | 6 +- .../config/InstrumentationConfigUtilTest.java | 12 ++-- ... YamlDeclarativeConfigPropertiesTest.java} | 33 ++++----- .../internal/ExporterBuilderUtil.java | 4 +- ...oleLogRecordExporterComponentProvider.java | 4 +- ...onsoleMetricExporterComponentProvider.java | 4 +- .../ConsoleSpanExporterComponentProvider.java | 4 +- .../otlp/internal/OtlpConfigUtil.java | 12 ++-- ...tlpLogRecordExporterComponentProvider.java | 4 +- .../OtlpMetricExporterComponentProvider.java | 4 +- .../OtlpSpanExporterComponentProvider.java | 4 +- .../internal/PrometheusComponentProvider.java | 4 +- .../ZipkinSpanExporterComponentProvider.java | 4 +- .../autoconfigure-spi/build.gradle.kts | 2 +- .../spi/internal/ComponentProvider.java | 6 +- .../AutoConfiguredOpenTelemetrySdk.java | 6 +- ...AutoConfiguredOpenTelemetrySdkBuilder.java | 23 ++++--- .../internal/AutoConfigureUtil.java | 6 +- .../sdk/autoconfigure/internal/SpiHelper.java | 18 ++--- ...java => DeclarativeConfigurationTest.java} | 6 +- .../fileconfig/AggregationFactory.java | 6 +- .../fileconfig/AttributesFactory.java | 10 +-- ...ion.java => DeclarativeConfiguration.java} | 48 ++++++------- .../fileconfig/FileConfigProvider.java | 38 ----------- .../incubator/fileconfig/FileConfigUtil.java | 14 ++-- .../fileconfig/InstrumentSelectorFactory.java | 6 +- .../fileconfig/LogRecordExporterFactory.java | 6 +- .../fileconfig/LogRecordProcessorFactory.java | 6 +- .../fileconfig/MetricExporterFactory.java | 8 +-- .../fileconfig/MetricReaderFactory.java | 7 +- .../OpenTelemetryConfigurationFactory.java | 4 +- .../incubator/fileconfig/SamplerFactory.java | 6 +- .../fileconfig/SdkConfigProvider.java | 39 +++++++++++ .../fileconfig/SpanExporterFactory.java | 6 +- .../fileconfig/SpanProcessorFactory.java | 6 +- .../fileconfig/TextMapPropagatorFactory.java | 6 +- .../fileconfig/AttributesFactoryTest.java | 4 +- ...> DeclarativeConfigurationCreateTest.java} | 14 ++-- ...=> DeclarativeConfigurationParseTest.java} | 23 ++++--- .../InstrumentSelectorFactoryTest.java | 4 +- .../LogRecordExporterFactoryTest.java | 20 +++--- .../LogRecordProcessorFactoryTest.java | 8 +-- .../fileconfig/MetricExporterFactoryTest.java | 22 +++--- .../fileconfig/MetricReaderFactoryTest.java | 12 ++-- ...OpenTelemetryConfigurationFactoryTest.java | 4 +- .../fileconfig/SamplerFactoryTest.java | 4 +- .../fileconfig/SpanExporterFactoryTest.java | 32 ++++----- .../fileconfig/SpanProcessorFactoryTest.java | 8 +-- .../TextMapPropagatorFactoryTest.java | 6 +- .../LogRecordExporterComponentProvider.java | 8 +-- .../MetricExporterComponentProvider.java | 8 +-- .../SpanExporterComponentProvider.java | 8 +-- 58 files changed, 361 insertions(+), 352 deletions(-) rename api/incubator/src/main/java/io/opentelemetry/api/incubator/config/{StructuredConfigException.java => DeclarativeConfigException.java} (61%) rename api/incubator/src/main/java/io/opentelemetry/api/incubator/config/{StructuredConfigProperties.java => DeclarativeConfigProperties.java} (75%) rename api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/{YamlStructuredConfigProperties.java => YamlDeclarativeConfigProperties.java} (78%) rename api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/{YamlStructuredConfigPropertiesTest.java => YamlDeclarativeConfigPropertiesTest.java} (85%) rename sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/{FileConfigurationTest.java => DeclarativeConfigurationTest.java} (98%) rename sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/{FileConfiguration.java => DeclarativeConfiguration.java} (82%) delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java create mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java rename sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/{FileConfigurationCreateTest.java => DeclarativeConfigurationCreateTest.java} (91%) rename sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/{FileConfigurationParseTest.java => DeclarativeConfigurationParseTest.java} (97%) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java index 29cbbb4ce6e..62cc044e653 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ConfigProvider.java @@ -9,7 +9,7 @@ import javax.annotation.concurrent.ThreadSafe; /** - * A registry for accessing configuration. + * A registry for accessing declarative configuration. * *

The name Provider is for consistency with other languages and it is NOT loaded * using reflection. @@ -21,14 +21,14 @@ public interface ConfigProvider { /** - * Returns the {@link StructuredConfigProperties} corresponding to instrumentation * config, or {@code null} if unavailable. * - * @return the instrumentation {@link StructuredConfigProperties} + * @return the instrumentation {@link DeclarativeConfigProperties} */ @Nullable - StructuredConfigProperties getInstrumentationConfig(); + DeclarativeConfigProperties getInstrumentationConfig(); /** Returns a no-op {@link ConfigProvider}. */ static ConfigProvider noop() { diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigException.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigException.java similarity index 61% rename from api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigException.java rename to api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigException.java index b819daf2d76..3ce49c6454d 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigException.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigException.java @@ -5,18 +5,18 @@ package io.opentelemetry.api.incubator.config; -/** An exception that is thrown if the user-provided file configuration is invalid. */ -public final class StructuredConfigException extends RuntimeException { +/** An exception that is thrown when errors occur with declarative configuration. */ +public final class DeclarativeConfigException extends RuntimeException { private static final long serialVersionUID = 3036584181551130522L; /** Create a new configuration exception with specified {@code message} and without a cause. */ - public StructuredConfigException(String message) { + public DeclarativeConfigException(String message) { super(message); } /** Create a new configuration exception with specified {@code message} and {@code cause}. */ - public StructuredConfigException(String message, Throwable cause) { + public DeclarativeConfigException(String message, Throwable cause) { super(message, cause); } } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigProperties.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java similarity index 75% rename from api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigProperties.java rename to api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java index 81dc84e4c2c..f457692c160 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/StructuredConfigProperties.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java @@ -12,21 +12,21 @@ import javax.annotation.Nullable; /** - * An interface for accessing structured configuration data. + * An interface for accessing declarative configuration data. * - *

An instance of {@link StructuredConfigProperties} is equivalent to a An instance of {@link DeclarativeConfigProperties} is equivalent to a YAML mapping node. It has accessors for * reading scalar properties, {@link #getStructured(String)} for reading children which are * themselves mappings, and {@link #getStructuredList(String)} for reading children which are * sequences of mappings. */ -public interface StructuredConfigProperties { +public interface DeclarativeConfigProperties { /** * Returns a {@link String} configuration property. * * @return null if the property has not been configured - * @throws StructuredConfigException if the property is not a valid scalar string + * @throws DeclarativeConfigException if the property is not a valid scalar string */ @Nullable String getString(String name); @@ -36,7 +36,7 @@ public interface StructuredConfigProperties { * * @return a {@link String} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws StructuredConfigException if the property is not a valid scalar string + * @throws DeclarativeConfigException if the property is not a valid scalar string */ default String getString(String name, String defaultValue) { return defaultIfNull(getString(name), defaultValue); @@ -47,7 +47,7 @@ default String getString(String name, String defaultValue) { * {@link Boolean#parseBoolean(String)} for handling the values. * * @return null if the property has not been configured - * @throws StructuredConfigException if the property is not a valid scalar boolean + * @throws DeclarativeConfigException if the property is not a valid scalar boolean */ @Nullable Boolean getBoolean(String name); @@ -57,7 +57,7 @@ default String getString(String name, String defaultValue) { * * @return a {@link Boolean} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws StructuredConfigException if the property is not a valid scalar boolean + * @throws DeclarativeConfigException if the property is not a valid scalar boolean */ default boolean getBoolean(String name, boolean defaultValue) { return defaultIfNull(getBoolean(name), defaultValue); @@ -70,7 +70,7 @@ default boolean getBoolean(String name, boolean defaultValue) { * {@link Long#intValue()} which may result in loss of precision. * * @return null if the property has not been configured - * @throws StructuredConfigException if the property is not a valid scalar integer + * @throws DeclarativeConfigException if the property is not a valid scalar integer */ @Nullable Integer getInt(String name); @@ -83,7 +83,7 @@ default boolean getBoolean(String name, boolean defaultValue) { * * @return a {@link Integer} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws StructuredConfigException if the property is not a valid scalar integer + * @throws DeclarativeConfigException if the property is not a valid scalar integer */ default int getInt(String name, int defaultValue) { return defaultIfNull(getInt(name), defaultValue); @@ -93,7 +93,7 @@ default int getInt(String name, int defaultValue) { * Returns a {@link Long} configuration property. * * @return null if the property has not been configured - * @throws StructuredConfigException if the property is not a valid scalar long + * @throws DeclarativeConfigException if the property is not a valid scalar long */ @Nullable Long getLong(String name); @@ -103,7 +103,7 @@ default int getInt(String name, int defaultValue) { * * @return a {@link Long} configuration property or {@code defaultValue} if a property with {@code * name} has not been configured - * @throws StructuredConfigException if the property is not a valid scalar long + * @throws DeclarativeConfigException if the property is not a valid scalar long */ default long getLong(String name, long defaultValue) { return defaultIfNull(getLong(name), defaultValue); @@ -113,7 +113,7 @@ default long getLong(String name, long defaultValue) { * Returns a {@link Double} configuration property. * * @return null if the property has not been configured - * @throws StructuredConfigException if the property is not a valid scalar double + * @throws DeclarativeConfigException if the property is not a valid scalar double */ @Nullable Double getDouble(String name); @@ -123,7 +123,7 @@ default long getLong(String name, long defaultValue) { * * @return a {@link Double} configuration property or {@code defaultValue} if a property with * {@code name} has not been configured - * @throws StructuredConfigException if the property is not a valid scalar double + * @throws DeclarativeConfigException if the property is not a valid scalar double */ default double getDouble(String name, double defaultValue) { return defaultIfNull(getDouble(name), defaultValue); @@ -137,7 +137,7 @@ default double getDouble(String name, double defaultValue) { * @param scalarType the scalar type, one of {@link String}, {@link Boolean}, {@link Long} or * {@link Double} * @return a {@link List} configuration property, or null if the property has not been configured - * @throws StructuredConfigException if the property is not a valid sequence of scalars, or if + * @throws DeclarativeConfigException if the property is not a valid sequence of scalars, or if * {@code scalarType} is not supported */ @Nullable @@ -152,31 +152,31 @@ default double getDouble(String name, double defaultValue) { * {@link Double} * @return a {@link List} configuration property or {@code defaultValue} if a property with {@code * name} has not been configured - * @throws StructuredConfigException if the property is not a valid sequence of scalars + * @throws DeclarativeConfigException if the property is not a valid sequence of scalars */ default List getScalarList(String name, Class scalarType, List defaultValue) { return defaultIfNull(getScalarList(name, scalarType), defaultValue); } /** - * Returns a {@link StructuredConfigProperties} configuration property. + * Returns a {@link DeclarativeConfigProperties} configuration property. * * @return a map-valued configuration property, or {@code null} if {@code name} has not been * configured - * @throws StructuredConfigException if the property is not a mapping + * @throws DeclarativeConfigException if the property is not a mapping */ @Nullable - StructuredConfigProperties getStructured(String name); + DeclarativeConfigProperties getStructured(String name); /** - * Returns a list of {@link StructuredConfigProperties} configuration property. + * Returns a list of {@link DeclarativeConfigProperties} configuration property. * * @return a list of map-valued configuration property, or {@code null} if {@code name} has not * been configured - * @throws StructuredConfigException if the property is not a sequence of mappings + * @throws DeclarativeConfigException if the property is not a sequence of mappings */ @Nullable - List getStructuredList(String name); + List getStructuredList(String name); /** * Returns a set of all configuration property keys. diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java index 60c5b945f46..b0daef4968d 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java @@ -10,8 +10,9 @@ import javax.annotation.Nullable; /** - * This class provides a temporary global accessor for {@link ConfigProvider} until the config API - * is marked stable. It will eventually be merged into {@link GlobalOpenTelemetry}. + * This class provides a temporary global accessor for {@link ConfigProvider} until the + * instrumentation config API is marked stable. It will eventually be merged into {@link + * GlobalOpenTelemetry}. */ // We intentionally assign to be used for error reporting. @SuppressWarnings("StaticAssignmentOfThrowable") diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java index 36e4f014745..af3553748e0 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java @@ -23,11 +23,11 @@ public class InstrumentationConfigUtil { * Return a map representation of the peer service map entries in {@code * .instrumentation.general.peer.service_mapping}, or null if none is configured. * - * @throws StructuredConfigException if an unexpected type is encountered accessing the property + * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property */ @Nullable public static Map peerServiceMapping(ConfigProvider configProvider) { - Optional> optServiceMappingList = + Optional> optServiceMappingList = Optional.ofNullable(configProvider.getInstrumentationConfig()) .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) .map(generalConfig -> generalConfig.getStructured("peer")) @@ -53,7 +53,7 @@ public static Map peerServiceMapping(ConfigProvider configProvid * Return {@code .instrumentation.general.http.client.request_captured_headers}, or null if none * is configured. * - * @throws StructuredConfigException if an unexpected type is encountered accessing the property + * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpClientRequestCapturedHeaders(ConfigProvider configProvider) { @@ -70,7 +70,7 @@ public static List httpClientRequestCapturedHeaders(ConfigProvider confi * Return {@code .instrumentation.general.http.client.response_captured_headers}, or null if none * is configured. * - * @throws StructuredConfigException if an unexpected type is encountered accessing the property + * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpClientResponseCapturedHeaders(ConfigProvider configProvider) { @@ -87,7 +87,7 @@ public static List httpClientResponseCapturedHeaders(ConfigProvider conf * Return {@code .instrumentation.general.http.server.request_captured_headers}, or null if none * is configured. * - * @throws StructuredConfigException if an unexpected type is encountered accessing the property + * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpServerRequestCapturedHeaders(ConfigProvider configProvider) { @@ -104,7 +104,7 @@ public static List httpServerRequestCapturedHeaders(ConfigProvider confi * Return {@code .instrumentation.general.http.server.response_captured_headers}, or null if none * is configured. * - * @throws StructuredConfigException if an unexpected type is encountered accessing the property + * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property */ @Nullable public static List httpSeverResponseCapturedHeaders(ConfigProvider configProvider) { @@ -120,10 +120,10 @@ public static List httpSeverResponseCapturedHeaders(ConfigProvider confi /** * Return {@code .instrumentation.java.}, or null if none is configured. * - * @throws StructuredConfigException if an unexpected type is encountered accessing the property + * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property */ @Nullable - public static StructuredConfigProperties javaInstrumentationConfig( + public static DeclarativeConfigProperties javaInstrumentationConfig( ConfigProvider configProvider, String instrumentationName) { return Optional.ofNullable(configProvider.getInstrumentationConfig()) .map(instrumentationConfig -> instrumentationConfig.getStructured("java")) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigProperties.java similarity index 78% rename from api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java rename to api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigProperties.java index dfad95405ca..09dc19b3775 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigProperties.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigProperties.java @@ -8,12 +8,12 @@ import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; -import io.opentelemetry.api.incubator.config.StructuredConfigException; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -22,7 +22,7 @@ import javax.annotation.Nullable; /** - * Implementation of {@link StructuredConfigProperties} which uses a file configuration model as a + * Implementation of {@link DeclarativeConfigProperties} which uses a file configuration model as a * source. * *

This class is internal and is hence not for public use. Its APIs are unstable and can change @@ -31,19 +31,24 @@ * @see #getStructured(String) Accessing nested maps * @see #getStructuredList(String) Accessing lists of maps */ -public final class YamlStructuredConfigProperties implements StructuredConfigProperties { +public final class YamlDeclarativeConfigProperties implements DeclarativeConfigProperties { + + private static final Set> SUPPORTED_SCALAR_TYPES = + Collections.unmodifiableSet( + new LinkedHashSet<>( + Arrays.asList(String.class, Boolean.class, Long.class, Double.class))); /** Values are {@link #isPrimitive(Object)}, {@link List} of scalars. */ private final Map simpleEntries; - private final Map> listEntries; - private final Map mapEntries; + private final Map> listEntries; + private final Map mapEntries; private final Set nullKeys; - private YamlStructuredConfigProperties( + private YamlDeclarativeConfigProperties( Map simpleEntries, - Map> listEntries, - Map mapEntries, + Map> listEntries, + Map mapEntries, Set nullKeys) { this.simpleEntries = simpleEntries; this.listEntries = listEntries; @@ -52,18 +57,18 @@ private YamlStructuredConfigProperties( } /** - * Create a {@link YamlStructuredConfigProperties} from the {@code properties} map. + * Create a {@link YamlDeclarativeConfigProperties} from the {@code properties} map. * *

{@code properties} is expected to be the output of YAML parsing (i.e. with Jackson {@code * com.fasterxml.jackson.databind.ObjectMapper}), and have values which are scalars, lists of * scalars, lists of maps, and maps. */ @SuppressWarnings("unchecked") - public static YamlStructuredConfigProperties create(Map properties) { - Map simpleEntries = new HashMap<>(); - Map> listEntries = new HashMap<>(); - Map mapEntries = new HashMap<>(); - Set nullKeys = new HashSet<>(); + public static YamlDeclarativeConfigProperties create(Map properties) { + Map simpleEntries = new LinkedHashMap<>(); + Map> listEntries = new LinkedHashMap<>(); + Map mapEntries = new LinkedHashMap<>(); + Set nullKeys = new LinkedHashSet<>(); for (Map.Entry entry : properties.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); @@ -76,15 +81,15 @@ public static YamlStructuredConfigProperties create(Map properti continue; } if (isListOfMaps(value)) { - List list = + List list = ((List>) value) - .stream().map(YamlStructuredConfigProperties::create).collect(toList()); + .stream().map(YamlDeclarativeConfigProperties::create).collect(toList()); listEntries.put(key, list); continue; } if (isMap(value)) { - YamlStructuredConfigProperties configProperties = - YamlStructuredConfigProperties.create((Map) value); + YamlDeclarativeConfigProperties configProperties = + YamlDeclarativeConfigProperties.create((Map) value); mapEntries.put(key, configProperties); continue; } @@ -92,19 +97,19 @@ public static YamlStructuredConfigProperties create(Map properti nullKeys.add(key); continue; } - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Unable to initialize ExtendedConfigProperties. Key \"" + key + "\" has unrecognized object type " + value.getClass().getName()); } - return new YamlStructuredConfigProperties(simpleEntries, listEntries, mapEntries, nullKeys); + return new YamlDeclarativeConfigProperties(simpleEntries, listEntries, mapEntries, nullKeys); } private static boolean isPrimitiveList(Object object) { if (object instanceof List) { List list = (List) object; - return list.stream().allMatch(YamlStructuredConfigProperties::isPrimitive); + return list.stream().allMatch(YamlDeclarativeConfigProperties::isPrimitive); } return false; } @@ -176,16 +181,12 @@ public Double getDouble(String name) { return doubleOrNull(simpleEntries.get(name)); } - private static final Set> SUPPORTED_SCALAR_TYPES = - Collections.unmodifiableSet( - new HashSet<>(Arrays.asList(String.class, Boolean.class, Long.class, Double.class))); - @Nullable @Override @SuppressWarnings("unchecked") public List getScalarList(String name, Class scalarType) { if (!SUPPORTED_SCALAR_TYPES.contains(scalarType)) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Unsupported scalar type " + scalarType.getName() + ". Supported types include " @@ -257,19 +258,19 @@ private static Double doubleOrNull(@Nullable Object value) { @Nullable @Override - public StructuredConfigProperties getStructured(String name) { + public DeclarativeConfigProperties getStructured(String name) { return mapEntries.get(name); } @Nullable @Override - public List getStructuredList(String name) { + public List getStructuredList(String name) { return listEntries.get(name); } @Override public Set getPropertyKeys() { - Set keys = new HashSet<>(); + Set keys = new LinkedHashSet<>(); keys.addAll(simpleEntries.keySet()); keys.addAll(listEntries.keySet()); keys.addAll(mapEntries.keySet()); @@ -289,7 +290,7 @@ public String toString() { /** Returns a map representation of this, which is useful for testing. */ public Map asMap() { - Map response = new HashMap<>(); + Map response = new LinkedHashMap<>(); response.putAll(simpleEntries); response.putAll(listEntries); response.putAll(mapEntries); diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java index cd75352c96f..f42df303f92 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import io.opentelemetry.api.incubator.config.internal.YamlStructuredConfigProperties; +import io.opentelemetry.api.incubator.config.internal.YamlDeclarativeConfigProperties; import java.util.Collections; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -30,7 +30,7 @@ void after() { void setAndGet() { assertThat(GlobalConfigProvider.get()).isEqualTo(ConfigProvider.noop()); ConfigProvider configProvider = - () -> YamlStructuredConfigProperties.create(Collections.emptyMap()); + () -> YamlDeclarativeConfigProperties.create(Collections.emptyMap()); GlobalConfigProvider.set(configProvider); assertThat(GlobalConfigProvider.get()).isSameAs(configProvider); } @@ -38,7 +38,7 @@ void setAndGet() { @Test void setThenSet() { ConfigProvider configProvider = - () -> YamlStructuredConfigProperties.create(Collections.emptyMap()); + () -> YamlDeclarativeConfigProperties.create(Collections.emptyMap()); GlobalConfigProvider.set(configProvider); assertThatThrownBy(() -> GlobalConfigProvider.set(configProvider)) .isInstanceOf(IllegalStateException.class) 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 b18f90d8c8d..cbc53845706 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 @@ -8,9 +8,9 @@ import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableMap; -import io.opentelemetry.api.incubator.config.internal.YamlStructuredConfigProperties; -import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigProvider; -import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration; +import io.opentelemetry.api.incubator.config.internal.YamlDeclarativeConfigProperties; +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.OpenTelemetryConfiguration; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; @@ -62,9 +62,9 @@ class InstrumentationConfigUtilTest { private static ConfigProvider toConfigProvider(String configYaml) { OpenTelemetryConfiguration configuration = - FileConfiguration.parse( + DeclarativeConfiguration.parse( new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8))); - return FileConfigProvider.create(configuration); + return SdkConfigProvider.create(configuration); } @Test @@ -148,7 +148,7 @@ void javaInstrumentationConfig() { kitchenSinkConfigProvider, "example")) .isNotNull() .isInstanceOfSatisfying( - YamlStructuredConfigProperties.class, + YamlDeclarativeConfigProperties.class, exampleConfig -> assertThat(exampleConfig.asMap()).isEqualTo(ImmutableMap.of("property", "value"))); assertThat( diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigPropertiesTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigPropertiesTest.java similarity index 85% rename from api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigPropertiesTest.java rename to api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigPropertiesTest.java index d2076e36b43..e8f4bcf9235 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlStructuredConfigPropertiesTest.java +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigPropertiesTest.java @@ -8,8 +8,8 @@ import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableSet; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; -import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; @@ -19,7 +19,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -class YamlStructuredConfigPropertiesTest { +class YamlDeclarativeConfigPropertiesTest { private static final String extendedSchema = "file_format: \"0.1\"\n" @@ -54,23 +54,23 @@ class YamlStructuredConfigPropertiesTest { + " - str_key1: str_value1\n" + " int_key1: 2"; - private StructuredConfigProperties structuredConfigProps; + private DeclarativeConfigProperties structuredConfigProps; @BeforeEach void setup() { OpenTelemetryConfiguration configuration = - FileConfiguration.parse( + DeclarativeConfiguration.parse( new ByteArrayInputStream(extendedSchema.getBytes(StandardCharsets.UTF_8))); - structuredConfigProps = FileConfiguration.toConfigProperties(configuration); + structuredConfigProps = DeclarativeConfiguration.toConfigProperties(configuration); } @Test void configurationSchema() { // Validate can read file configuration schema properties assertThat(structuredConfigProps.getString("file_format")).isEqualTo("0.1"); - StructuredConfigProperties resourceProps = structuredConfigProps.getStructured("resource"); + DeclarativeConfigProperties resourceProps = structuredConfigProps.getStructured("resource"); assertThat(resourceProps).isNotNull(); - StructuredConfigProperties resourceAttributesProps = resourceProps.getStructured("attributes"); + DeclarativeConfigProperties resourceAttributesProps = resourceProps.getStructured("attributes"); assertThat(resourceAttributesProps).isNotNull(); assertThat(resourceAttributesProps.getString("service.name")).isEqualTo("unknown_service"); } @@ -82,7 +82,7 @@ void additionalProperties() { // Validate can read properties not part of configuration schema // .other - StructuredConfigProperties otherProps = structuredConfigProps.getStructured("other"); + DeclarativeConfigProperties otherProps = structuredConfigProps.getStructured("other"); assertThat(otherProps).isNotNull(); assertThat(otherProps.getPropertyKeys()) .isEqualTo( @@ -123,14 +123,15 @@ void additionalProperties() { .isEqualTo(Collections.singletonList(true)); // .other.map_key - StructuredConfigProperties otherMapKeyProps = otherProps.getStructured("map_key"); + DeclarativeConfigProperties otherMapKeyProps = otherProps.getStructured("map_key"); assertThat(otherMapKeyProps).isNotNull(); assertThat(otherMapKeyProps.getPropertyKeys()) .isEqualTo(ImmutableSet.of("str_key1", "int_key1", "map_key1")); assertThat(otherMapKeyProps.getString("str_key1")).isEqualTo("str_value1"); assertThat(otherMapKeyProps.getInt("int_key1")).isEqualTo(2); // other.map_key.map_key1 - StructuredConfigProperties otherMapKeyMapKey1Props = otherMapKeyProps.getStructured("map_key1"); + DeclarativeConfigProperties otherMapKeyMapKey1Props = + otherMapKeyProps.getStructured("map_key1"); assertThat(otherMapKeyMapKey1Props).isNotNull(); assertThat(otherMapKeyMapKey1Props.getPropertyKeys()) .isEqualTo(ImmutableSet.of("str_key2", "int_key2")); @@ -138,22 +139,22 @@ void additionalProperties() { assertThat(otherMapKeyMapKey1Props.getInt("int_key2")).isEqualTo(3); // .other.list_key - List listKey = otherProps.getStructuredList("list_key"); + List listKey = otherProps.getStructuredList("list_key"); assertThat(listKey).hasSize(2); - StructuredConfigProperties listKeyProps1 = listKey.get(0); + DeclarativeConfigProperties listKeyProps1 = listKey.get(0); assertThat(listKeyProps1.getPropertyKeys()) .isEqualTo(ImmutableSet.of("str_key1", "int_key1", "map_key1")); assertThat(listKeyProps1.getString("str_key1")).isEqualTo("str_value1"); assertThat(listKeyProps1.getInt("int_key1")).isEqualTo(2); // .other.list_key[0] - StructuredConfigProperties listKeyProps1MapKeyProps = listKeyProps1.getStructured("map_key1"); + DeclarativeConfigProperties listKeyProps1MapKeyProps = listKeyProps1.getStructured("map_key1"); assertThat(listKeyProps1MapKeyProps).isNotNull(); assertThat(listKeyProps1MapKeyProps.getPropertyKeys()) .isEqualTo(ImmutableSet.of("str_key2", "int_key2")); assertThat(listKeyProps1MapKeyProps.getString("str_key2")).isEqualTo("str_value2"); assertThat(listKeyProps1MapKeyProps.getInt("int_key2")).isEqualTo(3); // .other.list_key[1] - StructuredConfigProperties listKeyProps2 = listKey.get(1); + DeclarativeConfigProperties listKeyProps2 = listKey.get(1); assertThat(listKeyProps2.getPropertyKeys()).isEqualTo(ImmutableSet.of("str_key1", "int_key1")); assertThat(listKeyProps2.getString("str_key1")).isEqualTo("str_value1"); assertThat(listKeyProps2.getInt("int_key1")).isEqualTo(2); @@ -186,7 +187,7 @@ void missingKeys() { @Test void wrongType() { - StructuredConfigProperties otherProps = structuredConfigProps.getStructured("other"); + DeclarativeConfigProperties otherProps = structuredConfigProps.getStructured("other"); assertThat(otherProps).isNotNull(); assertThat(otherProps.getString("int_key")).isNull(); diff --git a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/ExporterBuilderUtil.java b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/ExporterBuilderUtil.java index 21253c95a0e..e493f5d72cb 100644 --- a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/ExporterBuilderUtil.java +++ b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/ExporterBuilderUtil.java @@ -7,7 +7,7 @@ import static io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.common.export.MemoryMode; @@ -63,7 +63,7 @@ public static void configureExporterMemoryMode( /** Invoke the {@code memoryModeConsumer} with the configured {@link MemoryMode}. */ public static void configureExporterMemoryMode( - StructuredConfigProperties config, Consumer memoryModeConsumer) { + DeclarativeConfigProperties config, Consumer memoryModeConsumer) { String memoryModeStr = config.getString("memory_mode"); if (memoryModeStr == null) { return; diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleLogRecordExporterComponentProvider.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleLogRecordExporterComponentProvider.java index 48600cdc28b..e220219325a 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleLogRecordExporterComponentProvider.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleLogRecordExporterComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.exporter.logging.internal; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.logging.SystemOutLogRecordExporter; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.logs.export.LogRecordExporter; @@ -30,7 +30,7 @@ public String getName() { } @Override - public LogRecordExporter create(StructuredConfigProperties config) { + public LogRecordExporter create(DeclarativeConfigProperties config) { return SystemOutLogRecordExporter.create(); } } diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleMetricExporterComponentProvider.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleMetricExporterComponentProvider.java index ff4ae82020c..09ada70eb0c 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleMetricExporterComponentProvider.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleMetricExporterComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.exporter.logging.internal; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.logging.LoggingMetricExporter; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.metrics.export.MetricExporter; @@ -30,7 +30,7 @@ public String getName() { } @Override - public MetricExporter create(StructuredConfigProperties config) { + public MetricExporter create(DeclarativeConfigProperties config) { return LoggingMetricExporter.create(); } } diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleSpanExporterComponentProvider.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleSpanExporterComponentProvider.java index 00998c26085..06c6d4f09fb 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleSpanExporterComponentProvider.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/internal/ConsoleSpanExporterComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.exporter.logging.internal; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.trace.export.SpanExporter; @@ -29,7 +29,7 @@ public String getName() { } @Override - public SpanExporter create(StructuredConfigProperties config) { + public SpanExporter create(DeclarativeConfigProperties config) { return LoggingSpanExporter.create(); } } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java index 7744672aa5f..91d6c413602 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java @@ -7,7 +7,7 @@ import static io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.internal.ExporterBuilderUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; @@ -56,7 +56,7 @@ public static String getOtlpProtocol(String dataType, ConfigProperties config) { } /** Determine the configured OTLP protocol for the {@code dataType}. */ - public static String getStructuredConfigOtlpProtocol(StructuredConfigProperties config) { + public static String getStructuredConfigOtlpProtocol(DeclarativeConfigProperties config) { return config.getString("protocol", PROTOCOL_GRPC); } @@ -178,7 +178,7 @@ public static void configureOtlpExporterBuilder( @SuppressWarnings("TooManyParameters") public static void configureOtlpExporterBuilder( String dataType, - StructuredConfigProperties config, + DeclarativeConfigProperties config, Consumer setEndpoint, BiConsumer addHeader, Consumer setCompression, @@ -202,7 +202,7 @@ public static void configureOtlpExporterBuilder( setEndpoint.accept(endpoint.toString()); } - StructuredConfigProperties headers = config.getStructured("headers"); + DeclarativeConfigProperties headers = config.getStructured("headers"); if (headers != null) { headers .getPropertyKeys() @@ -278,7 +278,7 @@ public static void configureOtlpAggregationTemporality( } public static void configureOtlpAggregationTemporality( - StructuredConfigProperties config, + DeclarativeConfigProperties config, Consumer aggregationTemporalitySelectorConsumer) { String temporalityStr = config.getString("temporality_preference"); if (temporalityStr == null) { @@ -321,7 +321,7 @@ public static void configureOtlpHistogramDefaultAggregation( * DefaultAggregationSelector}. */ public static void configureOtlpHistogramDefaultAggregation( - StructuredConfigProperties config, + DeclarativeConfigProperties config, Consumer defaultAggregationSelectorConsumer) { String defaultHistogramAggregation = config.getString("default_histogram_aggregation"); if (defaultHistogramAggregation == null) { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterComponentProvider.java index 8e5713800ce..5e3492674d2 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterComponentProvider.java @@ -9,7 +9,7 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_GRPC; import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; @@ -39,7 +39,7 @@ public String getName() { } @Override - public LogRecordExporter create(StructuredConfigProperties config) { + public LogRecordExporter create(DeclarativeConfigProperties config) { String protocol = OtlpConfigUtil.getStructuredConfigOtlpProtocol(config); if (protocol.equals(PROTOCOL_HTTP_PROTOBUF)) { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterComponentProvider.java index 0982e0b498d..fe1cf3e86cc 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterComponentProvider.java @@ -9,7 +9,7 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_GRPC; import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; @@ -38,7 +38,7 @@ public String getName() { } @Override - public MetricExporter create(StructuredConfigProperties config) { + public MetricExporter create(DeclarativeConfigProperties config) { String protocol = OtlpConfigUtil.getStructuredConfigOtlpProtocol(config); if (protocol.equals(PROTOCOL_HTTP_PROTOBUF)) { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterComponentProvider.java index 57fd711b8fa..7494abf3588 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterComponentProvider.java @@ -9,7 +9,7 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_GRPC; import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; @@ -38,7 +38,7 @@ public String getName() { } @Override - public SpanExporter create(StructuredConfigProperties config) { + public SpanExporter create(DeclarativeConfigProperties config) { String protocol = OtlpConfigUtil.getStructuredConfigOtlpProtocol(config); if (protocol.equals(PROTOCOL_HTTP_PROTOBUF)) { diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java index 66f4df20caf..bcba3022693 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.exporter.prometheus.internal; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.prometheus.PrometheusHttpServer; import io.opentelemetry.exporter.prometheus.PrometheusHttpServerBuilder; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; @@ -30,7 +30,7 @@ public String getName() { } @Override - public MetricReader create(StructuredConfigProperties config) { + public MetricReader create(DeclarativeConfigProperties config) { PrometheusHttpServerBuilder prometheusBuilder = PrometheusHttpServer.builder(); Integer port = config.getInt("port"); diff --git a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java index e9912adbf44..b1dc3bf25af 100644 --- a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java +++ b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.exporter.zipkin.internal; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter; import io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; @@ -30,7 +30,7 @@ public String getName() { } @Override - public SpanExporter create(StructuredConfigProperties config) { + public SpanExporter create(DeclarativeConfigProperties config) { ZipkinSpanExporterBuilder builder = ZipkinSpanExporter.builder(); String endpoint = config.getString("endpoint"); diff --git a/sdk-extensions/autoconfigure-spi/build.gradle.kts b/sdk-extensions/autoconfigure-spi/build.gradle.kts index 32985cdf4e9..92a3d270cd9 100644 --- a/sdk-extensions/autoconfigure-spi/build.gradle.kts +++ b/sdk-extensions/autoconfigure-spi/build.gradle.kts @@ -8,5 +8,5 @@ otelJava.moduleName.set("io.opentelemetry.sdk.autoconfigure.spi") dependencies { api(project(":sdk:all")) - compileOnly(project(":api:incubator")) + implementation(project(":api:incubator")) } diff --git a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java index 8204ac39e7c..435ee874994 100644 --- a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java +++ b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java @@ -5,14 +5,14 @@ package io.opentelemetry.sdk.autoconfigure.spi.internal; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.logs.export.LogRecordExporter; import io.opentelemetry.sdk.metrics.export.MetricExporter; import io.opentelemetry.sdk.trace.export.SpanExporter; /** * Provides configured instances of SDK extension components. {@link ComponentProvider} allows SDK - * extension components which are not part of the core SDK to be referenced in file based + * extension components which are not part of the core SDK to be referenced in declarative * configuration. * * @param the type of the SDK extension component. See {@link #getType()}. Supported values @@ -45,5 +45,5 @@ public interface ComponentProvider { */ // TODO (jack-berg): consider dynamic configuration use case before stabilizing in case that // affects any API decisions - T create(StructuredConfigProperties config); + T create(DeclarativeConfigProperties config); } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java index 182336ad8bf..9fe07eac038 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdk.java @@ -66,8 +66,8 @@ static AutoConfiguredOpenTelemetrySdk create( abstract Resource getResource(); /** - * Returns the {@link ConfigProperties} used for auto-configuration, or {@code null} if file - * configuration was used. + * Returns the {@link ConfigProperties} used for auto-configuration, or {@code null} if + * declarative configuration was used. * * @see #getConfigProvider() */ @@ -76,7 +76,7 @@ static AutoConfiguredOpenTelemetrySdk create( /** * Returns the {@link ConfigProvider} representing the config used for auto-configuration, or - * {@code null} if file configuration was not used. + * {@code null} if declarative configuration was not used. * * @see #getConfig() */ diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java index 9218fd35ca7..1c73d062672 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java @@ -9,8 +9,8 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.incubator.config.GlobalConfigProvider; -import io.opentelemetry.api.incubator.config.StructuredConfigException; import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -552,19 +552,20 @@ private static AutoConfiguredOpenTelemetrySdk maybeConfigureFromFile(ConfigPrope throw new ConfigurationException("Configuration file not found", e); } try { - Class configurationFactory = - Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration"); - Method parse = configurationFactory.getMethod("parse", InputStream.class); + Class declarativeConfiguration = + Class.forName( + "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration"); + Method parse = declarativeConfiguration.getMethod("parse", InputStream.class); Object model = parse.invoke(null, fis); Class openTelemetryConfiguration = Class.forName( "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration"); - Method create = configurationFactory.getMethod("create", openTelemetryConfiguration); + Method create = declarativeConfiguration.getMethod("create", openTelemetryConfiguration); OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model); - Class fileConfigProvider = - Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigProvider"); + Class sdkConfigProvider = + Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider"); Method createFileConfigProvider = - fileConfigProvider.getMethod("create", openTelemetryConfiguration); + sdkConfigProvider.getMethod("create", openTelemetryConfiguration); ConfigProvider configProvider = (ConfigProvider) createFileConfigProvider.invoke(null, model); // Note: can't access file configuration resource without reflection so setting a dummy // resource @@ -576,15 +577,15 @@ private static AutoConfiguredOpenTelemetrySdk maybeConfigureFromFile(ConfigPrope e); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); - if (cause instanceof StructuredConfigException) { - throw toConfigurationException((StructuredConfigException) cause); + if (cause instanceof DeclarativeConfigException) { + throw toConfigurationException((DeclarativeConfigException) cause); } throw new ConfigurationException("Unexpected error configuring from file", e); } } private static ConfigurationException toConfigurationException( - StructuredConfigException exception) { + DeclarativeConfigException exception) { String message = Objects.requireNonNull(exception.getMessage()); return new ConfigurationException(message, exception); } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java index 88af5f303cf..52f0236e8d2 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/AutoConfigureUtil.java @@ -25,7 +25,7 @@ private AutoConfigureUtil() {} /** * Returns the {@link ConfigProperties} used for auto-configuration. * - * @return the config properties, or {@code null} if file based configuration is used + * @return the config properties, or {@code null} if declarative configuration is used */ @Nullable public static ConfigProperties getConfig( @@ -41,10 +41,10 @@ public static ConfigProperties getConfig( } /** - * Returns the {@link ConfigProvider} resulting from auto-configuration when file based + * Returns the {@link ConfigProvider} resulting from auto-configuration when declarative * configuration is used. * - * @return the {@link ConfigProvider}, or {@code null} if file based configuration is NOT used + * @return the {@link ConfigProvider}, or {@code null} if declarative configuration is NOT used */ @Nullable public static ConfigProvider getConfigProvider( diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/SpiHelper.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/SpiHelper.java index 85c4ef2b289..19ce5415dca 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/SpiHelper.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/SpiHelper.java @@ -5,8 +5,8 @@ package io.opentelemetry.sdk.autoconfigure.internal; -import io.opentelemetry.api.incubator.config.StructuredConfigException; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.Ordered; import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; @@ -83,13 +83,13 @@ public NamedSpiManager loadConfigurable( /** * Find a registered {@link ComponentProvider} which {@link ComponentProvider#getType()} matching * {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link - * ComponentProvider#create(StructuredConfigProperties)} with the given {@code model}. + * ComponentProvider#create(DeclarativeConfigProperties)} with the given {@code model}. * - * @throws StructuredConfigException if no matching providers are found, or if multiple are found - * (i.e. conflict), or if {@link ComponentProvider#create(StructuredConfigProperties)} throws + * @throws DeclarativeConfigException if no matching providers are found, or if multiple are found + * (i.e. conflict), or if {@link ComponentProvider#create(DeclarativeConfigProperties)} throws */ @SuppressWarnings({"unchecked", "rawtypes"}) - public T loadComponent(Class type, String name, StructuredConfigProperties config) { + public T loadComponent(Class type, String name, DeclarativeConfigProperties config) { // TODO(jack-berg): cache loaded component providers List componentProviders = load(ComponentProvider.class); List> matchedProviders = @@ -102,11 +102,11 @@ public T loadComponent(Class type, String name, StructuredConfigPropertie componentProvider.getType() == type && name.equals(componentProvider.getName())) .collect(Collectors.toList()); if (matchedProviders.isEmpty()) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "No component provider detected for " + type.getName() + " with name \"" + name + "\"."); } if (matchedProviders.size() > 1) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Component provider conflict. Multiple providers detected for " + type.getName() + " with name \"" @@ -122,7 +122,7 @@ public T loadComponent(Class type, String name, StructuredConfigPropertie try { return provider.create(config); } catch (Throwable throwable) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Error configuring " + type.getName() + " with name \"" + name + "\"", throwable); } } diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java similarity index 98% rename from sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java rename to sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 130cb265620..78aff42e6d9 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -18,9 +18,9 @@ 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.config.GlobalConfigProvider; import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.internal.testing.CleanupExtension; @@ -45,7 +45,7 @@ import org.junit.jupiter.api.io.TempDir; import org.slf4j.event.Level; -class FileConfigurationTest { +class DeclarativeConfigurationTest { @RegisterExtension private static final CleanupExtension cleanup = new CleanupExtension(); @@ -212,7 +212,7 @@ void configFile_ConfigProvider() { assertThat(globalConfigProvider) .isNotNull() .isSameAs(AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk)); - StructuredConfigProperties instrumentationConfig = + DeclarativeConfigProperties instrumentationConfig = globalConfigProvider.getInstrumentationConfig(); assertThat(instrumentationConfig).isNotNull(); diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java index 0e5bc589efb..3c9e63e14c3 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AggregationFactory.java @@ -5,7 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Aggregation; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Base2ExponentialBucketHistogram; @@ -51,7 +51,7 @@ public io.opentelemetry.sdk.metrics.Aggregation create( return io.opentelemetry.sdk.metrics.Aggregation.base2ExponentialBucketHistogram( maxSize, maxScale); } catch (IllegalArgumentException e) { - throw new StructuredConfigException("Invalid exponential bucket histogram", e); + throw new DeclarativeConfigException("Invalid exponential bucket histogram", e); } } ExplicitBucketHistogram explicitBucketHistogram = model.getExplicitBucketHistogram(); @@ -63,7 +63,7 @@ public io.opentelemetry.sdk.metrics.Aggregation create( try { return io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram(boundaries); } catch (IllegalArgumentException e) { - throw new StructuredConfigException("Invalid explicit bucket histogram", e); + throw new DeclarativeConfigException("Invalid explicit bucket histogram", e); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java index 12af399dcee..e51c21de441 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactory.java @@ -9,7 +9,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Attributes; import java.io.Closeable; @@ -41,7 +41,7 @@ public io.opentelemetry.api.common.Attributes create( .forEach( (key, value) -> { if (value == null) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Error processing attribute with key \"" + key + "\": unexpected null value"); } if (value instanceof String) { @@ -119,7 +119,7 @@ public io.opentelemetry.api.common.Attributes create( return; } } - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Error processing attribute with key \"" + key + "\": unrecognized value type " @@ -133,13 +133,13 @@ private static void checkAllEntriesOfType(String key, List values, Class e values.forEach( value -> { if (value == null) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Error processing attribute with key \"" + key + "\": unexpected null element in value"); } if (!expectedType.isAssignableFrom(value.getClass())) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Error processing attribute with key \"" + key + "\": expected value entries to be of type " diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java similarity index 82% rename from sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java rename to sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java index 8baddfb1845..a69f9d4d357 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java @@ -9,9 +9,9 @@ import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import io.opentelemetry.api.incubator.config.StructuredConfigException; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; -import io.opentelemetry.api.incubator.config.internal.YamlStructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.api.incubator.config.internal.YamlDeclarativeConfigProperties; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; @@ -38,14 +38,16 @@ import org.snakeyaml.engine.v2.schema.CoreSchema; /** - * Configure {@link OpenTelemetrySdk} from YAML configuration files conforming to the schema in open-telemetry/opentelemetry-configuration. - * - * @see #parseAndCreate(InputStream) + * Configure {@link OpenTelemetrySdk} using declarative + * configuration. For most users, this means calling {@link #parseAndCreate(InputStream)} with a + * YAML + * configuration file. */ -public final class FileConfiguration { +public final class DeclarativeConfiguration { - private static final Logger logger = Logger.getLogger(FileConfiguration.class.getName()); + private static final Logger logger = Logger.getLogger(DeclarativeConfiguration.class.getName()); private static final Pattern ENV_VARIABLE_REFERENCE = Pattern.compile("\\$\\{([a-zA-Z_][a-zA-Z0-9_]*)}"); @@ -64,12 +66,12 @@ public final class FileConfiguration { MAPPER.configOverride(Boolean.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET)); } - private FileConfiguration() {} + private DeclarativeConfiguration() {} /** * Combines {@link #parse(InputStream)} and {@link #create(OpenTelemetryConfiguration)}. * - * @throws StructuredConfigException if unable to parse or interpret + * @throws DeclarativeConfigException if unable to parse or interpret */ public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) { OpenTelemetryConfiguration configurationModel = parse(inputStream); @@ -82,7 +84,7 @@ public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) { * * @param configurationModel the configuration model * @return the {@link OpenTelemetrySdk} - * @throws StructuredConfigException if unable to interpret + * @throws DeclarativeConfigException if unable to interpret */ public static OpenTelemetrySdk create(OpenTelemetryConfiguration configurationModel) { List closeables = new ArrayList<>(); @@ -90,7 +92,7 @@ public static OpenTelemetrySdk create(OpenTelemetryConfiguration configurationMo return OpenTelemetryConfigurationFactory.getInstance() .create( configurationModel, - SpiHelper.create(FileConfiguration.class.getClassLoader()), + SpiHelper.create(DeclarativeConfiguration.class.getClassLoader()), closeables); } catch (RuntimeException e) { logger.info( @@ -104,10 +106,10 @@ public static OpenTelemetrySdk create(OpenTelemetryConfiguration configurationMo "Error closing " + closeable.getClass().getName() + ": " + ex.getMessage()); } } - if (e instanceof StructuredConfigException) { + if (e instanceof DeclarativeConfigException) { throw e; } - throw new StructuredConfigException("Unexpected configuration error", e); + throw new DeclarativeConfigException("Unexpected configuration error", e); } } @@ -117,13 +119,13 @@ public static OpenTelemetrySdk create(OpenTelemetryConfiguration configurationMo *

Before parsing, environment variable substitution is performed as described in {@link * EnvSubstitutionConstructor}. * - * @throws StructuredConfigException if unable to parse + * @throws DeclarativeConfigException if unable to parse */ public static OpenTelemetryConfiguration parse(InputStream configuration) { try { return parse(configuration, System.getenv()); } catch (RuntimeException e) { - throw new StructuredConfigException("Unable to parse configuration input stream", e); + throw new DeclarativeConfigException("Unable to parse configuration input stream", e); } } @@ -142,20 +144,20 @@ static Object loadYaml(InputStream inputStream, Map environmentV } /** - * Convert the {@code model} to a generic {@link StructuredConfigProperties}, which can be used to - * read configuration not part of the model. + * Convert the {@code model} to a generic {@link DeclarativeConfigProperties}, which can be used + * to read configuration not part of the model. * * @param model the configuration model - * @return a generic {@link StructuredConfigProperties} representation of the model + * @return a generic {@link DeclarativeConfigProperties} representation of the model */ - public static StructuredConfigProperties toConfigProperties(OpenTelemetryConfiguration model) { + public static DeclarativeConfigProperties toConfigProperties(OpenTelemetryConfiguration model) { return toConfigProperties((Object) model); } - static StructuredConfigProperties toConfigProperties(Object model) { + static DeclarativeConfigProperties toConfigProperties(Object model) { Map configurationMap = MAPPER.convertValue(model, new TypeReference>() {}); - return YamlStructuredConfigProperties.create(configurationMap); + return YamlDeclarativeConfigProperties.create(configurationMap); } /** diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java deleted file mode 100644 index 7db388ba4c2..00000000000 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.extension.incubator.fileconfig; - -import io.opentelemetry.api.incubator.config.ConfigProvider; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; -import javax.annotation.Nullable; - -/** File configuration implementation for {@link ConfigProvider}. */ -public final class FileConfigProvider implements ConfigProvider { - - @Nullable private final StructuredConfigProperties instrumentationConfig; - - private FileConfigProvider(OpenTelemetryConfiguration model) { - StructuredConfigProperties configProperties = FileConfiguration.toConfigProperties(model); - this.instrumentationConfig = configProperties.getStructured("instrumentation"); - } - - /** - * Create a {@link FileConfigProvider} from the {@code model}. - * - * @param model the configuration model - * @return the {@link FileConfigProvider} - */ - public static FileConfigProvider create(OpenTelemetryConfiguration model) { - return new FileConfigProvider(model); - } - - @Nullable - @Override - public StructuredConfigProperties getInstrumentationConfig() { - return instrumentationConfig; - } -} diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java index 6d2a92090e7..bca61d300de 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigUtil.java @@ -5,8 +5,8 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; -import io.opentelemetry.api.incubator.config.StructuredConfigException; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import java.io.Closeable; @@ -34,7 +34,7 @@ static T assertNotNull(@Nullable T object, String description) { static T requireNonNull(@Nullable T object, String description) { if (object == null) { - throw new StructuredConfigException(description + " is required but is null"); + throw new DeclarativeConfigException(description + " is required but is null"); } return object; } @@ -42,14 +42,14 @@ static T requireNonNull(@Nullable T object, String description) { /** * Find a registered {@link ComponentProvider} which {@link ComponentProvider#getType()} matching * {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link - * ComponentProvider#create(StructuredConfigProperties)} with the given {@code model}. + * ComponentProvider#create(DeclarativeConfigProperties)} with the given {@code model}. * - * @throws StructuredConfigException if no matching providers are found, or if multiple are found - * (i.e. conflict), or if {@link ComponentProvider#create(StructuredConfigProperties)} throws + * @throws DeclarativeConfigException if no matching providers are found, or if multiple are found + * (i.e. conflict), or if {@link ComponentProvider#create(DeclarativeConfigProperties)} throws */ static T loadComponent(SpiHelper spiHelper, Class type, String name, Object model) { // Map model to generic structured config properties - StructuredConfigProperties config = FileConfiguration.toConfigProperties(model); + DeclarativeConfigProperties config = DeclarativeConfiguration.toConfigProperties(model); return spiHelper.loadComponent(type, name, config); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java index cf0454efd9f..c4ae3841090 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactory.java @@ -5,7 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Selector; import io.opentelemetry.sdk.metrics.InstrumentSelector; @@ -36,7 +36,7 @@ public InstrumentSelector create( try { instrumentType = InstrumentType.valueOf(model.getInstrumentType().name()); } catch (IllegalArgumentException e) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Unrecognized instrument type: " + model.getInstrumentType(), e); } builder.setType(instrumentType); @@ -54,7 +54,7 @@ public InstrumentSelector create( try { return builder.build(); } catch (IllegalArgumentException e) { - throw new StructuredConfigException("Invalid selector", e); + throw new DeclarativeConfigException("Invalid selector", e); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java index ba697b1eb5b..ab3eff26f49 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactory.java @@ -7,7 +7,7 @@ import static java.util.stream.Collectors.joining; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Otlp; import io.opentelemetry.sdk.logs.export.LogRecordExporter; @@ -41,7 +41,7 @@ public LogRecordExporter create( if (!model.getAdditionalProperties().isEmpty()) { Map additionalProperties = model.getAdditionalProperties(); if (additionalProperties.size() > 1) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Invalid configuration - multiple log record exporters set: " + additionalProperties.keySet().stream().collect(joining(",", "[", "]"))); } @@ -59,7 +59,7 @@ public LogRecordExporter create( exporterKeyValue.getValue()); return FileConfigUtil.addAndReturn(closeables, logRecordExporter); } else { - throw new StructuredConfigException("log exporter must be set"); + throw new DeclarativeConfigException("log exporter must be set"); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java index decdf393e54..4c77d377211 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactory.java @@ -7,7 +7,7 @@ import static java.util.stream.Collectors.joining; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporter; import io.opentelemetry.sdk.logs.LogRecordProcessor; @@ -75,11 +75,11 @@ public LogRecordProcessor create( // TODO: add support for generic log record processors if (!model.getAdditionalProperties().isEmpty()) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Unrecognized log record processor(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } else { - throw new StructuredConfigException("log processor must be set"); + throw new DeclarativeConfigException("log processor must be set"); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java index 3160818cbb9..35613ba525b 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactory.java @@ -7,7 +7,7 @@ import static java.util.stream.Collectors.joining; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpMetric; import io.opentelemetry.sdk.metrics.export.MetricExporter; @@ -43,13 +43,13 @@ public MetricExporter create( } if (model.getPrometheus() != null) { - throw new StructuredConfigException("prometheus exporter not supported in this context"); + throw new DeclarativeConfigException("prometheus exporter not supported in this context"); } if (!model.getAdditionalProperties().isEmpty()) { Map additionalProperties = model.getAdditionalProperties(); if (additionalProperties.size() > 1) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Invalid configuration - multiple metric exporters set: " + additionalProperties.keySet().stream().collect(joining(",", "[", "]"))); } @@ -67,7 +67,7 @@ public MetricExporter create( exporterKeyValue.getValue()); return FileConfigUtil.addAndReturn(closeables, metricExporter); } else { - throw new StructuredConfigException("metric exporter must be set"); + throw new DeclarativeConfigException("metric exporter must be set"); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java index 90d6e997fd7..1458924ecf0 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactory.java @@ -7,7 +7,7 @@ import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigUtil.requireNonNull; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricExporter; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReader; @@ -64,9 +64,10 @@ public MetricReader create( return FileConfigUtil.addAndReturn(closeables, metricReader); } - throw new StructuredConfigException("prometheus is the only currently supported pull reader"); + throw new DeclarativeConfigException( + "prometheus is the only currently supported pull reader"); } - throw new StructuredConfigException("reader must be set"); + throw new DeclarativeConfigException("reader must be set"); } } 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 f8c94becfa5..dd365229f64 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 @@ -5,7 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.OpenTelemetrySdkBuilder; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; @@ -32,7 +32,7 @@ public OpenTelemetrySdk create( OpenTelemetryConfiguration model, SpiHelper spiHelper, List closeables) { OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder(); if (!"0.1".equals(model.getFileFormat())) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Unsupported file format. Supported formats include: 0.1"); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java index 6a0790fa677..4f9b030d79b 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactory.java @@ -7,7 +7,7 @@ import static java.util.stream.Collectors.joining; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @@ -113,11 +113,11 @@ public Sampler create( // TODO(jack-berg): add support for generic SPI samplers if (!model.getAdditionalProperties().isEmpty()) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Unrecognized sampler(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } else { - throw new StructuredConfigException("sampler must be set"); + throw new DeclarativeConfigException("sampler must be set"); } } 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 new file mode 100644 index 00000000000..243d2f3348e --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SdkConfigProvider.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import io.opentelemetry.api.incubator.config.ConfigProvider; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfiguration; +import javax.annotation.Nullable; + +/** SDK implementation of {@link ConfigProvider}. */ +public final class SdkConfigProvider implements ConfigProvider { + + @Nullable private final DeclarativeConfigProperties instrumentationConfig; + + private SdkConfigProvider(OpenTelemetryConfiguration model) { + DeclarativeConfigProperties configProperties = + DeclarativeConfiguration.toConfigProperties(model); + this.instrumentationConfig = configProperties.getStructured("instrumentation"); + } + + /** + * Create a {@link SdkConfigProvider} from the {@code model}. + * + * @param model the configuration model + * @return the {@link SdkConfigProvider} + */ + public static SdkConfigProvider create(OpenTelemetryConfiguration model) { + return new SdkConfigProvider(model); + } + + @Nullable + @Override + public DeclarativeConfigProperties getInstrumentationConfig() { + return instrumentationConfig; + } +} diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java index afa039b8a3f..e5e0728eb69 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactory.java @@ -7,7 +7,7 @@ import static java.util.stream.Collectors.joining; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Otlp; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Zipkin; @@ -51,7 +51,7 @@ public SpanExporter create( if (!model.getAdditionalProperties().isEmpty()) { Map additionalProperties = model.getAdditionalProperties(); if (additionalProperties.size() > 1) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Invalid configuration - multiple span exporters set: " + additionalProperties.keySet().stream().collect(joining(",", "[", "]"))); } @@ -69,7 +69,7 @@ public SpanExporter create( exporterKeyValue.getValue()); return FileConfigUtil.addAndReturn(closeables, spanExporter); } else { - throw new StructuredConfigException("span exporter must be set"); + throw new DeclarativeConfigException("span exporter must be set"); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java index 08a8a4f7d95..4d3306121c2 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java @@ -7,7 +7,7 @@ import static java.util.stream.Collectors.joining; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporter; import io.opentelemetry.sdk.trace.SpanProcessor; @@ -72,11 +72,11 @@ public SpanProcessor create( // TODO: add support for generic span processors if (!model.getAdditionalProperties().isEmpty()) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "Unrecognized span processor(s): " + model.getAdditionalProperties().keySet().stream().collect(joining(",", "[", "]"))); } else { - throw new StructuredConfigException("span processor must be set"); + throw new DeclarativeConfigException("span processor must be set"); } } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java index d9f1f0c0ee3..91477dfb605 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java @@ -6,7 +6,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager; @@ -39,7 +39,7 @@ public TextMapPropagator create( if (model.contains("none")) { if (model.size() > 1) { - throw new StructuredConfigException( + throw new DeclarativeConfigException( "propagators contains \"none\" along with other propagators"); } return TextMapPropagator.noop(); @@ -72,6 +72,6 @@ private static TextMapPropagator getPropagator( if (spiPropagator != null) { return spiPropagator; } - throw new StructuredConfigException("Unrecognized propagator: " + name); + throw new DeclarativeConfigException("Unrecognized propagator: " + name); } } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java index 9d6c123bb35..25cd29a274e 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributesFactoryTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Attributes; import java.util.Arrays; @@ -29,7 +29,7 @@ void create_InvalidAttributes(Attributes model, String expectedMessage) { () -> AttributesFactory.getInstance() .create(model, mock(SpiHelper.class), Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessageContaining(expectedMessage); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java similarity index 91% rename from sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java rename to sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java index 6612b79b80f..2f3699b1575 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java @@ -12,7 +12,7 @@ import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; import io.github.netmikey.logunit.api.LogCapturer; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.internal.testing.CleanupExtension; import java.io.ByteArrayInputStream; import java.io.File; @@ -28,7 +28,7 @@ import org.junit.jupiter.api.io.TempDir; import org.slf4j.event.Level; -class FileConfigurationCreateTest { +class DeclarativeConfigurationCreateTest { @RegisterExtension static final SelfSignedCertificateExtension serverTls = new SelfSignedCertificateExtension(); @@ -40,12 +40,12 @@ class FileConfigurationCreateTest { @RegisterExtension LogCapturer logCapturer = - LogCapturer.create().captureForLogger(FileConfiguration.class.getName(), Level.TRACE); + LogCapturer.create().captureForLogger(DeclarativeConfiguration.class.getName(), Level.TRACE); /** * Verify each example in open-telemetry/opentelemetry-configuration/examples - * can pass {@link FileConfiguration#parseAndCreate(InputStream)}. + * can pass {@link DeclarativeConfiguration#parseAndCreate(InputStream)}. */ @Test void parseAndCreate_Examples(@TempDir Path tempDir) @@ -91,7 +91,7 @@ void parseAndCreate_Examples(@TempDir Path tempDir) new ByteArrayInputStream(rewrittenExampleContent.getBytes(StandardCharsets.UTF_8)); // Verify that file can be parsed and interpreted without error - assertThatCode(() -> cleanup.addCloseable(FileConfiguration.parseAndCreate(is))) + assertThatCode(() -> cleanup.addCloseable(DeclarativeConfiguration.parseAndCreate(is))) .as("Example file: " + example.getName()) .doesNotThrowAnyException(); } @@ -115,9 +115,9 @@ void parseAndCreate_Exception_CleansUpPartials() { assertThatThrownBy( () -> - FileConfiguration.parseAndCreate( + DeclarativeConfiguration.parseAndCreate( new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8)))) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage( "No component provider detected for io.opentelemetry.sdk.logs.export.LogRecordExporter with name \"foo\"."); logCapturer.assertContains( diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java similarity index 97% rename from sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java rename to sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java index f645a2d231b..2f859adb52f 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Aggregation; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOff; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOn; @@ -62,15 +62,15 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -class FileConfigurationParseTest { +class DeclarativeConfigurationParseTest { @Test void parse_BadInputStream() { assertThatThrownBy( () -> - FileConfiguration.parseAndCreate( + DeclarativeConfiguration.parseAndCreate( new ByteArrayInputStream("foo".getBytes(StandardCharsets.UTF_8)))) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("Unable to parse configuration input stream"); } @@ -269,7 +269,7 @@ void parse_KitchenSinkExampleFile() throws IOException { try (FileInputStream configExampleFile = new FileInputStream(System.getenv("CONFIG_EXAMPLE_DIR") + "/kitchen-sink.yaml")) { - OpenTelemetryConfiguration config = FileConfiguration.parse(configExampleFile); + OpenTelemetryConfiguration config = DeclarativeConfiguration.parse(configExampleFile); // General config assertThat(config.getFileFormat()).isEqualTo("0.1"); @@ -318,7 +318,7 @@ void parse_nullValuesParsedToEmptyObjects() { + " aggregation:\n" + " drop: {}\n"; OpenTelemetryConfiguration objectPlaceholderModel = - FileConfiguration.parse( + DeclarativeConfiguration.parse( new ByteArrayInputStream(objectPlaceholderString.getBytes(StandardCharsets.UTF_8))); String noOjbectPlaceholderString = @@ -336,7 +336,7 @@ void parse_nullValuesParsedToEmptyObjects() { + " aggregation:\n" + " drop:\n"; OpenTelemetryConfiguration noObjectPlaceholderModel = - FileConfiguration.parse( + DeclarativeConfiguration.parse( new ByteArrayInputStream(noOjbectPlaceholderString.getBytes(StandardCharsets.UTF_8))); SpanExporter exporter = @@ -370,7 +370,8 @@ void parse_nullBoxedPrimitivesParsedToNull() { + " ratio:\n"; // Double OpenTelemetryConfiguration model = - FileConfiguration.parse(new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))); + DeclarativeConfiguration.parse( + new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))); assertThat(model.getFileFormat()).isNull(); assertThat(model.getDisabled()).isNull(); @@ -391,7 +392,7 @@ void parse_nullBoxedPrimitivesParsedToNull() { @MethodSource("coreSchemaValuesArgs") void coreSchemaValues(String rawYaml, Object expectedYamlResult) { Object yaml = - FileConfiguration.loadYaml( + DeclarativeConfiguration.loadYaml( new ByteArrayInputStream(rawYaml.getBytes(StandardCharsets.UTF_8)), Collections.emptyMap()); assertThat(yaml).isEqualTo(expectedYamlResult); @@ -419,7 +420,7 @@ void envSubstituteAndLoadYaml(String rawYaml, Object expectedYamlResult) { environmentVariables.put("HEX", "0xdeadbeef"); Object yaml = - FileConfiguration.loadYaml( + DeclarativeConfiguration.loadYaml( new ByteArrayInputStream(rawYaml.getBytes(StandardCharsets.UTF_8)), environmentVariables); assertThat(yaml).isEqualTo(expectedYamlResult); @@ -495,7 +496,7 @@ void read_WithEnvironmentVariables() { Map envVars = new HashMap<>(); envVars.put("OTEL_EXPORTER_OTLP_ENDPOINT", "http://collector:4317"); OpenTelemetryConfiguration model = - FileConfiguration.parse( + DeclarativeConfiguration.parse( new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8)), envVars); assertThat(model) .isEqualTo( diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java index 3cfc5f9f8da..3a35ab54e16 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/InstrumentSelectorFactoryTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Selector; import io.opentelemetry.sdk.metrics.InstrumentSelector; @@ -25,7 +25,7 @@ void create_Defaults() { () -> InstrumentSelectorFactory.getInstance() .create(new Selector(), mock(SpiHelper.class), Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("Invalid selector"); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java index ac262d5c610..b8aac5c040e 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java @@ -15,8 +15,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; -import io.opentelemetry.api.incubator.config.StructuredConfigException; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.internal.testing.CleanupExtension; @@ -78,11 +78,11 @@ void create_OtlpDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper) .loadComponent(eq(LogRecordExporter.class), eq("otlp"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); @@ -143,14 +143,14 @@ void create_OtlpConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper) .loadComponent(eq(LogRecordExporter.class), eq("otlp"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isEqualTo("http/protobuf"); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318"); - StructuredConfigProperties headers = configProperties.getStructured("headers"); + DeclarativeConfigProperties headers = configProperties.getStructured("headers"); assertThat(headers).isNotNull(); assertThat(headers.getPropertyKeys()).isEqualTo(ImmutableSet.of("key1", "key2")); assertThat(headers.getString("key1")).isEqualTo("value1"); @@ -176,7 +176,7 @@ void create_SpiExporter_Unknown() { "unknown_key", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage( "No component provider detected for io.opentelemetry.sdk.logs.export.LogRecordExporter with name \"unknown_key\"."); cleanup.addCloseables(closeables); diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java index d2708dab35b..74a7ec8de7b 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordProcessorFactoryTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; @@ -42,7 +42,7 @@ void create_BatchNullExporter() { new LogRecordProcessor().withBatch(new BatchLogRecordProcessor()), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("batch log record processor exporter is required but is null"); } @@ -109,7 +109,7 @@ void create_SimpleNullExporter() { new LogRecordProcessor().withSimple(new SimpleLogRecordProcessor()), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("simple log record processor exporter is required but is null"); } @@ -148,7 +148,7 @@ void create_SpiProcessor() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, closeables)) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("Unrecognized log record processor(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java index 25a1c6a2960..a2cffa2deec 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java @@ -15,8 +15,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; -import io.opentelemetry.api.incubator.config.StructuredConfigException; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.logging.LoggingMetricExporter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; @@ -83,10 +83,10 @@ void create_OtlpDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper).loadComponent(eq(MetricExporter.class), eq("otlp"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); @@ -156,13 +156,13 @@ void create_OtlpConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper).loadComponent(eq(MetricExporter.class), eq("otlp"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isEqualTo("http/protobuf"); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318"); - StructuredConfigProperties headers = configProperties.getStructured("headers"); + DeclarativeConfigProperties headers = configProperties.getStructured("headers"); assertThat(headers).isNotNull(); assertThat(headers.getPropertyKeys()).isEqualTo(ImmutableSet.of("key1", "key2")); assertThat(headers.getString("key1")).isEqualTo("value1"); @@ -211,7 +211,7 @@ void create_PrometheusExporter() { .withPrometheus(new Prometheus()), spiHelper, new ArrayList<>())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("prometheus exporter not supported in this context"); cleanup.addCloseables(closeables); } @@ -230,7 +230,7 @@ void create_SpiExporter_Unknown() { "unknown_key", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage( "No component provider detected for io.opentelemetry.sdk.metrics.export.MetricExporter with name \"unknown_key\"."); cleanup.addCloseables(closeables); diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java index 6cdaa9b17b0..2ad05ae1ac5 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java @@ -11,7 +11,7 @@ import static org.mockito.Mockito.verify; import io.github.netmikey.logunit.api.LogCapturer; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.exporter.prometheus.PrometheusHttpServer; import io.opentelemetry.internal.testing.CleanupExtension; @@ -39,7 +39,7 @@ class MetricReaderFactoryTest { @RegisterExtension LogCapturer logCapturer = - LogCapturer.create().captureForLogger(FileConfiguration.class.getName()); + LogCapturer.create().captureForLogger(DeclarativeConfiguration.class.getName()); private SpiHelper spiHelper = SpiHelper.create(MetricReaderFactoryTest.class.getClassLoader()); @@ -52,7 +52,7 @@ void create_PeriodicNullExporter() { new MetricReader().withPeriodic(new PeriodicMetricReader()), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("periodic metric reader exporter is required but is null"); } @@ -174,7 +174,7 @@ void create_InvalidPullReader() { new MetricReader().withPull(new PullMetricReader()), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("pull metric reader exporter is required but is null"); assertThatThrownBy( @@ -185,7 +185,7 @@ void create_InvalidPullReader() { .withPull(new PullMetricReader().withExporter(new MetricExporter())), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("prometheus is the only currently supported pull reader"); assertThatThrownBy( @@ -198,7 +198,7 @@ void create_InvalidPullReader() { .withExporter(new MetricExporter().withOtlp(new OtlpMetric()))), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("prometheus is the only currently supported pull reader"); } 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 cdcbf5f2ee3..7509ed95da1 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 @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -81,7 +81,7 @@ void create_InvalidFileFormat() { () -> OpenTelemetryConfigurationFactory.getInstance() .create(testCase, spiHelper, closeables)) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("Unsupported file format. Supported formats include: 0.1"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java index 3f08d263412..a09d86aa931 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SamplerFactoryTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; @@ -131,7 +131,7 @@ void create_SpiExporter() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("Unrecognized sampler(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java index 056652519dc..68e49aa9f25 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java @@ -15,8 +15,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; -import io.opentelemetry.api.incubator.config.StructuredConfigException; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; @@ -79,10 +79,10 @@ void create_OtlpDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper).loadComponent(eq(SpanExporter.class), eq("otlp"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); @@ -143,13 +143,13 @@ void create_OtlpConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper).loadComponent(eq(SpanExporter.class), eq("otlp"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isEqualTo("http/protobuf"); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318"); - StructuredConfigProperties headers = configProperties.getStructured("headers"); + DeclarativeConfigProperties headers = configProperties.getStructured("headers"); assertThat(headers).isNotNull(); assertThat(headers.getPropertyKeys()).isEqualTo(ImmutableSet.of("key1", "key2")); assertThat(headers.getString("key1")).isEqualTo("value1"); @@ -203,10 +203,10 @@ void create_ZipkinDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper).loadComponent(eq(SpanExporter.class), eq("zipkin"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getLong("timeout")).isNull(); } @@ -238,10 +238,10 @@ void create_ZipkinConfigured() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(StructuredConfigProperties.class); + ArgumentCaptor configCaptor = + ArgumentCaptor.forClass(DeclarativeConfigProperties.class); verify(spiHelper).loadComponent(eq(SpanExporter.class), eq("zipkin"), configCaptor.capture()); - StructuredConfigProperties configProperties = configCaptor.getValue(); + DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://zipkin:9411/v1/v2/spans"); assertThat(configProperties.getLong("timeout")).isEqualTo(15_000); } @@ -260,7 +260,7 @@ void create_SpiExporter_Unknown() { "unknown_key", ImmutableMap.of("key1", "value1")), spiHelper, new ArrayList<>())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage( "No component provider detected for io.opentelemetry.sdk.trace.export.SpanExporter with name \"unknown_key\"."); cleanup.addCloseables(closeables); diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java index 0d022c01b1e..50404016623 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactoryTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; @@ -42,7 +42,7 @@ void create_BatchNullExporter() { new SpanProcessor().withBatch(new BatchSpanProcessor()), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("batch span processor exporter is required but is null"); } @@ -109,7 +109,7 @@ void create_SimpleNullExporter() { new SpanProcessor().withSimple(new SimpleSpanProcessor()), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("simple span processor exporter is required but is null"); } @@ -148,7 +148,7 @@ void create_SpiProcessor() { .withAdditionalProperty("test", ImmutableMap.of("key1", "value1")), spiHelper, closeables)) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("Unrecognized span processor(s): [test]"); cleanup.addCloseables(closeables); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java index 554961acd42..298d776659a 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; -import io.opentelemetry.api.incubator.config.StructuredConfigException; +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.extension.trace.propagation.B3Propagator; @@ -63,7 +63,7 @@ void create_NoneAndOther() { () -> TextMapPropagatorFactory.getInstance() .create(Arrays.asList("none", "foo"), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("propagators contains \"none\" along with other propagators"); } @@ -73,7 +73,7 @@ void create_UnknownSpiPropagator() { () -> TextMapPropagatorFactory.getInstance() .create(Collections.singletonList("foo"), spiHelper, Collections.emptyList())) - .isInstanceOf(StructuredConfigException.class) + .isInstanceOf(DeclarativeConfigException.class) .hasMessage("Unrecognized propagator: foo"); } } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java index dfe1cf71087..f21c1d1bf09 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig.component; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.data.LogRecordData; @@ -24,15 +24,15 @@ public String getName() { } @Override - public LogRecordExporter create(StructuredConfigProperties config) { + public LogRecordExporter create(DeclarativeConfigProperties config) { return new TestLogRecordExporter(config); } public static class TestLogRecordExporter implements LogRecordExporter { - public final StructuredConfigProperties config; + public final DeclarativeConfigProperties config; - private TestLogRecordExporter(StructuredConfigProperties config) { + private TestLogRecordExporter(DeclarativeConfigProperties config) { this.config = config; } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java index 153419eec0f..80ea6b556ce 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig.component; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.metrics.InstrumentType; @@ -27,15 +27,15 @@ public String getName() { } @Override - public MetricExporter create(StructuredConfigProperties config) { + public MetricExporter create(DeclarativeConfigProperties config) { return new TestMetricExporter(config); } public static class TestMetricExporter implements MetricExporter { - public final StructuredConfigProperties config; + public final DeclarativeConfigProperties config; - private TestMetricExporter(StructuredConfigProperties config) { + private TestMetricExporter(DeclarativeConfigProperties config) { this.config = config; } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java index d3cf70ab7b8..ddaca3ca4b9 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig.component; -import io.opentelemetry.api.incubator.config.StructuredConfigProperties; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.data.SpanData; @@ -24,15 +24,15 @@ public String getName() { } @Override - public SpanExporter create(StructuredConfigProperties config) { + public SpanExporter create(DeclarativeConfigProperties config) { return new TestSpanExporter(config); } public static class TestSpanExporter implements SpanExporter { - public final StructuredConfigProperties config; + public final DeclarativeConfigProperties config; - private TestSpanExporter(StructuredConfigProperties config) { + private TestSpanExporter(DeclarativeConfigProperties config) { this.config = config; } From b184a59f80d5a4b162584320215c4c3ff9160986 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Thu, 3 Oct 2024 14:14:37 -0500 Subject: [PATCH 4/5] Simplify InstrumentationConfigUtil --- .../config/InstrumentationConfigUtil.java | 110 ++++++++++-------- 1 file changed, 59 insertions(+), 51 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java index af3553748e0..da611b780b4 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java @@ -8,7 +8,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Optional; +import java.util.function.Function; import javax.annotation.Nullable; /** @@ -17,8 +17,6 @@ */ public class InstrumentationConfigUtil { - // TODO (jack-berg): add helper function to access nested structures with dot notation - /** * Return a map representation of the peer service map entries in {@code * .instrumentation.general.peer.service_mapping}, or null if none is configured. @@ -27,25 +25,24 @@ public class InstrumentationConfigUtil { */ @Nullable public static Map peerServiceMapping(ConfigProvider configProvider) { - Optional> optServiceMappingList = - Optional.ofNullable(configProvider.getInstrumentationConfig()) - .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) - .map(generalConfig -> generalConfig.getStructured("peer")) - .map(httpConfig -> httpConfig.getStructuredList("service_mapping")); - if (!optServiceMappingList.isPresent()) { + List serviceMappingList = + getOrNull( + configProvider, + config -> config.getStructuredList("service_mapping"), + "general", + "peer"); + if (serviceMappingList == null) { return null; } Map serviceMapping = new LinkedHashMap<>(); - optServiceMappingList - .get() - .forEach( - entry -> { - String peer = entry.getString("peer"); - String service = entry.getString("service"); - if (peer != null && service != null) { - serviceMapping.put(peer, service); - } - }); + serviceMappingList.forEach( + entry -> { + String peer = entry.getString("peer"); + String service = entry.getString("service"); + if (peer != null && service != null) { + serviceMapping.put(peer, service); + } + }); return serviceMapping.isEmpty() ? null : serviceMapping; } @@ -57,13 +54,12 @@ public static Map peerServiceMapping(ConfigProvider configProvid */ @Nullable public static List httpClientRequestCapturedHeaders(ConfigProvider configProvider) { - return Optional.ofNullable(configProvider.getInstrumentationConfig()) - .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) - .map(generalConfig -> generalConfig.getStructured("http")) - .map(httpConfig -> httpConfig.getStructured("client")) - .map(clientConfig -> clientConfig.getScalarList("request_captured_headers", String.class)) - .filter(list -> !list.isEmpty()) - .orElse(null); + return getOrNull( + configProvider, + config -> config.getScalarList("request_captured_headers", String.class), + "general", + "http", + "client"); } /** @@ -74,13 +70,12 @@ public static List httpClientRequestCapturedHeaders(ConfigProvider confi */ @Nullable public static List httpClientResponseCapturedHeaders(ConfigProvider configProvider) { - return Optional.ofNullable(configProvider.getInstrumentationConfig()) - .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) - .map(generalConfig -> generalConfig.getStructured("http")) - .map(httpConfig -> httpConfig.getStructured("client")) - .map(clientConfig -> clientConfig.getScalarList("response_captured_headers", String.class)) - .filter(list -> !list.isEmpty()) - .orElse(null); + return getOrNull( + configProvider, + config -> config.getScalarList("response_captured_headers", String.class), + "general", + "http", + "client"); } /** @@ -91,13 +86,12 @@ public static List httpClientResponseCapturedHeaders(ConfigProvider conf */ @Nullable public static List httpServerRequestCapturedHeaders(ConfigProvider configProvider) { - return Optional.ofNullable(configProvider.getInstrumentationConfig()) - .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) - .map(generalConfig -> generalConfig.getStructured("http")) - .map(httpConfig -> httpConfig.getStructured("server")) - .map(clientConfig -> clientConfig.getScalarList("request_captured_headers", String.class)) - .filter(list -> !list.isEmpty()) - .orElse(null); + return getOrNull( + configProvider, + config -> config.getScalarList("request_captured_headers", String.class), + "general", + "http", + "server"); } /** @@ -108,13 +102,12 @@ public static List httpServerRequestCapturedHeaders(ConfigProvider confi */ @Nullable public static List httpSeverResponseCapturedHeaders(ConfigProvider configProvider) { - return Optional.ofNullable(configProvider.getInstrumentationConfig()) - .map(instrumentationConfig -> instrumentationConfig.getStructured("general")) - .map(generalConfig -> generalConfig.getStructured("http")) - .map(httpConfig -> httpConfig.getStructured("server")) - .map(clientConfig -> clientConfig.getScalarList("response_captured_headers", String.class)) - .filter(list -> !list.isEmpty()) - .orElse(null); + return getOrNull( + configProvider, + config -> config.getScalarList("response_captured_headers", String.class), + "general", + "http", + "server"); } /** @@ -125,10 +118,25 @@ public static List httpSeverResponseCapturedHeaders(ConfigProvider confi @Nullable public static DeclarativeConfigProperties javaInstrumentationConfig( ConfigProvider configProvider, String instrumentationName) { - return Optional.ofNullable(configProvider.getInstrumentationConfig()) - .map(instrumentationConfig -> instrumentationConfig.getStructured("java")) - .map(generalConfig -> generalConfig.getStructured(instrumentationName)) - .orElse(null); + return getOrNull(configProvider, config -> config.getStructured(instrumentationName), "java"); + } + + @Nullable + private static T getOrNull( + ConfigProvider configProvider, + Function accessor, + String... segments) { + DeclarativeConfigProperties config = configProvider.getInstrumentationConfig(); + if (config == null) { + return null; + } + for (String segment : segments) { + config = config.getStructured(segment); + if (config == null) { + return null; + } + } + return accessor.apply(config); } private InstrumentationConfigUtil() {} From 81f601c41217731003eb9168c59149b033efbcb2 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Thu, 3 Oct 2024 14:38:16 -0500 Subject: [PATCH 5/5] Cleanup, reduce dependencies to compileOnly --- api/incubator/build.gradle.kts | 4 +--- exporters/common/build.gradle.kts | 2 +- exporters/logging/build.gradle.kts | 2 +- exporters/otlp/all/build.gradle.kts | 2 +- exporters/prometheus/build.gradle.kts | 2 +- exporters/zipkin/build.gradle.kts | 2 +- .../autoconfigure-spi/build.gradle.kts | 2 +- .../fileconfig/DeclarativeConfiguration.java | 8 ++++---- .../YamlDeclarativeConfigProperties.java | 17 +++-------------- .../YamlDeclarativeConfigPropertiesTest.java | 3 +-- .../jaeger-remote-sampler/build.gradle.kts | 2 +- 11 files changed, 16 insertions(+), 30 deletions(-) rename {api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal => sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig}/YamlDeclarativeConfigPropertiesTest.java (98%) diff --git a/api/incubator/build.gradle.kts b/api/incubator/build.gradle.kts index fc74b103a35..205b5504a0f 100644 --- a/api/incubator/build.gradle.kts +++ b/api/incubator/build.gradle.kts @@ -14,10 +14,8 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") - // To use parsed config file as input for YamlStructuredConfigPropertiesTest + // To use parsed config file as input for InstrumentationConfigUtilTest testImplementation(project(":sdk-extensions:incubator")) - // TODO (jack-berg): Why is this dependency not brought in as transitive dependency of :sdk-extensions:incubator? - testImplementation("com.fasterxml.jackson.core:jackson-databind") testImplementation(project(":sdk:testing")) testImplementation(project(":api:testing-internal")) diff --git a/exporters/common/build.gradle.kts b/exporters/common/build.gradle.kts index 49c8c7186ad..ef16c7d7c39 100644 --- a/exporters/common/build.gradle.kts +++ b/exporters/common/build.gradle.kts @@ -12,8 +12,8 @@ val versions: Map by project dependencies { api(project(":api:all")) api(project(":sdk-extensions:autoconfigure-spi")) - implementation(project(":api:incubator")) + compileOnly(project(":api:incubator")) compileOnly(project(":sdk:common")) compileOnly(project(":exporters:common:compile-stub")) diff --git a/exporters/logging/build.gradle.kts b/exporters/logging/build.gradle.kts index 795a90fcf1c..82e96771834 100644 --- a/exporters/logging/build.gradle.kts +++ b/exporters/logging/build.gradle.kts @@ -12,7 +12,7 @@ dependencies { api(project(":sdk:all")) implementation(project(":sdk-extensions:autoconfigure-spi")) - implementation(project(":api:incubator")) + compileOnly(project(":api:incubator")) testImplementation(project(":sdk:testing")) } diff --git a/exporters/otlp/all/build.gradle.kts b/exporters/otlp/all/build.gradle.kts index f2a3d830fce..841521cb8ca 100644 --- a/exporters/otlp/all/build.gradle.kts +++ b/exporters/otlp/all/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { implementation(project(":exporters:otlp:common")) implementation(project(":exporters:sender:okhttp")) implementation(project(":sdk-extensions:autoconfigure-spi")) - implementation(project(":api:incubator")) + compileOnly(project(":api:incubator")) compileOnly("io.grpc:grpc-stub") diff --git a/exporters/prometheus/build.gradle.kts b/exporters/prometheus/build.gradle.kts index 5baaff012b2..98a67d731bb 100644 --- a/exporters/prometheus/build.gradle.kts +++ b/exporters/prometheus/build.gradle.kts @@ -9,7 +9,7 @@ otelJava.moduleName.set("io.opentelemetry.exporter.prometheus") dependencies { api(project(":sdk:metrics")) - implementation(project(":api:incubator")) + compileOnly(project(":api:incubator")) implementation(project(":exporters:common")) implementation(project(":sdk-extensions:autoconfigure-spi")) implementation("io.prometheus:prometheus-metrics-exporter-httpserver") diff --git a/exporters/zipkin/build.gradle.kts b/exporters/zipkin/build.gradle.kts index 55ea63c9d13..1636cd7ace8 100644 --- a/exporters/zipkin/build.gradle.kts +++ b/exporters/zipkin/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { implementation(project(":exporters:common")) implementation(project(":sdk-extensions:autoconfigure-spi")) - implementation(project(":api:incubator")) + compileOnly(project(":api:incubator")) implementation("io.zipkin.reporter2:zipkin-sender-okhttp3") diff --git a/sdk-extensions/autoconfigure-spi/build.gradle.kts b/sdk-extensions/autoconfigure-spi/build.gradle.kts index 92a3d270cd9..32985cdf4e9 100644 --- a/sdk-extensions/autoconfigure-spi/build.gradle.kts +++ b/sdk-extensions/autoconfigure-spi/build.gradle.kts @@ -8,5 +8,5 @@ otelJava.moduleName.set("io.opentelemetry.sdk.autoconfigure.spi") dependencies { api(project(":sdk:all")) - implementation(project(":api:incubator")) + compileOnly(project(":api:incubator")) } 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 73066ba970b..7bccdc4bf24 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 @@ -184,7 +184,7 @@ static DeclarativeConfigProperties toConfigProperties( public static io.opentelemetry.sdk.trace.samplers.Sampler createSampler( DeclarativeConfigProperties genericSamplerModel) { YamlDeclarativeConfigProperties yamlDeclarativeConfigProperties = - requireYamlStructuredConfigProperties(genericSamplerModel); + requireYamlDeclarativeConfigProperties(genericSamplerModel); SamplerModel samplerModel = convertToModel(yamlDeclarativeConfigProperties, SamplerModel.class); return createAndMaybeCleanup( SamplerFactory.getInstance(), @@ -192,7 +192,7 @@ public static io.opentelemetry.sdk.trace.samplers.Sampler createSampler( samplerModel); } - private static YamlDeclarativeConfigProperties requireYamlStructuredConfigProperties( + private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigProperties( DeclarativeConfigProperties declarativeConfigProperties) { if (!(declarativeConfigProperties instanceof YamlDeclarativeConfigProperties)) { throw new DeclarativeConfigException( @@ -202,8 +202,8 @@ private static YamlDeclarativeConfigProperties requireYamlStructuredConfigProper } static T convertToModel( - YamlDeclarativeConfigProperties structuredConfigProperties, Class modelType) { - return MAPPER.convertValue(structuredConfigProperties.toMap(), modelType); + YamlDeclarativeConfigProperties yamlDeclarativeConfigProperties, Class modelType) { + return MAPPER.convertValue(yamlDeclarativeConfigProperties.toMap(), modelType); } static R createAndMaybeCleanup(Factory factory, SpiHelper spiHelper, M model) { diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java index 7cd536c88d9..a27753fad49 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java @@ -46,19 +46,16 @@ public final class YamlDeclarativeConfigProperties implements DeclarativeConfigP private final Map> listEntries; private final Map mapEntries; - private final Set nullKeys; private final ComponentLoader componentLoader; private YamlDeclarativeConfigProperties( Map simpleEntries, Map> listEntries, Map mapEntries, - Set nullKeys, ComponentLoader componentLoader) { this.simpleEntries = simpleEntries; this.listEntries = listEntries; this.mapEntries = mapEntries; - this.nullKeys = nullKeys; this.componentLoader = componentLoader; } @@ -72,12 +69,11 @@ private YamlDeclarativeConfigProperties( * @see DeclarativeConfiguration#toConfigProperties(OpenTelemetryConfigurationModel) */ @SuppressWarnings("unchecked") - public static YamlDeclarativeConfigProperties create( + static YamlDeclarativeConfigProperties create( Map properties, ComponentLoader componentLoader) { Map simpleEntries = new LinkedHashMap<>(); Map> listEntries = new LinkedHashMap<>(); Map mapEntries = new LinkedHashMap<>(); - Set nullKeys = new LinkedHashSet<>(); for (Map.Entry entry : properties.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); @@ -104,10 +100,6 @@ public static YamlDeclarativeConfigProperties create( mapEntries.put(key, configProperties); continue; } - if (value == null) { - nullKeys.add(key); - continue; - } throw new DeclarativeConfigException( "Unable to initialize ExtendedConfigProperties. Key \"" + key @@ -115,7 +107,7 @@ public static YamlDeclarativeConfigProperties create( + value.getClass().getName()); } return new YamlDeclarativeConfigProperties( - simpleEntries, listEntries, mapEntries, nullKeys, componentLoader); + simpleEntries, listEntries, mapEntries, componentLoader); } private static boolean isPrimitiveList(Object object) { @@ -290,17 +282,15 @@ public Set getPropertyKeys() { keys.addAll(simpleEntries.keySet()); keys.addAll(listEntries.keySet()); keys.addAll(mapEntries.keySet()); - keys.addAll(nullKeys); return Collections.unmodifiableSet(keys); } @Override public String toString() { - StringJoiner joiner = new StringJoiner(", ", "YamlStructuredConfigProperties{", "}"); + StringJoiner joiner = new StringJoiner(", ", "YamlDeclarativeConfigProperties{", "}"); simpleEntries.forEach((key, value) -> joiner.add(key + "=" + value)); listEntries.forEach((key, value) -> joiner.add(key + "=" + value)); mapEntries.forEach((key, value) -> joiner.add(key + "=" + value)); - nullKeys.forEach((key) -> joiner.add(key + "=null")); return joiner.toString(); } @@ -312,7 +302,6 @@ public Map toMap() { result.put( key, value.stream().map(YamlDeclarativeConfigProperties::toMap).collect(toList()))); mapEntries.forEach((key, value) -> result.put(key, value.toMap())); - nullKeys.forEach(key -> result.put(key, null)); return Collections.unmodifiableMap(result); } diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigPropertiesTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigPropertiesTest.java similarity index 98% rename from api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigPropertiesTest.java rename to sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigPropertiesTest.java index c3ba062277e..2ec01806f83 100644 --- a/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/internal/YamlDeclarativeConfigPropertiesTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigPropertiesTest.java @@ -3,14 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.api.incubator.config.internal; +package io.opentelemetry.sdk.extension.incubator.fileconfig; import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableSet; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; diff --git a/sdk-extensions/jaeger-remote-sampler/build.gradle.kts b/sdk-extensions/jaeger-remote-sampler/build.gradle.kts index dcefb51da53..32b51d6065d 100644 --- a/sdk-extensions/jaeger-remote-sampler/build.gradle.kts +++ b/sdk-extensions/jaeger-remote-sampler/build.gradle.kts @@ -12,7 +12,7 @@ otelJava.moduleName.set("io.opentelemetry.sdk.extension.trace.jaeger") dependencies { api(project(":sdk:all")) - implementation(project(":api:incubator")) + compileOnly(project(":api:incubator")) compileOnly(project(":sdk-extensions:autoconfigure")) compileOnly(project(":sdk-extensions:incubator"))