2222import com .google .cloud .bigquery .Dataset ;
2323import com .google .cloud .bigquery .DatasetInfo ;
2424import io .opentelemetry .api .OpenTelemetry ;
25- import io .opentelemetry .api .common .AttributeKey ;
2625import io .opentelemetry .api .trace .Span ;
2726import io .opentelemetry .api .trace .Tracer ;
2827import io .opentelemetry .context .Scope ;
28+ import io .opentelemetry .exporter .logging .LoggingSpanExporter ;
2929import io .opentelemetry .sdk .OpenTelemetrySdk ;
30- import io .opentelemetry .sdk .common .CompletableResultCode ;
3130import io .opentelemetry .sdk .trace .SdkTracerProvider ;
32- import io .opentelemetry .sdk .trace .data .SpanData ;
3331import io .opentelemetry .sdk .trace .export .SimpleSpanProcessor ;
3432import io .opentelemetry .sdk .trace .samplers .Sampler ;
35- import java .util . Collection ;
36- import java .util .HashMap ;
37- import java .util .Map ;
33+ import java .time . LocalDate ;
34+ import java .util .logging . ConsoleHandler ;
35+ import java .util .logging . Logger ;
3836
3937public class EnableOpenTelemetryTracingWithParentSpan {
40- // Maps Span names to their attribute maps.
41- private static final Map <String , Map <AttributeKey <?>, Object >> OTEL_ATTRIBUTES =
42- new HashMap <String , Map <AttributeKey <?>, Object >>();
43- // Maps Span names to their parent Span IDs.
44- private static final Map <String , String > OTEL_PARENT_SPAN_IDS = new HashMap <>();
45- // Maps Span IDs to their Span names.
46- private static final Map <String , String > OTEL_SPAN_IDS_TO_NAMES = new HashMap <>();
47-
48- // Create a SpanExporter to determine how to handle captured Span data.
49- // See more at https://opentelemetry.io/docs/languages/java/sdk/#spanexporter
50- private static class SampleSpanExporter
51- implements io .opentelemetry .sdk .trace .export .SpanExporter {
52-
53- // TODO(developer): Replace export output before running the sample.
54- @ Override
55- public CompletableResultCode export (Collection <SpanData > collection ) {
56- // Export data. This data can be sent out of process via netowork calls, though
57- // for this example local data structures are used.
58- if (collection .isEmpty ()) {
59- // No span data was collected.
60- return CompletableResultCode .ofFailure ();
61- }
62-
63- for (SpanData data : collection ) {
64- OTEL_ATTRIBUTES .put (data .getName (), data .getAttributes ().asMap ());
65- OTEL_PARENT_SPAN_IDS .put (data .getName (), data .getParentSpanId ());
66- OTEL_SPAN_IDS_TO_NAMES .put (data .getSpanId (), data .getName ());
67- }
68- return CompletableResultCode .ofSuccess ();
69- }
70-
71- // TODO(developer): Replace these functions to suit your needs.
72- @ Override
73- public CompletableResultCode flush () {
74- // Export any data that has been queued up but not yet exported.
75- return CompletableResultCode .ofSuccess ();
76- }
77-
78- @ Override
79- public CompletableResultCode shutdown () {
80- // Shut down the exporter and clean up any resources.
81- return CompletableResultCode .ofSuccess ();
82- }
83- }
38+ private static final Logger log =
39+ Logger .getLogger (EnableOpenTelemetryTracingWithParentSpan .class .getName ());
8440
8541 public static void main (String [] args ) {
86- // TODO(developer): Replace Tracer name
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.
8747 final String tracerName = "Sample Tracer" ;
88- enableOpenTelemetryWithParentSpan ( tracerName ) ;
89- }
48+ final String parentSpanName = "Sample Parent Span" ;
49+ final String datasetId = "sampleDatasetId" ;
9050
91- public static void enableOpenTelemetryWithParentSpan (String tracerName ) {
92- // Create TracerProvider using the custom SpanExporter.
51+ // Create TracerProvider that exports to a logger.
9352 SdkTracerProvider tracerProvider =
9453 SdkTracerProvider .builder ()
95- .addSpanProcessor (SimpleSpanProcessor .create (new SampleSpanExporter () ))
54+ .addSpanProcessor (SimpleSpanProcessor .builder ( LoggingSpanExporter . create ()). build ( ))
9655 .setSampler (Sampler .alwaysOn ())
9756 .build ();
9857
99- // Create global OpenTelemetry instance using the TracerProvider.
100- OpenTelemetry otel =
101- OpenTelemetrySdk .builder ().setTracerProvider (tracerProvider ).build ();
58+ // Create OpenTelemetry instance using the TracerProvider.
59+ OpenTelemetry otel = OpenTelemetrySdk .builder ().setTracerProvider (tracerProvider ).build ();
10260
10361 // Create Tracer instance from the global OpenTelemetry object. Tracers are used to create
10462 // Spans. There can be multiple Tracers in a global OpenTelemetry instance.
10563 final Tracer tracer = otel .getTracer (tracerName );
64+ enableOpenTelemetryWithParentSpan (tracer , parentSpanName , datasetId );
65+ }
10666
67+ public static void enableOpenTelemetryWithParentSpan (
68+ Tracer tracer , String parentSpanName , String datasetId ) {
10769 // Create BigQuery client to trace. EnableOpenTelemetryTracing and OpenTelemetryTracer must
10870 // be set to enable tracing.
10971 BigQueryOptions otelOptions =
@@ -113,19 +75,15 @@ public static void enableOpenTelemetryWithParentSpan(String tracerName) {
11375 .build ();
11476 BigQuery bigquery = otelOptions .getService ();
11577
116- // TODO(developer): Replace Span and attribute names.
117- final String parentSpanName = "Sample Parent Span" ;
118- final String attributeKey = "sample-parent-attribute" ;
119- final String attributeValue = "sample-parent-value" ;
120- final String datasetId = "sampleDatasetId" ;
78+ LocalDate currentDate = LocalDate .now ();
12179
12280 // Create the root parent Span. setNoParent() ensures that it is a parent Span with a Span ID
12381 // of 0.
12482 Span parentSpan =
12583 tracer
12684 .spanBuilder (parentSpanName )
12785 .setNoParent ()
128- .setAttribute (attributeKey , attributeValue )
86+ .setAttribute ("current_date" , currentDate . toString () )
12987 .startSpan ();
13088
13189 // The Span Context is automatically passed on to any functions called within the scope of the
@@ -137,26 +95,6 @@ public static void enableOpenTelemetryWithParentSpan(String tracerName) {
13795 } finally {
13896 // finally block ensures that Spans are cleaned up properly.
13997 parentSpan .end ();
140-
141- // Unpack attribute maps to get attribute keys and values.
142- Map <AttributeKey <?>, Object > parentSpanAttributes = OTEL_ATTRIBUTES .get (parentSpanName );
143- Object parentSpanAttributeValue =
144- parentSpanAttributes .get (AttributeKey .stringKey (attributeKey ));
145- if (parentSpanAttributeValue == attributeValue ) {
146- System .out .println ("Parent Span was captured!" );
147- } else {
148- System .out .println ("Parent Span was not captured!" );
149- }
150-
151- String childSpanParentId =
152- OTEL_PARENT_SPAN_IDS .get ("com.google.cloud.bigquery.BigQuery.createDataset" );
153- String parentSpanId = OTEL_SPAN_IDS_TO_NAMES .get (childSpanParentId );
154- if (OTEL_SPAN_IDS_TO_NAMES .get (childSpanParentId ) == parentSpanName ) {
155- System .out .println ("createDataset is the child of Sample Parent Span!" );
156- } else {
157- System .out .println ("createDataset is not the child of Parent!" );
158- }
159-
16098 bigquery .delete (datasetId );
16199 }
162100 }
0 commit comments