Skip to content

Commit 398e552

Browse files
authored
Add tests verifying spans via in-memory exporter (#306)
1 parent 4394b7e commit 398e552

File tree

3 files changed

+91
-3
lines changed

3 files changed

+91
-3
lines changed

examples/trace/build.gradle

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ dependencies {
2929
implementation(libraries.google_cloud_trace)
3030
implementation project(':exporter-trace')
3131
runtimeOnly(libraries.opentelemetry_gcp_resources)
32+
33+
testImplementation(testLibraries.opentelemetry_sdk_testing)
34+
testImplementation(testLibraries.mockito)
35+
testImplementation(testLibraries.junit5)
36+
testRuntimeOnly(testLibraries.junit5_runtime)
37+
}
38+
39+
test {
40+
// Required to discover JUnit 5 tests
41+
useJUnitPlatform()
3242
}
3343

3444
// Set Docker image path here, e.g. using Google Container Registry or Docker Hub

examples/trace/src/main/java/com/google/cloud/opentelemetry/example/trace/TraceExporterExample.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.google.cloud.opentelemetry.trace.TraceConfiguration;
1919
import com.google.cloud.opentelemetry.trace.TraceExporter;
20+
import com.google.common.annotations.VisibleForTesting;
2021
import io.opentelemetry.api.trace.Span;
2122
import io.opentelemetry.context.Scope;
2223
import io.opentelemetry.sdk.OpenTelemetrySdk;
@@ -49,25 +50,33 @@ private static OpenTelemetrySdk setupTraceExporter() {
4950
.buildAndRegisterGlobal();
5051
}
5152

52-
private static void myUseCase(String description) {
53+
@VisibleForTesting
54+
static void myUseCase(OpenTelemetrySdk openTelemetrySdk, String description) {
5355
// Generate a span
5456
Span span =
5557
openTelemetrySdk.getTracer(INSTRUMENTATION_SCOPE_NAME).spanBuilder(description).startSpan();
5658
try (Scope scope = span.makeCurrent()) {
5759
span.addEvent("Event A");
60+
span.setAttribute("test_span", true);
5861
// Do some work for the use case
5962
for (int i = 0; i < 3; i++) {
6063
String work = String.format("%s - Work #%d", description, (i + 1));
61-
doWork(work);
64+
doWork(openTelemetrySdk, work);
6265
}
6366

67+
span.setAttribute("work_loop", 3);
6468
span.addEvent("Event B");
6569
} finally {
6670
span.end();
6771
}
6872
}
6973

70-
private static void doWork(String description) {
74+
private static void myUseCase(String description) {
75+
// Generate a span
76+
myUseCase(openTelemetrySdk, description);
77+
}
78+
79+
private static void doWork(OpenTelemetrySdk openTelemetrySdk, String description) {
7180
// Child span
7281
Span span =
7382
openTelemetrySdk.getTracer(INSTRUMENTATION_SCOPE_NAME).spanBuilder(description).startSpan();
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright 2024 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.google.cloud.opentelemetry.example.trace;
17+
18+
import static org.junit.jupiter.api.Assertions.assertEquals;
19+
import static org.junit.jupiter.api.Assertions.assertFalse;
20+
21+
import io.opentelemetry.api.common.AttributeKey;
22+
import io.opentelemetry.sdk.OpenTelemetrySdk;
23+
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
24+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
25+
import io.opentelemetry.sdk.trace.data.SpanData;
26+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
27+
import java.util.List;
28+
import org.junit.jupiter.api.AfterEach;
29+
import org.junit.jupiter.api.BeforeEach;
30+
import org.junit.jupiter.api.Test;
31+
32+
class TraceExporterExampleTest {
33+
34+
private OpenTelemetrySdk testOTelSdk;
35+
private InMemorySpanExporter testInMemorySpanExporter;
36+
37+
@BeforeEach
38+
public void setupOTelSdk() {
39+
testInMemorySpanExporter = InMemorySpanExporter.create();
40+
SdkTracerProvider testTracerProvider =
41+
SdkTracerProvider.builder()
42+
.addSpanProcessor(SimpleSpanProcessor.create(testInMemorySpanExporter))
43+
.build();
44+
45+
testOTelSdk = OpenTelemetrySdk.builder().setTracerProvider(testTracerProvider).build();
46+
}
47+
48+
@AfterEach
49+
public void cleanupOTelSdk() {
50+
testOTelSdk.close();
51+
}
52+
53+
@Test
54+
public void testMyUseCase() {
55+
TraceExporterExample.myUseCase(testOTelSdk, "test");
56+
List<SpanData> spanItems = testInMemorySpanExporter.getFinishedSpanItems();
57+
assertFalse(spanItems.isEmpty());
58+
59+
// assert on custom span attributes set by application
60+
spanItems.stream()
61+
.filter(spanData -> spanData.getName().equals("test"))
62+
.map(SpanData::getAttributes)
63+
.forEach(
64+
spanAttributes -> {
65+
assertEquals(true, spanAttributes.get(AttributeKey.booleanKey("test_span")));
66+
assertEquals(3, spanAttributes.get(AttributeKey.longKey("work_loop")));
67+
});
68+
}
69+
}

0 commit comments

Comments
 (0)