Skip to content

Commit 76b7dd8

Browse files
committed
set BSP batch size when on Lambda
1 parent 0cdbba5 commit 76b7dd8

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,13 @@ public class AwsApplicationSignalsCustomizerProvider
8686
private static final String OTEL_EXPORTER_OTLP_TRACES_ENDPOINT_CONFIG =
8787
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT";
8888
private static final String AWS_XRAY_DAEMON_ADDRESS_CONFIG = "AWS_XRAY_DAEMON_ADDRESS";
89-
9089
private static final String DEFAULT_UDP_ENDPOINT = "127.0.0.1:2000";
9190

91+
// UDP packet can be upto 64KB. To limit the packet size, we limit the exported batch size.
92+
// This is a bit of a magic number, as there is no simple way to tell how many spans can make a
93+
// 64KB batch since spans can vary in size.
94+
private static final int LAMBDA_SPAN_EXPORT_BATCH_SIZE = 10;
95+
9296
public void customize(AutoConfigurationCustomizer autoConfiguration) {
9397
autoConfiguration.addPropertiesCustomizer(this::customizeProperties);
9498
autoConfiguration.addResourceCustomizer(this::customizeResource);
@@ -168,7 +172,9 @@ private SdkTracerProviderBuilder customizeTracerProviderBuilder(
168172
// Signals metrics.
169173
if (isLambdaEnvironment()) {
170174
tracerProviderBuilder.addSpanProcessor(
171-
AwsUnsampledOnlySpanProcessorBuilder.create().build());
175+
AwsUnsampledOnlySpanProcessorBuilder.create()
176+
.setMaxExportBatchSize(LAMBDA_SPAN_EXPORT_BATCH_SIZE)
177+
.build());
172178
return tracerProviderBuilder;
173179
}
174180

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,30 @@ public static AwsUnsampledOnlySpanProcessorBuilder create() {
3131
.setPayloadSampleDecision(TracePayloadSampleDecision.UNSAMPLED)
3232
.build();
3333

34+
// Default batch size to be same as Otel BSP default
35+
private int maxExportBatchSize = 512;
36+
3437
public AwsUnsampledOnlySpanProcessorBuilder setSpanExporter(SpanExporter exporter) {
3538
requireNonNull(exporter, "exporter cannot be null");
3639
this.exporter = exporter;
3740
return this;
3841
}
3942

43+
public AwsUnsampledOnlySpanProcessorBuilder setMaxExportBatchSize(int maxExportBatchSize) {
44+
this.maxExportBatchSize = maxExportBatchSize;
45+
return this;
46+
}
47+
4048
public AwsUnsampledOnlySpanProcessor build() {
4149
BatchSpanProcessor bsp =
42-
BatchSpanProcessor.builder(exporter).setExportUnsampledSpans(true).build();
50+
BatchSpanProcessor.builder(exporter)
51+
.setExportUnsampledSpans(true)
52+
.setMaxExportBatchSize(maxExportBatchSize)
53+
.build();
4354
return new AwsUnsampledOnlySpanProcessor(bsp);
4455
}
4556

57+
// Visible for testing
4658
SpanExporter getSpanExporter() {
4759
return exporter;
4860
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public void testDefaultSpanProcessor() {
5959
.contains(
6060
"spanExporter=software.amazon.opentelemetry.javaagent.providers.OtlpUdpSpanExporter");
6161
assertThat(delegateBspString).contains("exportUnsampledSpans=true");
62+
assertThat(delegateBspString).contains("maxExportBatchSize=512");
6263
}
6364

6465
@Test
@@ -78,6 +79,19 @@ public void testSpanProcessorWithExporter() {
7879
assertThat(delegateBspString).contains("exportUnsampledSpans=true");
7980
}
8081

82+
@Test
83+
public void testSpanProcessorWithBatchSize() {
84+
AwsUnsampledOnlySpanProcessorBuilder builder =
85+
AwsUnsampledOnlySpanProcessorBuilder.create().setMaxExportBatchSize(100);
86+
AwsUnsampledOnlySpanProcessor unsampledSP = builder.build();
87+
88+
SpanProcessor delegate = unsampledSP.getDelegate();
89+
assertThat(delegate).isInstanceOf(BatchSpanProcessor.class);
90+
BatchSpanProcessor delegateBsp = (BatchSpanProcessor) delegate;
91+
String delegateBspString = delegateBsp.toString();
92+
assertThat(delegateBspString).contains("maxExportBatchSize=100");
93+
}
94+
8195
@Test
8296
public void testStartAddsAttributeToSampledSpan() {
8397
SpanContext mockSpanContext = mock(SpanContext.class);

0 commit comments

Comments
 (0)