From 6de1277cc68d144bb3fda6312552e4efac280eae Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Wed, 27 May 2026 17:34:57 +0000 Subject: [PATCH 1/4] feat: add globalOtel support --- .../bigquery/jdbc/BigQueryConnection.java | 17 ++- .../jdbc/BigQueryJdbcOpenTelemetry.java | 6 + .../bigquery/jdbc/BigQueryJdbcUrlUtility.java | 8 + .../cloud/bigquery/jdbc/DataSource.java | 20 +++ .../bigquery/jdbc/BigQueryConnectionTest.java | 139 ++++++++++++++++++ .../jdbc/BigQueryJdbcOpenTelemetryTest.java | 31 ++-- 6 files changed, 206 insertions(+), 15 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index d37922e4ddb3..4e7565856c97 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -216,6 +216,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { boolean enableGcpTraceExporter; boolean enableGcpLogExporter; OpenTelemetry customOpenTelemetry; + boolean useGlobalOpenTelemetry; private OpenTelemetry openTelemetry; private Context otelContext; Tracer tracer = @@ -367,6 +368,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.enableGcpTraceExporter = ds.getEnableGcpTraceExporter(); this.enableGcpLogExporter = ds.getEnableGcpLogExporter(); this.customOpenTelemetry = ds.getCustomOpenTelemetry(); + this.useGlobalOpenTelemetry = ds.getUseGlobalOpenTelemetry(); this.openTelemetry = getOpenTelemetryInstance(); this.bigQuery = getBigQueryConnection(); } @@ -1048,22 +1050,27 @@ private OpenTelemetry getOpenTelemetryInstance() { OpenTelemetry openTelemetry = BigQueryJdbcOpenTelemetry.getOpenTelemetry( + this.useGlobalOpenTelemetry, this.enableGcpTraceExporter, this.enableGcpLogExporter, this.customOpenTelemetry, effectiveCredentials, effectiveProjectId); + boolean hasExternalOtel = this.customOpenTelemetry != null || this.useGlobalOpenTelemetry; Logging localLoggingClient = null; - if (this.enableGcpLogExporter && !hasCustomOtel) { + if (this.enableGcpLogExporter && !hasExternalOtel) { localLoggingClient = BigQueryJdbcOpenTelemetry.createLoggingClient( true, null, effectiveCredentials, effectiveProjectId, this.credentials); } - if (this.enableGcpLogExporter || hasCustomOtel) { + if (this.enableGcpLogExporter || hasExternalOtel) { BigQueryJdbcOpenTelemetry.registerConnection( - this.connectionId, openTelemetry, localLoggingClient, this.enableGcpLogExporter); + this.connectionId, + openTelemetry, + localLoggingClient, + this.enableGcpLogExporter && !hasExternalOtel); } return openTelemetry; @@ -1128,7 +1135,9 @@ private BigQuery getBigQueryConnection() { if (this.httpTransportOptions != null) { bigQueryOptions.setTransportOptions(this.httpTransportOptions); } - if (this.enableGcpTraceExporter || this.customOpenTelemetry != null) { + if (this.enableGcpTraceExporter + || this.customOpenTelemetry != null + || this.useGlobalOpenTelemetry) { Tracer sdkTracer = this.openTelemetry.getTracer(BigQueryJdbcOpenTelemetry.BIGQUERY_NAMESPACE); bigQueryOptions.setOpenTelemetryTracer(sdkTracer); this.tracer = diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetry.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetry.java index 6fe251f0e8fa..1995a4d330e4 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetry.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetry.java @@ -21,6 +21,7 @@ import com.google.cloud.logging.Logging; import com.google.cloud.logging.LoggingOptions; import com.google.common.hash.Hashing; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.trace.Span; @@ -245,6 +246,7 @@ private static String getCredentialsIdentifier(String credentials) { * customOpenTelemetry if provided; fallback to an auto-configured GCP exporter if requested. */ public static OpenTelemetry getOpenTelemetry( + boolean useGlobalOpenTelemetry, boolean enableGcpTraceExporter, boolean enableGcpLogExporter, OpenTelemetry customOpenTelemetry, @@ -255,6 +257,10 @@ public static OpenTelemetry getOpenTelemetry( return customOpenTelemetry; } + if (useGlobalOpenTelemetry) { + return GlobalOpenTelemetry.get(); + } + // NOTE: Currently, tracing only fully supports Application Default Credentials (ADC). // Once b/503721589 is completed, Service Account (SA) will work as well. if (!enableGcpTraceExporter && !enableGcpLogExporter) { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index d14fef157af8..91de9cc79a49 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -168,6 +168,8 @@ protected boolean removeEldestEntry(Map.Entry> eldes static final boolean DEFAULT_ENABLE_GCP_TRACE_EXPORTER_VALUE = false; static final String ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME = "enableGcpLogExporter"; static final boolean DEFAULT_ENABLE_GCP_LOG_EXPORTER_VALUE = false; + static final String USE_GLOBAL_OTEL_PROPERTY_NAME = "useGlobalOpenTelemetry"; + static final boolean DEFAULT_USE_GLOBAL_OTEL_VALUE = false; private static final BigQueryJdbcCustomLogger LOG = new BigQueryJdbcCustomLogger(BigQueryJdbcUrlUtility.class.getName()); static final String FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME = @@ -638,6 +640,12 @@ protected boolean removeEldestEntry(Map.Entry> eldes BigQueryConnectionProperty.newBuilder() .setName(GCP_TELEMETRY_PROJECT_ID_PROPERTY_NAME) .setDescription("GCP Project ID for OTel exporter.") + .build(), + BigQueryConnectionProperty.newBuilder() + .setName(USE_GLOBAL_OTEL_PROPERTY_NAME) + .setDescription( + "Enables usage of the Global OpenTelemetry instance when true. Default is false.") + .setDefaultValue(String.valueOf(DEFAULT_USE_GLOBAL_OTEL_VALUE)) .build()))); private static final List NETWORK_PROPERTIES = diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index e2dfa888d8bf..7871c3eea07b 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -123,6 +123,7 @@ public class DataSource implements javax.sql.DataSource { private boolean enableGcpLogExporter = BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GCP_LOG_EXPORTER_VALUE; private OpenTelemetry customOpenTelemetry; + private boolean useGlobalOpenTelemetry = BigQueryJdbcUrlUtility.DEFAULT_USE_GLOBAL_OTEL_VALUE; // Make sure the JDBC driver class is loaded. static { @@ -358,6 +359,12 @@ public class DataSource implements javax.sql.DataSource { ds.setEnableGcpLogExporter( BigQueryJdbcUrlUtility.convertIntToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME, + (ds, val) -> + ds.setUseGlobalOpenTelemetry( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME))) .build(); public static DataSource fromUrl(String url) { @@ -675,6 +682,11 @@ Properties createProperties() { BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME, String.valueOf(this.enableGcpLogExporter)); } + if (this.useGlobalOpenTelemetry) { + connectionProperties.setProperty( + BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME, + String.valueOf(this.useGlobalOpenTelemetry)); + } return connectionProperties; } @@ -832,6 +844,14 @@ public void setCustomOpenTelemetry(OpenTelemetry customOpenTelemetry) { this.customOpenTelemetry = customOpenTelemetry; } + public boolean getUseGlobalOpenTelemetry() { + return useGlobalOpenTelemetry; + } + + public void setUseGlobalOpenTelemetry(boolean useGlobalOpenTelemetry) { + this.useGlobalOpenTelemetry = useGlobalOpenTelemetry; + } + public void setHighThroughputMinTableSize(Integer highThroughputMinTableSize) { if (highThroughputMinTableSize != null) { validateNonNegative( diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 790874e6fb43..618519541008 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -17,15 +17,25 @@ package com.google.cloud.bigquery.jdbc; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.rpc.HeaderProvider; import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.QueryJobConfiguration.JobCreationMode; import com.google.cloud.bigquery.exception.BigQueryJdbcException; import com.google.cloud.bigquery.storage.v1.BigQueryReadClient; import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient; +import com.google.cloud.logging.Logging; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension; @@ -44,6 +54,8 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.MockedStatic; +import org.mockito.Mockito; public class BigQueryConnectionTest extends BigQueryJdbcLoggingBaseTest { @@ -522,4 +534,131 @@ public void testConnectionPropertiesLoggingAndMasking() throws IOException, SQLE rootLogger.setLevel(originalLevel); } } + + @ParameterizedTest( + name = + "Case {index}: custom={0}, global={1}, trace={2}, log={3} -> expectTrace={4}, expectLog={5}") + @CsvSource({ + // hasCustom, useGlobal, enableTrace, enableLog, expectTrace, expectLog + "true, true, true, true, CUSTOM, CUSTOM", + "true, false, true, true, CUSTOM, CUSTOM", + "false, true, true, true, GLOBAL, GLOBAL", + "false, true, false, false, GLOBAL, GLOBAL", + "false, false, true, false, DRIVER_MANAGED, NONE", + "false, false, false, true, NONE, DRIVER_MANAGED", + "false, false, true, true, DRIVER_MANAGED, DRIVER_MANAGED", + "false, false, false, false, NONE, NONE" + }) + public void testOpenTelemetryPrecedenceHierarchy( + boolean hasCustom, + boolean useGlobal, + boolean enableTrace, + boolean enableLog, + String expectTrace, + String expectLog) + throws Exception { + + DataSource ds = DataSource.fromUrl(BASE_URL); + ds.setUseGlobalOpenTelemetry(useGlobal); + ds.setEnableGcpTraceExporter(enableTrace); + ds.setEnableGcpLogExporter(enableLog); + + OpenTelemetry mockCustomOtel = mock(OpenTelemetry.class); + OpenTelemetry mockGlobalOtel = mock(OpenTelemetry.class); + OpenTelemetry mockDriverManagedOtel = mock(OpenTelemetry.class); + Logging mockLogging = mock(Logging.class); + + if (hasCustom) { + ds.setCustomOpenTelemetry(mockCustomOtel); + } + + try (MockedStatic mockedOtel = + Mockito.mockStatic(BigQueryJdbcOpenTelemetry.class); + MockedStatic mockedAuth = + Mockito.mockStatic(BigQueryJdbcOAuthUtility.class); + MockedStatic mockedCreds = Mockito.mockStatic(GoogleCredentials.class)) { + + mockedCreds + .when(GoogleCredentials::getApplicationDefault) + .thenReturn(mock(GoogleCredentials.class)); + + // Mock parseOAuthProperties to always return ADC type to bypass validation + mockedAuth + .when(() -> BigQueryJdbcOAuthUtility.parseOAuthProperties(any(), anyString())) + .thenAnswer( + invocation -> { + java.util.Map props = new java.util.HashMap<>(); + props.put( + BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME, + "APPLICATION_DEFAULT_CREDENTIALS"); + return props; + }); + + mockedAuth + .when(() -> BigQueryJdbcOAuthUtility.getCredentials(any(), any(), any(), any())) + .thenReturn(mock(GoogleCredentials.class)); + + mockedOtel + .when( + () -> + BigQueryJdbcOpenTelemetry.createLoggingClient( + anyBoolean(), any(), any(), any(), any())) + .thenReturn(mockLogging); + + // Stub getOpenTelemetry to return the expected mock based on inputs + mockedOtel + .when( + () -> + BigQueryJdbcOpenTelemetry.getOpenTelemetry( + eq(useGlobal), + eq(enableTrace), + eq(enableLog), + hasCustom ? eq(mockCustomOtel) : isNull(), + any(), + any())) + .thenAnswer( + invocation -> { + if (hasCustom) return mockCustomOtel; + if (useGlobal) return mockGlobalOtel; + if (enableTrace || enableLog) return mockDriverManagedOtel; + return OpenTelemetry.noop(); + }); + + BigQueryConnection connection = new BigQueryConnection(BASE_URL, ds); + + boolean shouldBeRegistered = enableLog || hasCustom || useGlobal; + + if (!shouldBeRegistered) { + mockedOtel.verify( + () -> + BigQueryJdbcOpenTelemetry.registerConnection( + anyString(), any(), any(), anyBoolean()), + never()); + } else { + final OpenTelemetry expectedOtelInstance; + if ("CUSTOM".equals(expectTrace) || "CUSTOM".equals(expectLog)) { + expectedOtelInstance = mockCustomOtel; + } else if ("GLOBAL".equals(expectTrace) || "GLOBAL".equals(expectLog)) { + expectedOtelInstance = mockGlobalOtel; + } else if ("DRIVER_MANAGED".equals(expectTrace) || "DRIVER_MANAGED".equals(expectLog)) { + expectedOtelInstance = mockDriverManagedOtel; + } else { + expectedOtelInstance = OpenTelemetry.noop(); + } + + boolean expectUseDirectGcp = "DRIVER_MANAGED".equals(expectLog); + Logging expectedLogClient = expectUseDirectGcp ? mockLogging : null; + + mockedOtel.verify( + () -> + BigQueryJdbcOpenTelemetry.registerConnection( + anyString(), + eq(expectedOtelInstance), + eq(expectedLogClient), + eq(expectUseDirectGcp))); + } + + connection.close(); + } + } } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetryTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetryTest.java index 9a6e7091d6c6..6f07b0e220d5 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetryTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOpenTelemetryTest.java @@ -20,6 +20,7 @@ import static org.mockito.Mockito.mock; import com.google.auth.oauth2.GoogleCredentials; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Tracer; import org.junit.jupiter.api.AfterEach; @@ -50,7 +51,7 @@ public void testGetOpenTelemetry_withCustomSdk_returnsCustom() { OpenTelemetry mockCustomOtel = mock(OpenTelemetry.class); OpenTelemetry result = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, false, mockCustomOtel, null, null); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, false, false, mockCustomOtel, null, null); assertThat(result).isSameInstanceAs(mockCustomOtel); } @@ -61,7 +62,7 @@ public void testGetOpenTelemetry_withCustomSdkAndFlags_returnsCustom() { // Custom SDK always takes precedence over individual flags OpenTelemetry result = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, true, mockCustomOtel, null, null); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, true, mockCustomOtel, null, null); assertThat(result).isSameInstanceAs(mockCustomOtel); } @@ -69,7 +70,7 @@ public void testGetOpenTelemetry_withCustomSdkAndFlags_returnsCustom() { @Test public void testGetOpenTelemetry_noFlags_returnsNoop() { OpenTelemetry result = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, false, null, null, null); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, false, false, null, null, null); assertThat(result).isSameInstanceAs(OpenTelemetry.noop()); } @@ -84,9 +85,9 @@ public void testGetTracer_respectsScopeName() { @Test public void testGetOpenTelemetry_cachesSdkInstances() { OpenTelemetry result1 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, false, null, null, "project1"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, false, null, null, "project1"); OpenTelemetry result2 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, false, null, null, "project1"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, false, null, null, "project1"); assertThat(result1).isSameInstanceAs(result2); } @@ -94,9 +95,9 @@ public void testGetOpenTelemetry_cachesSdkInstances() { @Test public void testGetOpenTelemetry_createsNewInstanceForDifferentKey() { OpenTelemetry result1 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, false, null, null, "project1"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, false, null, null, "project1"); OpenTelemetry result2 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, false, null, null, "project2"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, false, null, null, "project2"); assertThat(result1).isNotSameInstanceAs(result2); } @@ -104,9 +105,9 @@ public void testGetOpenTelemetry_createsNewInstanceForDifferentKey() { @Test public void testGetOpenTelemetry_createsNewInstanceForDifferentTraceFlag() { OpenTelemetry result1 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, true, null, null, "project1"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, true, null, null, "project1"); OpenTelemetry result2 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, null, null, "project1"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, false, true, null, null, "project1"); assertThat(result1).isNotSameInstanceAs(result2); } @@ -114,10 +115,18 @@ public void testGetOpenTelemetry_createsNewInstanceForDifferentTraceFlag() { @Test public void testGetOpenTelemetry_ignoresEnableLogFlagInCacheKey() { OpenTelemetry result1 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, true, null, null, "project1"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, true, null, null, "project1"); OpenTelemetry result2 = - BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, false, null, null, "project1"); + BigQueryJdbcOpenTelemetry.getOpenTelemetry(false, true, false, null, null, "project1"); assertThat(result1).isSameInstanceAs(result2); } + + @Test + public void testGetOpenTelemetry_withUseGlobalOTel_returnsGlobal() { + OpenTelemetry result = + BigQueryJdbcOpenTelemetry.getOpenTelemetry(true, false, false, null, null, null); + + assertThat(result).isSameInstanceAs(GlobalOpenTelemetry.get()); + } } From 5303a69a186004c9a7c6000f8bae0bfcb0be615b Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Wed, 27 May 2026 17:47:25 +0000 Subject: [PATCH 2/4] chore: address feedback --- .../com/google/cloud/bigquery/jdbc/BigQueryConnection.java | 1 - .../google/cloud/bigquery/jdbc/BigQueryConnectionTest.java | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 4e7565856c97..8e530ccf060c 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -1040,7 +1040,6 @@ void removeStatement(Statement statement) { } private OpenTelemetry getOpenTelemetryInstance() { - boolean hasCustomOtel = this.customOpenTelemetry != null; String effectiveProjectId = (this.gcpTelemetryProjectId != null) ? this.gcpTelemetryProjectId : this.catalog; diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 618519541008..0859fcf85749 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -567,6 +567,10 @@ public void testOpenTelemetryPrecedenceHierarchy( OpenTelemetry mockGlobalOtel = mock(OpenTelemetry.class); OpenTelemetry mockDriverManagedOtel = mock(OpenTelemetry.class); Logging mockLogging = mock(Logging.class); + org.mockito.Mockito.when(mockCustomOtel.getTracer(anyString())).thenReturn(mock(Tracer.class)); + org.mockito.Mockito.when(mockGlobalOtel.getTracer(anyString())).thenReturn(mock(Tracer.class)); + org.mockito.Mockito.when(mockDriverManagedOtel.getTracer(anyString())) + .thenReturn(mock(Tracer.class)); if (hasCustom) { ds.setCustomOpenTelemetry(mockCustomOtel); From 45a9f46c9cc8633e89b1e0cd85996553d42f252a Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Wed, 27 May 2026 17:52:45 +0000 Subject: [PATCH 3/4] chore: use try-with in tests --- .../bigquery/jdbc/BigQueryConnectionTest.java | 63 +++++++++---------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 0859fcf85749..449806b014da 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -628,41 +628,40 @@ public void testOpenTelemetryPrecedenceHierarchy( return OpenTelemetry.noop(); }); - BigQueryConnection connection = new BigQueryConnection(BASE_URL, ds); - - boolean shouldBeRegistered = enableLog || hasCustom || useGlobal; - - if (!shouldBeRegistered) { - mockedOtel.verify( - () -> - BigQueryJdbcOpenTelemetry.registerConnection( - anyString(), any(), any(), anyBoolean()), - never()); - } else { - final OpenTelemetry expectedOtelInstance; - if ("CUSTOM".equals(expectTrace) || "CUSTOM".equals(expectLog)) { - expectedOtelInstance = mockCustomOtel; - } else if ("GLOBAL".equals(expectTrace) || "GLOBAL".equals(expectLog)) { - expectedOtelInstance = mockGlobalOtel; - } else if ("DRIVER_MANAGED".equals(expectTrace) || "DRIVER_MANAGED".equals(expectLog)) { - expectedOtelInstance = mockDriverManagedOtel; - } else { - expectedOtelInstance = OpenTelemetry.noop(); - } + try (BigQueryConnection connection = new BigQueryConnection(BASE_URL, ds)) { - boolean expectUseDirectGcp = "DRIVER_MANAGED".equals(expectLog); - Logging expectedLogClient = expectUseDirectGcp ? mockLogging : null; + boolean shouldBeRegistered = enableLog || hasCustom || useGlobal; - mockedOtel.verify( - () -> - BigQueryJdbcOpenTelemetry.registerConnection( - anyString(), - eq(expectedOtelInstance), - eq(expectedLogClient), - eq(expectUseDirectGcp))); + if (!shouldBeRegistered) { + mockedOtel.verify( + () -> + BigQueryJdbcOpenTelemetry.registerConnection( + anyString(), any(), any(), anyBoolean()), + never()); + } else { + final OpenTelemetry expectedOtelInstance; + if ("CUSTOM".equals(expectTrace) || "CUSTOM".equals(expectLog)) { + expectedOtelInstance = mockCustomOtel; + } else if ("GLOBAL".equals(expectTrace) || "GLOBAL".equals(expectLog)) { + expectedOtelInstance = mockGlobalOtel; + } else if ("DRIVER_MANAGED".equals(expectTrace) || "DRIVER_MANAGED".equals(expectLog)) { + expectedOtelInstance = mockDriverManagedOtel; + } else { + expectedOtelInstance = OpenTelemetry.noop(); + } + + boolean expectUseDirectGcp = "DRIVER_MANAGED".equals(expectLog); + Logging expectedLogClient = expectUseDirectGcp ? mockLogging : null; + + mockedOtel.verify( + () -> + BigQueryJdbcOpenTelemetry.registerConnection( + anyString(), + eq(expectedOtelInstance), + eq(expectedLogClient), + eq(expectUseDirectGcp))); + } } - - connection.close(); } } } From cd59c8c5621b5d03d9db6d8484aebe22222222d0 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Thu, 28 May 2026 11:53:16 +0000 Subject: [PATCH 4/4] chore: minor refactor --- .../bigquery/jdbc/BigQueryConnectionTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 449806b014da..039fe2e22a66 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -23,7 +23,9 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.when; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.rpc.HeaderProvider; @@ -55,7 +57,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.mockito.MockedStatic; -import org.mockito.Mockito; public class BigQueryConnectionTest extends BigQueryJdbcLoggingBaseTest { @@ -567,20 +568,19 @@ public void testOpenTelemetryPrecedenceHierarchy( OpenTelemetry mockGlobalOtel = mock(OpenTelemetry.class); OpenTelemetry mockDriverManagedOtel = mock(OpenTelemetry.class); Logging mockLogging = mock(Logging.class); - org.mockito.Mockito.when(mockCustomOtel.getTracer(anyString())).thenReturn(mock(Tracer.class)); - org.mockito.Mockito.when(mockGlobalOtel.getTracer(anyString())).thenReturn(mock(Tracer.class)); - org.mockito.Mockito.when(mockDriverManagedOtel.getTracer(anyString())) - .thenReturn(mock(Tracer.class)); + when(mockCustomOtel.getTracer(anyString())).thenReturn(mock(Tracer.class)); + when(mockGlobalOtel.getTracer(anyString())).thenReturn(mock(Tracer.class)); + when(mockDriverManagedOtel.getTracer(anyString())).thenReturn(mock(Tracer.class)); if (hasCustom) { ds.setCustomOpenTelemetry(mockCustomOtel); } try (MockedStatic mockedOtel = - Mockito.mockStatic(BigQueryJdbcOpenTelemetry.class); + mockStatic(BigQueryJdbcOpenTelemetry.class); MockedStatic mockedAuth = - Mockito.mockStatic(BigQueryJdbcOAuthUtility.class); - MockedStatic mockedCreds = Mockito.mockStatic(GoogleCredentials.class)) { + mockStatic(BigQueryJdbcOAuthUtility.class); + MockedStatic mockedCreds = mockStatic(GoogleCredentials.class)) { mockedCreds .when(GoogleCredentials::getApplicationDefault)