Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions aws-xray/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ dependencies {

compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
implementation("io.opentelemetry.semconv:opentelemetry-semconv:1.37.0")
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator")

implementation("com.squareup.okhttp3:okhttp")
implementation("io.opentelemetry.semconv:opentelemetry-semconv")
Expand All @@ -30,6 +31,7 @@ dependencies {

testImplementation("com.linecorp.armeria:armeria-junit5")
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
testImplementation("com.google.guava:guava")
testImplementation("org.slf4j:slf4j-simple")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Supplier;
import java.util.logging.Logger;
import javax.annotation.Nullable;

Expand All @@ -56,8 +57,9 @@ public final class AwsXrayRemoteSampler implements Sampler, Closeable {
// Default batch size to be same as OTel BSP default
private static final int maxExportBatchSize = 512;

private final Resource resource;
private final Supplier<Resource> resource;
private final Clock clock;
private final String endpoint;
private final Sampler initialSampler;
private final XraySamplerClient client;
private final ScheduledExecutorService executor;
Expand All @@ -80,18 +82,19 @@ public final class AwsXrayRemoteSampler implements Sampler, Closeable {
*/
// TODO(anuraaga): Deprecate after
// https://github.com/open-telemetry/opentelemetry-specification/issues/1588
public static AwsXrayRemoteSamplerBuilder newBuilder(Resource resource) {
public static AwsXrayRemoteSamplerBuilder newBuilder(Supplier<Resource> resource) {
return new AwsXrayRemoteSamplerBuilder(resource);
}

AwsXrayRemoteSampler(
Resource resource,
Supplier<Resource> resource,
Clock clock,
String endpoint,
Sampler initialSampler,
long pollingIntervalNanos) {
this.resource = resource;
this.clock = clock;
this.endpoint = endpoint;
this.initialSampler = initialSampler;
client = new XraySamplerClient(endpoint);
executor =
Expand Down Expand Up @@ -294,6 +297,11 @@ XraySamplerClient getClient() {

// Visible for testing
Resource getResource() {
return resource;
return resource.get();
}

@Override
public String toString() {
return "AwsXrayRemoteSampler{endpoint=" + endpoint + '}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import javax.annotation.Nullable;

/** A builder for {@link AwsXrayRemoteSampler}. */
Expand All @@ -23,14 +24,14 @@ public final class AwsXrayRemoteSamplerBuilder {
private static final String DEFAULT_ENDPOINT = "http://localhost:2000";
private static final long DEFAULT_POLLING_INTERVAL_SECS = 300;

private final Resource resource;
private final Supplier<Resource> resource;

private Clock clock = Clock.getDefault();
private String endpoint = DEFAULT_ENDPOINT;
@Nullable private Sampler initialSampler;
private long pollingIntervalNanos = SECONDS.toNanos(DEFAULT_POLLING_INTERVAL_SECS);

AwsXrayRemoteSamplerBuilder(Resource resource) {
AwsXrayRemoteSamplerBuilder(Supplier<Resource> resource) {
this.resource = resource;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.logging.Logger;
import javax.annotation.Nullable;

Expand All @@ -60,7 +61,7 @@ final class XrayRulesSampler implements Sampler {
private static final AttributeKey<String> HTTP_METHOD = AttributeKey.stringKey("http.method");

private final String clientId;
private final Resource resource;
private final Supplier<Resource> resource;
private final Clock clock;
private final Sampler fallbackSampler;
private final SamplingRuleApplier[] ruleAppliers;
Expand All @@ -75,7 +76,7 @@ final class XrayRulesSampler implements Sampler {

XrayRulesSampler(
String clientId,
Resource resource,
Supplier<Resource> resource,
Clock clock,
Sampler fallbackSampler,
List<GetSamplingRulesResponse.SamplingRule> rules,
Expand All @@ -91,7 +92,7 @@ final class XrayRulesSampler implements Sampler {
.map(
rule ->
new SamplingRuleApplier(
clientId, rule, resource.getAttribute(SERVICE_NAME), clock))
clientId, rule, resource.get().getAttribute(SERVICE_NAME), clock))
.toArray(SamplingRuleApplier[]::new),
createRuleHashMaps(rules),
rules.stream().anyMatch(r -> r.getSamplingRateBoost() != null),
Expand All @@ -105,7 +106,7 @@ final class XrayRulesSampler implements Sampler {

private XrayRulesSampler(
String clientId,
Resource resource,
Supplier<Resource> resource,
Clock clock,
Sampler fallbackSampler,
SamplingRuleApplier[] ruleAppliers,
Expand Down Expand Up @@ -161,7 +162,7 @@ public SamplingResult shouldSample(
: null;
}
for (SamplingRuleApplier applier : ruleAppliers) {
if (applier.matches(attributes, resource)) {
if (applier.matches(attributes, resource.get())) {
SamplingResult result =
applier.shouldSample(parentContext, traceId, name, spanKind, attributes, parentLinks);

Expand Down Expand Up @@ -263,7 +264,7 @@ void adaptSampling(ReadableSpan span, SpanData spanData, Consumer<ReadableSpan>
ruleToReportTo = applier;
break;
}
if (applier.matches(spanData.getAttributes(), resource)) {
if (applier.matches(spanData.getAttributes(), resource.get())) {
matchedRule = applier;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.contrib.awsxray.internal;

import com.google.auto.service.AutoService;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.contrib.awsxray.AwsXrayRemoteSampler;
import io.opentelemetry.contrib.awsxray.AwsXrayRemoteSamplerBuilder;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.util.function.Supplier;

/**
* File configuration SPI implementation for {@link AwsXrayRemoteSampler}.
*
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
* at any time.
*/
@SuppressWarnings("rawtypes")
@AutoService(ComponentProvider.class)
public class AwsXrayRemoteSamplerComponentProvider
implements ComponentProvider<Sampler>, AutoConfigureListener {

private Resource resource;

private final Supplier<Resource> resourceSupplier = () -> resource;

@Override
public Class<Sampler> getType() {
return Sampler.class;
}

@Override
public String getName() {
return "xray";
}

@Override
public Sampler create(DeclarativeConfigProperties config) {
AwsXrayRemoteSamplerBuilder builder = AwsXrayRemoteSampler.newBuilder(resourceSupplier);

String endpoint = config.getString("endpoint");
if (endpoint != null) {
builder.setEndpoint(endpoint);
}

return builder.build();
}

@Override
public void afterAutoConfigure(OpenTelemetrySdk sdk) {
if (sdk instanceof ExtendedOpenTelemetrySdk) {
this.resource = ((ExtendedOpenTelemetrySdk) sdk).getResource();
Copy link
Member Author

@zeitlinger zeitlinger Nov 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.contrib.awsxray.internal;

import static org.assertj.core.api.Assertions.assertThat;

import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import org.junit.jupiter.api.Test;

class AwsXrayRemoteSamplerComponentProviderTest {
@Test
void endToEnd() {
String yaml =
"file_format: 1.0-rc.1\n"
+ "tracer_provider:\n"
+ " sampler:\n"
+ " xray:\n"
+ " endpoint: 'https://example.com'\n";

OpenTelemetrySdk openTelemetrySdk =
DeclarativeConfiguration.parseAndCreate(
new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8)));

assertThat(openTelemetrySdk.getSdkTracerProvider().toString())
.contains("AwsXrayRemoteSampler{endpoint=https://example.com}");
}
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
Comparing source compatibility of opentelemetry-aws-xray-1.52.0-SNAPSHOT.jar against opentelemetry-aws-xray-1.51.0.jar
No changes.
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.contrib.awsxray.AwsXrayRemoteSampler (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) java.lang.String toString()
Loading