Skip to content

Commit 77ebde8

Browse files
google-genai-botcopybara-github
authored andcommitted
test: Adding a test for telemetry in RunnerTest
PiperOrigin-RevId: 822575688
1 parent 976a111 commit 77ebde8

3 files changed

Lines changed: 64 additions & 1 deletion

File tree

core/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@
184184
<groupId>io.opentelemetry</groupId>
185185
<artifactId>opentelemetry-sdk-trace</artifactId>
186186
</dependency>
187+
<dependency>
188+
<groupId>io.opentelemetry</groupId>
189+
<artifactId>opentelemetry-sdk-testing</artifactId>
190+
</dependency>
187191
</dependencies>
188192
<build>
189193
<resources>

core/src/main/java/com/google/adk/Telemetry.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,17 @@
4646
public class Telemetry {
4747

4848
private static final Logger log = LoggerFactory.getLogger(Telemetry.class);
49-
private static final Tracer tracer = GlobalOpenTelemetry.getTracer("gcp.vertex.agent");
49+
50+
@SuppressWarnings("NonFinalStaticField")
51+
private static Tracer tracer = GlobalOpenTelemetry.getTracer("gcp.vertex.agent");
5052

5153
private Telemetry() {}
5254

55+
/** Sets the OpenTelemetry instance to be used for tracing. This is for testing purposes only. */
56+
public static void setTracerForTesting(Tracer tracer) {
57+
Telemetry.tracer = tracer;
58+
}
59+
5360
/**
5461
* Traces tool call arguments.
5562
*

core/src/test/java/com/google/adk/runner/RunnerTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
import static org.mockito.Mockito.verify;
2929
import static org.mockito.Mockito.when;
3030

31+
import com.google.adk.Telemetry;
3132
import com.google.adk.agents.InvocationContext;
33+
import com.google.adk.agents.LiveRequestQueue;
3234
import com.google.adk.agents.LlmAgent;
3335
import com.google.adk.agents.RunConfig;
3436
import com.google.adk.events.Event;
@@ -44,19 +46,27 @@
4446
import com.google.genai.types.Content;
4547
import com.google.genai.types.FunctionCall;
4648
import com.google.genai.types.Part;
49+
import io.opentelemetry.api.trace.Tracer;
50+
import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;
51+
import io.opentelemetry.sdk.trace.data.SpanData;
4752
import io.reactivex.rxjava3.core.Completable;
4853
import io.reactivex.rxjava3.core.Flowable;
4954
import io.reactivex.rxjava3.core.Maybe;
5055
import java.util.List;
56+
import java.util.Objects;
5157
import java.util.Optional;
5258
import java.util.concurrent.ConcurrentHashMap;
59+
import org.junit.After;
60+
import org.junit.Before;
61+
import org.junit.Rule;
5362
import org.junit.Test;
5463
import org.junit.runner.RunWith;
5564
import org.junit.runners.JUnit4;
5665
import org.mockito.ArgumentCaptor;
5766

5867
@RunWith(JUnit4.class)
5968
public final class RunnerTest {
69+
@Rule public final OpenTelemetryRule openTelemetryRule = OpenTelemetryRule.create();
6070

6171
private final BasePlugin plugin = mockPlugin("test");
6272
private final Content pluginContent = createContent("from plugin");
@@ -65,6 +75,7 @@ public final class RunnerTest {
6575
private final Runner runner = new InMemoryRunner(agent, "test", ImmutableList.of(plugin));
6676
private final Session session =
6777
runner.sessionService().createSession("test", "user").blockingGet();
78+
private Tracer originalTracer;
6879

6980
private final FailingEchoTool failingEchoTool = new FailingEchoTool();
7081
private final EchoTool echoTool = new EchoTool();
@@ -94,6 +105,17 @@ private BasePlugin mockPlugin(String name) {
94105
return plugin;
95106
}
96107

108+
@Before
109+
public void setUp() {
110+
this.originalTracer = Telemetry.getTracer();
111+
Telemetry.setTracerForTesting(openTelemetryRule.getOpenTelemetry().getTracer("RunnerTest"));
112+
}
113+
114+
@After
115+
public void tearDown() {
116+
Telemetry.setTracerForTesting(originalTracer);
117+
}
118+
97119
@Test
98120
public void pluginDoesNothing() {
99121
var events =
@@ -606,4 +628,34 @@ public void beforeRunCallback_withStateDelta_seesMergedState() {
606628
private Content createContent(String text) {
607629
return Content.builder().parts(Part.builder().text(text).build()).build();
608630
}
631+
632+
@Test
633+
public void runAsync_createsInvocationSpan() {
634+
var unused =
635+
runner.runAsync("user", session.id(), createContent("test message")).toList().blockingGet();
636+
637+
List<SpanData> spans = openTelemetryRule.getSpans();
638+
assertThat(spans).isNotEmpty();
639+
640+
Optional<SpanData> invocationSpan =
641+
spans.stream().filter(span -> Objects.equals(span.getName(), "invocation")).findFirst();
642+
643+
assertThat(invocationSpan).isPresent();
644+
assertThat(invocationSpan.get().hasEnded()).isTrue();
645+
}
646+
647+
@Test
648+
public void runLive_createsInvocationSpan() {
649+
LiveRequestQueue liveRequestQueue = new LiveRequestQueue();
650+
var unused = runner.runLive(session, liveRequestQueue, RunConfig.builder().build()).test();
651+
652+
List<SpanData> spans = openTelemetryRule.getSpans();
653+
assertThat(spans).isNotEmpty();
654+
655+
Optional<SpanData> invocationSpan =
656+
spans.stream().filter(span -> Objects.equals(span.getName(), "invocation")).findFirst();
657+
658+
assertThat(invocationSpan).isPresent();
659+
assertThat(invocationSpan.get().hasEnded()).isTrue();
660+
}
609661
}

0 commit comments

Comments
 (0)