Skip to content

Commit fe5e51c

Browse files
committed
feat(spanner): Update OpenTelemetry OTLP trace sample to use Google Cloud OTLP endpoint
1 parent d70946d commit fe5e51c

1 file changed

Lines changed: 68 additions & 45 deletions

File tree

spanner/opentelemetry_traces/src/main/java/com/example/spanner/OpenTelemetryUsage.java

Lines changed: 68 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.example.spanner;
1818

19+
import com.google.auth.oauth2.GoogleCredentials;
1920
import com.google.cloud.opentelemetry.trace.TraceConfiguration;
2021
import com.google.cloud.opentelemetry.trace.TraceExporter;
2122
import com.google.cloud.spanner.DatabaseClient;
@@ -32,10 +33,13 @@
3233
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
3334
import io.opentelemetry.sdk.trace.export.SpanExporter;
3435
import 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. */
3943
public 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

Comments
 (0)