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..4f864ac8c89 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,11 +16,10 @@ *

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() { + public Class getType() { return LogRecordExporter.class; } 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..15df12c9abb 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,11 +16,10 @@ *

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() { + public Class getType() { return MetricExporter.class; } 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..1f2e5b47e4e 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,11 +16,10 @@ *

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() { + public Class getType() { return SpanExporter.class; } 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..3a1b0934935 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,7 +333,7 @@ protected T exporterFromComponentProvider(DeclarativeConfigProperties properties properties.getComponentLoader().load(ComponentProvider.class).spliterator(), false) .filter( p -> { - ComponentProvider c = p; + ComponentProvider c = p; return "otlp_file/development".equals(c.getName()) && c.getType().equals(componentProviderType); }) 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..24aac9fddda 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,11 +16,10 @@ *

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() { + public Class getType() { return LogRecordExporter.class; } 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..7c0c46bf82f 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,11 +16,10 @@ *

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() { + public Class getType() { return MetricExporter.class; } 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..09ab0c5a003 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,10 +16,10 @@ *

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() { + public Class getType() { return SpanExporter.class; } 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..190adb820e9 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,11 +19,10 @@ *

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() { + public Class getType() { return LogRecordExporter.class; } 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..2002adddf2e 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,10 +20,10 @@ *

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() { + public Class getType() { return MetricExporter.class; } 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..449c59096f7 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,10 +19,10 @@ *

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() { + public Class getType() { return SpanExporter.class; } 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..4c4ae862264 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,11 +19,10 @@ *

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() { + public Class getType() { return LogRecordExporter.class; } 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..f4d1dc17e78 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,10 +20,10 @@ *

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() { + public Class getType() { return MetricExporter.class; } 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..7b5b3a38e25 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,10 +19,10 @@ *

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() { + public Class getType() { return SpanExporter.class; } 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 25d069db7a8..0ea696596f8 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,10 +19,10 @@ *

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() { + public Class getType() { return MetricReader.class; } 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..213640a5033 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,9 +18,9 @@ *

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() { + 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..061c408c379 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,10 +17,10 @@ *

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() { + public Class getType() { return TextMapPropagator.class; } 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..e7f9f4fb032 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,10 +17,10 @@ *

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() { + public Class getType() { return TextMapPropagator.class; } 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..6d4ed47e184 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,10 +16,10 @@ *

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() { + public Class getType() { return TextMapPropagator.class; } 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..79c99906eb2 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,10 +17,10 @@ *

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() { + public Class getType() { return TextMapPropagator.class; } 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/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 9cc697ecaea..e9a0780d5b3 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 @@ -13,7 +13,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.function.Function; import java.util.stream.Collectors; /** Declarative configuration context and state carrier. */ @@ -54,11 +53,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())) @@ -79,10 +75,10 @@ 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); + return (T) provider.create(config); } 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..81bf7426c54 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 = @@ -25,7 +25,7 @@ public class ServiceResourceDetector implements ComponentProvider { private static final String RANDOM_SERVICE_INSTANCE_ID = UUID.randomUUID().toString(); @Override - public Class getType() { + public Class getType() { return Resource.class; } 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..98c37ed175c 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,9 +12,9 @@ // 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() { + 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..e4472c7eefe 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,9 +12,9 @@ // 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() { + 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..01ddd2811c6 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,9 +12,9 @@ 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() { + 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..e43d2f10627 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,9 +12,9 @@ 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() { + 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..b372282f6c0 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,9 +15,9 @@ 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() { + 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..4420fc4afee 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,9 +12,9 @@ // 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() { + 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..4df018bc9c3 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,9 +12,9 @@ // 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() { + 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..4fc9f676eb3 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,9 +9,9 @@ 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() { + 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..2c400665a7b 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,9 +9,9 @@ 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() { + 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..2192ede151d 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,9 +9,9 @@ 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() { + 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..056b371a4dd 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,9 +15,9 @@ 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() { + 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..00415e6b8c3 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,9 +12,9 @@ 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() { + 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..a82d99aa1ec 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,9 +13,9 @@ 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() { + 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..f1a11ee7ec4 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,9 +15,9 @@ import java.util.Collections; import javax.annotation.Nullable; -public class TextMapPropagatorComponentProvider implements ComponentProvider { +public class TextMapPropagatorComponentProvider implements ComponentProvider { @Override - public Class getType() { + 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..1391b01fdfa 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,9 +19,9 @@ *

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() { + public Class getType() { return Sampler.class; }