Skip to content

Commit 589c163

Browse files
committed
refactoring the builder and exporter classes
1 parent 1555fc6 commit 589c163

File tree

4 files changed

+44
-38
lines changed

4 files changed

+44
-38
lines changed

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/OtlpUdpSpanExporter.java

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,14 @@ class OtlpUdpSpanExporter implements SpanExporter {
4141

4242
private static final Logger logger = Logger.getLogger(OtlpUdpSpanExporter.class.getName());
4343

44-
// The protocol header and delimiter is required for sending data to X-Ray Daemon or when running
45-
// in Lambda.
46-
// https://docs.aws.amazon.com/xray/latest/devguide/xray-api-sendingdata.html#xray-api-daemon
47-
private static final String PROTOCOL_HEADER = "{\"format\": \"json\", \"version\": 1}";
48-
private static final char PROTOCOL_DELIMITER = '\n';
49-
50-
// These prefixes help the backend identify if the spans payload is sampled or not.
51-
private static final String FORMAT_OTEL_SAMPLED_TRACES_BINARY_PREFIX = "T1S";
52-
private static final String FORMAT_OTEL_UNSAMPLED_TRACES_BINARY_PREFIX = "T1U";
53-
5444
private final AtomicBoolean isShutdown = new AtomicBoolean();
5545

5646
private final UdpSender sender;
57-
private final boolean sampled;
47+
private final String payloadPrefix;
5848

59-
OtlpUdpSpanExporter(UdpSender sender, boolean sampled) {
49+
OtlpUdpSpanExporter(UdpSender sender, String payloadPrefix) {
6050
this.sender = sender;
61-
this.sampled = sampled;
51+
this.payloadPrefix = payloadPrefix;
6252
}
6353

6454
@Override
@@ -71,13 +61,7 @@ public CompletableResultCode export(Collection<SpanData> spans) {
7161
ByteArrayOutputStream baos = new ByteArrayOutputStream();
7262
try {
7363
exportRequest.writeBinaryTo(baos);
74-
String payload =
75-
PROTOCOL_HEADER
76-
+ PROTOCOL_DELIMITER
77-
+ (sampled
78-
? FORMAT_OTEL_SAMPLED_TRACES_BINARY_PREFIX
79-
: FORMAT_OTEL_UNSAMPLED_TRACES_BINARY_PREFIX)
80-
+ Base64.getEncoder().encodeToString(baos.toByteArray());
64+
String payload = payloadPrefix + Base64.getEncoder().encodeToString(baos.toByteArray());
8165
sender.send(payload.getBytes(StandardCharsets.UTF_8));
8266
return CompletableResultCode.ofSuccess();
8367
} catch (Exception e) {
@@ -107,7 +91,7 @@ UdpSender getSender() {
10791
}
10892

10993
// Visible for testing
110-
boolean isSampled() {
111-
return sampled;
94+
String getPayloadPrefix() {
95+
return payloadPrefix;
11296
}
11397
}

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/OtlpUdpSpanExporterBuilder.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,23 @@
1717

1818
import static java.util.Objects.requireNonNull;
1919

20-
import java.net.SocketException;
21-
2220
final class OtlpUdpSpanExporterBuilder {
2321

2422
private static final String DEFAULT_HOST = "127.0.0.1";
2523
private static final int DEFAULT_PORT = 2000;
2624

25+
// The protocol header and delimiter is required for sending data to X-Ray Daemon or when running
26+
// in Lambda.
27+
// https://docs.aws.amazon.com/xray/latest/devguide/xray-api-sendingdata.html#xray-api-daemon
28+
private static final String PROTOCOL_HEADER = "{\"format\": \"json\", \"version\": 1}";
29+
private static final char PROTOCOL_DELIMITER = '\n';
30+
31+
// These prefixes help the backend identify if the spans payload is sampled or not.
32+
private static final String FORMAT_OTEL_SAMPLED_TRACES_BINARY_PREFIX = "T1S";
33+
private static final String FORMAT_OTEL_UNSAMPLED_TRACES_BINARY_PREFIX = "T1U";
34+
2735
private UdpSender sender;
28-
private boolean sampled = true;
36+
private String tracePayloadPrefix = FORMAT_OTEL_SAMPLED_TRACES_BINARY_PREFIX;
2937

3038
public OtlpUdpSpanExporterBuilder setEndpoint(String endpoint) {
3139
requireNonNull(endpoint, "endpoint must not be null");
@@ -40,20 +48,20 @@ public OtlpUdpSpanExporterBuilder setEndpoint(String endpoint) {
4048
return this;
4149
}
4250

43-
public OtlpUdpSpanExporterBuilder setSampled(boolean sampled) {
44-
this.sampled = sampled;
51+
public OtlpUdpSpanExporterBuilder setPayloadSampleDecision(TracePayloadSampleDecision decision) {
52+
this.tracePayloadPrefix =
53+
decision == TracePayloadSampleDecision.SAMPLED
54+
? FORMAT_OTEL_SAMPLED_TRACES_BINARY_PREFIX
55+
: FORMAT_OTEL_UNSAMPLED_TRACES_BINARY_PREFIX;
4556
return this;
4657
}
4758

4859
public OtlpUdpSpanExporter build() {
4960
if (sender == null) {
50-
try {
51-
this.sender = new UdpSender(DEFAULT_HOST, DEFAULT_PORT);
52-
} catch (SocketException e) {
53-
throw new IllegalStateException("Failed to create OtlpUdpSpanExporter", e);
54-
}
61+
this.sender = new UdpSender(DEFAULT_HOST, DEFAULT_PORT);
5562
}
56-
return new OtlpUdpSpanExporter(this.sender, this.sampled);
63+
return new OtlpUdpSpanExporter(
64+
this.sender, PROTOCOL_HEADER + PROTOCOL_DELIMITER + tracePayloadPrefix);
5765
}
5866

5967
// Only for testing
@@ -62,3 +70,8 @@ OtlpUdpSpanExporterBuilder setSender(UdpSender sender) {
6270
return this;
6371
}
6472
}
73+
74+
enum TracePayloadSampleDecision {
75+
SAMPLED,
76+
UNSAMPLED
77+
}

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/UdpSender.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class UdpSender {
3434
private DatagramSocket socket;
3535
private final InetSocketAddress endpoint;
3636

37-
public UdpSender(String host, int port) throws SocketException {
37+
public UdpSender(String host, int port) {
3838
this.endpoint = new InetSocketAddress(host, port);
3939
try {
4040
this.socket = new DatagramSocket();
@@ -45,6 +45,9 @@ public UdpSender(String host, int port) throws SocketException {
4545

4646
public CompletableResultCode shutdown() {
4747
try {
48+
if (socket == null) {
49+
return CompletableResultCode.ofSuccess();
50+
}
4851
socket.close();
4952
return CompletableResultCode.ofSuccess();
5053
} catch (Exception e) {

awsagentprovider/src/test/java/software/amazon/opentelemetry/javaagent/providers/UdpExporterTest.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,20 @@ public void testUdpExporterWithDefaults() {
3939
assertThat(sender.getEndpoint().getHostName())
4040
.isEqualTo("localhost"); // getHostName implicitly converts 127.0.0.1 to localhost
4141
assertThat(sender.getEndpoint().getPort()).isEqualTo(2000);
42-
assertThat(exporter.isSampled()).isTrue();
42+
assertThat(exporter.getPayloadPrefix()).endsWith("T1S");
4343
}
4444

4545
@Test
4646
public void testUdpExporterWithCustomEndpointAndSample() {
4747
OtlpUdpSpanExporter exporter =
48-
new OtlpUdpSpanExporterBuilder().setEndpoint("somehost:1000").setSampled(false).build();
48+
new OtlpUdpSpanExporterBuilder()
49+
.setEndpoint("somehost:1000")
50+
.setPayloadSampleDecision(TracePayloadSampleDecision.UNSAMPLED)
51+
.build();
4952
UdpSender sender = exporter.getSender();
5053
assertThat(sender.getEndpoint().getHostName()).isEqualTo("somehost");
5154
assertThat(sender.getEndpoint().getPort()).isEqualTo(1000);
52-
assertThat(exporter.isSampled()).isFalse();
55+
assertThat(exporter.getPayloadPrefix()).endsWith("T1U");
5356
}
5457

5558
@Test
@@ -94,7 +97,10 @@ public void testExportWithSampledFalse() {
9497
SpanData spanData = buildSpanDataMock();
9598

9699
OtlpUdpSpanExporter exporter =
97-
new OtlpUdpSpanExporterBuilder().setSender(senderMock).setSampled(false).build();
100+
new OtlpUdpSpanExporterBuilder()
101+
.setSender(senderMock)
102+
.setPayloadSampleDecision(TracePayloadSampleDecision.UNSAMPLED)
103+
.build();
98104
exporter.export(Collections.singletonList(spanData));
99105

100106
verify(senderMock, times(1)).send(any(byte[].class));

0 commit comments

Comments
 (0)