diff --git a/api/incubator/build.gradle.kts b/api/incubator/build.gradle.kts
index bdf12950ac..205b5504a0 100644
--- a/api/incubator/build.gradle.kts
+++ b/api/incubator/build.gradle.kts
@@ -14,6 +14,9 @@ dependencies {
annotationProcessor("com.google.auto.value:auto-value")
+ // To use parsed config file as input for InstrumentationConfigUtilTest
+ testImplementation(project(":sdk-extensions:incubator"))
+
testImplementation(project(":sdk:testing"))
testImplementation(project(":api:testing-internal"))
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 0000000000..62cc044e65
--- /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 declarative 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 DeclarativeConfigProperties} corresponding to instrumentation
+ * config, or {@code null} if unavailable.
+ *
+ * @return the instrumentation {@link DeclarativeConfigProperties}
+ */
+ @Nullable
+ DeclarativeConfigProperties 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/DeclarativeConfigException.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigException.java
new file mode 100644
index 0000000000..3ce49c6454
--- /dev/null
+++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigException.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 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 DeclarativeConfigException(String message) {
+ super(message);
+ }
+
+ /** Create a new configuration exception with specified {@code message} and {@code cause}. */
+ public DeclarativeConfigException(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/DeclarativeConfigProperties.java
similarity index 68%
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/DeclarativeConfigProperties.java
index ced8800561..ef8e2343f2 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/DeclarativeConfigProperties.java
@@ -3,20 +3,18 @@
* 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;
/**
- * 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
@@ -25,24 +23,24 @@ import javax.annotation.Nullable;
*
This class is internal and is hence not for public use. Its APIs are unstable and can change
* at any time.
*/
-public interface StructuredConfigProperties {
+public interface DeclarativeConfigProperties {
/**
- * Return an empty {@link StructuredConfigProperties} instance.
+ * Return an empty {@link DeclarativeConfigProperties} instance.
*
*
Useful for walking the tree without checking for null. For example, to access a string key
* nested at .foo.bar.baz, call: {@code config.getStructured("foo", empty()).getStructured("bar",
* empty()).getString("baz")}.
*/
- static StructuredConfigProperties empty() {
- return EmptyStructuredConfigProperties.getInstance();
+ static DeclarativeConfigProperties empty() {
+ return EmptyDeclarativeConfigProperties.getInstance();
}
/**
* 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 DeclarativeConfigException if the property is not a valid scalar string
*/
@Nullable
String getString(String name);
@@ -52,7 +50,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 DeclarativeConfigException if the property is not a valid scalar string
*/
default String getString(String name, String defaultValue) {
return defaultIfNull(getString(name), defaultValue);
@@ -63,7 +61,7 @@ public interface StructuredConfigProperties {
* {@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 DeclarativeConfigException if the property is not a valid scalar boolean
*/
@Nullable
Boolean getBoolean(String name);
@@ -73,7 +71,7 @@ public interface StructuredConfigProperties {
*
* @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 DeclarativeConfigException if the property is not a valid scalar boolean
*/
default boolean getBoolean(String name, boolean defaultValue) {
return defaultIfNull(getBoolean(name), defaultValue);
@@ -86,7 +84,7 @@ public interface StructuredConfigProperties {
* {@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 DeclarativeConfigException if the property is not a valid scalar integer
*/
@Nullable
Integer getInt(String name);
@@ -99,7 +97,7 @@ public interface StructuredConfigProperties {
*
* @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 DeclarativeConfigException if the property is not a valid scalar integer
*/
default int getInt(String name, int defaultValue) {
return defaultIfNull(getInt(name), defaultValue);
@@ -109,7 +107,7 @@ public interface StructuredConfigProperties {
* 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 DeclarativeConfigException if the property is not a valid scalar long
*/
@Nullable
Long getLong(String name);
@@ -119,7 +117,7 @@ public interface StructuredConfigProperties {
*
* @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 DeclarativeConfigException if the property is not a valid scalar long
*/
default long getLong(String name, long defaultValue) {
return defaultIfNull(getLong(name), defaultValue);
@@ -129,7 +127,7 @@ public interface StructuredConfigProperties {
* 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 DeclarativeConfigException if the property is not a valid scalar double
*/
@Nullable
Double getDouble(String name);
@@ -139,7 +137,7 @@ public interface StructuredConfigProperties {
*
* @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 DeclarativeConfigException if the property is not a valid scalar double
*/
default double getDouble(String name, double defaultValue) {
return defaultIfNull(getDouble(name), defaultValue);
@@ -153,8 +151,8 @@ public interface StructuredConfigProperties {
* @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 DeclarativeConfigException if the property is not a valid sequence of scalars, or if
+ * {@code scalarType} is not supported
*/
@Nullable
List getScalarList(String name, Class scalarType);
@@ -163,56 +161,58 @@ public interface StructuredConfigProperties {
* 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 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 ConfigurationException 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 {@link StructuredConfigProperties} configuration property.
+ * Returns a list of {@link DeclarativeConfigProperties} configuration property.
*
* @return a map-valued configuration property, or {@code defaultValue} if {@code name} has not
* been configured
- * @throws ConfigurationException if the property is not a mapping
+ * @throws DeclarativeConfigException if the property is not a mapping
*/
- default StructuredConfigProperties getStructured(
- String name, StructuredConfigProperties defaultValue) {
+ default DeclarativeConfigProperties getStructured(
+ String name, DeclarativeConfigProperties defaultValue) {
return defaultIfNull(getStructured(name), defaultValue);
}
/**
- * 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 ConfigurationException 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 list of {@link StructuredConfigProperties} configuration property.
+ * Returns a list of {@link DeclarativeConfigProperties} configuration property.
*
* @return a list of map-valued configuration property, or {@code defaultValue} if {@code name}
* has not been configured
- * @throws ConfigurationException if the property is not a sequence of mappings
+ * @throws DeclarativeConfigException if the property is not a sequence of mappings
*/
- default List getStructuredList(
- String name, List defaultValue) {
+ default List getStructuredList(
+ String name, List defaultValue) {
return defaultIfNull(getStructuredList(name), defaultValue);
}
diff --git a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/EmptyStructuredConfigProperties.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/EmptyDeclarativeConfigProperties.java
similarity index 63%
rename from sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/EmptyStructuredConfigProperties.java
rename to api/incubator/src/main/java/io/opentelemetry/api/incubator/config/EmptyDeclarativeConfigProperties.java
index 2315dfa013..77b8a26549 100644
--- a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/EmptyStructuredConfigProperties.java
+++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/EmptyDeclarativeConfigProperties.java
@@ -3,22 +3,22 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.sdk.autoconfigure.spi.internal;
+package io.opentelemetry.api.incubator.config;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
-/** Empty instance of {@link StructuredConfigProperties}. */
-final class EmptyStructuredConfigProperties implements StructuredConfigProperties {
+/** Empty instance of {@link DeclarativeConfigProperties}. */
+final class EmptyDeclarativeConfigProperties implements DeclarativeConfigProperties {
- private static final EmptyStructuredConfigProperties INSTANCE =
- new EmptyStructuredConfigProperties();
+ private static final EmptyDeclarativeConfigProperties INSTANCE =
+ new EmptyDeclarativeConfigProperties();
- private EmptyStructuredConfigProperties() {}
+ private EmptyDeclarativeConfigProperties() {}
- static EmptyStructuredConfigProperties getInstance() {
+ static EmptyDeclarativeConfigProperties getInstance() {
return INSTANCE;
}
@@ -60,13 +60,13 @@ final class EmptyStructuredConfigProperties implements StructuredConfigPropertie
@Nullable
@Override
- public StructuredConfigProperties getStructured(String name) {
+ public DeclarativeConfigProperties getStructured(String name) {
return null;
}
@Nullable
@Override
- public List getStructuredList(String name) {
+ public List getStructuredList(String name) {
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 0000000000..b0daef4968
--- /dev/null
+++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/GlobalConfigProvider.java
@@ -0,0 +1,63 @@
+/*
+ * 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
+ * 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")
+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.
+ *
+ * @throws IllegalStateException when called more than once
+ */
+ 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 0000000000..e1e95e9315
--- /dev/null
+++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.api.incubator.config;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import javax.annotation.Nullable;
+
+/**
+ * A collection of convenience methods to extract instrumentation config from {@link
+ * ConfigProvider#getInstrumentationConfig()}.
+ */
+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 DeclarativeConfigException if an unexpected type is encountered accessing the property
+ */
+ @Nullable
+ public static Map peerServiceMapping(ConfigProvider configProvider) {
+ List serviceMappingList =
+ getOrNull(
+ configProvider,
+ config -> config.getStructuredList("service_mapping"),
+ "general",
+ "peer");
+ if (serviceMappingList == null) {
+ return null;
+ }
+ Map serviceMapping = new LinkedHashMap<>();
+ 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;
+ }
+
+ /**
+ * Return {@code .instrumentation.general.http.client.request_captured_headers}, or null if none
+ * is configured.
+ *
+ * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property
+ */
+ @Nullable
+ public static List httpClientRequestCapturedHeaders(ConfigProvider configProvider) {
+ return getOrNull(
+ configProvider,
+ config -> config.getScalarList("request_captured_headers", String.class),
+ "general",
+ "http",
+ "client");
+ }
+
+ /**
+ * Return {@code .instrumentation.general.http.client.response_captured_headers}, or null if none
+ * is configured.
+ *
+ * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property
+ */
+ @Nullable
+ public static List httpClientResponseCapturedHeaders(ConfigProvider configProvider) {
+ return getOrNull(
+ configProvider,
+ config -> config.getScalarList("response_captured_headers", String.class),
+ "general",
+ "http",
+ "client");
+ }
+
+ /**
+ * Return {@code .instrumentation.general.http.server.request_captured_headers}, or null if none
+ * is configured.
+ *
+ * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property
+ */
+ @Nullable
+ public static List httpServerRequestCapturedHeaders(ConfigProvider configProvider) {
+ return getOrNull(
+ configProvider,
+ config -> config.getScalarList("request_captured_headers", String.class),
+ "general",
+ "http",
+ "server");
+ }
+
+ /**
+ * Return {@code .instrumentation.general.http.server.response_captured_headers}, or null if none
+ * is configured.
+ *
+ * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property
+ */
+ @Nullable
+ public static List httpSeverResponseCapturedHeaders(ConfigProvider configProvider) {
+ return getOrNull(
+ configProvider,
+ config -> config.getScalarList("response_captured_headers", String.class),
+ "general",
+ "http",
+ "server");
+ }
+
+ /**
+ * Return {@code .instrumentation.java.}, or null if none is configured.
+ *
+ * @throws DeclarativeConfigException if an unexpected type is encountered accessing the property
+ */
+ @Nullable
+ public static DeclarativeConfigProperties javaInstrumentationConfig(
+ ConfigProvider configProvider, String instrumentationName) {
+ return getOrNull(configProvider, config -> config.getStructured(instrumentationName), "java");
+ }
+
+ /**
+ * Walk down the {@code segments} of {@link ConfigProvider#getInstrumentationConfig()} and call
+ * {@code accessor} on the terminal node. Returns null if {@link
+ * ConfigProvider#getInstrumentationConfig()} is null, or if null is encountered walking the
+ * {@code segments}, or if {@code accessor} returns null.
+ *
+ * See other methods in {@link InstrumentationConfigUtil} for usage examples.
+ */
+ @Nullable
+ public 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() {}
+}
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 0000000000..9c9e4bf41e
--- /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
new file mode 100644
index 0000000000..ecd837a529
--- /dev/null
+++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/config/GlobalConfigProviderTest.java
@@ -0,0 +1,44 @@
+/*
+ * 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 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 = DeclarativeConfigProperties::empty;
+ GlobalConfigProvider.set(configProvider);
+ assertThat(GlobalConfigProvider.get()).isSameAs(configProvider);
+ }
+
+ @Test
+ void setThenSet() {
+ ConfigProvider configProvider = DeclarativeConfigProperties::empty;
+ GlobalConfigProvider.set(configProvider);
+ assertThatThrownBy(() -> GlobalConfigProvider.set(configProvider))
+ .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 0000000000..94da0f2d10
--- /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.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
+import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
+import io.opentelemetry.sdk.extension.incubator.fileconfig.YamlDeclarativeConfigProperties;
+import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
+import 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) {
+ OpenTelemetryConfigurationModel configuration =
+ DeclarativeConfiguration.parse(
+ new ByteArrayInputStream(configYaml.getBytes(StandardCharsets.UTF_8)));
+ return SdkConfigProvider.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(
+ YamlDeclarativeConfigProperties.class,
+ exampleConfig ->
+ assertThat(exampleConfig.toMap()).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/exporters/common/build.gradle.kts b/exporters/common/build.gradle.kts
index bbca8bc416..8d5f38224e 100644
--- a/exporters/common/build.gradle.kts
+++ b/exporters/common/build.gradle.kts
@@ -13,6 +13,7 @@ dependencies {
api(project(":api:all"))
api(project(":sdk-extensions:autoconfigure-spi"))
+ compileOnly(project(":api:incubator"))
compileOnly(project(":sdk:common"))
compileOnly(project(":exporters:common:compile-stub"))
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 f67c7fe716..9e93cc38ab 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
@@ -9,7 +9,6 @@ import static io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.common.export.MemoryMode;
import io.opentelemetry.sdk.metrics.Aggregation;
import io.opentelemetry.sdk.metrics.InstrumentType;
@@ -63,22 +62,6 @@ public final class ExporterBuilderUtil {
memoryModeConsumer.accept(memoryMode);
}
- /** Invoke the {@code memoryModeConsumer} with the configured {@link MemoryMode}. */
- public static void configureExporterMemoryMode(
- StructuredConfigProperties config, Consumer memoryModeConsumer) {
- String memoryModeStr = config.getString("memory_mode");
- if (memoryModeStr == null) {
- return;
- }
- MemoryMode memoryMode;
- try {
- memoryMode = MemoryMode.valueOf(memoryModeStr.toUpperCase(Locale.ROOT));
- } catch (IllegalArgumentException e) {
- throw new ConfigurationException("Unrecognized memory_mode: " + memoryModeStr, e);
- }
- memoryModeConsumer.accept(memoryMode);
- }
-
/**
* Invoke the {@code defaultAggregationSelectorConsumer} with the configured {@link
* DefaultAggregationSelector}.
@@ -126,30 +109,6 @@ public final class ExporterBuilderUtil {
aggregationTemporalitySelectorConsumer.accept(temporalitySelector);
}
- public static void configureOtlpAggregationTemporality(
- StructuredConfigProperties config,
- Consumer aggregationTemporalitySelectorConsumer) {
- String temporalityStr = config.getString("temporality_preference");
- if (temporalityStr == null) {
- return;
- }
- AggregationTemporalitySelector temporalitySelector;
- switch (temporalityStr.toLowerCase(Locale.ROOT)) {
- case "cumulative":
- temporalitySelector = AggregationTemporalitySelector.alwaysCumulative();
- break;
- case "delta":
- temporalitySelector = AggregationTemporalitySelector.deltaPreferred();
- break;
- case "lowmemory":
- temporalitySelector = AggregationTemporalitySelector.lowMemory();
- break;
- default:
- throw new ConfigurationException("Unrecognized temporality_preference: " + temporalityStr);
- }
- aggregationTemporalitySelectorConsumer.accept(temporalitySelector);
- }
-
/**
* Invoke the {@code defaultAggregationSelectorConsumer} with the configured {@link
* DefaultAggregationSelector}.
@@ -165,28 +124,5 @@ public final class ExporterBuilderUtil {
}
}
- /**
- * Invoke the {@code defaultAggregationSelectorConsumer} with the configured {@link
- * DefaultAggregationSelector}.
- */
- public static void configureOtlpHistogramDefaultAggregation(
- StructuredConfigProperties config,
- Consumer defaultAggregationSelectorConsumer) {
- String defaultHistogramAggregation = config.getString("default_histogram_aggregation");
- if (defaultHistogramAggregation == null) {
- return;
- }
- if (AggregationUtil.aggregationName(Aggregation.base2ExponentialBucketHistogram())
- .equalsIgnoreCase(defaultHistogramAggregation)) {
- defaultAggregationSelectorConsumer.accept(
- DefaultAggregationSelector.getDefault()
- .with(InstrumentType.HISTOGRAM, Aggregation.base2ExponentialBucketHistogram()));
- } else if (!AggregationUtil.aggregationName(explicitBucketHistogram())
- .equalsIgnoreCase(defaultHistogramAggregation)) {
- throw new ConfigurationException(
- "Unrecognized default_histogram_aggregation: " + defaultHistogramAggregation);
- }
- }
-
private ExporterBuilderUtil() {}
}
diff --git a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/IncubatingExporterBuilderUtil.java b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/IncubatingExporterBuilderUtil.java
new file mode 100644
index 0000000000..f5992879cf
--- /dev/null
+++ b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/IncubatingExporterBuilderUtil.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.internal;
+
+import static io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram;
+
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
+import io.opentelemetry.sdk.common.export.MemoryMode;
+import io.opentelemetry.sdk.metrics.Aggregation;
+import io.opentelemetry.sdk.metrics.InstrumentType;
+import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
+import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector;
+import io.opentelemetry.sdk.metrics.internal.aggregator.AggregationUtil;
+import java.util.Locale;
+import java.util.function.Consumer;
+
+/**
+ * Utilities for exporter builders.
+ *
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change
+ * at any time.
+ */
+public final class IncubatingExporterBuilderUtil {
+
+ /** Invoke the {@code memoryModeConsumer} with the configured {@link MemoryMode}. */
+ public static void configureExporterMemoryMode(
+ DeclarativeConfigProperties config, Consumer memoryModeConsumer) {
+ String memoryModeStr = config.getString("memory_mode");
+ if (memoryModeStr == null) {
+ return;
+ }
+ MemoryMode memoryMode;
+ try {
+ memoryMode = MemoryMode.valueOf(memoryModeStr.toUpperCase(Locale.ROOT));
+ } catch (IllegalArgumentException e) {
+ throw new ConfigurationException("Unrecognized memory_mode: " + memoryModeStr, e);
+ }
+ memoryModeConsumer.accept(memoryMode);
+ }
+
+ public static void configureOtlpAggregationTemporality(
+ DeclarativeConfigProperties config,
+ Consumer aggregationTemporalitySelectorConsumer) {
+ String temporalityStr = config.getString("temporality_preference");
+ if (temporalityStr == null) {
+ return;
+ }
+ AggregationTemporalitySelector temporalitySelector;
+ switch (temporalityStr.toLowerCase(Locale.ROOT)) {
+ case "cumulative":
+ temporalitySelector = AggregationTemporalitySelector.alwaysCumulative();
+ break;
+ case "delta":
+ temporalitySelector = AggregationTemporalitySelector.deltaPreferred();
+ break;
+ case "lowmemory":
+ temporalitySelector = AggregationTemporalitySelector.lowMemory();
+ break;
+ default:
+ throw new ConfigurationException("Unrecognized temporality_preference: " + temporalityStr);
+ }
+ aggregationTemporalitySelectorConsumer.accept(temporalitySelector);
+ }
+
+ /**
+ * Invoke the {@code defaultAggregationSelectorConsumer} with the configured {@link
+ * DefaultAggregationSelector}.
+ */
+ public static void configureOtlpHistogramDefaultAggregation(
+ DeclarativeConfigProperties config,
+ Consumer defaultAggregationSelectorConsumer) {
+ String defaultHistogramAggregation = config.getString("default_histogram_aggregation");
+ if (defaultHistogramAggregation == null) {
+ return;
+ }
+ if (AggregationUtil.aggregationName(Aggregation.base2ExponentialBucketHistogram())
+ .equalsIgnoreCase(defaultHistogramAggregation)) {
+ defaultAggregationSelectorConsumer.accept(
+ DefaultAggregationSelector.getDefault()
+ .with(InstrumentType.HISTOGRAM, Aggregation.base2ExponentialBucketHistogram()));
+ } else if (!AggregationUtil.aggregationName(explicitBucketHistogram())
+ .equalsIgnoreCase(defaultHistogramAggregation)) {
+ throw new ConfigurationException(
+ "Unrecognized default_histogram_aggregation: " + defaultHistogramAggregation);
+ }
+ }
+
+ private IncubatingExporterBuilderUtil() {}
+}
diff --git a/exporters/logging-otlp/build.gradle.kts b/exporters/logging-otlp/build.gradle.kts
index a65f52f852..0870f2c993 100644
--- a/exporters/logging-otlp/build.gradle.kts
+++ b/exporters/logging-otlp/build.gradle.kts
@@ -14,10 +14,12 @@ dependencies {
implementation(project(":sdk:logs"))
implementation(project(":exporters:otlp:common"))
+ compileOnly(project(":api:incubator"))
implementation(project(":sdk-extensions:autoconfigure-spi"))
implementation("com.fasterxml.jackson.core:jackson-core")
+ testImplementation(project(":api:incubator"))
testImplementation(project(":sdk:testing"))
testImplementation("com.google.guava:guava")
diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterComponentProvider.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterComponentProvider.java
index e80747a86e..57817346d7 100644
--- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterComponentProvider.java
+++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterComponentProvider.java
@@ -5,9 +5,9 @@
package io.opentelemetry.exporter.logging.otlp.internal.logs;
-import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
+import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
/**
@@ -30,9 +30,9 @@ public final class OtlpStdoutLogRecordExporterComponentProvider
}
@Override
- public LogRecordExporter create(StructuredConfigProperties config) {
+ public LogRecordExporter create(DeclarativeConfigProperties config) {
OtlpStdoutLogRecordExporterBuilder builder = OtlpStdoutLogRecordExporter.builder();
- ExporterBuilderUtil.configureExporterMemoryMode(config, builder::setMemoryMode);
+ IncubatingExporterBuilderUtil.configureExporterMemoryMode(config, builder::setMemoryMode);
return builder.build();
}
}
diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterComponentProvider.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterComponentProvider.java
index 2a69bd0c7d..c600edbd59 100644
--- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterComponentProvider.java
+++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterComponentProvider.java
@@ -5,9 +5,9 @@
package io.opentelemetry.exporter.logging.otlp.internal.metrics;
-import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
+import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
/**
@@ -30,12 +30,12 @@ public final class OtlpStdoutMetricExporterComponentProvider
}
@Override
- public MetricExporter create(StructuredConfigProperties config) {
+ public MetricExporter create(DeclarativeConfigProperties config) {
OtlpStdoutMetricExporterBuilder builder = OtlpStdoutMetricExporter.builder();
- ExporterBuilderUtil.configureExporterMemoryMode(config, builder::setMemoryMode);
- ExporterBuilderUtil.configureOtlpAggregationTemporality(
+ IncubatingExporterBuilderUtil.configureExporterMemoryMode(config, builder::setMemoryMode);
+ IncubatingExporterBuilderUtil.configureOtlpAggregationTemporality(
config, builder::setAggregationTemporalitySelector);
- ExporterBuilderUtil.configureOtlpHistogramDefaultAggregation(
+ IncubatingExporterBuilderUtil.configureOtlpHistogramDefaultAggregation(
config, builder::setDefaultAggregationSelector);
return builder.build();
}
diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterComponentProvider.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterComponentProvider.java
index c21029ed13..8a821b3977 100644
--- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterComponentProvider.java
+++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterComponentProvider.java
@@ -5,9 +5,9 @@
package io.opentelemetry.exporter.logging.otlp.internal.traces;
-import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
+import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.trace.export.SpanExporter;
/**
@@ -30,9 +30,9 @@ public final class OtlpStdoutSpanExporterComponentProvider
}
@Override
- public SpanExporter create(StructuredConfigProperties config) {
+ public SpanExporter create(DeclarativeConfigProperties config) {
OtlpStdoutSpanExporterBuilder builder = OtlpStdoutSpanExporter.builder();
- ExporterBuilderUtil.configureExporterMemoryMode(config, builder::setMemoryMode);
+ IncubatingExporterBuilderUtil.configureExporterMemoryMode(config, builder::setMemoryMode);
return builder.build();
}
}
diff --git a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/AbstractOtlpStdoutExporterTest.java b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/AbstractOtlpStdoutExporterTest.java
index fbfd771a03..7605cc851d 100644
--- a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/AbstractOtlpStdoutExporterTest.java
+++ b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/AbstractOtlpStdoutExporterTest.java
@@ -15,10 +15,10 @@ import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Streams;
import io.github.netmikey.logunit.api.LogCapturer;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.common.export.MemoryMode;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
@@ -306,7 +306,7 @@ abstract class AbstractOtlpStdoutExporterTest {
@Test
void componentProviderConfig() {
- StructuredConfigProperties properties = mock(StructuredConfigProperties.class);
+ DeclarativeConfigProperties properties = mock(DeclarativeConfigProperties.class);
T exporter = exporterFromComponentProvider(properties);
assertThat(exporter).extracting("wrapperJsonObject").isEqualTo(true);
@@ -328,7 +328,7 @@ abstract class AbstractOtlpStdoutExporterTest {
}
@SuppressWarnings("unchecked")
- protected T exporterFromComponentProvider(StructuredConfigProperties properties) {
+ protected T exporterFromComponentProvider(DeclarativeConfigProperties properties) {
return (T)
((ComponentProvider>)
loadSpi(ComponentProvider.class)
diff --git a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpStdoutMetricExporterTest.java b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpStdoutMetricExporterTest.java
index fc081e229f..df91f1e2cb 100644
--- a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpStdoutMetricExporterTest.java
+++ b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpStdoutMetricExporterTest.java
@@ -11,10 +11,10 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableMap;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.exporter.logging.otlp.internal.metrics.OtlpStdoutMetricExporter;
import io.opentelemetry.exporter.logging.otlp.internal.metrics.OtlpStdoutMetricExporterBuilder;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider;
import io.opentelemetry.sdk.common.export.MemoryMode;
import io.opentelemetry.sdk.metrics.Aggregation;
@@ -81,7 +81,7 @@ class OtlpStdoutMetricExporterTest
@Test
void componentProviderMetricConfig() {
- StructuredConfigProperties properties = mock(StructuredConfigProperties.class);
+ DeclarativeConfigProperties properties = mock(DeclarativeConfigProperties.class);
when(properties.getString("temporality_preference")).thenReturn("DELTA");
when(properties.getString("default_histogram_aggregation"))
.thenReturn("BASE2_EXPONENTIAL_BUCKET_HISTOGRAM");
diff --git a/exporters/logging/build.gradle.kts b/exporters/logging/build.gradle.kts
index 6feefb00fe..82e9677183 100644
--- a/exporters/logging/build.gradle.kts
+++ b/exporters/logging/build.gradle.kts
@@ -12,6 +12,7 @@ dependencies {
api(project(":sdk:all"))
implementation(project(":sdk-extensions:autoconfigure-spi"))
+ compileOnly(project(":api:incubator"))
testImplementation(project(":sdk:testing"))
}
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 8c9d048c3b..2d8141cc4f 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,9 +5,9 @@
package io.opentelemetry.exporter.logging.internal;
+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.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
/**
@@ -30,7 +30,7 @@ public final class ConsoleLogRecordExporterComponentProvider
}
@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 df5270ca11..6fab453403 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,9 +5,9 @@
package io.opentelemetry.exporter.logging.internal;
+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.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
/**
@@ -30,7 +30,7 @@ public final class ConsoleMetricExporterComponentProvider
}
@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 a6fa1950bd..fd65a5acad 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,9 +5,9 @@
package io.opentelemetry.exporter.logging.internal;
+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.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.trace.export.SpanExporter;
/**
@@ -29,7 +29,7 @@ public final class ConsoleSpanExporterComponentProvider implements ComponentProv
}
@Override
- public SpanExporter create(StructuredConfigProperties config) {
+ public SpanExporter create(DeclarativeConfigProperties config) {
return LoggingSpanExporter.create();
}
}
diff --git a/exporters/otlp/all/build.gradle.kts b/exporters/otlp/all/build.gradle.kts
index 0c0ef6b75b..eb9ad982c6 100644
--- a/exporters/otlp/all/build.gradle.kts
+++ b/exporters/otlp/all/build.gradle.kts
@@ -20,6 +20,8 @@ dependencies {
implementation(project(":exporters:sender:okhttp"))
implementation(project(":sdk-extensions:autoconfigure-spi"))
+ compileOnly(project(":api:incubator"))
+
compileOnly("io.grpc:grpc-stub")
testImplementation(project(":exporters:otlp:testing-internal"))
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 999fc412a5..bf58047406 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
@@ -8,8 +8,6 @@ package io.opentelemetry.exporter.otlp.internal;
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
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.common.export.MemoryMode;
import io.opentelemetry.sdk.common.export.RetryPolicy;
import java.io.File;
@@ -20,8 +18,6 @@ import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
-import java.util.Collections;
-import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -52,18 +48,6 @@ public final class OtlpConfigUtil {
return config.getString("otel.exporter.otlp.protocol", PROTOCOL_GRPC);
}
- /** Determine the configured OTLP protocol for the {@code dataType}. */
- public static String getStructuredConfigOtlpProtocol(StructuredConfigProperties config) {
- // NOTE: The default OTLP protocol is different for declarative config than for env var / system
- // property based config. This is intentional. OpenTelemetry changed the default protocol
- // recommendation from grpc to http/protobuf, but the autoconfigure's env var / system property
- // based config did not update to reflect this before stabilizing, and changing is a breaking
- // change requiring a major version bump. Declarative config is not yet stable and therefore can
- // switch to the current default recommendation, which aligns also aligns with the behavior of
- // the OpenTelemetry Java Agent 2.x+.
- return config.getString("protocol", PROTOCOL_HTTP_PROTOBUF);
- }
-
/** Invoke the setters with the OTLP configuration for the {@code dataType}. */
@SuppressWarnings("TooManyParameters")
public static void configureOtlpExporterBuilder(
@@ -164,81 +148,7 @@ public final class OtlpConfigUtil {
ExporterBuilderUtil.configureExporterMemoryMode(config, setMemoryMode);
}
- /** Invoke the setters with the OTLP configuration for the {@code dataType}. */
- @SuppressWarnings("TooManyParameters")
- public static void configureOtlpExporterBuilder(
- String dataType,
- StructuredConfigProperties config,
- Consumer setEndpoint,
- BiConsumer addHeader,
- Consumer setCompression,
- Consumer setTimeout,
- Consumer setTrustedCertificates,
- BiConsumer setClientTls,
- Consumer setRetryPolicy,
- Consumer setMemoryMode) {
- String protocol = getStructuredConfigOtlpProtocol(config);
- boolean isHttpProtobuf = protocol.equals(PROTOCOL_HTTP_PROTOBUF);
- URL endpoint = validateEndpoint(config.getString("endpoint"), isHttpProtobuf);
- if (endpoint != null) {
- setEndpoint.accept(endpoint.toString());
- }
-
- String headerList = config.getString("headers_list");
- if (headerList != null) {
- ConfigProperties headersListConfig =
- DefaultConfigProperties.createFromMap(
- Collections.singletonMap("otel.exporter.otlp.headers", headerList));
- configureOtlpHeaders(headersListConfig, dataType, addHeader);
- }
-
- List headers = config.getStructuredList("headers");
- if (headers != null) {
- headers.forEach(
- header -> {
- String name = header.getString("name");
- String value = header.getString("value");
- if (name != null && value != null) {
- addHeader.accept(name, value);
- }
- });
- }
-
- String compression = config.getString("compression");
- if (compression != null) {
- setCompression.accept(compression);
- }
-
- Integer timeoutMs = config.getInt("timeout");
- if (timeoutMs != null) {
- setTimeout.accept(Duration.ofMillis(timeoutMs));
- }
-
- String certificatePath = config.getString("certificate");
- String clientKeyPath = config.getString("client_key");
- String clientKeyChainPath = config.getString("client_certificate");
-
- if (clientKeyPath != null && clientKeyChainPath == null) {
- throw new ConfigurationException(
- "client_key provided without client_certificate - both client_key and client_certificate must be set");
- } else if (clientKeyPath == null && clientKeyChainPath != null) {
- throw new ConfigurationException(
- "client_certificate provided without client_key - both client_key and client_certificate must be set");
- }
- byte[] certificateBytes = readFileBytes(certificatePath);
- if (certificateBytes != null) {
- setTrustedCertificates.accept(certificateBytes);
- }
- byte[] clientKeyBytes = readFileBytes(clientKeyPath);
- byte[] clientKeyChainBytes = readFileBytes(clientKeyChainPath);
- if (clientKeyBytes != null && clientKeyChainBytes != null) {
- setClientTls.accept(clientKeyBytes, clientKeyChainBytes);
- }
-
- ExporterBuilderUtil.configureExporterMemoryMode(config, setMemoryMode);
- }
-
- private static void configureOtlpHeaders(
+ static void configureOtlpHeaders(
ConfigProperties config, String dataType, BiConsumer addHeader) {
Map headers = config.getMap("otel.exporter.otlp." + dataType + ".headers");
if (headers.isEmpty()) {
@@ -266,7 +176,7 @@ public final class OtlpConfigUtil {
}
@Nullable
- private static URL validateEndpoint(@Nullable String endpoint, boolean isHttpProtobuf) {
+ static URL validateEndpoint(@Nullable String endpoint, boolean isHttpProtobuf) {
if (endpoint == null) {
return null;
}
@@ -314,7 +224,7 @@ public final class OtlpConfigUtil {
}
@Nullable
- private static byte[] readFileBytes(@Nullable String filePath) {
+ static byte[] readFileBytes(@Nullable String filePath) {
if (filePath == null) {
return null;
}
diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpDeclarativeConfigUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpDeclarativeConfigUtil.java
new file mode 100644
index 0000000000..55ed905364
--- /dev/null
+++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpDeclarativeConfigUtil.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.internal;
+
+import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF;
+import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.configureOtlpHeaders;
+import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.readFileBytes;
+import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.validateEndpoint;
+
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
+import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
+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.common.export.MemoryMode;
+import io.opentelemetry.sdk.common.export.RetryPolicy;
+import java.net.URL;
+import java.time.Duration;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
+public final class OtlpDeclarativeConfigUtil {
+
+ /** Determine the configured OTLP protocol for the {@code dataType}. */
+ public static String getStructuredConfigOtlpProtocol(DeclarativeConfigProperties config) {
+ // NOTE: The default OTLP protocol is different for declarative config than for env var / system
+ // property based config. This is intentional. OpenTelemetry changed the default protocol
+ // recommendation from grpc to http/protobuf, but the autoconfigure's env var / system property
+ // based config did not update to reflect this before stabilizing, and changing is a breaking
+ // change requiring a major version bump. Declarative config is not yet stable and therefore can
+ // switch to the current default recommendation, which aligns also aligns with the behavior of
+ // the OpenTelemetry Java Agent 2.x+.
+ return config.getString("protocol", PROTOCOL_HTTP_PROTOBUF);
+ }
+
+ /** Invoke the setters with the OTLP configuration for the {@code dataType}. */
+ @SuppressWarnings("TooManyParameters")
+ public static void configureOtlpExporterBuilder(
+ String dataType,
+ DeclarativeConfigProperties config,
+ Consumer setEndpoint,
+ BiConsumer addHeader,
+ Consumer setCompression,
+ Consumer setTimeout,
+ Consumer setTrustedCertificates,
+ BiConsumer setClientTls,
+ Consumer setRetryPolicy,
+ Consumer setMemoryMode) {
+ String protocol = getStructuredConfigOtlpProtocol(config);
+ boolean isHttpProtobuf = protocol.equals(PROTOCOL_HTTP_PROTOBUF);
+ URL endpoint = validateEndpoint(config.getString("endpoint"), isHttpProtobuf);
+ if (endpoint != null) {
+ setEndpoint.accept(endpoint.toString());
+ }
+
+ String headerList = config.getString("headers_list");
+ if (headerList != null) {
+ ConfigProperties headersListConfig =
+ DefaultConfigProperties.createFromMap(
+ Collections.singletonMap("otel.exporter.otlp.headers", headerList));
+ configureOtlpHeaders(headersListConfig, dataType, addHeader);
+ }
+
+ List headers = config.getStructuredList("headers");
+ if (headers != null) {
+ headers.forEach(
+ header -> {
+ String name = header.getString("name");
+ String value = header.getString("value");
+ if (name != null && value != null) {
+ addHeader.accept(name, value);
+ }
+ });
+ }
+
+ String compression = config.getString("compression");
+ if (compression != null) {
+ setCompression.accept(compression);
+ }
+
+ Integer timeoutMs = config.getInt("timeout");
+ if (timeoutMs != null) {
+ setTimeout.accept(Duration.ofMillis(timeoutMs));
+ }
+
+ String certificatePath = config.getString("certificate");
+ String clientKeyPath = config.getString("client_key");
+ String clientKeyChainPath = config.getString("client_certificate");
+
+ if (clientKeyPath != null && clientKeyChainPath == null) {
+ throw new ConfigurationException(
+ "client_key provided without client_certificate - both client_key and client_certificate must be set");
+ } else if (clientKeyPath == null && clientKeyChainPath != null) {
+ throw new ConfigurationException(
+ "client_certificate provided without client_key - both client_key and client_certificate must be set");
+ }
+ byte[] certificateBytes = readFileBytes(certificatePath);
+ if (certificateBytes != null) {
+ setTrustedCertificates.accept(certificateBytes);
+ }
+ byte[] clientKeyBytes = readFileBytes(clientKeyPath);
+ byte[] clientKeyChainBytes = readFileBytes(clientKeyChainPath);
+ if (clientKeyBytes != null && clientKeyChainBytes != null) {
+ setClientTls.accept(clientKeyBytes, clientKeyChainBytes);
+ }
+
+ IncubatingExporterBuilderUtil.configureExporterMemoryMode(config, setMemoryMode);
+ }
+
+ private OtlpDeclarativeConfigUtil() {}
+}
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 9134976e49..e10fd8bdd3 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,13 +9,13 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.DATA_TYPE_L
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.DeclarativeConfigProperties;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
/**
@@ -39,13 +39,13 @@ public class OtlpLogRecordExporterComponentProvider
}
@Override
- public LogRecordExporter create(StructuredConfigProperties config) {
- String protocol = OtlpConfigUtil.getStructuredConfigOtlpProtocol(config);
+ public LogRecordExporter create(DeclarativeConfigProperties config) {
+ String protocol = OtlpDeclarativeConfigUtil.getStructuredConfigOtlpProtocol(config);
if (protocol.equals(PROTOCOL_HTTP_PROTOBUF)) {
OtlpHttpLogRecordExporterBuilder builder = httpBuilder();
- OtlpConfigUtil.configureOtlpExporterBuilder(
+ OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
config,
builder::setEndpoint,
@@ -61,7 +61,7 @@ public class OtlpLogRecordExporterComponentProvider
} else if (protocol.equals(PROTOCOL_GRPC)) {
OtlpGrpcLogRecordExporterBuilder builder = grpcBuilder();
- OtlpConfigUtil.configureOtlpExporterBuilder(
+ OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
config,
builder::setEndpoint,
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 a08cab883b..c3b1771070 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,14 +9,14 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.DATA_TYPE_M
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_GRPC;
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF;
-import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
+import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter;
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder;
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
/**
@@ -39,13 +39,13 @@ public class OtlpMetricExporterComponentProvider implements ComponentProviderNOTE: when {@link #getType()} is {@link Resource}, the {@link #getName()} is not (currently)
- * used, and {@link #create(StructuredConfigProperties)} is (currently) called with an empty {@link
- * StructuredConfigProperties}.
+ * used, and {@link #create(DeclarativeConfigProperties)} is (currently) called with an empty {@link
+ * DeclarativeConfigProperties}.
*
* This class is internal and is hence not for public use. Its APIs are unstable and can change
* at any time.
@@ -58,5 +59,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/build.gradle.kts b/sdk-extensions/autoconfigure/build.gradle.kts
index eac32f51cd..a00685f6e6 100644
--- a/sdk-extensions/autoconfigure/build.gradle.kts
+++ b/sdk-extensions/autoconfigure/build.gradle.kts
@@ -10,6 +10,8 @@ dependencies {
api(project(":sdk:all"))
api(project(":sdk-extensions:autoconfigure-spi"))
+ compileOnly(project(":api:incubator"))
+
annotationProcessor("com.google.auto.value:auto-value")
testImplementation(project(":sdk:trace-shaded-deps"))
@@ -45,7 +47,6 @@ testing {
}
register("testFullConfig") {
dependencies {
- implementation(project(":api:incubator"))
implementation(project(":extensions:trace-propagators"))
implementation(project(":exporters:logging"))
implementation(project(":exporters:logging-otlp"))
@@ -78,6 +79,13 @@ testing {
}
}
}
+ register("testIncubating") {
+ dependencies {
+ implementation(project(":sdk-extensions:incubator"))
+ implementation(project(":exporters:logging"))
+ implementation(project(":sdk:testing"))
+ }
+ }
}
}
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 666da0f89c..c5d9c77f4e 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,10 @@ package io.opentelemetry.sdk.autoconfigure;
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.internal.AutoConfigureUtil;
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 +49,8 @@ public abstract class AutoConfiguredOpenTelemetrySdk {
OpenTelemetrySdk sdk,
Resource resource,
@Nullable ConfigProperties config,
- @Nullable StructuredConfigProperties structuredConfigProperties) {
- return new AutoValue_AutoConfiguredOpenTelemetrySdk(
- sdk, resource, config, structuredConfigProperties);
+ @Nullable Object configProvider) {
+ return new AutoValue_AutoConfiguredOpenTelemetrySdk(sdk, resource, config, configProvider);
}
/**
@@ -70,19 +70,24 @@ public abstract class AutoConfiguredOpenTelemetrySdk {
* Returns the {@link ConfigProperties} used for auto-configuration, or {@code null} if
* declarative configuration was used.
*
- * @see #getStructuredConfig()
+ * This method is experimental so not public. You may reflectively call it using {@link
+ * AutoConfigureUtil#getConfig(AutoConfiguredOpenTelemetrySdk)}.
+ *
+ * @see #getConfigProvider()
*/
@Nullable
abstract ConfigProperties getConfig();
/**
- * Returns the {@link StructuredConfigProperties} used for auto-configuration, or {@code null} if
- * declarative configuration was not used.
+ * Returns the {@link ConfigProvider}, or {@code null} if declarative configuration was not used.
+ *
+ *
This method is experimental so not public. You may reflectively call it using {@link
+ * AutoConfigureUtil#getConfigProvider(AutoConfiguredOpenTelemetrySdk)}.
*
* @see #getConfig()
*/
@Nullable
- abstract StructuredConfigProperties getStructuredConfig();
+ abstract Object 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 09cec8b892..0e1586497a 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
@@ -20,7 +20,6 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
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;
@@ -36,12 +35,7 @@ import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.io.Closeable;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -65,6 +59,18 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
private static final Logger logger =
Logger.getLogger(AutoConfiguredOpenTelemetrySdkBuilder.class.getName());
+ private static final boolean INCUBATOR_AVAILABLE;
+
+ static {
+ boolean incubatorAvailable = false;
+ try {
+ Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration");
+ incubatorAvailable = true;
+ } catch (ClassNotFoundException e) {
+ // Not available
+ }
+ INCUBATOR_AVAILABLE = incubatorAvailable;
+ }
@Nullable private ConfigProperties config;
@@ -431,7 +437,8 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
maybeConfigureFromFile(config, componentLoader);
if (fromFileConfiguration != null) {
maybeRegisterShutdownHook(fromFileConfiguration.getOpenTelemetrySdk());
- maybeSetAsGlobal(fromFileConfiguration.getOpenTelemetrySdk());
+ maybeSetAsGlobal(
+ fromFileConfiguration.getOpenTelemetrySdk(), fromFileConfiguration.getConfigProvider());
return fromFileConfiguration;
}
@@ -457,7 +464,7 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
OpenTelemetrySdk openTelemetrySdk = sdkBuilder.build();
maybeRegisterShutdownHook(openTelemetrySdk);
- maybeSetAsGlobal(openTelemetrySdk);
+ maybeSetAsGlobal(openTelemetrySdk, null);
callAutoConfigureListeners(spiHelper, openTelemetrySdk);
return AutoConfiguredOpenTelemetrySdk.create(openTelemetrySdk, resource, config, null);
@@ -548,44 +555,11 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
if (configurationFile == null || configurationFile.isEmpty()) {
return null;
}
- logger.fine("Autoconfiguring from configuration file: " + configurationFile);
- try (FileInputStream fis = new FileInputStream(configurationFile)) {
- Class> configurationFactory =
- Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration");
- Method parse = configurationFactory.getMethod("parse", InputStream.class);
- Object model = parse.invoke(null, fis);
- Class> openTelemetryConfiguration =
- Class.forName(
- "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel");
- Method create =
- configurationFactory.getMethod(
- "create", openTelemetryConfiguration, ComponentLoader.class);
- OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, componentLoader);
- Method toConfigProperties =
- configurationFactory.getMethod("toConfigProperties", openTelemetryConfiguration);
- StructuredConfigProperties structuredConfigProperties =
- (StructuredConfigProperties) toConfigProperties.invoke(null, model);
- // Note: can't access declarative configuration resource without reflection so setting a dummy
- // resource
- return AutoConfiguredOpenTelemetrySdk.create(
- sdk, Resource.getDefault(), null, structuredConfigProperties);
- } catch (FileNotFoundException e) {
- throw new ConfigurationException("Configuration file not found", e);
- } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) {
+ if (!INCUBATOR_AVAILABLE) {
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;
- }
- throw new ConfigurationException("Unexpected error configuring from file", e);
- } catch (IOException e) {
- // IOException (other than FileNotFoundException which is caught above) is only thrown
- // above by FileInputStream.close()
- throw new ConfigurationException("Error closing file", e);
+ "Cannot autoconfigure from config file without opentelemetry-sdk-extension-incubator on the classpath");
}
+ return IncubatingUtil.configureFromFile(logger, configurationFile, componentLoader);
}
private void maybeRegisterShutdownHook(OpenTelemetrySdk openTelemetrySdk) {
@@ -595,11 +569,15 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
Runtime.getRuntime().addShutdownHook(shutdownHook(openTelemetrySdk));
}
- private void maybeSetAsGlobal(OpenTelemetrySdk openTelemetrySdk) {
+ private void maybeSetAsGlobal(
+ OpenTelemetrySdk openTelemetrySdk, @Nullable Object configProvider) {
if (!setResultAsGlobal) {
return;
}
GlobalOpenTelemetry.set(openTelemetrySdk);
+ if (INCUBATOR_AVAILABLE && configProvider != null) {
+ IncubatingUtil.setGlobalConfigProvider(configProvider);
+ }
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/IncubatingUtil.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java
new file mode 100644
index 0000000000..a1280e241d
--- /dev/null
+++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.sdk.autoconfigure;
+
+import io.opentelemetry.api.incubator.config.ConfigProvider;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
+import io.opentelemetry.api.incubator.config.GlobalConfigProvider;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
+import io.opentelemetry.sdk.resources.Resource;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Utilities for interacting with incubating components ({@code
+ * io.opentelemetry:opentelemetry-api-incubator} and {@code
+ * io.opentelemetry:opentelemetry-sdk-extension-incubator}), which are not guaranteed to be present
+ * on the classpath. For all methods, callers MUST first separately reflectively confirm that the
+ * incubator is available on the classpath.
+ */
+final class IncubatingUtil {
+
+ private IncubatingUtil() {}
+
+ static AutoConfiguredOpenTelemetrySdk configureFromFile(
+ Logger logger, String configurationFile, ComponentLoader componentLoader) {
+ logger.fine("Autoconfiguring from configuration file: " + configurationFile);
+ try (FileInputStream fis = new FileInputStream(configurationFile)) {
+ 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.OpenTelemetryConfigurationModel");
+ Method create =
+ declarativeConfiguration.getMethod(
+ "create", openTelemetryConfiguration, ComponentLoader.class);
+ OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, componentLoader);
+ Class> sdkConfigProvider =
+ Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider");
+ Method createFileConfigProvider =
+ 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
+ return AutoConfiguredOpenTelemetrySdk.create(
+ sdk, Resource.getDefault(), null, configProvider);
+ } catch (FileNotFoundException e) {
+ throw new ConfigurationException("Configuration file not found", e);
+ } 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 DeclarativeConfigException) {
+ throw toConfigurationException((DeclarativeConfigException) cause);
+ }
+ throw new ConfigurationException("Unexpected error configuring from file", e);
+ } catch (IOException e) {
+ // IOException (other than FileNotFoundException which is caught above) is only thrown
+ // above by FileInputStream.close()
+ throw new ConfigurationException("Error closing file", e);
+ }
+ }
+
+ private static ConfigurationException toConfigurationException(
+ DeclarativeConfigException exception) {
+ String message = Objects.requireNonNull(exception.getMessage());
+ return new ConfigurationException(message, exception);
+ }
+
+ static void setGlobalConfigProvider(Object configProvider) {
+ GlobalConfigProvider.set((ConfigProvider) configProvider);
+ }
+}
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 fe18ac8d41..52f0236e8d 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;
@@ -25,7 +25,7 @@ public final class 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,21 +41,21 @@ public final class AutoConfigureUtil {
}
/**
- * Returns the {@link StructuredConfigProperties} used for auto-configuration when file based
+ * Returns the {@link ConfigProvider} resulting from auto-configuration when declarative
* 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 declarative 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/main/java/io/opentelemetry/sdk/autoconfigure/internal/SpiHelper.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/internal/SpiHelper.java
index 6f3196a6f6..db4ca4ff64 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
@@ -6,11 +6,8 @@
package io.opentelemetry.sdk.autoconfigure.internal;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
-import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.Ordered;
import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
-import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -23,7 +20,6 @@ import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
-import java.util.stream.Collectors;
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
@@ -90,53 +86,6 @@ public final class SpiHelper {
return NamedSpiManager.create(nameToProvider);
}
- /**
- * Find a registered {@link ComponentProvider} with {@link ComponentProvider#getType()} matching
- * {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link
- * ComponentProvider#create(StructuredConfigProperties)} with the given {@code config}.
- *
- * @throws ConfigurationException if no matching providers are found, or if multiple are found
- * (i.e. conflict), or if {@link ComponentProvider#create(StructuredConfigProperties)} throws
- */
- @SuppressWarnings({"unchecked", "rawtypes"})
- public T loadComponent(Class type, String name, StructuredConfigProperties config) {
- // TODO(jack-berg): cache loaded component providers
- List componentProviders = load(ComponentProvider.class);
- List> matchedProviders =
- componentProviders.stream()
- .map(
- (Function>)
- componentProvider -> componentProvider)
- .filter(
- componentProvider ->
- componentProvider.getType() == type && name.equals(componentProvider.getName()))
- .collect(Collectors.toList());
- if (matchedProviders.isEmpty()) {
- throw new ConfigurationException(
- "No component provider detected for " + type.getName() + " with name \"" + name + "\".");
- }
- if (matchedProviders.size() > 1) {
- throw new ConfigurationException(
- "Component provider conflict. Multiple providers detected for "
- + type.getName()
- + " with name \""
- + name
- + "\": "
- + componentProviders.stream()
- .map(provider -> provider.getClass().getName())
- .collect(Collectors.joining(",", "[", "]")));
- }
- // Exactly one matching component provider
- ComponentProvider provider = (ComponentProvider) matchedProviders.get(0);
-
- try {
- return provider.create(config);
- } catch (Throwable throwable) {
- throw new ConfigurationException(
- "Error configuring " + type.getName() + " with name \"" + name + "\"", throwable);
- }
- }
-
/**
* Load implementations of an ordered SPI (i.e. implements {@link Ordered}).
*
diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java
index 9b72fbefb8..c7ae65de9a 100644
--- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java
+++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java
@@ -69,7 +69,6 @@ import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Supplier;
-import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -675,26 +674,4 @@ class AutoConfiguredOpenTelemetrySdkTest {
logs.assertContains("Error closing io.opentelemetry.sdk.trace.SdkTracerProvider: Error!");
}
-
- @Test
- @SuppressLogger(AutoConfiguredOpenTelemetrySdkBuilder.class)
- void configurationError_fileNotFound() {
- assertThatThrownBy(
- () ->
- AutoConfiguredOpenTelemetrySdk.builder()
- .addPropertiesSupplier(() -> singletonMap("otel.config.file", "foo"))
- .addPropertiesSupplier(
- () -> singletonMap("otel.experimental.config.file", "foo"))
- .addPropertiesSupplier(() -> singletonMap("otel.sdk.disabled", "true"))
- .build())
- .isInstanceOf(ConfigurationException.class)
- .hasMessageContaining("Configuration file not found");
-
- Assertions.assertDoesNotThrow(
- () ->
- AutoConfiguredOpenTelemetrySdk.builder()
- .addPropertiesSupplier(() -> singletonMap("otel.experimental.config.file", ""))
- .addPropertiesSupplier(() -> singletonMap("otel.sdk.disabled", "true"))
- .build());
- }
}
diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
similarity index 73%
rename from sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java
rename to sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
index 955e581769..8dec1132b5 100644
--- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java
+++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
@@ -7,7 +7,6 @@ package io.opentelemetry.sdk.autoconfigure;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import io.github.netmikey.logunit.api.LogCapturer;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
@@ -17,16 +16,9 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.api.io.TempDir;
-import org.slf4j.event.Level;
-class FileConfigurationTest {
-
- @RegisterExtension
- static final LogCapturer logCapturer =
- LogCapturer.create()
- .captureForLogger(AutoConfiguredOpenTelemetrySdkBuilder.class.getName(), Level.TRACE);
+class DeclarativeConfigurationTest {
@Test
void configFile(@TempDir Path tempDir) throws IOException {
@@ -50,7 +42,6 @@ class FileConfigurationTest {
assertThatThrownBy(() -> AutoConfiguredOpenTelemetrySdk.builder().setConfig(config).build())
.isInstanceOf(ConfigurationException.class)
.hasMessage(
- "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?");
- logCapturer.assertContains("Autoconfiguring from configuration file: " + path);
+ "Cannot autoconfigure from config file without opentelemetry-sdk-extension-incubator on the classpath");
}
}
diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java
index edad134ae5..0a0a905ae8 100644
--- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java
+++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java
@@ -18,8 +18,6 @@ import io.grpc.stub.StreamObserver;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.api.common.Value;
-import io.opentelemetry.api.incubator.logs.ExtendedLogger;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.metrics.Meter;
@@ -38,7 +36,6 @@ import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse;
import io.opentelemetry.proto.collector.trace.v1.TraceServiceGrpc;
import io.opentelemetry.proto.common.v1.AnyValue;
import io.opentelemetry.proto.common.v1.KeyValue;
-import io.opentelemetry.proto.logs.v1.SeverityNumber;
import io.opentelemetry.proto.metrics.v1.Metric;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import java.util.ArrayList;
@@ -204,13 +201,6 @@ public class FullConfigTest {
logger.logRecordBuilder().setBody("debug log message").setSeverity(Severity.DEBUG).emit();
logger.logRecordBuilder().setBody("info log message").setSeverity(Severity.INFO).emit();
- ((ExtendedLogger) logger)
- .logRecordBuilder()
- .setEventName("namespace.test-name")
- .setSeverity(Severity.INFO)
- .setBody(Value.of(io.opentelemetry.api.common.KeyValue.of("cow", Value.of("moo"))))
- .emit();
-
openTelemetrySdk.getSdkTracerProvider().forceFlush().join(10, TimeUnit.SECONDS);
openTelemetrySdk.getSdkLoggerProvider().forceFlush().join(10, TimeUnit.SECONDS);
openTelemetrySdk.getSdkMeterProvider().forceFlush().join(10, TimeUnit.SECONDS);
@@ -297,17 +287,6 @@ public class FullConfigTest {
assertThat(logRecord.getBody().getStringValue()).isEqualTo("info log message");
assertThat(logRecord.getSeverityNumberValue())
.isEqualTo(Severity.INFO.getSeverityNumber());
- },
- logRecord -> {
- assertThat(logRecord.getBody().getKvlistValue().getValuesList())
- .containsExactlyInAnyOrder(
- KeyValue.newBuilder()
- .setKey("cow")
- .setValue(AnyValue.newBuilder().setStringValue("moo").build())
- .build());
- assertThat(logRecord.getSeverityNumber())
- .isEqualTo(SeverityNumber.SEVERITY_NUMBER_INFO);
- assertThat(logRecord.getEventName()).isEqualTo("namespace.test-name");
});
}
diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
similarity index 66%
rename from sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java
rename to sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
index ef0b05b2da..22fe2c6ef9 100644
--- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FileConfigurationTest.java
+++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java
@@ -6,6 +6,8 @@
package io.opentelemetry.sdk.autoconfigure;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
+import static java.util.Collections.singletonMap;
+import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
@@ -17,13 +19,18 @@ import static org.mockito.Mockito.verify;
import io.github.netmikey.logunit.api.LogCapturer;
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.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.internal.testing.CleanupExtension;
+import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
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.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@@ -31,14 +38,16 @@ import java.io.IOException;
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.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.api.io.TempDir;
import org.slf4j.event.Level;
-class FileConfigurationTest {
+class DeclarativeConfigurationTest {
@RegisterExtension private static final CleanupExtension cleanup = new CleanupExtension();
@@ -63,13 +72,43 @@ class FileConfigurationTest {
+ " - 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();
+ GlobalConfigProvider.resetForTest();
+ }
+
+ @Test
+ @SuppressLogger(AutoConfiguredOpenTelemetrySdkBuilder.class)
+ void configFile_fileNotFound() {
+ assertThatThrownBy(
+ () ->
+ AutoConfiguredOpenTelemetrySdk.builder()
+ .addPropertiesSupplier(() -> singletonMap("otel.config.file", "foo"))
+ .addPropertiesSupplier(
+ () -> singletonMap("otel.experimental.config.file", "foo"))
+ .addPropertiesSupplier(() -> singletonMap("otel.sdk.disabled", "true"))
+ .build())
+ .isInstanceOf(ConfigurationException.class)
+ .hasMessageContaining("Configuration file not found");
+
+ assertThatCode(
+ () ->
+ AutoConfiguredOpenTelemetrySdk.builder()
+ .addPropertiesSupplier(() -> singletonMap("otel.experimental.config.file", ""))
+ .addPropertiesSupplier(() -> singletonMap("otel.sdk.disabled", "true"))
+ .build())
+ .doesNotThrowAnyException();
}
@Test
@@ -95,13 +134,14 @@ class FileConfigurationTest {
builder.setConfig(config).build();
cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
- assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString())
+ Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString())
.isEqualTo(expectedSdk.toString());
// AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from
// file
- assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault());
+ Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getResource())
+ .isEqualTo(Resource.getDefault());
verify(builder, times(1)).shutdownHook(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
- assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue();
+ Assertions.assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue();
logCapturer.assertContains("Autoconfiguring from configuration file: " + configFilePath);
}
@@ -131,7 +171,11 @@ class FileConfigurationTest {
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
cleanup.addCloseable(openTelemetrySdk);
- assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isNotSameAs(openTelemetrySdk);
+ Assertions.assertThat(GlobalOpenTelemetry.get())
+ .extracting("delegate")
+ .isNotSameAs(openTelemetrySdk);
+ assertThat(GlobalConfigProvider.get())
+ .isNotSameAs(autoConfiguredOpenTelemetrySdk.getConfigProvider());
}
@Test
@@ -145,7 +189,11 @@ class FileConfigurationTest {
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
cleanup.addCloseable(openTelemetrySdk);
- assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isSameAs(openTelemetrySdk);
+ Assertions.assertThat(GlobalOpenTelemetry.get())
+ .extracting("delegate")
+ .isSameAs(openTelemetrySdk);
+ assertThat(GlobalConfigProvider.get())
+ .isSameAs(autoConfiguredOpenTelemetrySdk.getConfigProvider());
}
@Test
@@ -174,7 +222,7 @@ class FileConfigurationTest {
}
@Test
- void configFile_StructuredConfigProperties() {
+ void configFile_ConfigProvider() {
ConfigProperties config =
DefaultConfigProperties.createFromMap(
Collections.singletonMap("otel.experimental.config.file", configFilePath.toString()));
@@ -185,14 +233,19 @@ class FileConfigurationTest {
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));
+ DeclarativeConfigProperties 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 92be979672..20e91bd2e5 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
+ api(project(":api:incubator"))
implementation("com.fasterxml.jackson.core:jackson-databind")
api("com.fasterxml.jackson.core:jackson-annotations")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml")
@@ -39,7 +40,8 @@ dependencies {
testImplementation(project(":sdk-extensions:jaeger-remote-sampler"))
testImplementation(project(":extensions:trace-propagators"))
// As a part of the tests we check that we can parse examples without error. The https://github.com/open-telemetry/opentelemetry-configuration/blob/main/examples/kitchen-sink.yam contains a reference to the xray propagator
- testImplementation("io.opentelemetry.contrib:opentelemetry-aws-xray-propagator")
+ // TODO: add when updated to reflect new API locations
+ // testImplementation("io.opentelemetry.contrib:opentelemetry-aws-xray-propagator")
testImplementation("com.linecorp.armeria:armeria-junit5")
testImplementation("com.google.guava:guava-testlib")
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 5626d27c21..b856d0da4a 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.DeclarativeConfigException;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
-import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AggregationModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Base2ExponentialBucketHistogramModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExplicitBucketHistogramModel;
@@ -50,7 +50,7 @@ final class AggregationFactory implements Factory
try {
return Aggregation.base2ExponentialBucketHistogram(maxSize, maxScale);
} catch (IllegalArgumentException e) {
- throw new ConfigurationException("Invalid exponential bucket histogram", e);
+ throw new DeclarativeConfigException("Invalid exponential bucket histogram", e);
}
}
ExplicitBucketHistogramModel explicitBucketHistogram = model.getExplicitBucketHistogram();
@@ -62,7 +62,7 @@ final class AggregationFactory implements Factory
try {
return Aggregation.explicitBucketHistogram(boundaries);
} catch (IllegalArgumentException e) {
- throw new ConfigurationException("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/AttributeListFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributeListFactory.java
index 23d08e7fae..c79f1503e3 100644
--- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributeListFactory.java
+++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AttributeListFactory.java
@@ -10,8 +10,8 @@ import static java.util.stream.Collectors.toList;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
+import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
-import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel;
import java.io.Closeable;
import java.util.List;
@@ -115,7 +115,7 @@ final class AttributeListFactory implements Factoryopen-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_]*)(:-([^\n}]*))?}");
private static final ComponentLoader DEFAULT_COMPONENT_LOADER =
- SpiHelper.serviceComponentLoader(FileConfiguration.class.getClassLoader());
+ SpiHelper.serviceComponentLoader(DeclarativeConfiguration.class.getClassLoader());
private static final ObjectMapper MAPPER;
@@ -70,12 +72,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(OpenTelemetryConfigurationModel)}.
*
- * @throws ConfigurationException if unable to parse or interpret
+ * @throws DeclarativeConfigException if unable to parse or interpret
*/
public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) {
OpenTelemetryConfigurationModel configurationModel = parse(inputStream);
@@ -88,7 +90,7 @@ public final class FileConfiguration {
*
* @param configurationModel the configuration model
* @return the {@link OpenTelemetrySdk}
- * @throws ConfigurationException if unable to interpret
+ * @throws DeclarativeConfigException if unable to interpret
*/
public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurationModel) {
return create(configurationModel, DEFAULT_COMPONENT_LOADER);
@@ -102,7 +104,7 @@ public final class FileConfiguration {
* @param componentLoader the component loader used to load {@link ComponentProvider}
* implementations
* @return the {@link OpenTelemetrySdk}
- * @throws ConfigurationException if unable to interpret
+ * @throws DeclarativeConfigException if unable to interpret
*/
public static OpenTelemetrySdk create(
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
@@ -118,13 +120,13 @@ public final class FileConfiguration {
* Before parsing, environment variable substitution is performed as described in {@link
* EnvSubstitutionConstructor}.
*
- * @throws ConfigurationException if unable to parse
+ * @throws DeclarativeConfigException if unable to parse
*/
public static OpenTelemetryConfigurationModel parse(InputStream configuration) {
try {
return parse(configuration, System.getenv());
} catch (RuntimeException e) {
- throw new ConfigurationException("Unable to parse configuration input stream", e);
+ throw new DeclarativeConfigException("Unable to parse configuration input stream", e);
}
}
@@ -143,35 +145,35 @@ public final class FileConfiguration {
}
/**
- * Convert the {@code model} to a generic {@link StructuredConfigProperties}.
+ * Convert the {@code model} to a generic {@link DeclarativeConfigProperties}.
*
* @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(
+ public static DeclarativeConfigProperties toConfigProperties(
OpenTelemetryConfigurationModel model) {
return toConfigProperties(model, DEFAULT_COMPONENT_LOADER);
}
/**
- * Convert the {@code configuration} YAML to a generic {@link StructuredConfigProperties}.
+ * Convert the {@code configuration} YAML to a generic {@link DeclarativeConfigProperties}.
*
* @param configuration configuration YAML
- * @return a generic {@link StructuredConfigProperties} representation of the model
+ * @return a generic {@link DeclarativeConfigProperties} representation of the model
*/
- public static StructuredConfigProperties toConfigProperties(InputStream configuration) {
+ public static DeclarativeConfigProperties toConfigProperties(InputStream configuration) {
Object yamlObj = loadYaml(configuration, System.getenv());
return toConfigProperties(yamlObj, DEFAULT_COMPONENT_LOADER);
}
- static StructuredConfigProperties toConfigProperties(
+ static DeclarativeConfigProperties toConfigProperties(
Object model, ComponentLoader componentLoader) {
Map configurationMap =
MAPPER.convertValue(model, new TypeReference