1616
1717package com .example .spanner ;
1818
19+ import com .google .auth .oauth2 .GoogleCredentials ;
1920import com .google .cloud .opentelemetry .trace .TraceConfiguration ;
2021import com .google .cloud .opentelemetry .trace .TraceExporter ;
2122import com .google .cloud .spanner .DatabaseClient ;
3233import io .opentelemetry .sdk .trace .export .BatchSpanProcessor ;
3334import io .opentelemetry .sdk .trace .export .SpanExporter ;
3435import io .opentelemetry .sdk .trace .samplers .Sampler ;
36+ import java .io .IOException ;
37+ import java .util .Collections ;
38+ import java .util .HashMap ;
39+ import java .util .List ;
40+ import java .util .Map ;
3541
36- /**
37- * This sample demonstrates how to configure OpenTelemetry and inject via Spanner Options.
38- */
42+ /** This sample demonstrates how to configure OpenTelemetry and inject via Spanner Options. */
3943public class OpenTelemetryUsage {
4044
4145 static SdkTracerProvider sdkTracerProvider ;
@@ -46,20 +50,20 @@ public class OpenTelemetryUsage {
4650 static String instanceId = "my-instance" ;
4751 static String databaseId = "my-database" ;
4852
49- // Replace these variables to use OTLP Exporter
50- static boolean useCloudTraceExporter = true ; // Replace to false for OTLP
51- static String otlpEndpoint = "http ://localhost:4317 " ; // Replace with your OTLP endpoint
53+ static boolean useCloudTraceExporter = false ; // Replace to true for Cloud Trace exporter
54+ static String otlpEndpoint =
55+ "https ://telemetry.googleapis.com " ; // Replace with your OTLP endpoint
5256
53- public static void main (String [] args ) {
57+ public static void main (String [] args ) throws IOException {
5458
5559 if (useCloudTraceExporter ) {
5660 spanner = getSpannerWithCloudTraceExporter ();
5761 } else {
5862 spanner = getSpannerWithOtlpExporter ();
5963 }
6064
61- DatabaseClient dbClient = spanner
62- .getDatabaseClient (DatabaseId .of (projectId , instanceId , databaseId ));
65+ DatabaseClient dbClient =
66+ spanner .getDatabaseClient (DatabaseId .of (projectId , instanceId , databaseId ));
6367
6468 try (ResultSet resultSet =
6569 dbClient
@@ -74,15 +78,37 @@ public static void main(String[] args) {
7478 sdkTracerProvider .forceFlush ();
7579 }
7680
77- public static Spanner getSpannerWithOtlpExporter () {
81+ public static Spanner getSpannerWithOtlpExporter () throws IOException {
7882 // [START spanner_opentelemetry_traces_otlp_usage]
79- Resource resource = Resource
80- .getDefault ().merge (Resource .builder ().put ("service.name" , "My App" ).build ());
81-
83+ Resource resource =
84+ Resource .getDefault ()
85+ .merge (
86+ Resource .builder ()
87+ .put ("service.name" , "My App" )
88+ .put ("gcp.project_id" , projectId )
89+ .build ());
90+
91+ GoogleCredentials credentials =
92+ GoogleCredentials .getApplicationDefault ()
93+ .createScoped (Collections .singleton ("https://www.googleapis.com/auth/trace.append" ));
8294 OtlpGrpcSpanExporter otlpGrpcSpanExporter =
83- OtlpGrpcSpanExporter
84- .builder ()
85- .setEndpoint (otlpEndpoint ) // Replace with your OTLP endpoint
95+ OtlpGrpcSpanExporter .builder ()
96+ .setEndpoint (otlpEndpoint )
97+ .setHeaders (
98+ () -> {
99+ try {
100+ credentials .refreshIfExpired ();
101+ Map <String , List <String >> metadata = credentials .getRequestMetadata ();
102+ Map <String , String > headers = new HashMap <>();
103+ if (metadata != null ) {
104+ metadata .forEach ((key , values ) -> headers .put (key , String .join ("," , values )));
105+ }
106+ return headers ;
107+ } catch (Exception e ) {
108+ // Handle error fetching credentials
109+ return Collections .emptyMap ();
110+ }
111+ }) // Replace with your OTLP endpoint
86112 .build ();
87113
88114 // Using a batch span processor
@@ -92,24 +118,23 @@ public static Spanner getSpannerWithOtlpExporter() {
92118 BatchSpanProcessor .builder (otlpGrpcSpanExporter ).build ();
93119
94120 // Create a new tracer provider
95- sdkTracerProvider = SdkTracerProvider .builder ()
96- // Use Otlp exporter or any other exporter of your choice.
97- .addSpanProcessor (otlpGrpcSpanProcessor )
98- .setResource (resource )
99- .setSampler (Sampler .traceIdRatioBased (0.1 ))
100- .build ();
121+ sdkTracerProvider =
122+ SdkTracerProvider .builder ()
123+ // Use Otlp exporter or any other exporter of your choice.
124+ .addSpanProcessor (otlpGrpcSpanProcessor )
125+ .setResource (resource )
126+ .setSampler (Sampler .traceIdRatioBased (0.1 ))
127+ .build ();
101128
102129 // Export to a collector that is expecting OTLP using gRPC.
103- OpenTelemetry openTelemetry = OpenTelemetrySdk . builder ()
104- .setTracerProvider (sdkTracerProvider ).build ();
130+ OpenTelemetry openTelemetry =
131+ OpenTelemetrySdk . builder () .setTracerProvider (sdkTracerProvider ).build ();
105132
106133 // Enable OpenTelemetry traces before Injecting OpenTelemetry
107134 SpannerOptions .enableOpenTelemetryTraces ();
108135
109136 // Inject OpenTelemetry object via Spanner options or register as GlobalOpenTelemetry.
110- SpannerOptions options = SpannerOptions .newBuilder ()
111- .setOpenTelemetry (openTelemetry )
112- .build ();
137+ SpannerOptions options = SpannerOptions .newBuilder ().setOpenTelemetry (openTelemetry ).build ();
113138 Spanner spanner = options .getService ();
114139 // [END spanner_opentelemetry_traces_otlp_usage]
115140
@@ -118,40 +143,38 @@ public static Spanner getSpannerWithOtlpExporter() {
118143
119144 public static Spanner getSpannerWithCloudTraceExporter () {
120145 // [START spanner_opentelemetry_traces_cloudtrace_usage]
121- Resource resource = Resource
122- .getDefault ().merge (Resource .builder ().put ("service.name" , "My App" ).build ());
146+ Resource resource =
147+ Resource .getDefault ().merge (Resource .builder ().put ("service.name" , "My App" ).build ());
123148
124- SpanExporter traceExporter = TraceExporter . createWithConfiguration (
125- TraceConfiguration . builder (). setProjectId ( projectId ). build ()
126- );
149+ SpanExporter traceExporter =
150+ TraceExporter . createWithConfiguration (
151+ TraceConfiguration . builder (). setProjectId ( projectId ). build () );
127152
128153 // Using a batch span processor
129154 // You can use `.setScheduleDelay()`, `.setExporterTimeout()`,
130155 // `.setMaxQueueSize`(), and `.setMaxExportBatchSize()` to further customize.
131- BatchSpanProcessor otlpGrpcSpanProcessor =
132- BatchSpanProcessor .builder (traceExporter ).build ();
156+ BatchSpanProcessor otlpGrpcSpanProcessor = BatchSpanProcessor .builder (traceExporter ).build ();
133157
134158 // Create a new tracer provider
135- sdkTracerProvider = SdkTracerProvider .builder ()
136- // Use Otlp exporter or any other exporter of your choice.
137- .addSpanProcessor (otlpGrpcSpanProcessor )
138- .setResource (resource )
139- .setSampler (Sampler .traceIdRatioBased (0.1 ))
140- .build ();
159+ sdkTracerProvider =
160+ SdkTracerProvider .builder ()
161+ // Use Otlp exporter or any other exporter of your choice.
162+ .addSpanProcessor (otlpGrpcSpanProcessor )
163+ .setResource (resource )
164+ .setSampler (Sampler .traceIdRatioBased (0.1 ))
165+ .build ();
141166
142167 // Export to a collector that is expecting OTLP using gRPC.
143- OpenTelemetry openTelemetry = OpenTelemetrySdk . builder ()
144- .setTracerProvider (sdkTracerProvider ).build ();
168+ OpenTelemetry openTelemetry =
169+ OpenTelemetrySdk . builder () .setTracerProvider (sdkTracerProvider ).build ();
145170
146171 // Enable OpenTelemetry traces before Injecting OpenTelemetry
147172 SpannerOptions .enableOpenTelemetryTraces ();
148173
149174 // Inject OpenTelemetry object via Spanner options or register it as global object.
150175 // To register as the global OpenTelemetry object,
151176 // use "OpenTelemetrySdk.builder()....buildAndRegisterGlobal()".
152- SpannerOptions options = SpannerOptions .newBuilder ()
153- .setOpenTelemetry (openTelemetry )
154- .build ();
177+ SpannerOptions options = SpannerOptions .newBuilder ().setOpenTelemetry (openTelemetry ).build ();
155178 Spanner spanner = options .getService ();
156179 // [END spanner_opentelemetry_traces_cloudtrace_usage]
157180
0 commit comments