Skip to content

Commit 9e40d37

Browse files
committed
Add CRaC lifecycle integration test scaffold
1 parent 2421d67 commit 9e40d37

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.api.trace.Span;
11+
import io.opentelemetry.api.trace.Tracer;
12+
import io.opentelemetry.sdk.OpenTelemetrySdk;
13+
import io.opentelemetry.sdk.common.CompletableResultCode;
14+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
15+
import io.opentelemetry.sdk.trace.data.SpanData;
16+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
17+
import io.opentelemetry.sdk.trace.export.SpanExporter;
18+
import java.util.ArrayList;
19+
import java.util.Collection;
20+
import java.util.List;
21+
import java.util.concurrent.TimeUnit;
22+
import org.junit.jupiter.api.Disabled;
23+
import org.junit.jupiter.api.Test;
24+
25+
/**
26+
* Integration-style lifecycle tests for CRaC-like checkpoint/restore workflows.
27+
*
28+
* <p>In CRaC flows, applications typically need to close resources at checkpoint and resume normal
29+
* behavior after restore.
30+
*/
31+
class CracLifecycleIntegrationTest {
32+
33+
@Test
34+
void exportsDoNotResumeAfterShutdown_currentBehavior() {
35+
LifecycleSpanExporter exporter = new LifecycleSpanExporter();
36+
OpenTelemetrySdk sdk =
37+
OpenTelemetrySdk.builder()
38+
.setTracerProvider(
39+
SdkTracerProvider.builder()
40+
.addSpanProcessor(SimpleSpanProcessor.create(exporter))
41+
.build())
42+
.build();
43+
44+
try {
45+
Tracer tracer = sdk.getTracer("crac-lifecycle-test");
46+
47+
emitSpan(tracer, "before-checkpoint");
48+
sdk.getSdkTracerProvider().forceFlush().join(10, TimeUnit.SECONDS);
49+
assertThat(exporter.exportedSpanCount()).isEqualTo(1);
50+
51+
sdk.getSdkTracerProvider().shutdown().join(10, TimeUnit.SECONDS);
52+
53+
// Simulate post-restore traffic on the same initialized SDK.
54+
emitSpan(tracer, "after-restore");
55+
sdk.getSdkTracerProvider().forceFlush().join(10, TimeUnit.SECONDS);
56+
57+
assertThat(exporter.exportedSpanCount()).isEqualTo(1);
58+
} finally {
59+
sdk.close();
60+
}
61+
}
62+
63+
@Test
64+
@Disabled("Expected to fail until #6756 is addressed with checkpoint/restore-safe lifecycle")
65+
void exportsShouldResumeAfterRestore_expectedBehavior() {
66+
LifecycleSpanExporter exporter = new LifecycleSpanExporter();
67+
OpenTelemetrySdk sdk =
68+
OpenTelemetrySdk.builder()
69+
.setTracerProvider(
70+
SdkTracerProvider.builder()
71+
.addSpanProcessor(SimpleSpanProcessor.create(exporter))
72+
.build())
73+
.build();
74+
75+
try {
76+
Tracer tracer = sdk.getTracer("crac-lifecycle-test");
77+
78+
emitSpan(tracer, "before-checkpoint");
79+
sdk.getSdkTracerProvider().forceFlush().join(10, TimeUnit.SECONDS);
80+
assertThat(exporter.exportedSpanCount()).isEqualTo(1);
81+
82+
sdk.getSdkTracerProvider().shutdown().join(10, TimeUnit.SECONDS);
83+
84+
// Desired behavior for CRaC-style restore: post-restore spans should export again.
85+
emitSpan(tracer, "after-restore");
86+
sdk.getSdkTracerProvider().forceFlush().join(10, TimeUnit.SECONDS);
87+
88+
assertThat(exporter.exportedSpanCount()).isEqualTo(2);
89+
} finally {
90+
sdk.close();
91+
}
92+
}
93+
94+
private static void emitSpan(Tracer tracer, String name) {
95+
Span span = tracer.spanBuilder(name).startSpan();
96+
span.end();
97+
}
98+
99+
private static final class LifecycleSpanExporter implements SpanExporter {
100+
private final List<SpanData> exportedSpans = new ArrayList<>();
101+
private boolean shutdown;
102+
103+
@Override
104+
public CompletableResultCode export(Collection<SpanData> spans) {
105+
if (shutdown) {
106+
return CompletableResultCode.ofFailure();
107+
}
108+
exportedSpans.addAll(spans);
109+
return CompletableResultCode.ofSuccess();
110+
}
111+
112+
@Override
113+
public CompletableResultCode flush() {
114+
return CompletableResultCode.ofSuccess();
115+
}
116+
117+
@Override
118+
public CompletableResultCode shutdown() {
119+
shutdown = true;
120+
return CompletableResultCode.ofSuccess();
121+
}
122+
123+
private int exportedSpanCount() {
124+
return exportedSpans.size();
125+
}
126+
}
127+
}

0 commit comments

Comments
 (0)