Skip to content

Commit 6c11793

Browse files
author
Mateusz Rzeszutek
authored
Add experimental ConditionalResourceProvider interface (#4731)
* Add experimental ConditionalResourceProvider interface * Add tests
1 parent 1046253 commit 6c11793

File tree

7 files changed

+154
-0
lines changed

7 files changed

+154
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.autoconfigure.spi.internal;
7+
8+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
9+
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
10+
import io.opentelemetry.sdk.resources.Resource;
11+
12+
/**
13+
* A resource provider that is only applied if the {@link #shouldApply(ConfigProperties, Resource)}
14+
* method returns {@code true}.
15+
*
16+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
17+
* at any time.
18+
*/
19+
public interface ConditionalResourceProvider extends ResourceProvider {
20+
21+
/**
22+
* If an implementation needs to apply only under certain conditions related to the config or the
23+
* existing state of the Resource being built, they can choose to override this default.
24+
*
25+
* @param config The auto configuration properties
26+
* @param existing The current state of the Resource being created
27+
* @return false to skip over this ResourceProvider, or true to use it
28+
*/
29+
boolean shouldApply(ConfigProperties config, Resource existing);
30+
}

sdk-extensions/autoconfigure/build.gradle.kts

+15
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,21 @@ testing {
4747
}
4848
}
4949
}
50+
val testConditionalResourceProvider by registering(JvmTestSuite::class) {
51+
dependencies {
52+
implementation(project(":semconv"))
53+
}
54+
55+
targets {
56+
all {
57+
testTask {
58+
environment("OTEL_TRACES_EXPORTER", "none")
59+
environment("OTEL_METRICS_EXPORTER", "none")
60+
environment("OTEL_LOGS_EXPORTER", "none")
61+
}
62+
}
63+
}
64+
}
5065
val testConfigError by registering(JvmTestSuite::class) {
5166
dependencies {
5267
implementation(project(":extensions:trace-propagators"))

sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.api.common.AttributesBuilder;
1010
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1111
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
12+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ConditionalResourceProvider;
1213
import io.opentelemetry.sdk.resources.Resource;
1314
import io.opentelemetry.sdk.resources.ResourceBuilder;
1415
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
@@ -46,6 +47,10 @@ static Resource configureResource(
4647
if (disabledProviders.contains(resourceProvider.getClass().getName())) {
4748
continue;
4849
}
50+
if (resourceProvider instanceof ConditionalResourceProvider
51+
&& !((ConditionalResourceProvider) resourceProvider).shouldApply(config, result)) {
52+
continue;
53+
}
4954
result = result.merge(resourceProvider.createResource(config));
5055
}
5156

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.autoconfigure;
7+
8+
import static java.util.Collections.singletonMap;
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
import static org.assertj.core.api.Assertions.entry;
11+
12+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
13+
import org.junit.jupiter.api.Test;
14+
15+
class ConditionalResourceProviderTest {
16+
17+
@Test
18+
void shouldConditionallyProvideResourceAttributes_skipBasedOnPreviousResource() {
19+
AutoConfiguredOpenTelemetrySdk sdk =
20+
AutoConfiguredOpenTelemetrySdk.builder()
21+
.setResultAsGlobal(false)
22+
.registerShutdownHook(false)
23+
.build();
24+
25+
assertThat(sdk.getResource().getAttributes().asMap())
26+
.contains(entry(ResourceAttributes.SERVICE_NAME, "test-service"));
27+
}
28+
29+
@Test
30+
void shouldConditionallyProvideResourceAttributes_skipBasedOnConfig() {
31+
AutoConfiguredOpenTelemetrySdk sdk =
32+
AutoConfiguredOpenTelemetrySdk.builder()
33+
.setResultAsGlobal(false)
34+
.registerShutdownHook(false)
35+
.addPropertiesSupplier(() -> singletonMap("skip-first-resource-provider", "true"))
36+
.build();
37+
38+
assertThat(sdk.getResource().getAttributes().asMap())
39+
.contains(entry(ResourceAttributes.SERVICE_NAME, "test-service-2"));
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.autoconfigure;
7+
8+
import io.opentelemetry.api.common.Attributes;
9+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ConditionalResourceProvider;
11+
import io.opentelemetry.sdk.resources.Resource;
12+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
13+
14+
public class FirstResourceProvider implements ConditionalResourceProvider {
15+
16+
@Override
17+
public Resource createResource(ConfigProperties config) {
18+
return Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "test-service"));
19+
}
20+
21+
@Override
22+
public int order() {
23+
return 100;
24+
}
25+
26+
@Override
27+
public boolean shouldApply(ConfigProperties config, Resource existing) {
28+
return !config.getBoolean("skip-first-resource-provider", false);
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.autoconfigure;
7+
8+
import io.opentelemetry.api.common.Attributes;
9+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ConditionalResourceProvider;
11+
import io.opentelemetry.sdk.resources.Resource;
12+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
13+
14+
public class SecondResourceProvider implements ConditionalResourceProvider {
15+
16+
@Override
17+
public Resource createResource(ConfigProperties config) {
18+
return Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "test-service-2"));
19+
}
20+
21+
@Override
22+
public int order() {
23+
return 200;
24+
}
25+
26+
@Override
27+
public boolean shouldApply(ConfigProperties config, Resource existing) {
28+
String serviceName = existing.getAttribute(ResourceAttributes.SERVICE_NAME);
29+
return serviceName == null || "unknown_service:java".equals(serviceName);
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
io.opentelemetry.sdk.autoconfigure.SecondResourceProvider
2+
io.opentelemetry.sdk.autoconfigure.FirstResourceProvider

0 commit comments

Comments
 (0)