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 ee6fbfe66ba..3feebf33811 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 @@ -16,8 +16,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class OtlpStdoutLogRecordExporterComponentProvider - implements ComponentProvider { +public final class OtlpStdoutLogRecordExporterComponentProvider implements ComponentProvider { @Override public Class getType() { 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 70de404af14..bf8d8a73be9 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 @@ -16,8 +16,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class OtlpStdoutMetricExporterComponentProvider - implements ComponentProvider { +public final class OtlpStdoutMetricExporterComponentProvider implements ComponentProvider { @Override public Class getType() { 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 e16ac868e3b..969b804f863 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 @@ -16,8 +16,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class OtlpStdoutSpanExporterComponentProvider - implements ComponentProvider { +public final class OtlpStdoutSpanExporterComponentProvider implements ComponentProvider { @Override public Class getType() { 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 44b046aca42..a7313d2ded8 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 @@ -333,9 +333,8 @@ protected T exporterFromComponentProvider(DeclarativeConfigProperties properties properties.getComponentLoader().load(ComponentProvider.class).spliterator(), false) .filter( p -> { - ComponentProvider c = p; - return "otlp_file/development".equals(c.getName()) - && c.getType().equals(componentProviderType); + return "otlp_file/development".equals(p.getName()) + && p.getType().equals(componentProviderType); }) .findFirst() .orElseThrow(() -> new IllegalStateException("No provider found")) 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 2d8141cc4f2..1ff39c6de30 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 @@ -16,8 +16,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class ConsoleLogRecordExporterComponentProvider - implements ComponentProvider { +public final class ConsoleLogRecordExporterComponentProvider implements ComponentProvider { @Override public Class getType() { 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 6fab453403f..35599f84c14 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 @@ -16,8 +16,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class ConsoleMetricExporterComponentProvider - implements ComponentProvider { +public final class ConsoleMetricExporterComponentProvider implements ComponentProvider { @Override public Class getType() { 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 fd65a5acad8..fa5de9ee948 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 @@ -16,7 +16,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class ConsoleSpanExporterComponentProvider implements ComponentProvider { +public final class ConsoleSpanExporterComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcLogRecordExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcLogRecordExporterComponentProvider.java index f8faab7a00a..6afb9a601cd 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcLogRecordExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcLogRecordExporterComponentProvider.java @@ -19,8 +19,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpGrpcLogRecordExporterComponentProvider - implements ComponentProvider { +public class OtlpGrpcLogRecordExporterComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcMetricExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcMetricExporterComponentProvider.java index 25f8341fb07..cf8107f8499 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcMetricExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcMetricExporterComponentProvider.java @@ -20,7 +20,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpGrpcMetricExporterComponentProvider implements ComponentProvider { +public class OtlpGrpcMetricExporterComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcSpanExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcSpanExporterComponentProvider.java index 84e230ca515..17995efb946 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcSpanExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpGrpcSpanExporterComponentProvider.java @@ -19,7 +19,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpGrpcSpanExporterComponentProvider implements ComponentProvider { +public class OtlpGrpcSpanExporterComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpLogRecordExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpLogRecordExporterComponentProvider.java index e6a513e8982..a2850b254ca 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpLogRecordExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpLogRecordExporterComponentProvider.java @@ -19,8 +19,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpHttpLogRecordExporterComponentProvider - implements ComponentProvider { +public class OtlpHttpLogRecordExporterComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpMetricExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpMetricExporterComponentProvider.java index d6cc1bf62d1..0b59ee9380a 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpMetricExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpMetricExporterComponentProvider.java @@ -20,7 +20,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpHttpMetricExporterComponentProvider implements ComponentProvider { +public class OtlpHttpMetricExporterComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpSpanExporterComponentProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpSpanExporterComponentProvider.java index 752e9698dcf..d97b2e30628 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpSpanExporterComponentProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpHttpSpanExporterComponentProvider.java @@ -19,7 +19,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpHttpSpanExporterComponentProvider implements ComponentProvider { +public class OtlpHttpSpanExporterComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java index 37aa7f9a7be..9968c279536 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java @@ -19,7 +19,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class PrometheusComponentProvider implements ComponentProvider { +public class PrometheusComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java index 42c43eef14a..ec2d1624479 100644 --- a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java +++ b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/internal/ZipkinSpanExporterComponentProvider.java @@ -18,7 +18,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class ZipkinSpanExporterComponentProvider implements ComponentProvider { +public class ZipkinSpanExporterComponentProvider implements ComponentProvider { @Override public Class getType() { return SpanExporter.class; diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3ComponentProvider.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3ComponentProvider.java index ebd766640f9..1a0d9e27d6d 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3ComponentProvider.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3ComponentProvider.java @@ -17,7 +17,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class B3ComponentProvider implements ComponentProvider { +public final class B3ComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3MultiComponentProvider.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3MultiComponentProvider.java index 0fb223d81a7..9ae7c23d451 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3MultiComponentProvider.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/B3MultiComponentProvider.java @@ -17,7 +17,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class B3MultiComponentProvider implements ComponentProvider { +public final class B3MultiComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/JaegerComponentProvider.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/JaegerComponentProvider.java index 1326dd4cc83..28b8c4acf54 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/JaegerComponentProvider.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/JaegerComponentProvider.java @@ -16,7 +16,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class JaegerComponentProvider implements ComponentProvider { +public final class JaegerComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/OtTraceComponentProvider.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/OtTraceComponentProvider.java index 261eb5f8585..17303541fab 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/OtTraceComponentProvider.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/internal/OtTraceComponentProvider.java @@ -17,7 +17,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public final class OtTraceComponentProvider implements ComponentProvider { +public final class OtTraceComponentProvider implements ComponentProvider { @Override public Class getType() { diff --git a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java index 5772a0a1797..30a544887c6 100644 --- a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java +++ b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ComponentProvider.java @@ -27,18 +27,17 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. * - * @param the type of the SDK extension component. See {@link #getType()}. Supported values - * include: {@link SpanExporter}, {@link MetricExporter}, {@link LogRecordExporter}, {@link - * SpanProcessor}, {@link LogRecordProcessor}, {@link TextMapPropagator}, {@link Sampler}, - * {@link Resource}. + *

Supported component types include: {@link SpanExporter}, {@link MetricExporter}, {@link + * LogRecordExporter}, {@link SpanProcessor}, {@link LogRecordProcessor}, {@link TextMapPropagator}, + * {@link Sampler}, {@link Resource}. */ -public interface ComponentProvider { +public interface ComponentProvider { /** * The type of SDK extension component. For example, if providing instances of a custom span * exporter, the type would be {@link SpanExporter}. */ - Class getType(); + Class getType(); /** * The name of the exporter, to be referenced in configuration files. For example, if providing @@ -59,5 +58,5 @@ public interface ComponentProvider { */ // TODO (jack-berg): consider dynamic configuration use case before stabilizing in case that // affects any API decisions - T create(DeclarativeConfigProperties config); + Object create(DeclarativeConfigProperties config); } diff --git a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java index 65cdf2df576..a9c0bd22662 100644 --- a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java +++ b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java @@ -11,7 +11,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.resources.Resource; -public class TestResourceDetector implements ComponentProvider, AutoConfigureListener { +public class TestResourceDetector implements ComponentProvider, AutoConfigureListener { @SuppressWarnings("NonFinalStaticField") static boolean initialized = false; diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java index a53eb1d13c5..e93d85c3604 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java @@ -16,7 +16,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -90,11 +89,8 @@ T loadComponent(Class type, String name, Object model) { // TODO(jack-berg): cache loaded component providers List componentProviders = spiHelper.load(ComponentProvider.class); - List> matchedProviders = + List matchedProviders = componentProviders.stream() - .map( - (Function>) - componentProvider -> componentProvider) .filter( componentProvider -> componentProvider.getType() == type && name.equals(componentProvider.getName())) @@ -115,10 +111,22 @@ T loadComponent(Class type, String name, Object model) { .collect(Collectors.joining(",", "[", "]"))); } // Exactly one matching component provider - ComponentProvider provider = (ComponentProvider) matchedProviders.get(0); + ComponentProvider provider = matchedProviders.get(0); try { - return provider.create(config); + Object component = provider.create(config); + if (component != null && !type.isInstance(component)) { + throw new DeclarativeConfigException( + "Error configuring " + + type.getName() + + " with name \"" + + name + + "\". Component provider " + + provider.getClass().getName() + + " returned an unexpected component type: " + + component.getClass().getName()); + } + return (T) component; } catch (Throwable throwable) { throw new DeclarativeConfigException( "Error configuring " + type.getName() + " with name \"" + name + "\"", throwable); diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java index dcaeeee2718..2bd59f046e9 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java @@ -15,7 +15,7 @@ import java.util.Collections; import java.util.UUID; -public class ServiceResourceDetector implements ComponentProvider { +public class ServiceResourceDetector implements ComponentProvider { private static final AttributeKey SERVICE_NAME = AttributeKey.stringKey("service.name"); private static final AttributeKey SERVICE_INSTANCE_ID = diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/CapturingComponentLoader.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/CapturingComponentLoader.java new file mode 100644 index 00000000000..ee99e1e1517 --- /dev/null +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/CapturingComponentLoader.java @@ -0,0 +1,76 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.common.ComponentLoader; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A test utility that captures the configuration passed to component providers during loading. This + * allows tests to verify that component providers receive the expected configuration. + */ +class CapturingComponentLoader implements ComponentLoader { + + private final ComponentLoader delegate; + private final Map capturedConfigs = + new ConcurrentHashMap<>(); + + CapturingComponentLoader() { + delegate = ComponentLoader.forClassLoader(getClass().getClassLoader()); + } + + DeclarativeConfigProperties getCapturedConfig(String name) { + return capturedConfigs.get(name); + } + + @Override + public Iterable load(Class spiClass) { + if (spiClass == ComponentProvider.class) { + return createWrappedComponentProviders(); + } + return delegate.load(spiClass); + } + + @SuppressWarnings("unchecked") + private Iterable createWrappedComponentProviders() { + List wrappedProviders = new ArrayList<>(); + for (ComponentProvider provider : delegate.load(ComponentProvider.class)) { + ComponentProvider wrapped = new CapturingComponentProvider(provider); + wrappedProviders.add((T) wrapped); + } + return wrappedProviders; + } + + private class CapturingComponentProvider implements ComponentProvider { + + private final ComponentProvider delegate; + + CapturingComponentProvider(ComponentProvider delegate) { + this.delegate = delegate; + } + + @Override + public Class getType() { + return delegate.getType(); + } + + @Override + public String getName() { + return delegate.getName(); + } + + @Override + public Object create(DeclarativeConfigProperties config) { + capturedConfigs.put(getName(), config); + return delegate.create(config); + } + } +} diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java index d1964c15de3..054e2c312d1 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LogRecordExporterFactoryTest.java @@ -8,9 +8,6 @@ import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigTestUtil.createTempFileWithContent; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableMap; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; @@ -21,7 +18,6 @@ import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.component.LogRecordExporterComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel; @@ -36,22 +32,12 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.io.TempDir; -import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.junit.jupiter.MockitoSettings; -import org.mockito.quality.Strictness; - -@ExtendWith(MockitoExtension.class) -@MockitoSettings(strictness = Strictness.LENIENT) + class LogRecordExporterFactoryTest { @RegisterExtension @@ -62,39 +48,24 @@ class LogRecordExporterFactoryTest { @RegisterExtension CleanupExtension cleanup = new CleanupExtension(); - private final SpiHelper spiHelper = - spy(SpiHelper.create(SpanExporterFactoryTest.class.getClassLoader())); - private final DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper); - private List> loadedComponentProviders = Collections.emptyList(); + private CapturingComponentLoader capturingComponentLoader; + private SpiHelper spiHelper; + private DeclarativeConfigContext context; @BeforeEach - @SuppressWarnings("unchecked") void setup() { - when(spiHelper.load(ComponentProvider.class)) - .thenAnswer( - invocation -> { - List> result = - (List>) invocation.callRealMethod(); - loadedComponentProviders = - result.stream().map(Mockito::spy).collect(Collectors.toList()); - return loadedComponentProviders; - }); - } - - private ComponentProvider getComponentProvider(String name, Class type) { - return loadedComponentProviders.stream() - .filter( - componentProvider -> - componentProvider.getName().equals(name) - && componentProvider.getType().equals(type)) - .findFirst() - .orElseThrow(IllegalStateException::new); + capturingComponentLoader = new CapturingComponentLoader(); + spiHelper = SpiHelper.create(capturingComponentLoader); + context = new DeclarativeConfigContext(spiHelper); } @Test void create_OtlpHttpDefaults() { List closeables = new ArrayList<>(); - OtlpHttpLogRecordExporter expectedExporter = OtlpHttpLogRecordExporter.getDefault(); + OtlpHttpLogRecordExporter expectedExporter = + OtlpHttpLogRecordExporter.getDefault().toBuilder() + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass + .build(); cleanup.addCloseable(expectedExporter); LogRecordExporter exporter = @@ -106,14 +77,10 @@ void create_OtlpHttpDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_http", LogRecordExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_http"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("protocol")).isNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); @@ -135,6 +102,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) .addHeader("key2", "value2") .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass .build(); cleanup.addCloseable(expectedExporter); @@ -174,12 +142,10 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_http", LogRecordExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_http"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318/v1/logs"); List headers = configProperties.getStructuredList("headers"); assertThat(headers) @@ -204,7 +170,10 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) @Test void create_OtlpGrpcDefaults() { List closeables = new ArrayList<>(); - OtlpGrpcLogRecordExporter expectedExporter = OtlpGrpcLogRecordExporter.getDefault(); + OtlpGrpcLogRecordExporter expectedExporter = + OtlpGrpcLogRecordExporter.getDefault().toBuilder() + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass + .build(); cleanup.addCloseable(expectedExporter); LogRecordExporter exporter = @@ -216,14 +185,10 @@ void create_OtlpGrpcDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", LogRecordExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_grpc"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); assertThat(configProperties.getString("compression")).isNull(); @@ -244,6 +209,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) .addHeader("key2", "value2") .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass .build(); cleanup.addCloseable(expectedExporter); @@ -283,12 +249,10 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", LogRecordExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_grpc"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4317"); List headers = configProperties.getStructuredList("headers"); assertThat(headers) @@ -327,11 +291,10 @@ void create_OtlpFile() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_file/development", LogRecordExporter.class); - verify(componentProvider).create(configCaptor.capture()); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_file/development"); + assertThat(configProperties).isNotNull(); } @Test diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java index d5aa856877d..5fe2da41942 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricExporterFactoryTest.java @@ -8,9 +8,6 @@ import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigTestUtil.createTempFileWithContent; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableMap; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; @@ -22,7 +19,6 @@ import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.component.MetricExporterComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileMetricExporterModel; @@ -42,22 +38,12 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.io.TempDir; -import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.junit.jupiter.MockitoSettings; -import org.mockito.quality.Strictness; - -@ExtendWith(MockitoExtension.class) -@MockitoSettings(strictness = Strictness.LENIENT) + class MetricExporterFactoryTest { @RegisterExtension @@ -68,39 +54,24 @@ class MetricExporterFactoryTest { @RegisterExtension CleanupExtension cleanup = new CleanupExtension(); - private final SpiHelper spiHelper = - spy(SpiHelper.create(SpanExporterFactoryTest.class.getClassLoader())); - private final DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper); - private List> loadedComponentProviders = Collections.emptyList(); + private CapturingComponentLoader capturingComponentLoader; + private SpiHelper spiHelper; + private DeclarativeConfigContext context; @BeforeEach - @SuppressWarnings("unchecked") void setup() { - when(spiHelper.load(ComponentProvider.class)) - .thenAnswer( - invocation -> { - List> result = - (List>) invocation.callRealMethod(); - loadedComponentProviders = - result.stream().map(Mockito::spy).collect(Collectors.toList()); - return loadedComponentProviders; - }); - } - - private ComponentProvider getComponentProvider(String name, Class type) { - return loadedComponentProviders.stream() - .filter( - componentProvider -> - componentProvider.getName().equals(name) - && componentProvider.getType().equals(type)) - .findFirst() - .orElseThrow(IllegalStateException::new); + capturingComponentLoader = new CapturingComponentLoader(); + spiHelper = SpiHelper.create(capturingComponentLoader); + context = new DeclarativeConfigContext(spiHelper); } @Test void create_OtlpHttpDefaults() { List closeables = new ArrayList<>(); - OtlpHttpMetricExporter expectedExporter = OtlpHttpMetricExporter.getDefault(); + OtlpHttpMetricExporter expectedExporter = + OtlpHttpMetricExporter.getDefault().toBuilder() + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass + .build(); cleanup.addCloseable(expectedExporter); MetricExporter exporter = @@ -113,12 +84,10 @@ void create_OtlpHttpDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_http", MetricExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_http"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("protocol")).isNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); @@ -146,6 +115,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) .setDefaultAggregationSelector( DefaultAggregationSelector.getDefault() .with(InstrumentType.HISTOGRAM, Aggregation.base2ExponentialBucketHistogram())) + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass .build(); cleanup.addCloseable(expectedExporter); @@ -190,12 +160,10 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_http", MetricExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_http"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318/v1/metrics"); List headers = configProperties.getStructuredList("headers"); assertThat(headers) @@ -223,7 +191,10 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) @Test void create_OtlpGrpcDefaults() { List closeables = new ArrayList<>(); - OtlpGrpcMetricExporter expectedExporter = OtlpGrpcMetricExporter.getDefault(); + OtlpGrpcMetricExporter expectedExporter = + OtlpGrpcMetricExporter.getDefault().toBuilder() + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass + .build(); cleanup.addCloseable(expectedExporter); MetricExporter exporter = @@ -236,12 +207,10 @@ void create_OtlpGrpcDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", MetricExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_grpc"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); assertThat(configProperties.getString("compression")).isNull(); @@ -268,6 +237,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) .setDefaultAggregationSelector( DefaultAggregationSelector.getDefault() .with(InstrumentType.HISTOGRAM, Aggregation.base2ExponentialBucketHistogram())) + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass .build(); cleanup.addCloseable(expectedExporter); @@ -312,12 +282,10 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", MetricExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_grpc"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4317"); List headers = configProperties.getStructuredList("headers"); assertThat(headers) @@ -374,11 +342,10 @@ void create_OtlpFile() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_file/development", MetricExporter.class); - verify(componentProvider).create(configCaptor.capture()); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_file/development"); + assertThat(configProperties).isNotNull(); } @Test diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java index 3bcd13c9731..2896cc55bd3 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanExporterFactoryTest.java @@ -8,9 +8,6 @@ import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigTestUtil.createTempFileWithContent; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableMap; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; @@ -23,7 +20,6 @@ import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; -import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.component.SpanExporterComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileExporterModel; @@ -40,22 +36,12 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.io.TempDir; -import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.junit.jupiter.MockitoSettings; -import org.mockito.quality.Strictness; - -@ExtendWith(MockitoExtension.class) -@MockitoSettings(strictness = Strictness.LENIENT) + class SpanExporterFactoryTest { @RegisterExtension @@ -66,39 +52,24 @@ class SpanExporterFactoryTest { @RegisterExtension CleanupExtension cleanup = new CleanupExtension(); - private final SpiHelper spiHelper = - spy(SpiHelper.create(SpanExporterFactoryTest.class.getClassLoader())); - private final DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper); - private List> loadedComponentProviders = Collections.emptyList(); + private CapturingComponentLoader capturingComponentLoader; + private SpiHelper spiHelper; + private DeclarativeConfigContext context; @BeforeEach - @SuppressWarnings("unchecked") void setup() { - when(spiHelper.load(ComponentProvider.class)) - .thenAnswer( - invocation -> { - List> result = - (List>) invocation.callRealMethod(); - loadedComponentProviders = - result.stream().map(Mockito::spy).collect(Collectors.toList()); - return loadedComponentProviders; - }); - } - - private ComponentProvider getComponentProvider(String name, Class type) { - return loadedComponentProviders.stream() - .filter( - componentProvider -> - componentProvider.getName().equals(name) - && componentProvider.getType().equals(type)) - .findFirst() - .orElseThrow(IllegalStateException::new); + capturingComponentLoader = new CapturingComponentLoader(); + spiHelper = SpiHelper.create(capturingComponentLoader); + context = new DeclarativeConfigContext(spiHelper); } @Test void create_OtlpHttpDefaults() { List closeables = new ArrayList<>(); - OtlpHttpSpanExporter expectedExporter = OtlpHttpSpanExporter.getDefault(); + OtlpHttpSpanExporter expectedExporter = + OtlpHttpSpanExporter.getDefault().toBuilder() + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass + .build(); cleanup.addCloseable(expectedExporter); SpanExporter exporter = @@ -109,11 +80,10 @@ void create_OtlpHttpDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_http", SpanExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_http"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("protocol")).isNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); @@ -135,6 +105,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) .addHeader("key2", "value2") .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass .build(); cleanup.addCloseable(expectedExporter); @@ -174,11 +145,10 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_http", SpanExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_http"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318/v1/traces"); List headers = configProperties.getStructuredList("headers"); assertThat(headers) @@ -203,7 +173,10 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) @Test void create_OtlpGrpcDefaults() { List closeables = new ArrayList<>(); - OtlpGrpcSpanExporter expectedExporter = OtlpGrpcSpanExporter.getDefault(); + OtlpGrpcSpanExporter expectedExporter = + OtlpGrpcSpanExporter.getDefault().toBuilder() + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass + .build(); cleanup.addCloseable(expectedExporter); SpanExporter exporter = @@ -214,11 +187,10 @@ void create_OtlpGrpcDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_grpc", SpanExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_grpc"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getStructured("headers")).isNull(); assertThat(configProperties.getString("compression")).isNull(); @@ -239,6 +211,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) .addHeader("key2", "value2") .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") + .setComponentLoader(capturingComponentLoader) // needed for the toString() check to pass .build(); cleanup.addCloseable(expectedExporter); @@ -278,11 +251,10 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_grpc", SpanExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_grpc"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4317"); List headers = configProperties.getStructuredList("headers"); assertThat(headers) @@ -334,11 +306,10 @@ void create_ZipkinDefaults() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("zipkin", SpanExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("zipkin"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isNull(); assertThat(configProperties.getLong("timeout")).isNull(); } @@ -367,11 +338,10 @@ void create_ZipkinConfigured() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("zipkin", SpanExporter.class); - verify(componentProvider).create(configCaptor.capture()); - DeclarativeConfigProperties configProperties = configCaptor.getValue(); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("zipkin"); + assertThat(configProperties).isNotNull(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://zipkin:9411/v1/v2/spans"); assertThat(configProperties.getLong("timeout")).isEqualTo(15_000); } @@ -393,11 +363,10 @@ void create_OtlpFile() { assertThat(exporter.toString()).isEqualTo(expectedExporter.toString()); - ArgumentCaptor configCaptor = - ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = - getComponentProvider("otlp_file/development", SpanExporter.class); - verify(componentProvider).create(configCaptor.capture()); + // Verify the configuration passed to the component provider + DeclarativeConfigProperties configProperties = + capturingComponentLoader.getCapturedConfig("otlp_file/development"); + assertThat(configProperties).isNotNull(); } @Test diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ContainerResourceProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ContainerResourceProvider.java index a5d3a331003..8c56339f578 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ContainerResourceProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ContainerResourceProvider.java @@ -12,7 +12,7 @@ // TODO(jack-berg): This allows DeclarativeConfigurationCreateTest to pass with kitchen-sink.yaml // example. Delete after resource providers from opentelemetry-java-instrumentation are renamed to // reflect declarative config naming -public class ContainerResourceProvider implements ComponentProvider { +public class ContainerResourceProvider implements ComponentProvider { @Override public Class getType() { return Resource.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/HostResourceProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/HostResourceProvider.java index bf8d978d9e6..7bff673457d 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/HostResourceProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/HostResourceProvider.java @@ -12,7 +12,7 @@ // TODO(jack-berg): This allows DeclarativeConfigurationCreateTest to pass with kitchen-sink.yaml // example. Delete after resource providers from opentelemetry-java-instrumentation are renamed to // reflect declarative config naming -public class HostResourceProvider implements ComponentProvider { +public class HostResourceProvider implements ComponentProvider { @Override public Class getType() { return Resource.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java index f21c1d1bf09..cae58c59540 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordExporterComponentProvider.java @@ -12,7 +12,7 @@ import io.opentelemetry.sdk.logs.export.LogRecordExporter; import java.util.Collection; -public class LogRecordExporterComponentProvider implements ComponentProvider { +public class LogRecordExporterComponentProvider implements ComponentProvider { @Override public Class getType() { return LogRecordExporter.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordProcessorComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordProcessorComponentProvider.java index a44cd939c74..28724787319 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordProcessorComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/LogRecordProcessorComponentProvider.java @@ -12,7 +12,7 @@ import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.ReadWriteLogRecord; -public class LogRecordProcessorComponentProvider implements ComponentProvider { +public class LogRecordProcessorComponentProvider implements ComponentProvider { @Override public Class getType() { return LogRecordProcessor.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java index 80ea6b556ce..f0860d2fd48 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/MetricExporterComponentProvider.java @@ -15,7 +15,7 @@ import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.Collection; -public class MetricExporterComponentProvider implements ComponentProvider { +public class MetricExporterComponentProvider implements ComponentProvider { @Override public Class getType() { return MetricExporter.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/OsResourceProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/OsResourceProvider.java index 04114fe43bb..a8a6801dca6 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/OsResourceProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/OsResourceProvider.java @@ -12,7 +12,7 @@ // TODO(jack-berg): This allows DeclarativeConfigurationCreateTest to pass with kitchen-sink.yaml // example. Delete after resource providers from opentelemetry-java-instrumentation are renamed to // reflect declarative config naming -public class OsResourceProvider implements ComponentProvider { +public class OsResourceProvider implements ComponentProvider { @Override public Class getType() { return Resource.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ProcessResourceProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ProcessResourceProvider.java index 06d02355f34..87718b791ba 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ProcessResourceProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ProcessResourceProvider.java @@ -12,7 +12,7 @@ // TODO(jack-berg): This allows DeclarativeConfigurationCreateTest to pass with kitchen-sink.yaml // example. Delete after resource providers from opentelemetry-java-instrumentation are renamed to // reflect declarative config naming -public class ProcessResourceProvider implements ComponentProvider { +public class ProcessResourceProvider implements ComponentProvider { @Override public Class getType() { return Resource.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceComponentProvider.java index b5c9a6fd7a3..f15d1919917 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceComponentProvider.java @@ -9,7 +9,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.resources.Resource; -public class ResourceComponentProvider implements ComponentProvider { +public class ResourceComponentProvider implements ComponentProvider { @Override public Class getType() { return Resource.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceFirstComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceFirstComponentProvider.java index 32381134e1b..565dc1c4f96 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceFirstComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceFirstComponentProvider.java @@ -9,7 +9,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.resources.Resource; -public class ResourceFirstComponentProvider implements ComponentProvider { +public class ResourceFirstComponentProvider implements ComponentProvider { @Override public Class getType() { return Resource.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceSecondComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceSecondComponentProvider.java index e77c6726717..f512e1e354f 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceSecondComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/ResourceSecondComponentProvider.java @@ -9,7 +9,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.resources.Resource; -public class ResourceSecondComponentProvider implements ComponentProvider { +public class ResourceSecondComponentProvider implements ComponentProvider { @Override public Class getType() { return Resource.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SamplerComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SamplerComponentProvider.java index 3264dd91fc7..e48a4a0ceab 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SamplerComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SamplerComponentProvider.java @@ -15,7 +15,7 @@ import io.opentelemetry.sdk.trace.samplers.SamplingResult; import java.util.List; -public class SamplerComponentProvider implements ComponentProvider { +public class SamplerComponentProvider implements ComponentProvider { @Override public Class getType() { return Sampler.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java index ddaca3ca4b9..f1068a082b8 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanExporterComponentProvider.java @@ -12,7 +12,7 @@ import io.opentelemetry.sdk.trace.export.SpanExporter; import java.util.Collection; -public class SpanExporterComponentProvider implements ComponentProvider { +public class SpanExporterComponentProvider implements ComponentProvider { @Override public Class getType() { return SpanExporter.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanProcessorComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanProcessorComponentProvider.java index 3a1ddf9b13a..b42a4795ef6 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanProcessorComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/SpanProcessorComponentProvider.java @@ -13,7 +13,7 @@ import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SpanProcessor; -public class SpanProcessorComponentProvider implements ComponentProvider { +public class SpanProcessorComponentProvider implements ComponentProvider { @Override public Class getType() { return SpanProcessor.class; diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/TextMapPropagatorComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/TextMapPropagatorComponentProvider.java index 9c8e4e5ebbf..e87c64feec1 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/TextMapPropagatorComponentProvider.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/TextMapPropagatorComponentProvider.java @@ -15,7 +15,7 @@ import java.util.Collections; import javax.annotation.Nullable; -public class TextMapPropagatorComponentProvider implements ComponentProvider { +public class TextMapPropagatorComponentProvider implements ComponentProvider { @Override public Class getType() { return TextMapPropagator.class; diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java index fd89f42cae9..667a659e91a 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java @@ -19,7 +19,7 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class JaegerRemoteSamplerComponentProvider implements ComponentProvider { +public class JaegerRemoteSamplerComponentProvider implements ComponentProvider { @Override public Class getType() { return Sampler.class;