diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index c492b1182c..87a5670338 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -59,6 +59,37 @@
google-oauth-client-jetty
1.39.0
+
+ io.opentelemetry
+ opentelemetry-api
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-context
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk-common
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk-trace
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-exporter-logging
+ 1.48.0
+
+
com.google.cloud
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 496458c708..f2c96c00db 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -39,6 +39,18 @@
UTF-8
+
+
+
+ io.opentelemetry
+ opentelemetry-bom
+ 1.48.0
+ pom
+ import
+
+
+
+
@@ -82,6 +94,36 @@
1.4.4
test
+
+ io.opentelemetry
+ opentelemetry-api
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-context
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk-common
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk-trace
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-exporter-logging
+ 1.48.0
+
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 0e32438edd..2b5dfd4bcd 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -51,6 +51,13 @@
pom
import
+
+ io.opentelemetry
+ opentelemetry-bom
+ 1.48.0
+ pom
+ import
+
@@ -59,6 +66,36 @@
com.google.cloud
google-cloud-bigquery
+
+ io.opentelemetry
+ opentelemetry-api
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-context
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk-common
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-sdk-trace
+ 1.48.0
+
+
+ io.opentelemetry
+ opentelemetry-exporter-logging
+ 1.48.0
+
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 0000000000..57ec7eb71d
--- /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 0000000000..af69df10ba
--- /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 0000000000..0ad5651018
--- /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 0000000000..482915008b
--- /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()));
+ }
+}