From cf2b33c768691846763d77bade04ebc71db1f1ee Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Fri, 2 Sep 2022 15:25:05 +0200 Subject: [PATCH 1/2] Add experimental ConditionalResourceProvider interface --- .../internal/ConditionalResourceProvider.java | 30 +++++++++++++++++++ .../autoconfigure/ResourceConfiguration.java | 5 ++++ 2 files changed, 35 insertions(+) create mode 100644 sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ConditionalResourceProvider.java diff --git a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ConditionalResourceProvider.java b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ConditionalResourceProvider.java new file mode 100644 index 00000000000..12aede7ce4d --- /dev/null +++ b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ConditionalResourceProvider.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure.spi.internal; + +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; +import io.opentelemetry.sdk.resources.Resource; + +/** + * A resource provider that is only applied if the {@link #shouldApply(ConfigProperties, Resource)} + * method returns {@code true}. + * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +public interface ConditionalResourceProvider extends ResourceProvider { + + /** + * If an implementation needs to apply only under certain conditions related to the config or the + * existing state of the Resource being built, they can choose to override this default. + * + * @param config The auto configuration properties + * @param existing The current state of the Resource being created + * @return false to skip over this ResourceProvider, or true to use it + */ + boolean shouldApply(ConfigProperties config, Resource existing); +} diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java index 76646ab441d..7c43cb7f42d 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java @@ -9,6 +9,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ConditionalResourceProvider; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.resources.ResourceBuilder; import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; @@ -46,6 +47,10 @@ static Resource configureResource( if (disabledProviders.contains(resourceProvider.getClass().getName())) { continue; } + if (resourceProvider instanceof ConditionalResourceProvider + && !((ConditionalResourceProvider) resourceProvider).shouldApply(config, result)) { + continue; + } result = result.merge(resourceProvider.createResource(config)); } From 5a279b551573eb7c5d12a7ce840c1edebe188f1f Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Fri, 2 Sep 2022 16:02:57 +0200 Subject: [PATCH 2/2] Add tests --- sdk-extensions/autoconfigure/build.gradle.kts | 15 +++++++ .../ConditionalResourceProviderTest.java | 41 +++++++++++++++++++ .../autoconfigure/FirstResourceProvider.java | 30 ++++++++++++++ .../autoconfigure/SecondResourceProvider.java | 31 ++++++++++++++ ...try.sdk.autoconfigure.spi.ResourceProvider | 2 + 5 files changed, 119 insertions(+) create mode 100644 sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/ConditionalResourceProviderTest.java create mode 100644 sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/FirstResourceProvider.java create mode 100644 sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/SecondResourceProvider.java create mode 100644 sdk-extensions/autoconfigure/src/testConditionalResourceProvider/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider diff --git a/sdk-extensions/autoconfigure/build.gradle.kts b/sdk-extensions/autoconfigure/build.gradle.kts index bbeaeec897b..515b27935eb 100644 --- a/sdk-extensions/autoconfigure/build.gradle.kts +++ b/sdk-extensions/autoconfigure/build.gradle.kts @@ -47,6 +47,21 @@ testing { } } } + val testConditionalResourceProvider by registering(JvmTestSuite::class) { + dependencies { + implementation(project(":semconv")) + } + + targets { + all { + testTask { + environment("OTEL_TRACES_EXPORTER", "none") + environment("OTEL_METRICS_EXPORTER", "none") + environment("OTEL_LOGS_EXPORTER", "none") + } + } + } + } val testConfigError by registering(JvmTestSuite::class) { dependencies { implementation(project(":extensions:trace-propagators")) diff --git a/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/ConditionalResourceProviderTest.java b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/ConditionalResourceProviderTest.java new file mode 100644 index 00000000000..6bd8c096e62 --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/ConditionalResourceProviderTest.java @@ -0,0 +1,41 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import static java.util.Collections.singletonMap; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; +import org.junit.jupiter.api.Test; + +class ConditionalResourceProviderTest { + + @Test + void shouldConditionallyProvideResourceAttributes_skipBasedOnPreviousResource() { + AutoConfiguredOpenTelemetrySdk sdk = + AutoConfiguredOpenTelemetrySdk.builder() + .setResultAsGlobal(false) + .registerShutdownHook(false) + .build(); + + assertThat(sdk.getResource().getAttributes().asMap()) + .contains(entry(ResourceAttributes.SERVICE_NAME, "test-service")); + } + + @Test + void shouldConditionallyProvideResourceAttributes_skipBasedOnConfig() { + AutoConfiguredOpenTelemetrySdk sdk = + AutoConfiguredOpenTelemetrySdk.builder() + .setResultAsGlobal(false) + .registerShutdownHook(false) + .addPropertiesSupplier(() -> singletonMap("skip-first-resource-provider", "true")) + .build(); + + assertThat(sdk.getResource().getAttributes().asMap()) + .contains(entry(ResourceAttributes.SERVICE_NAME, "test-service-2")); + } +} diff --git a/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/FirstResourceProvider.java b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/FirstResourceProvider.java new file mode 100644 index 00000000000..6f3dd0326d5 --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/FirstResourceProvider.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ConditionalResourceProvider; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; + +public class FirstResourceProvider implements ConditionalResourceProvider { + + @Override + public Resource createResource(ConfigProperties config) { + return Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "test-service")); + } + + @Override + public int order() { + return 100; + } + + @Override + public boolean shouldApply(ConfigProperties config, Resource existing) { + return !config.getBoolean("skip-first-resource-provider", false); + } +} diff --git a/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/SecondResourceProvider.java b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/SecondResourceProvider.java new file mode 100644 index 00000000000..557a1f7255c --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/java/io/opentelemetry/sdk/autoconfigure/SecondResourceProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ConditionalResourceProvider; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; + +public class SecondResourceProvider implements ConditionalResourceProvider { + + @Override + public Resource createResource(ConfigProperties config) { + return Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "test-service-2")); + } + + @Override + public int order() { + return 200; + } + + @Override + public boolean shouldApply(ConfigProperties config, Resource existing) { + String serviceName = existing.getAttribute(ResourceAttributes.SERVICE_NAME); + return serviceName == null || "unknown_service:java".equals(serviceName); + } +} diff --git a/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider new file mode 100644 index 00000000000..3a57d0417cc --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testConditionalResourceProvider/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider @@ -0,0 +1,2 @@ +io.opentelemetry.sdk.autoconfigure.SecondResourceProvider +io.opentelemetry.sdk.autoconfigure.FirstResourceProvider