Skip to content

Commit c040f53

Browse files
committed
implemented new sigv4 exporter
1 parent 2ed720d commit c040f53

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

awsagentprovider/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ dependencies {
5555
testImplementation("io.opentelemetry:opentelemetry-extension-trace-propagators")
5656
testImplementation("com.google.guava:guava")
5757
testRuntimeOnly("io.opentelemetry:opentelemetry-exporter-otlp-common")
58+
testImplementation("io.opentelemetry:opentelemetry-exporter-otlp")
5859

5960
compileOnly("com.google.code.findbugs:jsr305:3.0.2")
6061
testImplementation("org.mockito:mockito-core:5.14.2")

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

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

1818
import io.opentelemetry.exporter.internal.otlp.traces.TraceRequestMarshaler;
1919
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
20+
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
2021
import io.opentelemetry.sdk.common.CompletableResultCode;
2122
import io.opentelemetry.sdk.common.export.MemoryMode;
2223
import io.opentelemetry.sdk.trace.data.SpanData;
2324
import io.opentelemetry.sdk.trace.export.SpanExporter;
2425
import java.io.ByteArrayInputStream;
2526
import java.io.ByteArrayOutputStream;
2627
import java.net.URI;
27-
import java.util.ArrayList;
28-
import java.util.Collection;
29-
import java.util.HashMap;
30-
import java.util.List;
31-
import java.util.Map;
28+
import java.util.*;
3229
import java.util.function.Supplier;
3330
import javax.annotation.concurrent.Immutable;
3431
import org.slf4j.Logger;
@@ -52,18 +49,32 @@ public class OtlpAwsSpanExporter implements SpanExporter {
5249
private static final String SERVICE_NAME = "xray";
5350
private static final Logger logger = LoggerFactory.getLogger(OtlpAwsSpanExporter.class);
5451

55-
private final SpanExporter parentExporter;
52+
private final OtlpHttpSpanExporterBuilder parentExporterBuilder;
53+
private final OtlpHttpSpanExporter parentExporter;
5654
private final String awsRegion;
5755
private final String endpoint;
5856
private Collection<SpanData> spanData;
5957

58+
public OtlpAwsSpanExporter(String endpoint) {
59+
this(null, endpoint);
60+
}
61+
6062
public OtlpAwsSpanExporter(OtlpHttpSpanExporter parentExporter, String endpoint) {
61-
this.parentExporter =
62-
parentExporter.toBuilder()
63+
OtlpHttpSpanExporterBuilder defaultExporterBuilder =
64+
OtlpHttpSpanExporter.builder()
6365
.setMemoryMode(MemoryMode.IMMUTABLE_DATA)
6466
.setEndpoint(endpoint)
65-
.setHeaders(new SigV4AuthHeaderSupplier())
66-
.build();
67+
.setHeaders(new SigV4AuthHeaderSupplier());
68+
69+
this.parentExporterBuilder =
70+
parentExporter == null
71+
? defaultExporterBuilder
72+
: parentExporter.toBuilder()
73+
.setMemoryMode(MemoryMode.IMMUTABLE_DATA)
74+
.setEndpoint(endpoint)
75+
.setHeaders(new SigV4AuthHeaderSupplier());
76+
77+
this.parentExporter = this.parentExporterBuilder.build();
6778

6879
this.awsRegion = endpoint.split("\\.")[1];
6980
this.endpoint = endpoint;
@@ -93,7 +104,10 @@ public CompletableResultCode shutdown() {
93104

94105
@Override
95106
public String toString() {
96-
return this.parentExporter.toString();
107+
StringJoiner joiner = new StringJoiner(", ", "OtlpAwsSpanExporter{", "}");
108+
joiner.add(this.parentExporterBuilder.toString());
109+
joiner.add("memoryMode=" + MemoryMode.IMMUTABLE_DATA);
110+
return joiner.toString();
97111
}
98112

99113
private final class SigV4AuthHeaderSupplier implements Supplier<Map<String, String>> {

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import static org.mockito.Mockito.*;
2020
import static org.mockito.Mockito.when;
2121

22+
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
23+
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
24+
import io.opentelemetry.sdk.common.CompletableResultCode;
2225
import io.opentelemetry.sdk.trace.export.SpanExporter;
2326
import java.net.URI;
2427
import java.util.List;
@@ -71,9 +74,12 @@ public class OtlpAwsSpanExporterTest {
7174

7275
private MockedStatic<DefaultCredentialsProvider> mockDefaultCredentialsProvider;
7376
private MockedStatic<AwsV4HttpSigner> mockAwsV4HttpSigner;
77+
private MockedStatic<OtlpHttpSpanExporter> otlpSpanExporterMock;
7478

7579
@Mock private DefaultCredentialsProvider credentialsProvider;
7680
@Mock private AwsV4HttpSigner signer;
81+
@Mock private OtlpHttpSpanExporterBuilder mockBuilder;
82+
@Mock private OtlpHttpSpanExporter mockExporter;
7783

7884
private ArgumentCaptor<Supplier<Map<String, String>>> headersCaptor;
7985

@@ -87,14 +93,24 @@ void setup() {
8793
this.mockAwsV4HttpSigner = mockStatic(AwsV4HttpSigner.class);
8894
this.mockAwsV4HttpSigner.when(AwsV4HttpSigner::create).thenReturn(this.signer);
8995

96+
this.otlpSpanExporterMock = mockStatic(OtlpHttpSpanExporter.class);
97+
9098
this.headersCaptor = ArgumentCaptor.forClass(Supplier.class);
99+
100+
when(OtlpHttpSpanExporter.builder()).thenReturn(mockBuilder);
101+
when(this.mockBuilder.setEndpoint(any())).thenReturn(mockBuilder);
102+
when(this.mockBuilder.setMemoryMode(any())).thenReturn(mockBuilder);
103+
when(this.mockBuilder.setHeaders(headersCaptor.capture())).thenReturn(mockBuilder);
104+
when(this.mockBuilder.build()).thenReturn(mockExporter);
105+
when(this.mockExporter.export(any())).thenReturn(CompletableResultCode.ofSuccess());
91106
}
92107

93108
@AfterEach
94109
void afterEach() {
95110
reset(this.signer, this.credentialsProvider);
96111
this.mockDefaultCredentialsProvider.close();
97112
this.mockAwsV4HttpSigner.close();
113+
this.otlpSpanExporterMock.close();
98114
}
99115

100116
@Test

0 commit comments

Comments
 (0)