diff --git a/.github/release-please.yml b/.github/release-please.yml
index d722d35a2..f87ac1ecc 100644
--- a/.github/release-please.yml
+++ b/.github/release-please.yml
@@ -35,6 +35,10 @@ branches:
handleGHRelease: true
releaseType: java-backport
branch: 2.52.x
+ - bumpMinorPreMajor: true
+ handleGHRelease: true
+ releaseType: java-backport
+ branch: 2.51.x
bumpMinorPreMajor: true
handleGHRelease: true
releaseType: java-yoshi
diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml
index 26f85cb16..8a7fa3e30 100644
--- a/.github/sync-repo-settings.yaml
+++ b/.github/sync-repo-settings.yaml
@@ -147,6 +147,21 @@ branchProtectionRules:
- cla/google
- javadoc
- unmanaged_dependency_check
+ - pattern: 2.51.x
+ isAdminEnforced: true
+ requiredApprovingReviewCount: 1
+ requiresCodeOwnerReviews: true
+ requiresStrictStatusChecks: false
+ requiredStatusCheckContexts:
+ - dependencies (17)
+ - lint
+ - clirr
+ - units (8)
+ - units (11)
+ - 'Kokoro - Test: Integration'
+ - cla/google
+ - javadoc
+ - unmanaged_dependency_check
permissionRules:
- team: api-bigquery
permission: admin
diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml
index 1795d3b24..6d5c25a0c 100644
--- a/.github/workflows/unmanaged_dependency_check.yaml
+++ b/.github/workflows/unmanaged_dependency_check.yaml
@@ -17,7 +17,7 @@ jobs:
# repository
.kokoro/build.sh
- name: Unmanaged dependency check
- uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.50.1
+ uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.50.2
with:
# java-bigquery does not produce a BOM. Fortunately the root pom.xml
# defines google-cloud-bigquery in dependencyManagement section. So
diff --git a/.kokoro/continuous/graalvm-native-a.cfg b/.kokoro/continuous/graalvm-native-a.cfg
index 13d12ce34..bfe47cf7d 100644
--- a/.kokoro/continuous/graalvm-native-a.cfg
+++ b/.kokoro/continuous/graalvm-native-a.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.50.1"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.50.2"
}
env_vars: {
diff --git a/.kokoro/continuous/graalvm-native-b.cfg b/.kokoro/continuous/graalvm-native-b.cfg
index 4696d04ef..603c54174 100644
--- a/.kokoro/continuous/graalvm-native-b.cfg
+++ b/.kokoro/continuous/graalvm-native-b.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.50.1"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.50.2"
}
env_vars: {
diff --git a/.kokoro/continuous/graalvm-native-c.cfg b/.kokoro/continuous/graalvm-native-c.cfg
index 26d39a747..6b35d89de 100644
--- a/.kokoro/continuous/graalvm-native-c.cfg
+++ b/.kokoro/continuous/graalvm-native-c.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.50.1"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.50.2"
}
env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg
index 13d12ce34..bfe47cf7d 100644
--- a/.kokoro/presubmit/graalvm-native-a.cfg
+++ b/.kokoro/presubmit/graalvm-native-a.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.50.1"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.50.2"
}
env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg
index 4696d04ef..603c54174 100644
--- a/.kokoro/presubmit/graalvm-native-b.cfg
+++ b/.kokoro/presubmit/graalvm-native-b.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.50.1"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.50.2"
}
env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-c.cfg b/.kokoro/presubmit/graalvm-native-c.cfg
index 26d39a747..6b35d89de 100644
--- a/.kokoro/presubmit/graalvm-native-c.cfg
+++ b/.kokoro/presubmit/graalvm-native-c.cfg
@@ -3,7 +3,7 @@
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
- value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.50.1"
+ value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.50.2"
}
env_vars: {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9336a4195..147b9c589 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,24 @@
# Changelog
+## [2.54.0](https://github.com/googleapis/java-bigquery/compare/v2.53.0...v2.54.0) (2025-07-31)
+
+
+### Features
+
+* **bigquery:** Add OpenTelemetry Samples ([#3899](https://github.com/googleapis/java-bigquery/issues/3899)) ([e3d9ed9](https://github.com/googleapis/java-bigquery/commit/e3d9ed92ca5d9b58b5747960d74f895ed8733ebf))
+* **bigquery:** Add otel metrics to request headers ([#3900](https://github.com/googleapis/java-bigquery/issues/3900)) ([4071e4c](https://github.com/googleapis/java-bigquery/commit/4071e4cb2547b236183fd4fbb92c73f074cf2fa0))
+
+
+### Dependencies
+
+* Update dependency com.google.api.grpc:proto-google-cloud-bigqueryconnection-v1 to v2.70.0 ([#3890](https://github.com/googleapis/java-bigquery/issues/3890)) ([84207e2](https://github.com/googleapis/java-bigquery/commit/84207e297eec75bcb4f1cc1b64423d7c2ddd6c30))
+* Update dependency com.google.apis:google-api-services-bigquery to v2-rev20250706-2.0.0 ([#3910](https://github.com/googleapis/java-bigquery/issues/3910)) ([ae5c971](https://github.com/googleapis/java-bigquery/commit/ae5c97146c7076e90c000fd98b797ec8e08a9cd8))
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.50.2 ([#3901](https://github.com/googleapis/java-bigquery/issues/3901)) ([8205623](https://github.com/googleapis/java-bigquery/commit/82056237f194a6c99ec4fb3a4315023efdedff1b))
+* Update dependency io.opentelemetry:opentelemetry-api to v1.52.0 ([#3902](https://github.com/googleapis/java-bigquery/issues/3902)) ([772407b](https://github.com/googleapis/java-bigquery/commit/772407b12f4da005f79eafc944d4c53f0eec5c27))
+* Update dependency io.opentelemetry:opentelemetry-bom to v1.52.0 ([#3903](https://github.com/googleapis/java-bigquery/issues/3903)) ([509a6fc](https://github.com/googleapis/java-bigquery/commit/509a6fc0bb7e7a101bf0d4334a3ff1adde2cab09))
+* Update dependency io.opentelemetry:opentelemetry-context to v1.52.0 ([#3904](https://github.com/googleapis/java-bigquery/issues/3904)) ([96c1bae](https://github.com/googleapis/java-bigquery/commit/96c1bae0fcdfdfc2dbb25dcae5007c5d02111a8c))
+* Update dependency io.opentelemetry:opentelemetry-exporter-logging to v1.52.0 ([#3905](https://github.com/googleapis/java-bigquery/issues/3905)) ([28ee4c9](https://github.com/googleapis/java-bigquery/commit/28ee4c941b99b1fe3803aefbe7a8ae57100d76cb))
+
## [2.53.0](https://github.com/googleapis/java-bigquery/compare/v2.52.0...v2.53.0) (2025-07-14)
diff --git a/benchmark/pom.xml b/benchmark/pom.xml
index 8674b7102..5f875493d 100644
--- a/benchmark/pom.xml
+++ b/benchmark/pom.xml
@@ -6,7 +6,7 @@
google-cloud-bigquery-parent
com.google.cloud
- 2.53.0
+ 2.54.0
diff --git a/google-cloud-bigquery-bom/pom.xml b/google-cloud-bigquery-bom/pom.xml
index bc3a9e0c3..cefddd199 100644
--- a/google-cloud-bigquery-bom/pom.xml
+++ b/google-cloud-bigquery-bom/pom.xml
@@ -3,12 +3,12 @@
4.0.0
com.google.cloud
google-cloud-bigquery-bom
- 2.53.0
+ 2.54.0
pom
com.google.cloud
sdk-platform-java-config
- 3.50.1
+ 3.50.2
@@ -54,7 +54,7 @@
com.google.cloud
google-cloud-bigquery
- 2.53.0
+ 2.54.0
diff --git a/google-cloud-bigquery/pom.xml b/google-cloud-bigquery/pom.xml
index ad20f607e..058a06caa 100644
--- a/google-cloud-bigquery/pom.xml
+++ b/google-cloud-bigquery/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-bigquery
- 2.53.0
+ 2.54.0
jar
BigQuery
https://github.com/googleapis/java-bigquery
@@ -11,7 +11,7 @@
com.google.cloud
google-cloud-bigquery-parent
- 2.53.0
+ 2.54.0
google-cloud-bigquery
diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java
index 9d89435ea..16737dc4b 100644
--- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java
+++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpc.java
@@ -158,6 +158,9 @@ public Dataset getDatasetSkipExceptionTranslation(
if (options.containsKey(Option.DATASET_VIEW)) {
bqGetRequest.setDatasetView(options.get(Option.DATASET_VIEW).toString());
}
+ bqGetRequest
+ .getRequestHeaders()
+ .set("x-goog-otel-enabled", this.options.isOpenTelemetryTracingEnabled());
Span getDataset = null;
if (this.options.isOpenTelemetryTracingEnabled()
@@ -205,6 +208,10 @@ public Tuple> listDatasetsSkipExceptionTranslation(
.setMaxResults(Option.MAX_RESULTS.getLong(options))
.setPageToken(Option.PAGE_TOKEN.getString(options));
+ datasetsListRequest
+ .getRequestHeaders()
+ .set("x-goog-otel-enabled", this.options.isOpenTelemetryTracingEnabled());
+
Span listDatasets = null;
if (this.options.isOpenTelemetryTracingEnabled()
&& this.options.getOpenTelemetryTracer() != null) {
@@ -256,6 +263,9 @@ public Dataset createSkipExceptionTranslation(Dataset dataset, Map
@@ -71,7 +71,7 @@
com.google.cloud
google-cloud-bigquerystorage-bom
- 3.16.0
+ 3.16.1
pom
import
@@ -79,7 +79,7 @@
com.google.cloud
google-cloud-datacatalog-bom
- 1.73.0
+ 1.74.0
pom
import
@@ -93,7 +93,7 @@
com.google.cloud
google-cloud-bigquery
- 2.53.0
+ 2.54.0
@@ -137,19 +137,19 @@
com.google.cloud
google-cloud-storage
- 2.53.2
+ 2.53.3
test
com.google.cloud
google-cloud-bigqueryconnection
- 2.69.0
+ 2.70.0
test
com.google.api.grpc
proto-google-cloud-bigqueryconnection-v1
- 2.69.0
+ 2.70.0
test
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 11e13e43e..7cd683afd 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -37,6 +37,7 @@
1.8
1.8
UTF-8
+ 1.52.0
@@ -45,7 +46,7 @@
com.google.cloud
google-cloud-bigquery
- 2.52.0
+ 2.53.0
@@ -59,17 +60,48 @@
google-oauth-client-jetty
1.39.0
+
+ io.opentelemetry
+ opentelemetry-api
+ ${opentelemetry.version}
+
+
+ io.opentelemetry
+ opentelemetry-context
+ ${opentelemetry.version}
+
+
+ io.opentelemetry
+ opentelemetry-sdk
+ ${opentelemetry.version}
+
+
+ io.opentelemetry
+ opentelemetry-sdk-common
+ ${opentelemetry.version}
+
+
+ io.opentelemetry
+ opentelemetry-sdk-trace
+ ${opentelemetry.version}
+
+
+ io.opentelemetry
+ opentelemetry-exporter-logging
+ ${opentelemetry.version}
+
+
com.google.cloud
google-cloud-bigtable
- 2.61.0
+ 2.62.0
test
com.google.cloud
google-cloud-bigqueryconnection
- 2.69.0
+ 2.70.0
test
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 7e1bfd314..186090714 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -39,12 +39,24 @@
UTF-8
+
+
+
+ io.opentelemetry
+ opentelemetry-bom
+ 1.52.0
+ pom
+ import
+
+
+
+
com.google.cloud
google-cloud-bigquery
- 2.53.0
+ 2.54.0
@@ -61,13 +73,13 @@
com.google.cloud
google-cloud-bigtable
- 2.61.0
+ 2.62.0
test
com.google.cloud
google-cloud-bigqueryconnection
- 2.69.0
+ 2.70.0
test
@@ -82,6 +94,30 @@
1.4.4
test
+
+ io.opentelemetry
+ opentelemetry-api
+
+
+ io.opentelemetry
+ opentelemetry-context
+
+
+ io.opentelemetry
+ opentelemetry-sdk
+
+
+ io.opentelemetry
+ opentelemetry-sdk-common
+
+
+ io.opentelemetry
+ opentelemetry-sdk-trace
+
+
+ io.opentelemetry
+ opentelemetry-exporter-logging
+
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 62c7f22ec..d6f779c24 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -47,7 +47,14 @@
com.google.cloud
libraries-bom
- 26.63.0
+ 26.64.0
+ pom
+ import
+
+
+ io.opentelemetry
+ opentelemetry-bom
+ 1.52.0
pom
import
@@ -59,6 +66,30 @@
com.google.cloud
google-cloud-bigquery
+
+ io.opentelemetry
+ opentelemetry-api
+
+
+ io.opentelemetry
+ opentelemetry-context
+
+
+ io.opentelemetry
+ opentelemetry-sdk
+
+
+ io.opentelemetry
+ opentelemetry-sdk-common
+
+
+ io.opentelemetry
+ opentelemetry-sdk-trace
+
+
+ io.opentelemetry
+ opentelemetry-exporter-logging
+
@@ -79,13 +110,13 @@
com.google.cloud
google-cloud-bigtable
- 2.61.0
+ 2.62.0
test
com.google.cloud
google-cloud-bigqueryconnection
- 2.69.0
+ 2.70.0
test
diff --git a/samples/snippets/src/main/java/com/example/bigquery/EnableOpenTelemetryTracing.java b/samples/snippets/src/main/java/com/example/bigquery/EnableOpenTelemetryTracing.java
new file mode 100644
index 000000000..57ec7eb71
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/bigquery/EnableOpenTelemetryTracing.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.bigquery;
+
+// [START bigquery_enable_otel_tracing]
+import com.google.cloud.bigquery.BigQuery;
+import com.google.cloud.bigquery.BigQueryOptions;
+import com.google.cloud.bigquery.Dataset;
+import com.google.cloud.bigquery.DatasetInfo;
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.exporter.logging.LoggingSpanExporter;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
+import io.opentelemetry.sdk.trace.samplers.Sampler;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Logger;
+
+public class EnableOpenTelemetryTracing {
+ private static final Logger log = Logger.getLogger(EnableOpenTelemetryTracing.class.getName());
+
+ public static void main(String[] args) {
+ // Set logging to System.err.
+ ConsoleHandler ch = new ConsoleHandler();
+ log.addHandler(ch);
+
+ // TODO(developer): Replace values before running the sample.
+ final String tracerName = "Sample Tracer";
+ final String datasetId = "sampleDatasetId";
+
+ // Create TracerProvider that exports to a logger.
+ SdkTracerProvider tracerProvider =
+ SdkTracerProvider.builder()
+ .addSpanProcessor(SimpleSpanProcessor.builder(LoggingSpanExporter.create()).build())
+ .setSampler(Sampler.alwaysOn())
+ .build();
+
+ // Create global OpenTelemetry instance using the TracerProvider.
+ OpenTelemetry otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();
+
+ // Create Tracer instance from the OpenTelemetry object. Tracers are used to create
+ // Spans. There can be multiple Tracers in an OpenTelemetry instance.
+ Tracer tracer = otel.getTracer(tracerName);
+
+ enableOpenTelemetry(tracer, datasetId);
+ }
+
+ public static void enableOpenTelemetry(Tracer tracer, String datasetId) {
+ // Create BigQuery client to trace. EnableOpenTelemetryTracing and OpenTelemetryTracer must
+ // be set to enable tracing.
+ BigQueryOptions otelOptions =
+ BigQueryOptions.newBuilder()
+ .setEnableOpenTelemetryTracing(true)
+ .setOpenTelemetryTracer(tracer)
+ .build();
+ BigQuery bigquery = otelOptions.getService();
+
+ try {
+ // Create dataset.
+ DatasetInfo info = DatasetInfo.newBuilder(datasetId).build();
+ Dataset dataset = bigquery.create(info);
+ } catch (Exception e) {
+ System.out.println(
+ String.format("Failed to create dataset: %s: %s", e.toString(), e.getMessage()));
+ } finally {
+ bigquery.delete(datasetId);
+ }
+ }
+}
+// [END bigquery_enable_otel_tracing]
diff --git a/samples/snippets/src/main/java/com/example/bigquery/EnableOpenTelemetryTracingWithParentSpan.java b/samples/snippets/src/main/java/com/example/bigquery/EnableOpenTelemetryTracingWithParentSpan.java
new file mode 100644
index 000000000..af69df10b
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/bigquery/EnableOpenTelemetryTracingWithParentSpan.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.bigquery;
+
+// [START bigquery_enable_otel_tracing_with_parent_span]
+import com.google.cloud.bigquery.BigQuery;
+import com.google.cloud.bigquery.BigQueryOptions;
+import com.google.cloud.bigquery.Dataset;
+import com.google.cloud.bigquery.DatasetInfo;
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.context.Scope;
+import io.opentelemetry.exporter.logging.LoggingSpanExporter;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
+import io.opentelemetry.sdk.trace.samplers.Sampler;
+import java.time.LocalDate;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Logger;
+
+public class EnableOpenTelemetryTracingWithParentSpan {
+ private static final Logger log =
+ Logger.getLogger(EnableOpenTelemetryTracingWithParentSpan.class.getName());
+
+ public static void main(String[] args) {
+ // Set logging to System.err.
+ ConsoleHandler ch = new ConsoleHandler();
+ log.addHandler(ch);
+
+ // TODO(developer): Replace values before running the sample.
+ final String tracerName = "Sample Tracer";
+ final String parentSpanName = "Sample Parent Span";
+ final String datasetId = "sampleDatasetId";
+
+ // Create TracerProvider that exports to a logger.
+ SdkTracerProvider tracerProvider =
+ SdkTracerProvider.builder()
+ .addSpanProcessor(SimpleSpanProcessor.builder(LoggingSpanExporter.create()).build())
+ .setSampler(Sampler.alwaysOn())
+ .build();
+
+ // Create OpenTelemetry instance using the TracerProvider.
+ OpenTelemetry otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();
+
+ // Create Tracer instance from the global OpenTelemetry object. Tracers are used to create
+ // Spans. There can be multiple Tracers in a global OpenTelemetry instance.
+ final Tracer tracer = otel.getTracer(tracerName);
+ enableOpenTelemetryWithParentSpan(tracer, parentSpanName, datasetId);
+ }
+
+ public static void enableOpenTelemetryWithParentSpan(
+ Tracer tracer, String parentSpanName, String datasetId) {
+ // Create BigQuery client to trace. EnableOpenTelemetryTracing and OpenTelemetryTracer must
+ // be set to enable tracing.
+ BigQueryOptions otelOptions =
+ BigQueryOptions.newBuilder()
+ .setEnableOpenTelemetryTracing(true)
+ .setOpenTelemetryTracer(tracer)
+ .build();
+ BigQuery bigquery = otelOptions.getService();
+
+ LocalDate currentDate = LocalDate.now();
+
+ // Create the root parent Span. setNoParent() ensures that it is a parent Span with a Span ID
+ // of 0.
+ Span parentSpan =
+ tracer
+ .spanBuilder(parentSpanName)
+ .setNoParent()
+ .setAttribute("current_date", currentDate.toString())
+ .startSpan();
+
+ // The Span Context is automatically passed on to any functions called within the scope of the
+ // try block. parentSpan.makeCurrent() sets parentSpan to be the parent of any Spans created in
+ // this scope, or the scope of any functions called within this scope.
+ try (Scope parentScope = parentSpan.makeCurrent()) {
+ DatasetInfo info = DatasetInfo.newBuilder(datasetId).build();
+ Dataset dataset = bigquery.create(info);
+ } catch (Exception e) {
+ System.out.println(
+ String.format("Failed to create dataset: %s: %s", e.toString(), e.getMessage()));
+ } finally {
+ // finally block ensures that Spans are cleaned up properly.
+ parentSpan.end();
+ bigquery.delete(datasetId);
+ }
+ }
+}
+// [END bigquery_enable_otel_tracing_with_parent_span]
diff --git a/samples/snippets/src/test/java/com/example/bigquery/EnableOpenTelemetryTracingIT.java b/samples/snippets/src/test/java/com/example/bigquery/EnableOpenTelemetryTracingIT.java
new file mode 100644
index 000000000..0ad565101
--- /dev/null
+++ b/samples/snippets/src/test/java/com/example/bigquery/EnableOpenTelemetryTracingIT.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.bigquery;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.cloud.bigquery.testing.RemoteBigQueryHelper;
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.common.CompletableResultCode;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.data.SpanData;
+import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
+import io.opentelemetry.sdk.trace.samplers.Sampler;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EnableOpenTelemetryTracingIT {
+ private final Logger log = Logger.getLogger(this.getClass().getName());
+ private ByteArrayOutputStream bout;
+ private PrintStream out;
+ private PrintStream originalPrintStream;
+
+ private static class ConsoleSpanExporter
+ implements io.opentelemetry.sdk.trace.export.SpanExporter {
+ @Override
+ public CompletableResultCode export(Collection collection) {
+ if (collection.isEmpty()) {
+ return CompletableResultCode.ofFailure();
+ }
+ for (SpanData data : collection) {
+ System.out.println(data);
+ }
+ return CompletableResultCode.ofSuccess();
+ }
+
+ @Override
+ public CompletableResultCode flush() {
+ return CompletableResultCode.ofSuccess();
+ }
+
+ @Override
+ public CompletableResultCode shutdown() {
+ return CompletableResultCode.ofSuccess();
+ }
+ }
+
+ @Before
+ public void setUp() {
+ bout = new ByteArrayOutputStream();
+ out = new PrintStream(bout);
+ originalPrintStream = System.out;
+ System.setOut(out);
+ }
+
+ @After
+ public void tearDown() {
+ // restores print statements in the original method
+ System.out.flush();
+ System.setOut(originalPrintStream);
+ log.log(Level.INFO, "\n" + bout.toString());
+ }
+
+ @Test
+ public void testEnableOpenTelemetryTracing() {
+ final String tracerName = "testSampleTracer";
+ final String datasetId = RemoteBigQueryHelper.generateDatasetName();
+
+ SdkTracerProvider tracerProvider =
+ SdkTracerProvider.builder()
+ .addSpanProcessor(SimpleSpanProcessor.builder(new ConsoleSpanExporter()).build())
+ .setSampler(Sampler.alwaysOn())
+ .build();
+
+ OpenTelemetry otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();
+
+ final Tracer tracer = otel.getTracer(tracerName);
+
+ EnableOpenTelemetryTracing.enableOpenTelemetry(tracer, datasetId);
+
+ assertThat(bout.toString()).contains("com.google.cloud.bigquery.BigQuery.createDataset");
+ assertThat(bout.toString()).contains("com.google.cloud.bigquery.BigQuery.deleteDataset");
+ }
+}
diff --git a/samples/snippets/src/test/java/com/example/bigquery/EnableOpenTelemetryTracingWithParentSpanIT.java b/samples/snippets/src/test/java/com/example/bigquery/EnableOpenTelemetryTracingWithParentSpanIT.java
new file mode 100644
index 000000000..482915008
--- /dev/null
+++ b/samples/snippets/src/test/java/com/example/bigquery/EnableOpenTelemetryTracingWithParentSpanIT.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.bigquery;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.cloud.bigquery.testing.RemoteBigQueryHelper;
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.common.CompletableResultCode;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.data.SpanData;
+import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
+import io.opentelemetry.sdk.trace.samplers.Sampler;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.time.LocalDate;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EnableOpenTelemetryTracingWithParentSpanIT {
+ private final Logger log = Logger.getLogger(this.getClass().getName());
+ private ByteArrayOutputStream bout;
+ private PrintStream out;
+ private PrintStream originalPrintStream;
+
+ private static class ConsoleSpanExporter
+ implements io.opentelemetry.sdk.trace.export.SpanExporter {
+ @Override
+ public CompletableResultCode export(Collection collection) {
+ if (collection.isEmpty()) {
+ return CompletableResultCode.ofFailure();
+ }
+ for (SpanData data : collection) {
+ System.out.println(data);
+ }
+ return CompletableResultCode.ofSuccess();
+ }
+
+ @Override
+ public CompletableResultCode flush() {
+ return CompletableResultCode.ofSuccess();
+ }
+
+ @Override
+ public CompletableResultCode shutdown() {
+ return CompletableResultCode.ofSuccess();
+ }
+ }
+
+ @Before
+ public void setUp() {
+ bout = new ByteArrayOutputStream();
+ out = new PrintStream(bout);
+ originalPrintStream = System.out;
+ System.setOut(out);
+ }
+
+ @After
+ public void tearDown() {
+ // restores print statements in the original method
+ System.out.flush();
+ System.setOut(originalPrintStream);
+ log.log(Level.INFO, "\n" + bout.toString());
+ }
+
+ @Test
+ public void testEnableOpenTelemetryWithParentSpan() {
+ final String tracerName = "testSampleTracer";
+ final String parentSpanName = "testSampleParentSpan";
+ final String datasetId = RemoteBigQueryHelper.generateDatasetName();
+ final LocalDate currentDate = LocalDate.now();
+
+ SdkTracerProvider tracerProvider =
+ SdkTracerProvider.builder()
+ .addSpanProcessor(SimpleSpanProcessor.builder(new ConsoleSpanExporter()).build())
+ .setSampler(Sampler.alwaysOn())
+ .build();
+
+ OpenTelemetry otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();
+
+ final Tracer tracer = otel.getTracer(tracerName);
+
+ EnableOpenTelemetryTracingWithParentSpan.enableOpenTelemetryWithParentSpan(
+ tracer, parentSpanName, datasetId);
+
+ assertThat(bout.toString()).contains(parentSpanName);
+ assertThat(bout.toString())
+ .contains(String.format("AttributesMap{data={current_date=%s}", currentDate.toString()));
+ }
+}
diff --git a/versions.txt b/versions.txt
index 5245c445b..f0fee808c 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,4 +1,4 @@
# Format:
# module:released-version:current-version
-google-cloud-bigquery:2.53.0:2.53.0
\ No newline at end of file
+google-cloud-bigquery:2.54.0:2.54.0
\ No newline at end of file