feat(bigquery): Add OpenTelemetry Samples (#3899) · googleapis/java-bigquery@e3d9ed9
1+/*
2+ * Copyright 2025 Google LLC
3+ *
4+ * Licensed under the Apache License, Version 2.0 (the "License");
5+ * you may not use this file except in compliance with the License.
6+ * You may obtain a copy of the License at
7+ *
8+ * http://www.apache.org/licenses/LICENSE-2.0
9+ *
10+ * Unless required by applicable law or agreed to in writing, software
11+ * distributed under the License is distributed on an "AS IS" BASIS,
12+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+ * See the License for the specific language governing permissions and
14+ * limitations under the License.
15+ */
16+17+package com.example.bigquery;
18+19+// [START bigquery_enable_otel_tracing_with_parent_span]
20+import com.google.cloud.bigquery.BigQuery;
21+import com.google.cloud.bigquery.BigQueryOptions;
22+import com.google.cloud.bigquery.Dataset;
23+import com.google.cloud.bigquery.DatasetInfo;
24+import io.opentelemetry.api.OpenTelemetry;
25+import io.opentelemetry.api.trace.Span;
26+import io.opentelemetry.api.trace.Tracer;
27+import io.opentelemetry.context.Scope;
28+import io.opentelemetry.exporter.logging.LoggingSpanExporter;
29+import io.opentelemetry.sdk.OpenTelemetrySdk;
30+import io.opentelemetry.sdk.trace.SdkTracerProvider;
31+import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
32+import io.opentelemetry.sdk.trace.samplers.Sampler;
33+import java.time.LocalDate;
34+import java.util.logging.ConsoleHandler;
35+import java.util.logging.Logger;
36+37+public class EnableOpenTelemetryTracingWithParentSpan {
38+private static final Logger log =
39+Logger.getLogger(EnableOpenTelemetryTracingWithParentSpan.class.getName());
40+41+public static void main(String[] args) {
42+// Set logging to System.err.
43+ConsoleHandler ch = new ConsoleHandler();
44+log.addHandler(ch);
45+46+// TODO(developer): Replace values before running the sample.
47+final String tracerName = "Sample Tracer";
48+final String parentSpanName = "Sample Parent Span";
49+final String datasetId = "sampleDatasetId";
50+51+// Create TracerProvider that exports to a logger.
52+SdkTracerProvider tracerProvider =
53+SdkTracerProvider.builder()
54+ .addSpanProcessor(SimpleSpanProcessor.builder(LoggingSpanExporter.create()).build())
55+ .setSampler(Sampler.alwaysOn())
56+ .build();
57+58+// Create OpenTelemetry instance using the TracerProvider.
59+OpenTelemetry otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();
60+61+// Create Tracer instance from the global OpenTelemetry object. Tracers are used to create
62+// Spans. There can be multiple Tracers in a global OpenTelemetry instance.
63+final Tracer tracer = otel.getTracer(tracerName);
64+enableOpenTelemetryWithParentSpan(tracer, parentSpanName, datasetId);
65+ }
66+67+public static void enableOpenTelemetryWithParentSpan(
68+Tracer tracer, String parentSpanName, String datasetId) {
69+// Create BigQuery client to trace. EnableOpenTelemetryTracing and OpenTelemetryTracer must
70+// be set to enable tracing.
71+BigQueryOptions otelOptions =
72+BigQueryOptions.newBuilder()
73+ .setEnableOpenTelemetryTracing(true)
74+ .setOpenTelemetryTracer(tracer)
75+ .build();
76+BigQuery bigquery = otelOptions.getService();
77+78+LocalDate currentDate = LocalDate.now();
79+80+// Create the root parent Span. setNoParent() ensures that it is a parent Span with a Span ID
81+// of 0.
82+Span parentSpan =
83+tracer
84+ .spanBuilder(parentSpanName)
85+ .setNoParent()
86+ .setAttribute("current_date", currentDate.toString())
87+ .startSpan();
88+89+// The Span Context is automatically passed on to any functions called within the scope of the
90+// try block. parentSpan.makeCurrent() sets parentSpan to be the parent of any Spans created in
91+// this scope, or the scope of any functions called within this scope.
92+try (Scope parentScope = parentSpan.makeCurrent()) {
93+DatasetInfo info = DatasetInfo.newBuilder(datasetId).build();
94+Dataset dataset = bigquery.create(info);
95+ } catch (Exception e) {
96+System.out.println(
97+String.format("Failed to create dataset: %s: %s", e.toString(), e.getMessage()));
98+ } finally {
99+// finally block ensures that Spans are cleaned up properly.
100+parentSpan.end();
101+bigquery.delete(datasetId);
102+ }
103+ }
104+}
105+// [END bigquery_enable_otel_tracing_with_parent_span]