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]