From c0e6adc3e1b85fb124ed3e53e13e30ecc481fcf9 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 19 Aug 2026 14:19:33 -0400 Subject: [PATCH 1/3] chore: Add sample retryContext --- .../google/cloud/bigquery/BigQueryImpl.java | 3 +- .../cloud/bigquery/BigQueryRetryHelper.java | 65 ++++++++++++++++++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java index 2ad09c33d7cb..e4a4298a995a 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java @@ -588,7 +588,8 @@ public com.google.api.services.bigquery.model.Job call() throws IOException { ? getBigQueryRetryConfig(optionsMap) : DEFAULT_RETRY_CONFIG, getOptions().isOpenTelemetryTracingEnabled(), - getOptions().getOpenTelemetryTracer())); + getOptions().getOpenTelemetryTracer(), + getOptions().getApiTracerFactory())); } catch (BigQueryRetryHelperException e) { throw BigQueryException.translateAndThrow(e); } diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java index 6b7847c59892..8ce3c0633b0e 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java @@ -22,10 +22,16 @@ import com.google.api.gax.retrying.ResultRetryAlgorithm; import com.google.api.gax.retrying.RetryAlgorithm; import com.google.api.gax.retrying.RetrySettings; +import com.google.api.gax.retrying.RetryingContext; import com.google.api.gax.retrying.RetryingExecutor; import com.google.api.gax.retrying.RetryingFuture; import com.google.api.gax.retrying.TimedAttemptSettings; import com.google.api.gax.retrying.TimedRetryAlgorithm; +import com.google.api.gax.rpc.StatusCode; +import com.google.api.gax.tracing.ApiTracer; +import com.google.api.gax.tracing.ApiTracerFactory; +import com.google.api.gax.tracing.BaseApiTracer; +import com.google.api.gax.tracing.SpanName; import com.google.cloud.RetryHelper; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; @@ -33,6 +39,9 @@ import io.opentelemetry.context.ContextKey; import io.opentelemetry.context.Scope; import java.io.IOException; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; @@ -53,7 +62,19 @@ public static V runWithRetries( ApiClock clock, BigQueryRetryConfig bigQueryRetryConfig, boolean isOpenTelemetryEnabled, - Tracer openTelemetryTracer) + Tracer openTelemetryTracer) { + return runWithRetries(callable, retrySettings, resultRetryAlgorithm, clock, bigQueryRetryConfig, isOpenTelemetryEnabled, openTelemetryTracer, null); + } + + public static V runWithRetries( + Callable callable, + RetrySettings retrySettings, + ResultRetryAlgorithm resultRetryAlgorithm, + ApiClock clock, + BigQueryRetryConfig bigQueryRetryConfig, + boolean isOpenTelemetryEnabled, + Tracer openTelemetryTracer, + ApiTracerFactory apiTracerFactory) throws RetryHelperException { Span runWithRetries = null; if (isOpenTelemetryEnabled && openTelemetryTracer != null) { @@ -75,7 +96,9 @@ public static V runWithRetries( callable, new ExponentialRetryAlgorithm(retrySettings, clock), algorithm, - bigQueryRetryConfig); + bigQueryRetryConfig, + retrySettings, + apiTracerFactory); } catch (Exception e) { // Checks for IOException and translate it into BigQueryException. The BigQueryException // constructor parses the IOException and translate it into internal code. @@ -94,7 +117,9 @@ private static V run( Callable callable, TimedRetryAlgorithm timedAlgorithm, ResultRetryAlgorithm resultAlgorithm, - BigQueryRetryConfig bigQueryRetryConfig) + BigQueryRetryConfig bigQueryRetryConfig, + RetrySettings retrySettings, + ApiTracerFactory apiTracerFactory) throws ExecutionException, InterruptedException { RetryAlgorithm retryAlgorithm = new BigQueryRetryAlgorithm<>( @@ -105,6 +130,40 @@ private static V run( // BigQueryRetryAlgorithm retries considering bigQueryRetryConfig RetryingExecutor executor = new DirectRetryingExecutor<>(retryAlgorithm); + // 1. Resolve method name for the tracer span + String methodName = "execute"; + try { + Method enclosingMethod = callable.getClass().getEnclosingMethod(); + if (enclosingMethod != null) { + methodName = enclosingMethod.getName(); + } + } catch (Exception ignored) { + } + + // 2. Obtain ApiTracer from the factory + final ApiTracer tracer = (apiTracerFactory != null) + ? apiTracerFactory.newTracer( + null, SpanName.of("BigQuery", methodName), ApiTracerFactory.OperationType.Unary) + : BaseApiTracer.getInstance(); + + // 3. Construct RetryingContext + RetryingContext context = new RetryingContext() { + @Override + public ApiTracer getTracer() { + return tracer; + } + + @Override + public RetrySettings getRetrySettings() { + return retrySettings; + } + + @Override + public Set getRetryableCodes() { + return Collections.emptySet(); + } + }; + // Log retry info if (LOG.isLoggable(Level.FINEST)) { LOG.log( From 413f087a47cd78cfb65b26ca209ddc9da068bea7 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 24 Aug 2026 12:24:09 -0400 Subject: [PATCH 2/3] chore: Pass the executor in --- .../java/com/google/cloud/bigquery/BigQueryRetryHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java index 8ce3c0633b0e..a82f2ebeb8bb 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java @@ -128,7 +128,7 @@ private static V run( bigQueryRetryConfig); // using BigQueryRetryAlgorithm in place of // com.google.api.gax.retrying.RetryAlgorithm, as // BigQueryRetryAlgorithm retries considering bigQueryRetryConfig - RetryingExecutor executor = new DirectRetryingExecutor<>(retryAlgorithm); + DirectRetryingExecutor executor = new DirectRetryingExecutor<>(retryAlgorithm); // 1. Resolve method name for the tracer span String methodName = "execute"; @@ -175,7 +175,7 @@ public Set getRetryableCodes() { }); } - RetryingFuture retryingFuture = executor.createFuture(callable); + RetryingFuture retryingFuture = executor.createFuture(callable, context); executor.submit(retryingFuture); return retryingFuture.get(); } From 35978a892518622093a81921ac6a0cdc90805d1e Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 24 Aug 2026 14:45:00 -0400 Subject: [PATCH 3/3] chore: Resolve lint issues --- .../cloud/bigquery/BigQueryRetryHelper.java | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java index a82f2ebeb8bb..5cb19e46cd4d 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryRetryHelper.java @@ -23,7 +23,6 @@ import com.google.api.gax.retrying.RetryAlgorithm; import com.google.api.gax.retrying.RetrySettings; import com.google.api.gax.retrying.RetryingContext; -import com.google.api.gax.retrying.RetryingExecutor; import com.google.api.gax.retrying.RetryingFuture; import com.google.api.gax.retrying.TimedAttemptSettings; import com.google.api.gax.retrying.TimedRetryAlgorithm; @@ -63,7 +62,15 @@ public static V runWithRetries( BigQueryRetryConfig bigQueryRetryConfig, boolean isOpenTelemetryEnabled, Tracer openTelemetryTracer) { - return runWithRetries(callable, retrySettings, resultRetryAlgorithm, clock, bigQueryRetryConfig, isOpenTelemetryEnabled, openTelemetryTracer, null); + return runWithRetries( + callable, + retrySettings, + resultRetryAlgorithm, + clock, + bigQueryRetryConfig, + isOpenTelemetryEnabled, + openTelemetryTracer, + null); } public static V runWithRetries( @@ -141,28 +148,30 @@ private static V run( } // 2. Obtain ApiTracer from the factory - final ApiTracer tracer = (apiTracerFactory != null) - ? apiTracerFactory.newTracer( - null, SpanName.of("BigQuery", methodName), ApiTracerFactory.OperationType.Unary) - : BaseApiTracer.getInstance(); + final ApiTracer tracer = + (apiTracerFactory != null) + ? apiTracerFactory.newTracer( + null, SpanName.of("BigQuery", methodName), ApiTracerFactory.OperationType.Unary) + : BaseApiTracer.getInstance(); // 3. Construct RetryingContext - RetryingContext context = new RetryingContext() { - @Override - public ApiTracer getTracer() { - return tracer; - } + RetryingContext context = + new RetryingContext() { + @Override + public ApiTracer getTracer() { + return tracer; + } - @Override - public RetrySettings getRetrySettings() { - return retrySettings; - } + @Override + public RetrySettings getRetrySettings() { + return retrySettings; + } - @Override - public Set getRetryableCodes() { - return Collections.emptySet(); - } - }; + @Override + public Set getRetryableCodes() { + return Collections.emptySet(); + } + }; // Log retry info if (LOG.isLoggable(Level.FINEST)) {