Skip to content

Commit ec06b65

Browse files
authored
Remove usage of deprecated resource autoconfiguration (#139)
1 parent 4775be2 commit ec06b65

File tree

4 files changed

+96
-41
lines changed

4 files changed

+96
-41
lines changed

aws-xray/src/main/java/io/opentelemetry/contrib/awsxray/AwsXrayRemoteSampler.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,4 +204,14 @@ private static String generateClientId() {
204204
}
205205
return new String(clientIdChars);
206206
}
207+
208+
// Visible for testing
209+
XraySamplerClient getClient() {
210+
return client;
211+
}
212+
213+
// Visible for testing
214+
Resource getResource() {
215+
return resource;
216+
}
207217
}

aws-xray/src/main/java/io/opentelemetry/contrib/awsxray/AwsXrayRemoteSamplerProvider.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,26 @@
66
package io.opentelemetry.contrib.awsxray;
77

88
import com.google.auto.service.AutoService;
9-
import io.opentelemetry.sdk.autoconfigure.OpenTelemetryResourceAutoConfiguration;
9+
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
10+
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
1011
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1112
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider;
13+
import io.opentelemetry.sdk.resources.Resource;
1214
import io.opentelemetry.sdk.trace.samplers.Sampler;
1315
import java.util.Map;
16+
import org.checkerframework.checker.nullness.qual.Nullable;
1417

1518
@AutoService(ConfigurableSamplerProvider.class)
1619
public class AwsXrayRemoteSamplerProvider implements ConfigurableSamplerProvider {
1720

1821
@Override
1922
public Sampler createSampler(ConfigProperties config) {
20-
AwsXrayRemoteSamplerBuilder builder =
21-
AwsXrayRemoteSampler.newBuilder(
22-
OpenTelemetryResourceAutoConfiguration.configureResource(config));
23+
Resource resource = ResourceHolder.resource;
24+
if (resource == null) {
25+
// Should never be the case in practice.
26+
resource = Resource.getDefault();
27+
}
28+
AwsXrayRemoteSamplerBuilder builder = AwsXrayRemoteSampler.newBuilder(resource);
2329

2430
Map<String, String> params = config.getMap("otel.traces.sampler.arg");
2531

@@ -35,4 +41,22 @@ public Sampler createSampler(ConfigProperties config) {
3541
public String getName() {
3642
return "xray";
3743
}
44+
45+
// Currently the only way to read the Resource from autoconfiguration. Best would be if the SPI
46+
// could return a Function<SamplerFactoryArgs, Sampler> where SamplerFactoryArgs has
47+
// SDK-constructed components like Resource and Clock.
48+
@AutoService(AutoConfigurationCustomizerProvider.class)
49+
public static final class ResourceHolder implements AutoConfigurationCustomizerProvider {
50+
51+
@Nullable static volatile Resource resource;
52+
53+
@Override
54+
public void customize(AutoConfigurationCustomizer autoConfiguration) {
55+
autoConfiguration.addResourceCustomizer(
56+
(resource, config) -> {
57+
ResourceHolder.resource = resource;
58+
return resource;
59+
});
60+
}
61+
}
3862
}

aws-xray/src/main/java/io/opentelemetry/contrib/awsxray/XraySamplerClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ private static String readResponse(Response response, String endpoint) throws IO
131131
return "";
132132
}
133133

134+
// Visible for testing
135+
String getSamplingRulesEndpoint() {
136+
return getSamplingRulesEndpoint;
137+
}
138+
134139
@SuppressWarnings("JavaUtilDate")
135140
private static class FloatDateDeserializer extends StdDeserializer<Date> {
136141

aws-xray/src/test/java/io/opentelemetry/contrib/awsxray/AwsXrayRemoteSamplerProviderTest.java

Lines changed: 53 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,61 +6,77 @@
66
package io.opentelemetry.contrib.awsxray;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9-
import static org.assertj.core.api.InstanceOfAssertFactories.type;
10-
import static org.mockito.Mockito.when;
119

12-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
13-
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider;
14-
import java.util.Collections;
15-
import java.util.ServiceLoader;
10+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
11+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
12+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
13+
import java.util.HashMap;
14+
import java.util.Map;
1615
import org.junit.jupiter.api.Test;
1716
import org.junit.jupiter.api.extension.ExtendWith;
18-
import org.mockito.Mock;
1917
import org.mockito.junit.jupiter.MockitoExtension;
2018

2119
@ExtendWith(MockitoExtension.class)
2220
class AwsXrayRemoteSamplerProviderTest {
2321

24-
@Mock private ConfigProperties config;
25-
26-
@Test
27-
void serviceProvider() {
28-
ServiceLoader<ConfigurableSamplerProvider> samplerProviders =
29-
ServiceLoader.load(ConfigurableSamplerProvider.class);
30-
assertThat(samplerProviders)
31-
.singleElement(type(AwsXrayRemoteSamplerProvider.class))
32-
.satisfies(
33-
provider -> {
34-
assertThat(provider.getName()).isEqualTo("xray");
35-
});
36-
}
37-
3822
@Test
39-
void emptyConfig() {
40-
try (AwsXrayRemoteSampler sampler =
41-
(AwsXrayRemoteSampler) new AwsXrayRemoteSamplerProvider().createSampler(config)) {
23+
void serviceNameOnly() {
24+
Map<String, String> props = new HashMap<>();
25+
props.put("otel.traces.sampler", "xray");
26+
props.put("otel.service.name", "cat-service");
27+
props.put("otel.traces.exporter", "none");
28+
props.put("otel.metrics.exporter", "none");
29+
try (SdkTracerProvider tracerProvider =
30+
AutoConfiguredOpenTelemetrySdk.builder()
31+
.addPropertiesSupplier(() -> props)
32+
.setResultAsGlobal(false)
33+
.build()
34+
.getOpenTelemetrySdk()
35+
.getSdkTracerProvider()) {
4236
// Inspect implementation details for simplicity, otherwise we'd probably need to make a
4337
// test HTTP server that records requests.
44-
assertThat(sampler)
45-
.extracting("client")
46-
.extracting("getSamplingRulesEndpoint", type(String.class))
47-
.isEqualTo("http://localhost:2000/GetSamplingRules");
38+
assertThat(tracerProvider)
39+
.extracting("sharedState")
40+
.extracting("sampler")
41+
.isInstanceOfSatisfying(
42+
AwsXrayRemoteSampler.class,
43+
sampler -> {
44+
assertThat(sampler.getClient().getSamplingRulesEndpoint())
45+
.isEqualTo("http://localhost:2000/GetSamplingRules");
46+
assertThat(sampler.getResource().getAttribute(ResourceAttributes.SERVICE_NAME))
47+
.isEqualTo("cat-service");
48+
});
4849
}
4950
}
5051

5152
@Test
5253
void setEndpoint() {
53-
when(config.getMap("otel.resource.attributes")).thenReturn(Collections.emptyMap());
54-
when(config.getMap("otel.traces.sampler.arg"))
55-
.thenReturn(Collections.singletonMap("endpoint", "http://localhost:3000"));
56-
try (AwsXrayRemoteSampler sampler =
57-
(AwsXrayRemoteSampler) new AwsXrayRemoteSamplerProvider().createSampler(config)) {
54+
Map<String, String> props = new HashMap<>();
55+
props.put("otel.traces.sampler", "xray");
56+
props.put("otel.traces.sampler.arg", "endpoint=http://localhost:3000");
57+
props.put("otel.service.name", "cat-service");
58+
props.put("otel.traces.exporter", "none");
59+
props.put("otel.metrics.exporter", "none");
60+
try (SdkTracerProvider tracerProvider =
61+
AutoConfiguredOpenTelemetrySdk.builder()
62+
.addPropertiesSupplier(() -> props)
63+
.setResultAsGlobal(false)
64+
.build()
65+
.getOpenTelemetrySdk()
66+
.getSdkTracerProvider()) {
5867
// Inspect implementation details for simplicity, otherwise we'd probably need to make a
5968
// test HTTP server that records requests.
60-
assertThat(sampler)
61-
.extracting("client")
62-
.extracting("getSamplingRulesEndpoint", type(String.class))
63-
.isEqualTo("http://localhost:3000/GetSamplingRules");
69+
assertThat(tracerProvider)
70+
.extracting("sharedState")
71+
.extracting("sampler")
72+
.isInstanceOfSatisfying(
73+
AwsXrayRemoteSampler.class,
74+
sampler -> {
75+
assertThat(sampler.getClient().getSamplingRulesEndpoint())
76+
.isEqualTo("http://localhost:3000/GetSamplingRules");
77+
assertThat(sampler.getResource().getAttribute(ResourceAttributes.SERVICE_NAME))
78+
.isEqualTo("cat-service");
79+
});
6480
}
6581
}
6682
}

0 commit comments

Comments
 (0)