diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/authenticator/ExporterAuthenticator.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/authenticator/ExporterAuthenticator.java new file mode 100644 index 00000000000..0235dd33615 --- /dev/null +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/authenticator/ExporterAuthenticator.java @@ -0,0 +1,12 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.authenticator; + +import java.util.Map; + +public interface ExporterAuthenticator { + Map getAuthenticationHeaders(); +} diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ComponentProviderLoader.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ComponentProviderLoader.java new file mode 100644 index 00000000000..cf68847fa20 --- /dev/null +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/ComponentProviderLoader.java @@ -0,0 +1,14 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public interface ComponentProviderLoader { + T loadComponent(Class type, String name, DeclarativeConfigProperties properties); +} diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java index cf98312c9e8..f92d33fe0fc 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/DeclarativeConfigProperties.java @@ -232,4 +232,8 @@ default List getStructuredList( /** Return a {@link ComponentLoader} that should be used to load SPIs. */ ComponentLoader getComponentLoader(); + + default ComponentProviderLoader getComponentProviderLoader() { + return EmptyComponentProviderLoader.getInstance(); + } } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/EmptyComponentProviderLoader.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/EmptyComponentProviderLoader.java new file mode 100644 index 00000000000..c1293168e13 --- /dev/null +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/EmptyComponentProviderLoader.java @@ -0,0 +1,22 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.config; + +final class EmptyComponentProviderLoader implements ComponentProviderLoader { + + private static final EmptyComponentProviderLoader INSTANCE = new EmptyComponentProviderLoader(); + + EmptyComponentProviderLoader() {} + + static ComponentProviderLoader getInstance() { + return INSTANCE; + } + + @Override + public T loadComponent(Class type, String name, DeclarativeConfigProperties properties) { + throw new UnsupportedOperationException("Empty ComponentProviderLoader is not implemented"); + } +} diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpDeclarativeConfigUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpDeclarativeConfigUtil.java index b2f174ae3df..b827a9af13d 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpDeclarativeConfigUtil.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpDeclarativeConfigUtil.java @@ -10,6 +10,7 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.readFileBytes; import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.validateEndpoint; +import io.opentelemetry.api.incubator.authenticator.ExporterAuthenticator; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil; @@ -22,8 +23,11 @@ import java.time.Duration; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.function.Supplier; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -51,6 +55,7 @@ public static void configureOtlpExporterBuilder( Consumer setComponentLoader, Consumer setEndpoint, BiConsumer addHeader, + Consumer>> setHeaders, Consumer setCompression, Consumer setTimeout, Consumer setTrustedCertificates, @@ -65,6 +70,27 @@ public static void configureOtlpExporterBuilder( setEndpoint.accept(endpoint.toString()); } + DeclarativeConfigProperties authenticator = config.getStructured("authenticator"); + if (authenticator != null) { + Set propertyKeys = authenticator.getPropertyKeys(); + int size = propertyKeys.size(); + if (size != 1) { + throw new ConfigurationException( + "authenticator must be a single structured property, but found " + + size + + " properties: " + + propertyKeys); + } + + String authenticatorName = propertyKeys.iterator().next(); + ExporterAuthenticator exporterAuthenticator = + config + .getComponentProviderLoader() + .loadComponent(ExporterAuthenticator.class, authenticatorName, authenticator); + + setHeaders.accept(exporterAuthenticator::getAuthenticationHeaders); + } + String headerList = config.getString("headers_list"); if (headerList != null) { ConfigProperties headersListConfig = 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..e65f24aeb2d 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 @@ -42,6 +42,7 @@ public LogRecordExporter create(DeclarativeConfigProperties config) { builder::setComponentLoader, builder::setEndpoint, builder::addHeader, + builder::setHeaders, builder::setCompression, builder::setTimeout, builder::setTrustedCertificates, 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..5c51e9c9c4e 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 @@ -42,6 +42,7 @@ public MetricExporter create(DeclarativeConfigProperties config) { builder::setComponentLoader, builder::setEndpoint, builder::addHeader, + builder::setHeaders, builder::setCompression, builder::setTimeout, builder::setTrustedCertificates, 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..13a92c62fe8 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 @@ -41,6 +41,7 @@ public SpanExporter create(DeclarativeConfigProperties config) { builder::setComponentLoader, builder::setEndpoint, builder::addHeader, + builder::setHeaders, builder::setCompression, builder::setTimeout, builder::setTrustedCertificates, 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..e75a784714e 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 @@ -42,6 +42,7 @@ public LogRecordExporter create(DeclarativeConfigProperties config) { builder::setComponentLoader, builder::setEndpoint, builder::addHeader, + builder::setHeaders, builder::setCompression, builder::setTimeout, builder::setTrustedCertificates, 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..94c6c67253c 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 @@ -42,6 +42,7 @@ public MetricExporter create(DeclarativeConfigProperties config) { builder::setComponentLoader, builder::setEndpoint, builder::addHeader, + builder::setHeaders, builder::setCompression, builder::setTimeout, builder::setTrustedCertificates, 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..911173a769d 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 @@ -41,6 +41,7 @@ public SpanExporter create(DeclarativeConfigProperties config) { builder::setComponentLoader, builder::setEndpoint, builder::addHeader, + builder::setHeaders, builder::setCompression, builder::setTimeout, builder::setTrustedCertificates, diff --git a/sdk-extensions/incubator/build.gradle.kts b/sdk-extensions/incubator/build.gradle.kts index 1bb858d699a..fa991a900a5 100644 --- a/sdk-extensions/incubator/build.gradle.kts +++ b/sdk-extensions/incubator/build.gradle.kts @@ -58,8 +58,9 @@ dependencies { // ... proceed with normal sourcesJar, compileJava, etc val configurationTag = "1.0.0-rc.1" -val configurationRef = "refs/tags/v$configurationTag" // Replace with commit SHA to point to experiment with a specific commit -val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip" +// todo revert this when config PR is merged: https://github.com/open-telemetry/opentelemetry-configuration/pull/275 +val configurationRef = "refs/heads/authenticator" // Replace with commit SHA to point to experiment with a specific commit +val configurationRepoZip = "https://github.com/zeitlinger/opentelemetry-configuration/archive/$configurationRef.zip" val buildDirectory = layout.buildDirectory.asFile.get() val downloadConfigurationSchema by tasks.registering(Download::class) { 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..ffd7c2d3ea9 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 @@ -50,7 +50,12 @@ List getCloseables() { @SuppressWarnings({"unchecked", "rawtypes"}) T loadComponent(Class type, String name, Object model) { DeclarativeConfigProperties config = - DeclarativeConfiguration.toConfigProperties(model, spiHelper.getComponentLoader()); + new DeclarativeConfigPropertiesWithComponentProviderLoader( + model instanceof DeclarativeConfigProperties + ? (DeclarativeConfigProperties) model + : DeclarativeConfiguration.toConfigProperties( + model, spiHelper.getComponentLoader()), + this::loadComponent); // TODO(jack-berg): cache loaded component providers List componentProviders = spiHelper.load(ComponentProvider.class); diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigPropertiesWithComponentProviderLoader.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigPropertiesWithComponentProviderLoader.java new file mode 100644 index 00000000000..5ec30239ab7 --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigPropertiesWithComponentProviderLoader.java @@ -0,0 +1,88 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import io.opentelemetry.api.incubator.config.ComponentProviderLoader; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.common.ComponentLoader; +import java.util.List; +import java.util.Set; +import javax.annotation.Nullable; + +class DeclarativeConfigPropertiesWithComponentProviderLoader + implements DeclarativeConfigProperties { + private final DeclarativeConfigProperties properties; + private final ComponentProviderLoader componentProviderLoader; + + DeclarativeConfigPropertiesWithComponentProviderLoader( + DeclarativeConfigProperties properties, ComponentProviderLoader componentProviderLoader) { + this.properties = properties; + this.componentProviderLoader = componentProviderLoader; + } + + @Nullable + @Override + public String getString(String name) { + return properties.getString(name); + } + + @Nullable + @Override + public Boolean getBoolean(String name) { + return properties.getBoolean(name); + } + + @Nullable + @Override + public Integer getInt(String name) { + return properties.getInt(name); + } + + @Nullable + @Override + public Long getLong(String name) { + return properties.getLong(name); + } + + @Nullable + @Override + public Double getDouble(String name) { + return properties.getDouble(name); + } + + @Nullable + @Override + public List getScalarList(String name, Class scalarType) { + return properties.getScalarList(name, scalarType); + } + + @Nullable + @Override + public DeclarativeConfigProperties getStructured(String name) { + return properties.getStructured(name); + } + + @Nullable + @Override + public List getStructuredList(String name) { + return properties.getStructuredList(name); + } + + @Override + public Set getPropertyKeys() { + return properties.getPropertyKeys(); + } + + @Override + public ComponentLoader getComponentLoader() { + return properties.getComponentLoader(); + } + + @Override + public ComponentProviderLoader getComponentProviderLoader() { + return componentProviderLoader; + } +} diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java index 4be956af593..2ca7c3fd50a 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigProperties.java @@ -106,6 +106,7 @@ public static YamlDeclarativeConfigProperties create( + "\" has unrecognized object type " + value.getClass().getName()); } + return new YamlDeclarativeConfigProperties( simpleEntries, listEntries, mapEntries, componentLoader); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComponentProviderExtension.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComponentProviderExtension.java new file mode 100644 index 00000000000..916fa51e306 --- /dev/null +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ComponentProviderExtension.java @@ -0,0 +1,60 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.mockito.Mockito; + +public class ComponentProviderExtension implements BeforeEachCallback { + + private final SpiHelper spiHelper = + spy(SpiHelper.create(SpanExporterFactoryTest.class.getClassLoader())); + private final DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper); + + private List> loadedComponentProviders = Collections.emptyList(); + + @SuppressWarnings("unchecked") + @Override + public void beforeEach(ExtensionContext context) throws Exception { + when(spiHelper.load(ComponentProvider.class)) + .thenAnswer( + invocation -> { + List> result = + (List>) invocation.callRealMethod(); + + // only capture first invocation for exporter, not second for authenticator + if (loadedComponentProviders.isEmpty()) { + loadedComponentProviders = + result.stream().map(Mockito::spy).collect(Collectors.toList()); + return loadedComponentProviders; + } + return result; + }); + } + + DeclarativeConfigContext getContext() { + return context; + } + + ComponentProvider getComponentProvider(String name, Class type) { + return loadedComponentProviders.stream() + .filter( + componentProvider -> + componentProvider.getName().equals(name) + && componentProvider.getType().equals(type)) + .findFirst() + .orElseThrow(IllegalStateException::new); + } +} diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java index 18284627324..9c662f55905 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java @@ -14,6 +14,7 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOnSamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeLimitsModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AuthenticatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3MultiPropagatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3PropagatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BaggagePropagatorModel; @@ -237,6 +238,11 @@ void parse_KitchenSinkExampleFile() throws IOException { .withConfig(new ExperimentalTracerConfigModel().withDisabled(false)))); tracerProvider.withTracerConfiguratorDevelopment(tracerConfigurator); + Map authAttributes = new HashMap<>(); + authAttributes.put("tenant", "foo"); + authAttributes.put("region", "bar"); + AuthenticatorModel authenticator = + new AuthenticatorModel().withAdditionalProperty("rainy_cloud", authAttributes); SpanProcessorModel spanProcessor1 = new SpanProcessorModel() .withBatch( @@ -259,6 +265,7 @@ void parse_KitchenSinkExampleFile() throws IOException { .withName("api-key") .withValue("1234"))) .withHeadersList("api-key=1234") + .withAuthenticator(authenticator) .withCompression("gzip") .withTimeout(10_000) .withEncoding( @@ -281,6 +288,7 @@ void parse_KitchenSinkExampleFile() throws IOException { .withName("api-key") .withValue("1234"))) .withHeadersList("api-key=1234") + .withAuthenticator(authenticator) .withCompression("gzip") .withTimeout(10_000) .withInsecure(false)))); @@ -368,6 +376,7 @@ void parse_KitchenSinkExampleFile() throws IOException { .withName("api-key") .withValue("1234"))) .withHeadersList("api-key=1234") + .withAuthenticator(authenticator) .withCompression("gzip") .withTimeout(10_000) .withEncoding( @@ -390,6 +399,7 @@ void parse_KitchenSinkExampleFile() throws IOException { .withName("api-key") .withValue("1234"))) .withHeadersList("api-key=1234") + .withAuthenticator(authenticator) .withCompression("gzip") .withTimeout(10_000) .withInsecure(false)))); @@ -483,6 +493,7 @@ void parse_KitchenSinkExampleFile() throws IOException { .withName("api-key") .withValue("1234"))) .withHeadersList("api-key=1234") + .withAuthenticator(authenticator) .withCompression("gzip") .withTimeout(10_000) .withEncoding(OtlpHttpExporterModel.OtlpHttpEncoding.PROTOBUF) @@ -524,6 +535,7 @@ void parse_KitchenSinkExampleFile() throws IOException { .withName("api-key") .withValue("1234"))) .withHeadersList("api-key=1234") + .withAuthenticator(authenticator) .withCompression("gzip") .withTimeout(10_000) .withInsecure(false) 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..4c4e8d44193 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,7 @@ 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; @@ -20,9 +18,9 @@ import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.internal.testing.CleanupExtension; -import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.component.LogRecordExporterComponentProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AuthenticatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.NameStringValuePairModel; @@ -38,14 +36,11 @@ 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; @@ -62,34 +57,10 @@ 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(); - - @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; - }); - } + @RegisterExtension + ComponentProviderExtension componentProviderExtension = new ComponentProviderExtension(); - private ComponentProvider getComponentProvider(String name, Class type) { - return loadedComponentProviders.stream() - .filter( - componentProvider -> - componentProvider.getName().equals(name) - && componentProvider.getType().equals(type)) - .findFirst() - .orElseThrow(IllegalStateException::new); - } + private final DeclarativeConfigContext context = componentProviderExtension.getContext(); @Test void create_OtlpHttpDefaults() { @@ -111,7 +82,7 @@ void create_OtlpHttpDefaults() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_http", LogRecordExporter.class); + componentProviderExtension.getComponentProvider("otlp_http", LogRecordExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isNull(); @@ -133,6 +104,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) .setEndpoint("http://example:4318/v1/logs") .addHeader("key1", "value1") .addHeader("key2", "value2") + .setHeaders(() -> Collections.singletonMap("auth_provider_key1", "value1")) .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") .build(); @@ -163,6 +135,9 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) new NameStringValuePairModel() .withName("key2") .withValue("value2"))) + .withAuthenticator( + new AuthenticatorModel() + .withAdditionalProperty("rainy_cloud", null)) .withCompression("gzip") .withTimeout(15_000) .withCertificateFile(certificatePath) @@ -177,7 +152,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_http", LogRecordExporter.class); + componentProviderExtension.getComponentProvider("otlp_http", LogRecordExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318/v1/logs"); @@ -221,7 +196,7 @@ void create_OtlpGrpcDefaults() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", LogRecordExporter.class); + componentProviderExtension.getComponentProvider("otlp_grpc", LogRecordExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isNull(); @@ -242,6 +217,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) .setEndpoint("http://example:4317") .addHeader("key1", "value1") .addHeader("key2", "value2") + .setHeaders(() -> Collections.singletonMap("auth_provider_key1", "value1")) .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") .build(); @@ -272,6 +248,9 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) new NameStringValuePairModel() .withName("key2") .withValue("value2"))) + .withAuthenticator( + new AuthenticatorModel() + .withAdditionalProperty("rainy_cloud", null)) .withCompression("gzip") .withTimeout(15_000) .withCertificateFile(certificatePath) @@ -286,7 +265,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", LogRecordExporter.class); + componentProviderExtension.getComponentProvider("otlp_grpc", LogRecordExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4317"); @@ -330,7 +309,8 @@ void create_OtlpFile() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_file/development", LogRecordExporter.class); + componentProviderExtension.getComponentProvider( + "otlp_file/development", LogRecordExporter.class); verify(componentProvider).create(configCaptor.capture()); } 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..2d983090060 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,7 @@ 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,9 +19,9 @@ import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.internal.testing.CleanupExtension; -import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.component.MetricExporterComponentProvider; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AuthenticatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileMetricExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.NameStringValuePairModel; @@ -44,14 +42,11 @@ 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; @@ -68,34 +63,10 @@ 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(); - - @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; - }); - } + @RegisterExtension + ComponentProviderExtension componentProviderExtension = new ComponentProviderExtension(); - private ComponentProvider getComponentProvider(String name, Class type) { - return loadedComponentProviders.stream() - .filter( - componentProvider -> - componentProvider.getName().equals(name) - && componentProvider.getType().equals(type)) - .findFirst() - .orElseThrow(IllegalStateException::new); - } + private final DeclarativeConfigContext context = componentProviderExtension.getContext(); @Test void create_OtlpHttpDefaults() { @@ -116,7 +87,7 @@ void create_OtlpHttpDefaults() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_http", MetricExporter.class); + componentProviderExtension.getComponentProvider("otlp_http", MetricExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isNull(); @@ -140,6 +111,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) .setEndpoint("http://example:4318/v1/metrics") .addHeader("key1", "value1") .addHeader("key2", "value2") + .setHeaders(() -> Collections.singletonMap("auth_provider_key1", "value1")) .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) @@ -174,6 +146,9 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) new NameStringValuePairModel() .withName("key2") .withValue("value2"))) + .withAuthenticator( + new AuthenticatorModel() + .withAdditionalProperty("rainy_cloud", null)) .withCompression("gzip") .withTimeout(15_000) .withCertificateFile(certificatePath) @@ -193,7 +168,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_http", MetricExporter.class); + componentProviderExtension.getComponentProvider("otlp_http", MetricExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318/v1/metrics"); @@ -239,7 +214,7 @@ void create_OtlpGrpcDefaults() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", MetricExporter.class); + componentProviderExtension.getComponentProvider("otlp_grpc", MetricExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isNull(); @@ -262,6 +237,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) .setEndpoint("http://example:4317") .addHeader("key1", "value1") .addHeader("key2", "value2") + .setHeaders(() -> Collections.singletonMap("auth_provider_key1", "value1")) .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) @@ -296,6 +272,9 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) new NameStringValuePairModel() .withName("key2") .withValue("value2"))) + .withAuthenticator( + new AuthenticatorModel() + .withAdditionalProperty("rainy_cloud", null)) .withCompression("gzip") .withTimeout(15_000) .withCertificateFile(certificatePath) @@ -315,7 +294,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_grpc", MetricExporter.class); + componentProviderExtension.getComponentProvider("otlp_grpc", MetricExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4317"); @@ -377,7 +356,8 @@ void create_OtlpFile() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_file/development", MetricExporter.class); + componentProviderExtension.getComponentProvider( + "otlp_file/development", MetricExporter.class); verify(componentProvider).create(configCaptor.capture()); } 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..4e96fe42dfe 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,7 @@ 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,9 +20,9 @@ import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; 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.AuthenticatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.NameStringValuePairModel; @@ -42,14 +40,11 @@ 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; @@ -66,34 +61,10 @@ 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(); - - @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; - }); - } + @RegisterExtension + ComponentProviderExtension componentProviderExtension = new ComponentProviderExtension(); - private ComponentProvider getComponentProvider(String name, Class type) { - return loadedComponentProviders.stream() - .filter( - componentProvider -> - componentProvider.getName().equals(name) - && componentProvider.getType().equals(type)) - .findFirst() - .orElseThrow(IllegalStateException::new); - } + private final DeclarativeConfigContext context = componentProviderExtension.getContext(); @Test void create_OtlpHttpDefaults() { @@ -111,7 +82,8 @@ void create_OtlpHttpDefaults() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_http", SpanExporter.class); + ComponentProvider componentProvider = + componentProviderExtension.getComponentProvider("otlp_http", SpanExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("protocol")).isNull(); @@ -133,6 +105,7 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) .setEndpoint("http://example:4318/v1/traces") .addHeader("key1", "value1") .addHeader("key2", "value2") + .setHeaders(() -> Collections.singletonMap("auth_provider_key1", "value1")) .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") .build(); @@ -163,6 +136,9 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) new NameStringValuePairModel() .withName("key2") .withValue("value2"))) + .withAuthenticator( + new AuthenticatorModel() + .withAdditionalProperty("rainy_cloud", null)) .withCompression("gzip") .withTimeout(15_000) .withCertificateFile(certificatePath) @@ -176,7 +152,8 @@ void create_OtlpHttpConfigured(@TempDir Path tempDir) ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_http", SpanExporter.class); + ComponentProvider componentProvider = + componentProviderExtension.getComponentProvider("otlp_http", SpanExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4318/v1/traces"); @@ -216,7 +193,8 @@ void create_OtlpGrpcDefaults() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_grpc", SpanExporter.class); + ComponentProvider componentProvider = + componentProviderExtension.getComponentProvider("otlp_grpc", SpanExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isNull(); @@ -237,6 +215,7 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) .setEndpoint("http://example:4317") .addHeader("key1", "value1") .addHeader("key2", "value2") + .setHeaders(() -> Collections.singletonMap("auth_provider_key1", "value1")) .setTimeout(Duration.ofSeconds(15)) .setCompression("gzip") .build(); @@ -267,6 +246,9 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) new NameStringValuePairModel() .withName("key2") .withValue("value2"))) + .withAuthenticator( + new AuthenticatorModel() + .withAdditionalProperty("rainy_cloud", null)) .withCompression("gzip") .withTimeout(15_000) .withCertificateFile(certificatePath) @@ -280,7 +262,8 @@ void create_OtlpGrpcConfigured(@TempDir Path tempDir) ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("otlp_grpc", SpanExporter.class); + ComponentProvider componentProvider = + componentProviderExtension.getComponentProvider("otlp_grpc", SpanExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://example:4317"); @@ -336,7 +319,8 @@ void create_ZipkinDefaults() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("zipkin", SpanExporter.class); + ComponentProvider componentProvider = + componentProviderExtension.getComponentProvider("zipkin", SpanExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isNull(); @@ -369,7 +353,8 @@ void create_ZipkinConfigured() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); - ComponentProvider componentProvider = getComponentProvider("zipkin", SpanExporter.class); + ComponentProvider componentProvider = + componentProviderExtension.getComponentProvider("zipkin", SpanExporter.class); verify(componentProvider).create(configCaptor.capture()); DeclarativeConfigProperties configProperties = configCaptor.getValue(); assertThat(configProperties.getString("endpoint")).isEqualTo("http://zipkin:9411/v1/v2/spans"); @@ -396,7 +381,8 @@ void create_OtlpFile() { ArgumentCaptor configCaptor = ArgumentCaptor.forClass(DeclarativeConfigProperties.class); ComponentProvider componentProvider = - getComponentProvider("otlp_file/development", SpanExporter.class); + componentProviderExtension.getComponentProvider( + "otlp_file/development", SpanExporter.class); verify(componentProvider).create(configCaptor.capture()); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/TestAuthComponentProvider.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/TestAuthComponentProvider.java new file mode 100644 index 00000000000..c540be42a4b --- /dev/null +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/component/TestAuthComponentProvider.java @@ -0,0 +1,28 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig.component; + +import io.opentelemetry.api.incubator.authenticator.ExporterAuthenticator; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import java.util.Collections; + +public class TestAuthComponentProvider implements ComponentProvider { + @Override + public Class getType() { + return ExporterAuthenticator.class; + } + + @Override + public String getName() { + return "rainy_cloud"; + } + + @Override + public ExporterAuthenticator create(DeclarativeConfigProperties config) { + return () -> Collections.singletonMap("auth_provider_key1", "value1"); + } +} diff --git a/sdk-extensions/incubator/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-extensions/incubator/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider index da5f7288070..aefb6ba65e1 100644 --- a/sdk-extensions/incubator/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider +++ b/sdk-extensions/incubator/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider @@ -12,3 +12,4 @@ io.opentelemetry.sdk.extension.incubator.fileconfig.component.ContainerResourceP io.opentelemetry.sdk.extension.incubator.fileconfig.component.HostResourceProvider io.opentelemetry.sdk.extension.incubator.fileconfig.component.OsResourceProvider io.opentelemetry.sdk.extension.incubator.fileconfig.component.ProcessResourceProvider +io.opentelemetry.sdk.extension.incubator.fileconfig.component.TestAuthComponentProvider