diff --git a/build.gradle b/build.gradle index 708d75f3..77735957 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id 'com.jfrog.artifactory' version '5.2.0' id 'org.sonarqube' version '5.0.0.4638' id 'io.spring.dependency-management' version '1.1.4' - id 'org.springframework.boot' version '3.2.3' + id 'org.springframework.boot' version '3.2.5' id 'ru.vyarus.quality' version '5.0.0' id 'com.srcclr.gradle' version '3.1.12' } @@ -22,7 +22,7 @@ project.ext { // Spring Boot 3.2.3 pulls in opentelemetry-bom 1.31.0. // We need >= 1.32.0 so that our HttpServerMetrics can use Meter.setExplicitBucketBoundariesAdvice: -ext['opentelemetry.version'] = '1.34.1' +ext['opentelemetry.version'] = '1.37.0' // If true, search local repository (~/.m2/repository/) first for dependencies. def useMavenLocal = false @@ -62,7 +62,7 @@ dependencies { // Google dependencies // use common bom - implementation platform('com.google.cloud:libraries-bom:26.35.0') + implementation platform('com.google.cloud:libraries-bom:26.38.0') implementation group: 'com.google.cloud', name: 'google-cloud-core' implementation group: 'com.google.cloud', name: 'google-cloud-pubsub' api group: 'com.google.guava', name: 'guava' @@ -73,7 +73,7 @@ dependencies { // Terra libraries implementation group: 'org.broadinstitute.dsde.workbench', name: 'sam-client_2.13', version: '0.1-0c4b377' - var stairwayVersion= '1.0.7-SNAPSHOT' + var stairwayVersion= '1.1.1-SNAPSHOT' api "bio.terra:stairway-gcp:${stairwayVersion}" implementation "bio.terra:stairway-azure:${stairwayVersion}" @@ -83,9 +83,9 @@ dependencies { implementation group: 'ch.qos.logback.contrib', name: 'logback-jackson', version: '0.1.5' // OpenTelemetry BOMs (opentelemetry-bom versioned by Spring dependency manager) - implementation platform('io.opentelemetry:opentelemetry-bom-alpha:1.34.1-alpha') - implementation platform('io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.0.0') - implementation platform('io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:2.0.0-alpha') + implementation platform('io.opentelemetry:opentelemetry-bom-alpha:1.37.0-alpha') + implementation platform('io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.3.0') + implementation platform('io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:2.3.0-alpha') // OpenTelemetry dependencies versioned by BOMs api 'io.opentelemetry:opentelemetry-api' implementation 'io.opentelemetry:opentelemetry-sdk' @@ -96,11 +96,14 @@ dependencies { implementation 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations' implementation 'io.opentelemetry.instrumentation:opentelemetry-spring-boot' implementation 'io.opentelemetry:opentelemetry-exporter-prometheus' - implementation 'io.opentelemetry:opentelemetry-extension-incubator' + implementation 'io.opentelemetry:opentelemetry-api-incubator' + implementation 'io.opentelemetry:opentelemetry-sdk-extension-autoconfigure' + implementation 'io.opentelemetry:opentelemetry-exporter-otlp' + implementation 'org.springframework.boot:spring-boot-autoconfigure' // Google cloud open telemetry exporters - implementation 'com.google.cloud.opentelemetry:exporter-trace:0.27.0' - implementation 'com.google.cloud.opentelemetry:exporter-metrics:0.27.0' + implementation 'com.google.cloud.opentelemetry:exporter-trace:0.28.0' + implementation 'com.google.cloud.opentelemetry:exporter-metrics:0.28.0' // Testing testImplementation 'org.springframework:spring-aspects' // for tracing in tests diff --git a/src/main/java/bio/terra/common/opentelemetry/HttpMetricsAdvice.java b/src/main/java/bio/terra/common/opentelemetry/HttpMetricsAdvice.java index e37e4edd..58b5a0f7 100644 --- a/src/main/java/bio/terra/common/opentelemetry/HttpMetricsAdvice.java +++ b/src/main/java/bio/terra/common/opentelemetry/HttpMetricsAdvice.java @@ -5,11 +5,11 @@ package bio.terra.common.opentelemetry; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import static java.util.Arrays.asList; +import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; -import io.opentelemetry.extension.incubator.metrics.ExtendedDoubleHistogramBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.internal.HttpAttributes; import io.opentelemetry.semconv.SemanticAttributes; import java.util.List; import java.util.stream.DoubleStream; @@ -54,7 +54,7 @@ static void applyClientDurationAdvice(DoubleHistogramBuilder builder) { asList( SemanticAttributes.HTTP_REQUEST_METHOD, SemanticAttributes.HTTP_RESPONSE_STATUS_CODE, - HttpAttributes.ERROR_TYPE, + ERROR_TYPE, SemanticAttributes.NETWORK_PROTOCOL_NAME, SemanticAttributes.NETWORK_PROTOCOL_VERSION, SemanticAttributes.SERVER_ADDRESS, @@ -71,7 +71,7 @@ static void applyServerDurationAdvice(DoubleHistogramBuilder builder) { SemanticAttributes.HTTP_ROUTE, SemanticAttributes.HTTP_REQUEST_METHOD, SemanticAttributes.HTTP_RESPONSE_STATUS_CODE, - HttpAttributes.ERROR_TYPE, + ERROR_TYPE, SemanticAttributes.NETWORK_PROTOCOL_NAME, SemanticAttributes.NETWORK_PROTOCOL_VERSION, SemanticAttributes.URL_SCHEME)); diff --git a/src/main/java/bio/terra/common/opentelemetry/OpenTelemetryConfig.java b/src/main/java/bio/terra/common/opentelemetry/OpenTelemetryConfig.java index 38c03397..c44d2a52 100644 --- a/src/main/java/bio/terra/common/opentelemetry/OpenTelemetryConfig.java +++ b/src/main/java/bio/terra/common/opentelemetry/OpenTelemetryConfig.java @@ -2,12 +2,9 @@ import bio.terra.common.tracing.ExcludingUrlSampler; import io.opentelemetry.instrumentation.spring.autoconfigure.EnableOpenTelemetry; +import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import io.opentelemetry.sdk.metrics.InstrumentSelector; -import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.View; -import io.opentelemetry.sdk.metrics.export.MetricReader; -import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.util.Optional; @@ -16,7 +13,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; import org.springframework.data.util.Pair; @Configuration @@ -26,39 +22,30 @@ public class OpenTelemetryConfig { public static final Set DEFAULT_EXCLUDED_URLS = Set.of("/status", "/version"); - /** - * Creates an OpenTelemetry {@link SdkMeterProvider} with all metrics readers and views in the - * spring context - */ + /** Customizes the OpenTelemetry SDK sampling and adds all views and span processors. */ @Bean - @Primary - public SdkMeterProvider terraMeterProvider( - Resource otelResource, - ObjectProvider metricReaders, - ObjectProvider> views) { - var sdkMeterProviderBuilder = SdkMeterProvider.builder().addResource(otelResource); - metricReaders.stream().forEach(sdkMeterProviderBuilder::registerMetricReader); - views.stream() - .forEach(pair -> sdkMeterProviderBuilder.registerView(pair.getFirst(), pair.getSecond())); - return sdkMeterProviderBuilder.build(); - } + public AutoConfigurationCustomizerProvider otelCustomizer( + TracingProperties tracingProperties, + ObjectProvider> views, + ObjectProvider spanProcessors) { + return customizer -> { + customizer.addMeterProviderCustomizer( + (builder, unused) -> { + views.stream().forEach(pair -> builder.registerView(pair.getFirst(), pair.getSecond())); + return builder; + }); - /** - * Creates an OpenTelemetry {@link SdkTracerProvider} with all span processors in the spring - * context - */ - @Bean - @Primary - public SdkTracerProvider terraTraceProvider( - Resource resource, - ObjectProvider spanProcessors, - TracingProperties tracingProperties) { - var tracerProviderBuilder = SdkTracerProvider.builder().setResource(resource); - spanProcessors.stream().forEach(tracerProviderBuilder::addSpanProcessor); - tracerProviderBuilder.setSampler( - new ExcludingUrlSampler( - Optional.ofNullable(tracingProperties.excludedUrls()).orElse(DEFAULT_EXCLUDED_URLS), - Sampler.parentBased(Sampler.traceIdRatioBased(tracingProperties.samplingRatio())))); - return tracerProviderBuilder.build(); + customizer.addTracerProviderCustomizer( + (builder, unused) -> { + spanProcessors.stream().forEach(builder::addSpanProcessor); + builder.setSampler( + new ExcludingUrlSampler( + Optional.ofNullable(tracingProperties.excludedUrls()) + .orElse(DEFAULT_EXCLUDED_URLS), + Sampler.parentBased( + Sampler.traceIdRatioBased(tracingProperties.samplingRatio())))); + return builder; + }); + }; } }