From 40099057e2b59f34e868da4c34dcd9c1194b2fde Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Tue, 21 Apr 2026 15:32:15 -0700 Subject: [PATCH] feat:Add telemetry headers The change adds custom telemetry headers (x-goog-api-client, user-agent) to BigQuery and BigQuery Storage API calls made by the plugin, including the ADK and Java versions. PiperOrigin-RevId: 903458058 --- .../BigQueryAgentAnalyticsPlugin.java | 4 ++++ .../plugins/agentanalytics/BigQueryUtils.java | 8 ++++++++ .../adk/plugins/agentanalytics/PluginState.java | 16 +++++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryAgentAnalyticsPlugin.java b/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryAgentAnalyticsPlugin.java index bdfa458ee..22c772e31 100644 --- a/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryAgentAnalyticsPlugin.java +++ b/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryAgentAnalyticsPlugin.java @@ -17,6 +17,7 @@ package com.google.adk.plugins.agentanalytics; import static com.google.adk.plugins.agentanalytics.BigQueryUtils.createAnalyticsViews; +import static com.google.adk.plugins.agentanalytics.BigQueryUtils.getVersionHeaderValue; import static com.google.adk.plugins.agentanalytics.BigQueryUtils.maybeUpgradeSchema; import static com.google.adk.plugins.agentanalytics.JsonFormatter.convertToJsonNode; import static com.google.adk.plugins.agentanalytics.JsonFormatter.smartTruncate; @@ -40,6 +41,7 @@ import com.google.adk.tools.ToolContext; import com.google.adk.tools.mcp.AbstractMcpTool; import com.google.adk.utils.AgentEnums.AgentOrigin; +import com.google.api.gax.rpc.FixedHeaderProvider; import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQueryException; @@ -110,6 +112,8 @@ public BigQueryAgentAnalyticsPlugin(BigQueryLoggerConfig config, BigQuery bigQue private static BigQuery createBigQuery(BigQueryLoggerConfig config) throws IOException { BigQueryOptions.Builder builder = BigQueryOptions.newBuilder(); + builder.setHeaderProvider( + FixedHeaderProvider.create(ImmutableMap.of("user-agent", getVersionHeaderValue()))); if (config.credentials() != null) { builder.setCredentials(config.credentials()); } else { diff --git a/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryUtils.java b/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryUtils.java index 60306799d..f0db45e12 100644 --- a/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryUtils.java +++ b/core/src/main/java/com/google/adk/plugins/agentanalytics/BigQueryUtils.java @@ -22,6 +22,7 @@ import static com.google.common.collect.ImmutableMap.toImmutableMap; import static java.util.stream.Collectors.toCollection; +import com.google.adk.Version; import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQueryException; import com.google.cloud.bigquery.Field; @@ -136,6 +137,13 @@ final class BigQueryUtils { "JSON_QUERY(content, '$.args') AS tool_args")) .buildOrThrow(); + private static final String FRAMEWORK_PREFIX = "google-adk-bq-logger-java"; + + /** Returns the telemetry header value. */ + static String getVersionHeaderValue() { + return FRAMEWORK_PREFIX + "/" + Version.JAVA_ADK_VERSION; + } + /** Creates and/or replaces the analytics views in BigQuery. */ static void createAnalyticsViews(BigQuery bigQuery, BigQueryLoggerConfig config) { for (Map.Entry> entry : EVENT_VIEW_DEFS.entrySet()) { diff --git a/core/src/main/java/com/google/adk/plugins/agentanalytics/PluginState.java b/core/src/main/java/com/google/adk/plugins/agentanalytics/PluginState.java index 94763a49c..63c60c491 100644 --- a/core/src/main/java/com/google/adk/plugins/agentanalytics/PluginState.java +++ b/core/src/main/java/com/google/adk/plugins/agentanalytics/PluginState.java @@ -1,9 +1,11 @@ package com.google.adk.plugins.agentanalytics; +import static com.google.adk.plugins.agentanalytics.BigQueryUtils.getVersionHeaderValue; import static java.util.concurrent.TimeUnit.MILLISECONDS; import com.google.api.gax.core.FixedCredentialsProvider; import com.google.api.gax.retrying.RetrySettings; +import com.google.api.gax.rpc.FixedHeaderProvider; import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient; import com.google.cloud.bigquery.storage.v1.BigQueryWriteSettings; import com.google.cloud.bigquery.storage.v1.StreamWriter; @@ -11,8 +13,10 @@ import com.google.common.base.VerifyException; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.util.Collection; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -67,13 +71,14 @@ void markProcessed(String invocationId) { } protected BigQueryWriteClient createWriteClient(BigQueryLoggerConfig config) throws IOException { + BigQueryWriteSettings.Builder settingsBuilder = + BigQueryWriteSettings.newBuilder() + .setHeaderProvider( + FixedHeaderProvider.create(ImmutableMap.of("user-agent", getVersionHeaderValue()))); if (config.credentials() != null) { - return BigQueryWriteClient.create( - BigQueryWriteSettings.newBuilder() - .setCredentialsProvider(FixedCredentialsProvider.create(config.credentials())) - .build()); + settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(config.credentials())); } - return BigQueryWriteClient.create(); + return BigQueryWriteClient.create(settingsBuilder.build()); } protected StreamWriter createWriter() { @@ -89,6 +94,7 @@ protected StreamWriter createWriter() { String streamName = getStreamName(config); try { return StreamWriter.newBuilder(streamName, writeClient) + .setTraceId(BigQueryUtils.getVersionHeaderValue() + ":" + UUID.randomUUID()) .setRetrySettings(retrySettings) .setWriterSchema(BigQuerySchema.getArrowSchema()) .build();