From 2104fd6136f21e22f9b43e984f4a1819f940ecc2 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 22 Apr 2026 10:07:52 +0200 Subject: [PATCH 1/5] test: Bump google ADK patching range to include new major `1.0.0` --- .../configs/google-adk.ts | 98 +++++++++++++++++-- 1 file changed, 91 insertions(+), 7 deletions(-) diff --git a/js/src/auto-instrumentations/configs/google-adk.ts b/js/src/auto-instrumentations/configs/google-adk.ts index 8da69df28..8c986be46 100644 --- a/js/src/auto-instrumentations/configs/google-adk.ts +++ b/js/src/auto-instrumentations/configs/google-adk.ts @@ -2,7 +2,8 @@ import type { InstrumentationConfig } from "@apm-js-collab/code-transformer"; import { googleADKChannels } from "../../instrumentation/plugins/google-adk-channels"; const googleADKVersionRange = ">=0.1.0"; -const googleADKBundledIndexVersionRange = ">=0.6.1 <0.7.0"; +const googleADKBundledIndexV06VersionRange = ">=0.6.1 <0.7.0"; +const googleADKBundledIndexV1VersionRange = ">=1.0.0 <2.0.0"; /** * Instrumentation configurations for the Google ADK (@google/adk). @@ -42,7 +43,7 @@ export const googleADKConfigs: InstrumentationConfig[] = [ channelName: googleADKChannels.runnerRunAsync.channelName, module: { name: "@google/adk", - versionRange: googleADKBundledIndexVersionRange, + versionRange: googleADKBundledIndexV06VersionRange, filePath: "dist/cjs/index.js", }, functionQuery: { @@ -55,7 +56,35 @@ export const googleADKConfigs: InstrumentationConfig[] = [ channelName: googleADKChannels.runnerRunAsync.channelName, module: { name: "@google/adk", - versionRange: googleADKBundledIndexVersionRange, + versionRange: googleADKBundledIndexV06VersionRange, + filePath: "dist/esm/index.js", + }, + functionQuery: { + methodName: "runAsync", + kind: "Sync", + index: 11, + }, + }, + // The 1.x bundled entrypoints still inline the runtime into index.js, but + // the minified method order changed. These indices are verified against 1.0.0. + { + channelName: googleADKChannels.runnerRunAsync.channelName, + module: { + name: "@google/adk", + versionRange: googleADKBundledIndexV1VersionRange, + filePath: "dist/cjs/index.js", + }, + functionQuery: { + methodName: "runAsync", + kind: "Sync", + index: 11, + }, + }, + { + channelName: googleADKChannels.runnerRunAsync.channelName, + module: { + name: "@google/adk", + versionRange: googleADKBundledIndexV1VersionRange, filePath: "dist/esm/index.js", }, functionQuery: { @@ -91,7 +120,35 @@ export const googleADKConfigs: InstrumentationConfig[] = [ channelName: googleADKChannels.agentRunAsync.channelName, module: { name: "@google/adk", - versionRange: googleADKBundledIndexVersionRange, + versionRange: googleADKBundledIndexV06VersionRange, + filePath: "dist/cjs/index.js", + }, + functionQuery: { + methodName: "runAsync", + kind: "Sync", + index: 0, + }, + }, + { + channelName: googleADKChannels.agentRunAsync.channelName, + module: { + name: "@google/adk", + versionRange: googleADKBundledIndexV06VersionRange, + filePath: "dist/esm/index.js", + }, + functionQuery: { + methodName: "runAsync", + kind: "Sync", + index: 0, + }, + }, + // The 1.x bundled entrypoints keep BaseAgent.runAsync as the first bundled + // async-generator runAsync method in file order. + { + channelName: googleADKChannels.agentRunAsync.channelName, + module: { + name: "@google/adk", + versionRange: googleADKBundledIndexV1VersionRange, filePath: "dist/cjs/index.js", }, functionQuery: { @@ -104,7 +161,7 @@ export const googleADKConfigs: InstrumentationConfig[] = [ channelName: googleADKChannels.agentRunAsync.channelName, module: { name: "@google/adk", - versionRange: googleADKBundledIndexVersionRange, + versionRange: googleADKBundledIndexV1VersionRange, filePath: "dist/esm/index.js", }, functionQuery: { @@ -140,7 +197,34 @@ export const googleADKConfigs: InstrumentationConfig[] = [ channelName: googleADKChannels.toolRunAsync.channelName, module: { name: "@google/adk", - versionRange: googleADKBundledIndexVersionRange, + versionRange: googleADKBundledIndexV06VersionRange, + filePath: "dist/cjs/index.js", + }, + functionQuery: { + methodName: "runAsync", + kind: "Async", + index: 1, + }, + }, + { + channelName: googleADKChannels.toolRunAsync.channelName, + module: { + name: "@google/adk", + versionRange: googleADKBundledIndexV06VersionRange, + filePath: "dist/esm/index.js", + }, + functionQuery: { + methodName: "runAsync", + kind: "Async", + index: 1, + }, + }, + // The 1.x bundle moves FunctionTool.runAsync behind one helper method. + { + channelName: googleADKChannels.toolRunAsync.channelName, + module: { + name: "@google/adk", + versionRange: googleADKBundledIndexV1VersionRange, filePath: "dist/cjs/index.js", }, functionQuery: { @@ -153,7 +237,7 @@ export const googleADKConfigs: InstrumentationConfig[] = [ channelName: googleADKChannels.toolRunAsync.channelName, module: { name: "@google/adk", - versionRange: googleADKBundledIndexVersionRange, + versionRange: googleADKBundledIndexV1VersionRange, filePath: "dist/esm/index.js", }, functionQuery: { From 13ab4f43a4d92191981e692c49fdb6cde856b31f Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 22 Apr 2026 10:16:19 +0200 Subject: [PATCH 2/5] changeset --- .changeset/eager-jobs-hammer.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/eager-jobs-hammer.md diff --git a/.changeset/eager-jobs-hammer.md b/.changeset/eager-jobs-hammer.md new file mode 100644 index 000000000..7dec269f8 --- /dev/null +++ b/.changeset/eager-jobs-hammer.md @@ -0,0 +1,5 @@ +--- +"braintrust": patch +--- + +feat: Bump google ADK patching range to include new major `1.0.0` From a14c164ff4a456c9df43cdb40dca81817f22272b Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 22 Apr 2026 11:36:40 +0200 Subject: [PATCH 3/5] fix --- .../google-adk-v1000-auto.log-payloads.json | 147 ++++++++++++++++ .../google-adk-v1000-auto.span-events.json | 124 ++++++++++++++ ...google-adk-v1000-wrapped.log-payloads.json | 162 ++++++++++++++++++ .../google-adk-v1000-wrapped.span-events.json | 141 +++++++++++++++ .../google-adk-instrumentation/package.json | 3 +- .../google-adk-instrumentation/pnpm-lock.yaml | 110 +++++++++++- .../scenario.google-adk-v061.mjs | 5 + .../scenario.google-adk-v061.ts | 5 + .../scenario.test.ts | 88 ++++++---- .../configs/google-adk.ts | 4 +- 10 files changed, 753 insertions(+), 36 deletions(-) create mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.log-payloads.json create mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.span-events.json create mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json create mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json create mode 100644 e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.mjs create mode 100644 e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.ts diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.log-payloads.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.log-payloads.json new file mode 100644 index 000000000..0b9a92b5c --- /dev/null +++ b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.log-payloads.json @@ -0,0 +1,147 @@ +[ + { + "metadata": { + "scenario": "google-adk-instrumentation" + }, + "metrics": { + "start": 0 + }, + "name": "google-adk-instrumentation-root", + "type": "task" + }, + { + "metadata": { + "operation": "simple-run" + }, + "metrics": { + "start": 0 + }, + "name": "adk-simple-run-operation", + "type": null + }, + { + "input": { + "messages": [ + { + "content": "What is the weather in Paris, France?", + "role": "user" + } + ] + }, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metrics": { + "start": 0 + }, + "name": "Google ADK Runner", + "type": "task" + }, + { + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metrics": { + "start": 0 + }, + "name": "Agent: weather_agent", + "type": "task" + }, + { + "input": { + "location": "Paris, France" + }, + "metadata": { + "google_adk.tool_call_id": "adk-", + "google_adk.tool_name": "get_weather", + "provider": "google-adk" + }, + "metrics": { + "duration": 0, + "end": 0, + "start": 0 + }, + "name": "tool: get_weather", + "output": { + "condition": "sunny", + "location": "Paris, France", + "temperature": 72 + }, + "type": "tool" + }, + { + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metrics": { + "duration": 0, + "end": 0, + "start": 0 + }, + "name": "Agent: weather_agent", + "output": { + "author": "weather_agent", + "content": "", + "role": "model" + }, + "type": "task" + }, + { + "input": { + "messages": [ + { + "content": "What is the weather in Paris, France?", + "role": "user" + } + ] + }, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metrics": { + "completion_tokens": "", + "duration": 0, + "end": 0, + "prompt_tokens": "", + "start": 0, + "tokens": "" + }, + "name": "Google ADK Runner", + "output": { + "author": "weather_agent", + "content": "", + "role": "model" + }, + "type": "task" + }, + { + "metadata": { + "operation": "simple-run" + }, + "metrics": { + "end": 0, + "start": 0 + }, + "name": "adk-simple-run-operation", + "type": null + }, + { + "metadata": { + "scenario": "google-adk-instrumentation" + }, + "metrics": { + "end": 0, + "start": 0 + }, + "name": "google-adk-instrumentation-root", + "type": "task" + } +] diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.span-events.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.span-events.json new file mode 100644 index 000000000..cb8cddcb8 --- /dev/null +++ b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.span-events.json @@ -0,0 +1,124 @@ +[ + { + "has_input": false, + "has_output": false, + "metadata": { + "scenario": "google-adk-instrumentation" + }, + "metric_keys": [], + "name": "google-adk-instrumentation-root", + "root_span_id": "", + "span_id": "", + "span_parents": [], + "type": "task" + }, + { + "has_input": false, + "has_output": false, + "metadata": { + "operation": "simple-run" + }, + "metric_keys": [], + "name": "adk-simple-run-operation", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": null + }, + { + "has_input": true, + "has_output": false, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metric_keys": [], + "name": "Google ADK Runner", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + }, + { + "has_input": false, + "has_output": false, + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metric_keys": [], + "name": "Agent: weather_agent", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + }, + { + "has_input": true, + "has_output": true, + "metadata": { + "google_adk.tool_call_id": "adk-", + "google_adk.tool_name": "get_weather", + "provider": "google-adk" + }, + "metric_keys": [ + "duration" + ], + "name": "tool: get_weather", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "tool" + }, + { + "has_input": false, + "has_output": true, + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metric_keys": [ + "duration" + ], + "name": "Agent: weather_agent", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + }, + { + "has_input": true, + "has_output": true, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metric_keys": [ + "completion_tokens", + "duration", + "prompt_tokens", + "tokens" + ], + "name": "Google ADK Runner", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + } +] diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json new file mode 100644 index 000000000..cc629c7a4 --- /dev/null +++ b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json @@ -0,0 +1,162 @@ +[ + { + "metadata": { + "scenario": "google-adk-instrumentation" + }, + "metrics": { + "start": 0 + }, + "name": "google-adk-instrumentation-root", + "type": "task" + }, + { + "metadata": { + "operation": "simple-run" + }, + "metrics": { + "start": 0 + }, + "name": "adk-simple-run-operation", + "type": null + }, + { + "input": { + "messages": [ + { + "content": "What is the weather in Paris, France?", + "role": "user" + } + ] + }, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metrics": { + "start": 0 + }, + "name": "Google ADK Runner", + "type": "task" + }, + { + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metrics": { + "start": 0 + }, + "name": "Agent: weather_agent", + "type": "task" + }, + { + "input": { + "location": "Paris, France" + }, + "metadata": { + "google_adk.tool_call_id": "adk-", + "google_adk.tool_name": "get_weather", + "provider": "google-adk" + }, + "metrics": { + "start": 0 + }, + "name": "tool: get_weather", + "type": "tool" + }, + { + "input": { + "location": "Paris, France" + }, + "metadata": { + "google_adk.tool_call_id": "adk-", + "google_adk.tool_name": "get_weather", + "provider": "google-adk" + }, + "metrics": { + "duration": 0, + "end": 0, + "start": 0 + }, + "name": "tool: get_weather", + "output": { + "condition": "sunny", + "location": "Paris, France", + "temperature": 72 + }, + "type": "tool" + }, + { + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metrics": { + "duration": 0, + "end": 0, + "start": 0 + }, + "name": "Agent: weather_agent", + "output": { + "author": "weather_agent", + "content": "", + "role": "model" + }, + "type": "task" + }, + { + "input": { + "messages": [ + { + "content": "What is the weather in Paris, France?", + "role": "user" + } + ] + }, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metrics": { + "completion_tokens": "", + "duration": 0, + "end": 0, + "prompt_tokens": "", + "start": 0, + "tokens": "" + }, + "name": "Google ADK Runner", + "output": { + "author": "weather_agent", + "content": "", + "role": "model" + }, + "type": "task" + }, + { + "metadata": { + "operation": "simple-run" + }, + "metrics": { + "end": 0, + "start": 0 + }, + "name": "adk-simple-run-operation", + "type": null + }, + { + "metadata": { + "scenario": "google-adk-instrumentation" + }, + "metrics": { + "end": 0, + "start": 0 + }, + "name": "google-adk-instrumentation-root", + "type": "task" + } +] diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json new file mode 100644 index 000000000..71f5ce69e --- /dev/null +++ b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json @@ -0,0 +1,141 @@ +[ + { + "has_input": false, + "has_output": false, + "metadata": { + "scenario": "google-adk-instrumentation" + }, + "metric_keys": [], + "name": "google-adk-instrumentation-root", + "root_span_id": "", + "span_id": "", + "span_parents": [], + "type": "task" + }, + { + "has_input": false, + "has_output": false, + "metadata": { + "operation": "simple-run" + }, + "metric_keys": [], + "name": "adk-simple-run-operation", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": null + }, + { + "has_input": true, + "has_output": false, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metric_keys": [], + "name": "Google ADK Runner", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + }, + { + "has_input": false, + "has_output": false, + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metric_keys": [], + "name": "Agent: weather_agent", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + }, + { + "has_input": true, + "has_output": false, + "metadata": { + "google_adk.tool_call_id": "adk-", + "google_adk.tool_name": "get_weather", + "provider": "google-adk" + }, + "metric_keys": [], + "name": "tool: get_weather", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "tool" + }, + { + "has_input": true, + "has_output": true, + "metadata": { + "google_adk.tool_call_id": "adk-", + "google_adk.tool_name": "get_weather", + "provider": "google-adk" + }, + "metric_keys": [ + "duration" + ], + "name": "tool: get_weather", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "tool" + }, + { + "has_input": false, + "has_output": true, + "metadata": { + "google_adk.agent_name": "weather_agent", + "model": "gemini-2.5-flash-lite", + "provider": "google-adk" + }, + "metric_keys": [ + "duration" + ], + "name": "Agent: weather_agent", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + }, + { + "has_input": true, + "has_output": true, + "metadata": { + "google_adk.session_id": "test-session-1", + "google_adk.user_id": "test-user", + "provider": "google-adk" + }, + "metric_keys": [ + "completion_tokens", + "duration", + "prompt_tokens", + "tokens" + ], + "name": "Google ADK Runner", + "root_span_id": "", + "span_id": "", + "span_parents": [ + "" + ], + "type": "task" + } +] diff --git a/e2e/scenarios/google-adk-instrumentation/package.json b/e2e/scenarios/google-adk-instrumentation/package.json index 3b6424224..a93433113 100644 --- a/e2e/scenarios/google-adk-instrumentation/package.json +++ b/e2e/scenarios/google-adk-instrumentation/package.json @@ -9,6 +9,7 @@ } }, "dependencies": { - "@google/adk": "0.6.1" + "@google/adk": "1.0.0", + "google-adk-sdk-v061": "npm:@google/adk@0.6.1" } } diff --git a/e2e/scenarios/google-adk-instrumentation/pnpm-lock.yaml b/e2e/scenarios/google-adk-instrumentation/pnpm-lock.yaml index 1c5117849..65a291f2c 100644 --- a/e2e/scenarios/google-adk-instrumentation/pnpm-lock.yaml +++ b/e2e/scenarios/google-adk-instrumentation/pnpm-lock.yaml @@ -9,8 +9,11 @@ importers: .: dependencies: '@google/adk': - specifier: 0.6.1 - version: 0.6.1(71c6fbe96c14c583afc78db44c65d7e5) + specifier: 1.0.0 + version: 1.0.0(@grpc/grpc-js@1.14.3)(@mikro-orm/mariadb@6.6.12(@mikro-orm/core@6.6.12)(pg@8.20.0))(@mikro-orm/mssql@6.6.12(@azure/core-client@1.10.1)(@mikro-orm/core@6.6.12)(mariadb@3.4.5)(pg@8.20.0))(@mikro-orm/mysql@6.6.12(@mikro-orm/core@6.6.12)(@types/node@25.5.2)(mariadb@3.4.5)(pg@8.20.0))(@mikro-orm/postgresql@6.6.12(@mikro-orm/core@6.6.12)(mariadb@3.4.5))(@mikro-orm/sqlite@6.6.12(@mikro-orm/core@6.6.12)(mariadb@3.4.5)(pg@8.20.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + google-adk-sdk-v061: + specifier: npm:@google/adk@0.6.1 + version: '@google/adk@0.6.1(71c6fbe96c14c583afc78db44c65d7e5)' packages: @@ -178,6 +181,15 @@ packages: '@opentelemetry/sdk-trace-base': ^2.1.0 '@opentelemetry/sdk-trace-node': ^2.1.0 + '@google/adk@1.0.0': + resolution: {integrity: sha512-BRUnfoArCbBmPn4pvTBOYxjQQyDvUR99v40Bl2P5L8G7rgP5NVzpE8HCeKSIziNoU4yW7lgor0GyzaPt0YHQeA==} + peerDependencies: + '@mikro-orm/mariadb': ^6.6.6 + '@mikro-orm/mssql': ^6.6.6 + '@mikro-orm/mysql': ^6.6.6 + '@mikro-orm/postgresql': ^6.6.6 + '@mikro-orm/sqlite': ^6.6.6 + '@google/genai@1.49.0': resolution: {integrity: sha512-hO69Zl0H3x+L0KL4stl1pLYgnqnwHoLqtKy6MRlNnW8TAxjqMdOUVafomKd4z1BePkzoxJWbYILny9a2Zk43VQ==} engines: {node: '>=20.0.0'} @@ -208,6 +220,18 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsep-plugin/assignment@1.3.0': + resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.0.4': + resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@mikro-orm/core@6.6.12': resolution: {integrity: sha512-LgLfRfaGdRUNkJ457H1GsuzoiZJuBY3HKgP+BZMTaFr/l6ah6JbyubodbVXxH+Ffji62TtbHFFRr0tj4wNwLRg==} engines: {node: '>= 18.12.0'} @@ -541,6 +565,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -1265,6 +1292,14 @@ packages: js-md4@0.3.2: resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsep@1.4.0: + resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} + engines: {node: '>= 10.16.0'} + json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -1277,6 +1312,11 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonpath-plus@10.4.0: + resolution: {integrity: sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==} + engines: {node: '>=18.0.0'} + hasBin: true + jsonwebtoken@9.0.3: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} @@ -2457,6 +2497,50 @@ snapshots: - supports-color - utf-8-validate + '@google/adk@1.0.0(@grpc/grpc-js@1.14.3)(@mikro-orm/mariadb@6.6.12(@mikro-orm/core@6.6.12)(pg@8.20.0))(@mikro-orm/mssql@6.6.12(@azure/core-client@1.10.1)(@mikro-orm/core@6.6.12)(mariadb@3.4.5)(pg@8.20.0))(@mikro-orm/mysql@6.6.12(@mikro-orm/core@6.6.12)(@types/node@25.5.2)(mariadb@3.4.5)(pg@8.20.0))(@mikro-orm/postgresql@6.6.12(@mikro-orm/core@6.6.12)(mariadb@3.4.5))(@mikro-orm/sqlite@6.6.12(@mikro-orm/core@6.6.12)(mariadb@3.4.5)(pg@8.20.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)': + dependencies: + '@a2a-js/sdk': 0.3.13(@grpc/grpc-js@1.14.3)(express@4.22.1) + '@google-cloud/opentelemetry-cloud-monitoring-exporter': 0.21.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.6.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@google-cloud/opentelemetry-cloud-trace-exporter': 3.0.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@google-cloud/storage': 7.19.0(encoding@0.1.13) + '@google/genai': 1.49.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + '@mikro-orm/core': 6.6.12 + '@mikro-orm/mariadb': 6.6.12(@mikro-orm/core@6.6.12)(pg@8.20.0) + '@mikro-orm/mssql': 6.6.12(@azure/core-client@1.10.1)(@mikro-orm/core@6.6.12)(mariadb@3.4.5)(pg@8.20.0) + '@mikro-orm/mysql': 6.6.12(@mikro-orm/core@6.6.12)(@types/node@25.5.2)(mariadb@3.4.5)(pg@8.20.0) + '@mikro-orm/postgresql': 6.6.12(@mikro-orm/core@6.6.12)(mariadb@3.4.5) + '@mikro-orm/reflection': 6.6.12(@mikro-orm/core@6.6.12) + '@mikro-orm/sqlite': 6.6.12(@mikro-orm/core@6.6.12)(mariadb@3.4.5)(pg@8.20.0) + '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/exporter-logs-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-gcp': 0.40.3(@opentelemetry/api@1.9.0)(encoding@0.1.13) + '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.6.1(@opentelemetry/api@1.9.0) + express: 4.22.1 + google-auth-library: 10.6.2 + js-yaml: 4.1.1 + jsonpath-plus: 10.4.0 + lodash-es: 4.18.1 + winston: 3.19.0 + zod: 4.3.6 + zod-to-json-schema: 3.25.2(zod@4.3.6) + transitivePeerDependencies: + - '@bufbuild/protobuf' + - '@cfworker/json-schema' + - '@grpc/grpc-js' + - '@opentelemetry/core' + - bufferutil + - encoding + - supports-color + - utf-8-validate + '@google/genai@1.49.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))': dependencies: google-auth-library: 10.6.2 @@ -2490,6 +2574,14 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} + '@jsep-plugin/assignment@1.3.0(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@jsep-plugin/regex@1.0.4(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + '@mikro-orm/core@6.6.12': dependencies: dataloader: 2.2.3 @@ -2984,6 +3076,8 @@ snapshots: readable-stream: 3.6.2 optional: true + argparse@2.0.1: {} + array-flatten@1.1.1: {} array-union@2.1.0: {} @@ -3819,6 +3913,12 @@ snapshots: js-md4@0.3.2: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsep@1.4.0: {} + json-bigint@1.0.0: dependencies: bignumber.js: 9.3.1 @@ -3833,6 +3933,12 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonpath-plus@10.4.0: + dependencies: + '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) + '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) + jsep: 1.4.0 + jsonwebtoken@9.0.3: dependencies: jws: 4.0.1 diff --git a/e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.mjs b/e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.mjs new file mode 100644 index 000000000..c38a65601 --- /dev/null +++ b/e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.mjs @@ -0,0 +1,5 @@ +import * as adk from "google-adk-sdk-v061"; +import { runMain } from "../../helpers/provider-runtime.mjs"; +import { runAutoGoogleADKInstrumentation } from "./scenario.impl.mjs"; + +runMain(async () => runAutoGoogleADKInstrumentation(adk)); diff --git a/e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.ts b/e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.ts new file mode 100644 index 000000000..7f89e28ed --- /dev/null +++ b/e2e/scenarios/google-adk-instrumentation/scenario.google-adk-v061.ts @@ -0,0 +1,5 @@ +import * as adk from "google-adk-sdk-v061"; +import { runMain } from "../../helpers/scenario-runtime"; +import { runWrappedGoogleADKInstrumentation } from "./scenario.impl.mjs"; + +runMain(async () => runWrappedGoogleADKInstrumentation(adk)); diff --git a/e2e/scenarios/google-adk-instrumentation/scenario.test.ts b/e2e/scenarios/google-adk-instrumentation/scenario.test.ts index 80423925a..016240305 100644 --- a/e2e/scenarios/google-adk-instrumentation/scenario.test.ts +++ b/e2e/scenarios/google-adk-instrumentation/scenario.test.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import { prepareScenarioDir, + readInstalledPackageVersion, resolveScenarioDir, } from "../../helpers/scenario-harness"; import { defineGoogleADKInstrumentationAssertions } from "./assertions"; @@ -9,37 +10,62 @@ const scenarioDir = await prepareScenarioDir({ scenarioDir: resolveScenarioDir(import.meta.url), }); const TIMEOUT_MS = 90_000; -describe("google adk sdk 0.6.1", () => { - defineGoogleADKInstrumentationAssertions({ - name: "wrapped instrumentation", - runScenario: async ({ runScenarioDir }) => { - await runScenarioDir({ - entry: "scenario.ts", - runContext: { variantKey: "google-adk-v061-wrapped" }, - scenarioDir, - timeoutMs: TIMEOUT_MS, - }); +const googleADKScenarios = await Promise.all( + [ + { + autoEntry: "scenario.google-adk-v061.mjs", + dependencyName: "google-adk-sdk-v061", + snapshotName: "google-adk-v061", + wrapperEntry: "scenario.google-adk-v061.ts", }, - expectLLMSpan: false, - snapshotName: "google-adk-v061-wrapped", - testFileUrl: import.meta.url, - timeoutMs: TIMEOUT_MS, - }); - - defineGoogleADKInstrumentationAssertions({ - name: "auto-hook instrumentation", - runScenario: async ({ runNodeScenarioDir }) => { - await runNodeScenarioDir({ - entry: "scenario.mjs", - nodeArgs: ["--import", "braintrust/hook.mjs"], - runContext: { variantKey: "google-adk-v061-auto" }, - scenarioDir, - timeoutMs: TIMEOUT_MS, - }); + { + autoEntry: "scenario.mjs", + dependencyName: "@google/adk", + snapshotName: "google-adk-v1000", + wrapperEntry: "scenario.ts", }, - expectLLMSpan: true, - snapshotName: "google-adk-v061-auto", - testFileUrl: import.meta.url, - timeoutMs: TIMEOUT_MS, + ].map(async (scenario) => ({ + ...scenario, + version: await readInstalledPackageVersion( + scenarioDir, + scenario.dependencyName, + ), + })), +); + +for (const scenario of googleADKScenarios) { + describe(`google adk sdk ${scenario.version}`, () => { + defineGoogleADKInstrumentationAssertions({ + name: "wrapped instrumentation", + runScenario: async ({ runScenarioDir }) => { + await runScenarioDir({ + entry: scenario.wrapperEntry, + runContext: { variantKey: `${scenario.snapshotName}-wrapped` }, + scenarioDir, + timeoutMs: TIMEOUT_MS, + }); + }, + expectLLMSpan: false, + snapshotName: `${scenario.snapshotName}-wrapped`, + testFileUrl: import.meta.url, + timeoutMs: TIMEOUT_MS, + }); + + defineGoogleADKInstrumentationAssertions({ + name: "auto-hook instrumentation", + runScenario: async ({ runNodeScenarioDir }) => { + await runNodeScenarioDir({ + entry: scenario.autoEntry, + nodeArgs: ["--import", "braintrust/hook.mjs"], + runContext: { variantKey: `${scenario.snapshotName}-auto` }, + scenarioDir, + timeoutMs: TIMEOUT_MS, + }); + }, + expectLLMSpan: true, + snapshotName: `${scenario.snapshotName}-auto`, + testFileUrl: import.meta.url, + timeoutMs: TIMEOUT_MS, + }); }); -}); +} diff --git a/js/src/auto-instrumentations/configs/google-adk.ts b/js/src/auto-instrumentations/configs/google-adk.ts index 8c986be46..55b9ce662 100644 --- a/js/src/auto-instrumentations/configs/google-adk.ts +++ b/js/src/auto-instrumentations/configs/google-adk.ts @@ -77,7 +77,7 @@ export const googleADKConfigs: InstrumentationConfig[] = [ functionQuery: { methodName: "runAsync", kind: "Sync", - index: 11, + index: 12, }, }, { @@ -90,7 +90,7 @@ export const googleADKConfigs: InstrumentationConfig[] = [ functionQuery: { methodName: "runAsync", kind: "Sync", - index: 11, + index: 12, }, }, From 70d55cdb5b8203b123e35a6a6bd30a74b0fc750a Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 22 Apr 2026 13:01:19 +0200 Subject: [PATCH 4/5] e2e test summary --- .agents/skills/e2e-tests/SKILL.md | 1 + e2e/config/pr-comment-scenarios.json | 5 ++++- e2e/scenarios/google-adk-instrumentation/assertions.ts | 6 ++++-- .../google-adk-instrumentation/scenario.test.ts | 10 ++++++---- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.agents/skills/e2e-tests/SKILL.md b/.agents/skills/e2e-tests/SKILL.md index ffe3458c3..9b21f3219 100644 --- a/.agents/skills/e2e-tests/SKILL.md +++ b/.agents/skills/e2e-tests/SKILL.md @@ -45,6 +45,7 @@ Try not to use specific test narrowing commands unless hunting down a very nasty - Keep reusable logic in `e2e/helpers/`. Keep one-off fixtures and scenario-specific files inside the scenario directory. - Snapshot stable contracts, not raw noise. Use `normalizeForSnapshot(...)` before inline snapshots and `formatJsonFileSnapshot(...)` plus file snapshots for larger payloads or version matrices. - When a scenario family already has `assertions.ts`, keep version- or provider-specific test setup in `scenario.test.ts` and reuse the shared assertions file. +- Keep the CI e2e summary up to date. If a scenario version matrix or `variantKey` changes, update `e2e/config/pr-comment-scenarios.json` in the same change and follow the established pattern used by other versioned scenarios: one summary row per version, not separate wrapped/auto rows unless that pattern already exists for the scenario family. - Run new or updated scenarios three times in a row before considering snapshots stable. ## Scenario Patterns diff --git a/e2e/config/pr-comment-scenarios.json b/e2e/config/pr-comment-scenarios.json index 7870cbcfe..210590c01 100644 --- a/e2e/config/pr-comment-scenarios.json +++ b/e2e/config/pr-comment-scenarios.json @@ -26,7 +26,10 @@ "scenarioDirName": "google-adk-instrumentation", "label": "Google ADK Instrumentation", "metadataScenario": "google-adk-instrumentation", - "variants": [{ "variantKey": "google-adk-v061", "label": "v0.6.1" }] + "variants": [ + { "variantKey": "google-adk-v061", "label": "v0.6.1" }, + { "variantKey": "google-adk-v1000", "label": "v1.0.0" } + ] }, { "scenarioDirName": "google-genai-instrumentation", diff --git a/e2e/scenarios/google-adk-instrumentation/assertions.ts b/e2e/scenarios/google-adk-instrumentation/assertions.ts index 39cc5a91c..6f8726522 100644 --- a/e2e/scenarios/google-adk-instrumentation/assertions.ts +++ b/e2e/scenarios/google-adk-instrumentation/assertions.ts @@ -160,19 +160,21 @@ function summarizeADKPayload(event: CapturedLogEvent): Json { export function defineGoogleADKInstrumentationAssertions(options: { expectLLMSpan: boolean; + mode: "auto" | "wrapped"; name: string; runScenario: RunGoogleADKScenario; snapshotName: string; testFileUrl: string; timeoutMs: number; }): void { + const snapshotBaseName = `${options.snapshotName}-${options.mode}`; const spanSnapshotPath = resolveFileSnapshotPath( options.testFileUrl, - `${options.snapshotName}.span-events.json`, + `${snapshotBaseName}.span-events.json`, ); const payloadSnapshotPath = resolveFileSnapshotPath( options.testFileUrl, - `${options.snapshotName}.log-payloads.json`, + `${snapshotBaseName}.log-payloads.json`, ); const testConfig = { timeout: options.timeoutMs, diff --git a/e2e/scenarios/google-adk-instrumentation/scenario.test.ts b/e2e/scenarios/google-adk-instrumentation/scenario.test.ts index 016240305..4d583dfc4 100644 --- a/e2e/scenarios/google-adk-instrumentation/scenario.test.ts +++ b/e2e/scenarios/google-adk-instrumentation/scenario.test.ts @@ -37,33 +37,35 @@ for (const scenario of googleADKScenarios) { describe(`google adk sdk ${scenario.version}`, () => { defineGoogleADKInstrumentationAssertions({ name: "wrapped instrumentation", + mode: "wrapped", runScenario: async ({ runScenarioDir }) => { await runScenarioDir({ entry: scenario.wrapperEntry, - runContext: { variantKey: `${scenario.snapshotName}-wrapped` }, + runContext: { variantKey: scenario.snapshotName }, scenarioDir, timeoutMs: TIMEOUT_MS, }); }, expectLLMSpan: false, - snapshotName: `${scenario.snapshotName}-wrapped`, + snapshotName: scenario.snapshotName, testFileUrl: import.meta.url, timeoutMs: TIMEOUT_MS, }); defineGoogleADKInstrumentationAssertions({ name: "auto-hook instrumentation", + mode: "auto", runScenario: async ({ runNodeScenarioDir }) => { await runNodeScenarioDir({ entry: scenario.autoEntry, nodeArgs: ["--import", "braintrust/hook.mjs"], - runContext: { variantKey: `${scenario.snapshotName}-auto` }, + runContext: { variantKey: scenario.snapshotName }, scenarioDir, timeoutMs: TIMEOUT_MS, }); }, expectLLMSpan: true, - snapshotName: `${scenario.snapshotName}-auto`, + snapshotName: scenario.snapshotName, testFileUrl: import.meta.url, timeoutMs: TIMEOUT_MS, }); From 7507438eb8c1c38a338200635ca59a709c18f58c Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 22 Apr 2026 13:28:43 +0200 Subject: [PATCH 5/5] unify snapshots --- .../google-adk-v061-wrapped.log-payloads.json | 162 ------------------ .../google-adk-v061-wrapped.span-events.json | 141 --------------- ...json => google-adk-v061.log-payloads.json} | 0 ....json => google-adk-v061.span-events.json} | 0 ...google-adk-v1000-wrapped.log-payloads.json | 162 ------------------ .../google-adk-v1000-wrapped.span-events.json | 141 --------------- ...son => google-adk-v1000.log-payloads.json} | 0 ...json => google-adk-v1000.span-events.json} | 0 .../google-adk-instrumentation/assertions.ts | 18 +- .../scenario.test.ts | 2 - 10 files changed, 12 insertions(+), 614 deletions(-) delete mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.log-payloads.json delete mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.span-events.json rename e2e/scenarios/google-adk-instrumentation/__snapshots__/{google-adk-v061-auto.log-payloads.json => google-adk-v061.log-payloads.json} (100%) rename e2e/scenarios/google-adk-instrumentation/__snapshots__/{google-adk-v061-auto.span-events.json => google-adk-v061.span-events.json} (100%) delete mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json delete mode 100644 e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json rename e2e/scenarios/google-adk-instrumentation/__snapshots__/{google-adk-v1000-auto.log-payloads.json => google-adk-v1000.log-payloads.json} (100%) rename e2e/scenarios/google-adk-instrumentation/__snapshots__/{google-adk-v1000-auto.span-events.json => google-adk-v1000.span-events.json} (100%) diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.log-payloads.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.log-payloads.json deleted file mode 100644 index cc629c7a4..000000000 --- a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.log-payloads.json +++ /dev/null @@ -1,162 +0,0 @@ -[ - { - "metadata": { - "scenario": "google-adk-instrumentation" - }, - "metrics": { - "start": 0 - }, - "name": "google-adk-instrumentation-root", - "type": "task" - }, - { - "metadata": { - "operation": "simple-run" - }, - "metrics": { - "start": 0 - }, - "name": "adk-simple-run-operation", - "type": null - }, - { - "input": { - "messages": [ - { - "content": "What is the weather in Paris, France?", - "role": "user" - } - ] - }, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metrics": { - "start": 0 - }, - "name": "Google ADK Runner", - "type": "task" - }, - { - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metrics": { - "start": 0 - }, - "name": "Agent: weather_agent", - "type": "task" - }, - { - "input": { - "location": "Paris, France" - }, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metrics": { - "start": 0 - }, - "name": "tool: get_weather", - "type": "tool" - }, - { - "input": { - "location": "Paris, France" - }, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metrics": { - "duration": 0, - "end": 0, - "start": 0 - }, - "name": "tool: get_weather", - "output": { - "condition": "sunny", - "location": "Paris, France", - "temperature": 72 - }, - "type": "tool" - }, - { - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metrics": { - "duration": 0, - "end": 0, - "start": 0 - }, - "name": "Agent: weather_agent", - "output": { - "author": "weather_agent", - "content": "", - "role": "model" - }, - "type": "task" - }, - { - "input": { - "messages": [ - { - "content": "What is the weather in Paris, France?", - "role": "user" - } - ] - }, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metrics": { - "completion_tokens": "", - "duration": 0, - "end": 0, - "prompt_tokens": "", - "start": 0, - "tokens": "" - }, - "name": "Google ADK Runner", - "output": { - "author": "weather_agent", - "content": "", - "role": "model" - }, - "type": "task" - }, - { - "metadata": { - "operation": "simple-run" - }, - "metrics": { - "end": 0, - "start": 0 - }, - "name": "adk-simple-run-operation", - "type": null - }, - { - "metadata": { - "scenario": "google-adk-instrumentation" - }, - "metrics": { - "end": 0, - "start": 0 - }, - "name": "google-adk-instrumentation-root", - "type": "task" - } -] diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.span-events.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.span-events.json deleted file mode 100644 index 71f5ce69e..000000000 --- a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-wrapped.span-events.json +++ /dev/null @@ -1,141 +0,0 @@ -[ - { - "has_input": false, - "has_output": false, - "metadata": { - "scenario": "google-adk-instrumentation" - }, - "metric_keys": [], - "name": "google-adk-instrumentation-root", - "root_span_id": "", - "span_id": "", - "span_parents": [], - "type": "task" - }, - { - "has_input": false, - "has_output": false, - "metadata": { - "operation": "simple-run" - }, - "metric_keys": [], - "name": "adk-simple-run-operation", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": null - }, - { - "has_input": true, - "has_output": false, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metric_keys": [], - "name": "Google ADK Runner", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - }, - { - "has_input": false, - "has_output": false, - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metric_keys": [], - "name": "Agent: weather_agent", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - }, - { - "has_input": true, - "has_output": false, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metric_keys": [], - "name": "tool: get_weather", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "tool" - }, - { - "has_input": true, - "has_output": true, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metric_keys": [ - "duration" - ], - "name": "tool: get_weather", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "tool" - }, - { - "has_input": false, - "has_output": true, - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metric_keys": [ - "duration" - ], - "name": "Agent: weather_agent", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - }, - { - "has_input": true, - "has_output": true, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metric_keys": [ - "completion_tokens", - "duration", - "prompt_tokens", - "tokens" - ], - "name": "Google ADK Runner", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - } -] diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-auto.log-payloads.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061.log-payloads.json similarity index 100% rename from e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-auto.log-payloads.json rename to e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061.log-payloads.json diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-auto.span-events.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061.span-events.json similarity index 100% rename from e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061-auto.span-events.json rename to e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v061.span-events.json diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json deleted file mode 100644 index cc629c7a4..000000000 --- a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.log-payloads.json +++ /dev/null @@ -1,162 +0,0 @@ -[ - { - "metadata": { - "scenario": "google-adk-instrumentation" - }, - "metrics": { - "start": 0 - }, - "name": "google-adk-instrumentation-root", - "type": "task" - }, - { - "metadata": { - "operation": "simple-run" - }, - "metrics": { - "start": 0 - }, - "name": "adk-simple-run-operation", - "type": null - }, - { - "input": { - "messages": [ - { - "content": "What is the weather in Paris, France?", - "role": "user" - } - ] - }, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metrics": { - "start": 0 - }, - "name": "Google ADK Runner", - "type": "task" - }, - { - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metrics": { - "start": 0 - }, - "name": "Agent: weather_agent", - "type": "task" - }, - { - "input": { - "location": "Paris, France" - }, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metrics": { - "start": 0 - }, - "name": "tool: get_weather", - "type": "tool" - }, - { - "input": { - "location": "Paris, France" - }, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metrics": { - "duration": 0, - "end": 0, - "start": 0 - }, - "name": "tool: get_weather", - "output": { - "condition": "sunny", - "location": "Paris, France", - "temperature": 72 - }, - "type": "tool" - }, - { - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metrics": { - "duration": 0, - "end": 0, - "start": 0 - }, - "name": "Agent: weather_agent", - "output": { - "author": "weather_agent", - "content": "", - "role": "model" - }, - "type": "task" - }, - { - "input": { - "messages": [ - { - "content": "What is the weather in Paris, France?", - "role": "user" - } - ] - }, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metrics": { - "completion_tokens": "", - "duration": 0, - "end": 0, - "prompt_tokens": "", - "start": 0, - "tokens": "" - }, - "name": "Google ADK Runner", - "output": { - "author": "weather_agent", - "content": "", - "role": "model" - }, - "type": "task" - }, - { - "metadata": { - "operation": "simple-run" - }, - "metrics": { - "end": 0, - "start": 0 - }, - "name": "adk-simple-run-operation", - "type": null - }, - { - "metadata": { - "scenario": "google-adk-instrumentation" - }, - "metrics": { - "end": 0, - "start": 0 - }, - "name": "google-adk-instrumentation-root", - "type": "task" - } -] diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json deleted file mode 100644 index 71f5ce69e..000000000 --- a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-wrapped.span-events.json +++ /dev/null @@ -1,141 +0,0 @@ -[ - { - "has_input": false, - "has_output": false, - "metadata": { - "scenario": "google-adk-instrumentation" - }, - "metric_keys": [], - "name": "google-adk-instrumentation-root", - "root_span_id": "", - "span_id": "", - "span_parents": [], - "type": "task" - }, - { - "has_input": false, - "has_output": false, - "metadata": { - "operation": "simple-run" - }, - "metric_keys": [], - "name": "adk-simple-run-operation", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": null - }, - { - "has_input": true, - "has_output": false, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metric_keys": [], - "name": "Google ADK Runner", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - }, - { - "has_input": false, - "has_output": false, - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metric_keys": [], - "name": "Agent: weather_agent", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - }, - { - "has_input": true, - "has_output": false, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metric_keys": [], - "name": "tool: get_weather", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "tool" - }, - { - "has_input": true, - "has_output": true, - "metadata": { - "google_adk.tool_call_id": "adk-", - "google_adk.tool_name": "get_weather", - "provider": "google-adk" - }, - "metric_keys": [ - "duration" - ], - "name": "tool: get_weather", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "tool" - }, - { - "has_input": false, - "has_output": true, - "metadata": { - "google_adk.agent_name": "weather_agent", - "model": "gemini-2.5-flash-lite", - "provider": "google-adk" - }, - "metric_keys": [ - "duration" - ], - "name": "Agent: weather_agent", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - }, - { - "has_input": true, - "has_output": true, - "metadata": { - "google_adk.session_id": "test-session-1", - "google_adk.user_id": "test-user", - "provider": "google-adk" - }, - "metric_keys": [ - "completion_tokens", - "duration", - "prompt_tokens", - "tokens" - ], - "name": "Google ADK Runner", - "root_span_id": "", - "span_id": "", - "span_parents": [ - "" - ], - "type": "task" - } -] diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.log-payloads.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000.log-payloads.json similarity index 100% rename from e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.log-payloads.json rename to e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000.log-payloads.json diff --git a/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.span-events.json b/e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000.span-events.json similarity index 100% rename from e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000-auto.span-events.json rename to e2e/scenarios/google-adk-instrumentation/__snapshots__/google-adk-v1000.span-events.json diff --git a/e2e/scenarios/google-adk-instrumentation/assertions.ts b/e2e/scenarios/google-adk-instrumentation/assertions.ts index 6f8726522..c41f01a6f 100644 --- a/e2e/scenarios/google-adk-instrumentation/assertions.ts +++ b/e2e/scenarios/google-adk-instrumentation/assertions.ts @@ -160,21 +160,19 @@ function summarizeADKPayload(event: CapturedLogEvent): Json { export function defineGoogleADKInstrumentationAssertions(options: { expectLLMSpan: boolean; - mode: "auto" | "wrapped"; name: string; runScenario: RunGoogleADKScenario; snapshotName: string; testFileUrl: string; timeoutMs: number; }): void { - const snapshotBaseName = `${options.snapshotName}-${options.mode}`; const spanSnapshotPath = resolveFileSnapshotPath( options.testFileUrl, - `${snapshotBaseName}.span-events.json`, + `${options.snapshotName}.span-events.json`, ); const payloadSnapshotPath = resolveFileSnapshotPath( options.testFileUrl, - `${snapshotBaseName}.log-payloads.json`, + `${options.snapshotName}.log-payloads.json`, ); const testConfig = { timeout: options.timeoutMs, @@ -260,7 +258,12 @@ export function defineGoogleADKInstrumentationAssertions(options: { test("matches the shared span snapshot", testConfig, async () => { const relevantEvents = events.filter( - (e) => e.span.name !== undefined && e.span.type !== "llm", + (e) => + e.span.name !== undefined && + e.span.type !== "llm" && + // Wrapped mode logs an extra start-only tool row. Normalize to the + // terminal tool record so wrapped and auto-hook snapshots stay aligned. + (e.span.type !== "tool" || e.output !== undefined), ); const spanSummary = normalizeForSnapshot( dedupeSnapshotItems( @@ -289,7 +292,10 @@ export function defineGoogleADKInstrumentationAssertions(options: { test("matches the shared payload snapshot", testConfig, async () => { const relevantEvents = events.filter( - (e) => e.span.name !== undefined && e.span.type !== "llm", + (e) => + e.span.name !== undefined && + e.span.type !== "llm" && + (e.span.type !== "tool" || e.output !== undefined), ); const payloadSummary = normalizeForSnapshot( dedupeSnapshotItems( diff --git a/e2e/scenarios/google-adk-instrumentation/scenario.test.ts b/e2e/scenarios/google-adk-instrumentation/scenario.test.ts index 4d583dfc4..b12718a1d 100644 --- a/e2e/scenarios/google-adk-instrumentation/scenario.test.ts +++ b/e2e/scenarios/google-adk-instrumentation/scenario.test.ts @@ -37,7 +37,6 @@ for (const scenario of googleADKScenarios) { describe(`google adk sdk ${scenario.version}`, () => { defineGoogleADKInstrumentationAssertions({ name: "wrapped instrumentation", - mode: "wrapped", runScenario: async ({ runScenarioDir }) => { await runScenarioDir({ entry: scenario.wrapperEntry, @@ -54,7 +53,6 @@ for (const scenario of googleADKScenarios) { defineGoogleADKInstrumentationAssertions({ name: "auto-hook instrumentation", - mode: "auto", runScenario: async ({ runNodeScenarioDir }) => { await runNodeScenarioDir({ entry: scenario.autoEntry,