You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is the consolidated readiness tracker for the Java BigQuery Agent Analytics (BQAA) plugin.
Current verdict: not ready to exit Preview or claim Python-compatible Preview behavior. Full Python feature parity is not required, but the P1 items below can produce incorrect analytics, duplicate telemetry, retained per-invocation resources, or incomplete cleanup on supported Java runtime paths.
Make trace state safe for concurrent ParallelAgent branches.
Java stores one TraceManager per invocation and one global LIFO stack inside it.
ParallelAgent merges concurrently scheduled branches with the same invocation ID. If branch A starts, branch B starts, and A completes first, A pops B's span.
Use task-local, branch-keyed, or otherwise ownership-checked trace state.
Add a deterministic same-invocation overlap test that completes branches out of start order and validates span IDs, parents, and STARTING/COMPLETED pairing.
Stop creating plugin-owned OpenTelemetry spans.
TraceManager.pushSpan() starts a real OTel span and pop/cleanup ends it.
With an SDK exporter configured, BQAA therefore exports a duplicate analytics span tree alongside ADK's framework spans.
Match Python's ID-only internal execution tree while inheriting an ambient trace_id when available.
Add an in-memory exporter regression test asserting BQAA exports zero plugin-owned spans.
Apply sensitive-key redaction at the final attributes boundary.
Content and session-metadata paths now use the redacting formatter, but the final assembled attributes map is not passed through that boundary.
state_delta, custom tags, labels, and other extra attributes can therefore carry sensitive-key values into BigQuery unchanged.
Redact the complete attributes tree immediately before serialization, regardless of which producer populated it. Python currently has the same gap, so parity is not a safety defense.
Add nested secret-key fixtures for state deltas, custom tags, labels, and generic metadata.
Fix per-invocation processor/task lifecycle.
BatchProcessor.start() discards the ScheduledFuture returned by scheduleWithFixedDelay().
Per-invocation close() does not cancel it, so every completed invocation leaves a periodic task retaining its closed processor/writer until plugin-wide shutdown.
Store/cancel the task during idempotent close and add a high-cardinality invocation test proving scheduled work/resources are released.
Make append, final drain, and timeout cleanup genuinely bounded.
writer.append(...).get() has no total deadline, and final processor drain runs outside the effective shutdownTimeout bound.
Pending parse/offload futures are not cancelled or lifecycle-gated after timeout. A late completion can recreate a BatchProcessor for an invocation that has already been finalized, with no later invocation cleanup.
Apply a total append/drain deadline, reject/account appends after invocation close, and test a never-completing append plus a late GCS/parse completion.
Surface and account writer-construction and continuation failures.
StreamWriter creation occurs inside computeIfAbsent; if the future completes exceptionally, the pending task is removed without a durable error signal or drop counter.
Rows can therefore disappear before a processor exists, outside the current loss-accounting path.
Record a specific drop reason, emit an observable error, and make late/exceptional continuations respect the invocation lifecycle gate.
Correct HITL and long-running-tool pause/resume semantics.
Java currently labels both HITL FunctionCall requests and FunctionResponse results as *_COMPLETED.
User-message handling inspects FunctionCall where resumed input arrives as FunctionResponse.
Emit pairable TOOL_PAUSED / resumed TOOL_COMPLETED rows with function_call_id and pause_kind, without double-routing HITL completions.
Add a Runner-level two-turn test for HITL and non-HITL long-running tools.
Add terminal agent/run failure analytics and guaranteed cleanup.
Java's plugin API exposes model/tool error callbacks but no agent/run error callbacks.
afterAgent / afterRun are concatenated after successful completion, so an upstream exception can skip AGENT_ERROR, INVOCATION_ERROR, per-invocation flush, and trace cleanup.
Add framework error hooks and finally-style invocation cleanup that preserves the original exception.
Contract gaps: fix or explicitly exclude from a narrow Preview
Align or version the AGENT_RESPONSE row/view contract.
Java emits content.text_summary and exposes text_summary in its view.
Python emits content.response and exposes response_text.
The same event type should be queryable across SDKs; add a cross-language golden-row test.
Complete supported workflow taxonomy.
Java runtime models transfer, compaction, and long-running tool IDs, but Java BQAA does not emit Python-equivalent AGENT_TRANSFER, EVENT_COMPACTION, and pairable TOOL_PAUSED rows/views.
Implement these before a parity claim, or list each omission in Preview scope documentation.
Add the minimum attributes.adk producer envelope.
At minimum stamp schema version, app name, and available source-event identity/branch fields.
Python-only node/scope fields can follow when Java exposes equivalent runtime data.
Publish an executable Java Preview guide and data contract.
Cover dependency/setup, ADC and IAM, dataset/table/view defaults, explicit close behavior, drop-stat monitoring, GCS/privacy controls, event taxonomy, row/view contract, and documented Python-parity exclusions.
P2 reliability and operational readiness
Move first-use table bootstrap off the agent callback thread; coalesce concurrent setup and use bounded retry/backoff after failures.
Make enabled=false avoid ADC resolution and BigQuery client initialization.
Add explicit loss accounting for setup-not-ready, writer construction, parse timeout, and rejected late continuations.
Add a gated real-BigQuery smoke test using public construction, real Storage Write append/drain, and query readback. The current BigQueryAgentAnalyticsPluginE2ETest mocks BigQuery, BigQueryWriteClient, and StreamWriter.
Decide and document Java/Python default differences (agent_analytics.events, views disabled vs Python agent_events, views enabled).
Make model, tool, and BigQuery exception-message capture null-safe; Java exceptions may legally return a null message, while the generated event value objects require a non-null optional payload.
Validate all duration and retry settings at config build time, including positive flush/shutdown durations and valid retry-attempt bounds.
Lower-priority Python gaps that do not independently block a narrow Preview
Summary
This is the consolidated readiness tracker for the Java BigQuery Agent Analytics (BQAA) plugin.
Current verdict: not ready to exit Preview or claim Python-compatible Preview behavior. Full Python feature parity is not required, but the P1 items below can produce incorrect analytics, duplicate telemetry, retained per-invocation resources, or incomplete cleanup on supported Java runtime paths.
Latest comparison, pinned on 2026-07-10:
google/adk-java@08f4fdc6c9ea80ec46723b2c6b71a4409c77feedgoogle/adk-python@9d306f5d322eccbc5022ac72407fa8a994f64cf6P1: must fix before broad/public Preview
Make trace state safe for concurrent
ParallelAgentbranches.TraceManagerper invocation and one global LIFO stack inside it.ParallelAgentmerges concurrently scheduled branches with the same invocation ID. If branch A starts, branch B starts, and A completes first, A pops B's span.Stop creating plugin-owned OpenTelemetry spans.
TraceManager.pushSpan()starts a real OTel span and pop/cleanup ends it.trace_idwhen available.Apply sensitive-key redaction at the final attributes boundary.
state_delta, custom tags, labels, and other extra attributes can therefore carry sensitive-key values into BigQuery unchanged.Fix per-invocation processor/task lifecycle.
BatchProcessor.start()discards theScheduledFuturereturned byscheduleWithFixedDelay().close()does not cancel it, so every completed invocation leaves a periodic task retaining its closed processor/writer until plugin-wide shutdown.Make append, final drain, and timeout cleanup genuinely bounded.
writer.append(...).get()has no total deadline, and final processor drain runs outside the effectiveshutdownTimeoutbound.BatchProcessorfor an invocation that has already been finalized, with no later invocation cleanup.Surface and account writer-construction and continuation failures.
StreamWritercreation occurs insidecomputeIfAbsent; if the future completes exceptionally, the pending task is removed without a durable error signal or drop counter.Correct HITL and long-running-tool pause/resume semantics.
FunctionCallrequests andFunctionResponseresults as*_COMPLETED.FunctionCallwhere resumed input arrives asFunctionResponse.TOOL_PAUSED/ resumedTOOL_COMPLETEDrows withfunction_call_idandpause_kind, without double-routing HITL completions.Add terminal agent/run failure analytics and guaranteed cleanup.
afterAgent/afterRunare concatenated after successful completion, so an upstream exception can skipAGENT_ERROR,INVOCATION_ERROR, per-invocation flush, and trace cleanup.Contract gaps: fix or explicitly exclude from a narrow Preview
Align or version the
AGENT_RESPONSErow/view contract.content.text_summaryand exposestext_summaryin its view.content.responseand exposesresponse_text.Complete supported workflow taxonomy.
AGENT_TRANSFER,EVENT_COMPACTION, and pairableTOOL_PAUSEDrows/views.Add the minimum
attributes.adkproducer envelope.Publish an executable Java Preview guide and data contract.
P2 reliability and operational readiness
enabled=falseavoid ADC resolution and BigQuery client initialization.BigQueryAgentAnalyticsPluginE2ETestmocks BigQuery,BigQueryWriteClient, andStreamWriter.agent_analytics.events, views disabled vs Pythonagent_events, views enabled).Lower-priority Python gaps that do not independently block a narrow Preview
These should remain roadmap items unless the Preview explicitly promises full Python query/config parity.
Confirmed fixed on current Java
mainSTATE_DELTA.Event.authorfallback.Acceptance tests for Preview readiness
ParallelAgentoverlap preserves branch-local span ownership.shutdownTimeoutbounds a never-completing append and final drain.Current verification signal
Pinned references
ParallelAgent:adk-java/core/src/main/java/com/google/adk/agents/ParallelAgent.java
Lines 172 to 184 in 08f4fdc
Historical investigation and withdrawn/down-scoped findings remain available in the comments below.