in src/main/java/com/google/cloud/spanner/pgadapter/Server.java [215:293]
static OpenTelemetry setupOpenTelemetry(OptionsMetadata optionsMetadata) {
if (!optionsMetadata.isEnableOpenTelemetry()
&& !optionsMetadata.isEnableOpenTelemetryMetrics()) {
return OpenTelemetry.noop();
}
if (getOpenTelemetrySetting("otel.traces.exporter") == null) {
System.setProperty("otel.traces.exporter", "none");
}
if (getOpenTelemetrySetting("otel.metrics.exporter") == null) {
System.setProperty("otel.metrics.exporter", "none");
}
if (getOpenTelemetrySetting("otel.logs.exporter") == null) {
System.setProperty("otel.logs.exporter", "none");
}
if (getOpenTelemetrySetting("otel.service.name") == null) {
System.setProperty("otel.service.name", "pgadapter-" + ThreadLocalRandom.current().nextInt());
}
String serviceName = Objects.requireNonNull(getOpenTelemetrySetting("otel.service.name"));
try {
String projectId = optionsMetadata.getTelemetryProjectId();
Credentials credentials = optionsMetadata.getTelemetryCredentials();
AutoConfiguredOpenTelemetrySdkBuilder openTelemetryBuilder =
AutoConfiguredOpenTelemetrySdk.builder();
if (optionsMetadata.isEnableOpenTelemetry()) {
TraceConfiguration.Builder builder =
TraceConfiguration.builder().setDeadline(Duration.ofSeconds(60L));
if (projectId != null) {
builder.setProjectId(projectId);
}
if (credentials != null) {
builder.setCredentials(credentials);
}
builder.setFixedAttributes(
ImmutableMap.of(
"service.name",
AttributeValue.newBuilder()
.setStringValue(TruncatableString.newBuilder().setValue(serviceName).build())
.build()));
TraceConfiguration configuration = builder.build();
SpanExporter traceExporter = TraceExporter.createWithConfiguration(configuration);
Sampler sampler;
if (optionsMetadata.getOpenTelemetryTraceRatio() == null) {
sampler = Sampler.parentBased(Sampler.traceIdRatioBased(0.05d));
} else {
sampler =
Sampler.parentBased(
Sampler.traceIdRatioBased(optionsMetadata.getOpenTelemetryTraceRatio()));
}
openTelemetryBuilder.addTracerProviderCustomizer(
(sdkTracerProviderBuilder, configProperties) ->
sdkTracerProviderBuilder
.setSampler(sampler)
.addSpanProcessor(BatchSpanProcessor.builder(traceExporter).build()));
}
if (optionsMetadata.isEnableOpenTelemetryMetrics()) {
MetricExporter cloudMonitoringExporter =
GoogleCloudMetricExporter.createWithConfiguration(
MetricConfiguration.builder()
// Configure the cloud project id.
.setProjectId(projectId)
// Set the credentials to use when writing to the Cloud Monitoring API
.setCredentials(credentials)
.build());
openTelemetryBuilder.addMeterProviderCustomizer(
(sdkMeterProviderBuilder, configProperties) ->
sdkMeterProviderBuilder
.addResource(
Resource.create(
Attributes.of(AttributeKey.stringKey("service.name"), serviceName)))
.registerMetricReader(
PeriodicMetricReader.builder(cloudMonitoringExporter).build()));
}
return openTelemetryBuilder.build().getOpenTelemetrySdk();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}