diff --git a/pom.xml b/pom.xml index eeb1b1755b..8ce2c2d239 100644 --- a/pom.xml +++ b/pom.xml @@ -73,7 +73,7 @@ 3.0.0-SNAPSHOT 5.12.7 0.32.0 - 0.10.0 + 0.11.0 0.10.1 2.3.4.RELEASE diff --git a/spring-cloud-sleuth-autoconfigure/pom.xml b/spring-cloud-sleuth-autoconfigure/pom.xml index 52876f5ff2..870c257665 100644 --- a/spring-cloud-sleuth-autoconfigure/pom.xml +++ b/spring-cloud-sleuth-autoconfigure/pom.xml @@ -351,17 +351,6 @@ - - io.opentelemetry - opentelemetry-extension-auto-annotations - true - - - io.opentelemetry - * - - - io.opentelemetry opentelemetry-exporter-logging diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java index 7bfff13646..89337e981d 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java @@ -22,10 +22,9 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.metrics.MeterProvider; -import io.opentelemetry.api.metrics.spi.MeterProviderFactory; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerProvider; -import io.opentelemetry.api.trace.spi.TracerProviderFactory; +import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.TracerSdkProvider; import io.opentelemetry.sdk.trace.config.TraceConfig; @@ -33,6 +32,8 @@ import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.spi.TracerProviderFactorySdk; +import io.opentelemetry.spi.metrics.MeterProviderFactory; +import io.opentelemetry.spi.trace.TracerProviderFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -44,6 +45,7 @@ import org.springframework.cloud.sleuth.autoconfig.SleuthSpanFilterProperties; import org.springframework.cloud.sleuth.autoconfig.SleuthTracerProperties; import org.springframework.cloud.sleuth.autoconfig.TraceConfiguration; +import org.springframework.cloud.sleuth.otel.bridge.OtelOpenTelemetry; import org.springframework.cloud.sleuth.otel.bridge.SpanExporterCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -67,6 +69,17 @@ SleuthAnnotationConfiguration.class }) public class OtelAutoConfiguration { + @Bean + @ConditionalOnMissingBean + OpenTelemetry otel(TracerProviderFactory tracerProviderFactory, MeterProviderFactory meterProviderFactory, + TracerProvider tracerProvider, MeterProvider meterProvider, ContextPropagators contextPropagators) { + OtelOpenTelemetry otelOpenTelemetry = new OtelOpenTelemetry(tracerProviderFactory, meterProviderFactory, + tracerProvider, meterProvider, contextPropagators); + OpenTelemetry.set(otelOpenTelemetry); + OpenTelemetry.setGlobalPropagators(contextPropagators); + return otelOpenTelemetry; + } + @Bean @ConditionalOnMissingBean TracerProviderFactory otelTracerProviderFactory() { diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelBridgeConfiguation.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelBridgeConfiguation.java index b02f72e0b5..1b67b902c7 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelBridgeConfiguation.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelBridgeConfiguation.java @@ -19,10 +19,6 @@ import java.util.regex.Pattern; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.metrics.MeterProvider; -import io.opentelemetry.api.metrics.spi.MeterProviderFactory; -import io.opentelemetry.api.trace.TracerProvider; -import io.opentelemetry.api.trace.spi.TracerProviderFactory; import io.opentelemetry.context.propagation.ContextPropagators; import org.springframework.beans.factory.ObjectProvider; @@ -51,7 +47,6 @@ import org.springframework.cloud.sleuth.otel.bridge.OtelCurrentTraceContext; import org.springframework.cloud.sleuth.otel.bridge.OtelHttpClientHandler; import org.springframework.cloud.sleuth.otel.bridge.OtelHttpServerHandler; -import org.springframework.cloud.sleuth.otel.bridge.OtelOpenTelemetry; import org.springframework.cloud.sleuth.otel.bridge.OtelPropagator; import org.springframework.cloud.sleuth.otel.bridge.OtelSpanCustomizer; import org.springframework.cloud.sleuth.otel.bridge.OtelTracer; @@ -76,14 +71,6 @@ @Import({ OtelLogConfiguration.class, OtelExporterConfiguration.class }) class OtelBridgeConfiguation { - @Bean - @ConditionalOnMissingBean - OpenTelemetry otel(TracerProviderFactory tracerProviderFactory, MeterProviderFactory meterProviderFactory, - TracerProvider tracerProvider, MeterProvider meterProvider, ContextPropagators contextPropagators) { - return new OtelOpenTelemetry(tracerProviderFactory, meterProviderFactory, tracerProvider, meterProvider, - contextPropagators); - } - @Bean Tracer otelTracerBridge(io.opentelemetry.api.trace.Tracer tracer, ApplicationEventPublisher publisher, CurrentTraceContext currentTraceContext, SleuthBaggageProperties sleuthBaggageProperties) { diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfiguration.java index 40044d3fa6..70b5feb96c 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfiguration.java @@ -17,9 +17,12 @@ package org.springframework.cloud.sleuth.autoconfig.otel; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import io.opentelemetry.api.OpenTelemetry; +import javax.annotation.Nullable; + +import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.DefaultContextPropagators; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -58,12 +61,30 @@ class OtelPropagationConfiguration { ContextPropagators otelContextPropagators(ObjectProvider> propagators) { List mapPropagators = propagators.getIfAvailable(ArrayList::new); if (mapPropagators.isEmpty()) { - return OpenTelemetry.getGlobalPropagators(); + return noOpContextPropagator(); } DefaultContextPropagators.Builder builder = DefaultContextPropagators.builder(); mapPropagators.forEach(builder::addTextMapPropagator); - OpenTelemetry.setGlobalPropagators(builder.build()); - return OpenTelemetry.getGlobalPropagators(); + return builder.build(); + } + + private ContextPropagators noOpContextPropagator() { + return () -> new TextMapPropagator() { + @Override + public List fields() { + return Collections.emptyList(); + } + + @Override + public void inject(Context context, @Nullable C carrier, Setter setter) { + + } + + @Override + public Context extract(Context context, @Nullable C carrier, Getter getter) { + return context; + } + }; } @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-sleuth-dependencies/pom.xml b/spring-cloud-sleuth-dependencies/pom.xml index 367ddc4ae0..29493f72d9 100644 --- a/spring-cloud-sleuth-dependencies/pom.xml +++ b/spring-cloud-sleuth-dependencies/pom.xml @@ -34,7 +34,7 @@ 5.13.1 0.37.4 4.2.2 - 0.10.0 + 0.11.0 diff --git a/spring-cloud-sleuth-otel/pom.xml b/spring-cloud-sleuth-otel/pom.xml index 2d26d97247..01d8a26fd9 100644 --- a/spring-cloud-sleuth-otel/pom.xml +++ b/spring-cloud-sleuth-otel/pom.xml @@ -88,17 +88,6 @@ - - io.opentelemetry - opentelemetry-extension-auto-annotations - true - - - io.opentelemetry - * - - - io.opentelemetry opentelemetry-exporter-logging diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java index 9bedfa046b..913b4869fd 100644 --- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java +++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java @@ -27,6 +27,7 @@ import java.util.Objects; import io.opentelemetry.api.baggage.Baggage; +import io.opentelemetry.api.baggage.BaggageBuilder; import io.opentelemetry.api.baggage.BaggageConsumer; import io.opentelemetry.api.baggage.EntryMetadata; import io.opentelemetry.context.Context; @@ -205,7 +206,7 @@ public String getEntryValue(String entryKey) { } @Override - public Builder toBuilder() { + public BaggageBuilder toBuilder() { return Baggage.builder(); } diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelOpenTelemetry.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelOpenTelemetry.java index 7dec15954e..fdbf48ca9a 100644 --- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelOpenTelemetry.java +++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelOpenTelemetry.java @@ -20,10 +20,10 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.metrics.MeterProvider; -import io.opentelemetry.api.metrics.spi.MeterProviderFactory; import io.opentelemetry.api.trace.TracerProvider; -import io.opentelemetry.api.trace.spi.TracerProviderFactory; import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.spi.metrics.MeterProviderFactory; +import io.opentelemetry.spi.trace.TracerProviderFactory; /** * Sleuth implementation of a {@link OpenTelemetry}. @@ -68,11 +68,11 @@ public ContextPropagators getPropagators() { } @Override - public io.opentelemetry.api.OpenTelemetry.Builder toBuilder() { + public io.opentelemetry.api.OpenTelemetryBuilder toBuilder() { return new Builder(this.meterProviderFactory, this.tracerProviderFactory); } - static class Builder implements io.opentelemetry.api.OpenTelemetry.Builder { + static class Builder implements io.opentelemetry.api.OpenTelemetryBuilder { private ContextPropagators propagators; diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java index 772b82c463..bbb68cb712 100644 --- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java +++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java @@ -16,7 +16,9 @@ package org.springframework.cloud.sleuth.otel.bridge; +import java.time.Instant; import java.util.Objects; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import io.opentelemetry.api.common.AttributeKey; @@ -187,7 +189,12 @@ public io.opentelemetry.api.trace.Span addEvent(String name) { } @Override - public io.opentelemetry.api.trace.Span addEvent(String name, long timestamp) { + public io.opentelemetry.api.trace.Span addEvent(String name, long timestamp, TimeUnit unit) { + return span.addEvent(name, timestamp, unit); + } + + @Override + public io.opentelemetry.api.trace.Span addEvent(String name, Instant timestamp) { return span.addEvent(name, timestamp); } @@ -197,7 +204,12 @@ public io.opentelemetry.api.trace.Span addEvent(String name, Attributes attribut } @Override - public io.opentelemetry.api.trace.Span addEvent(String name, Attributes attributes, long timestamp) { + public io.opentelemetry.api.trace.Span addEvent(String name, Attributes attributes, long timestamp, TimeUnit unit) { + return span.addEvent(name, attributes, timestamp, unit); + } + + @Override + public io.opentelemetry.api.trace.Span addEvent(String name, Attributes attributes, Instant timestamp) { return span.addEvent(name, attributes, timestamp); } @@ -242,8 +254,13 @@ public void end() { } @Override - public void end(long l) { - span.end(l); + public void end(long timestamp, TimeUnit unit) { + span.end(timestamp, unit); + } + + @Override + public void end(Instant timestamp) { + span.end(timestamp); } @Override @@ -256,6 +273,11 @@ public boolean isRecording() { return span.isRecording(); } + @Override + public Context storeInContext(Context context) { + return span.storeInContext(context); + } + @Override public String toString() { return "SpanFromSpanContext{" + "span=" + span + ", newSpanContext=" + newSpanContext + '}'; diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java index 277673cd47..c53be3e711 100644 --- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java +++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java @@ -31,7 +31,7 @@ */ class OtelSpanBuilder implements Span.Builder { - private final io.opentelemetry.api.trace.Span.Builder delegate; + private final io.opentelemetry.api.trace.SpanBuilder delegate; private final List annotations = new LinkedList<>(); @@ -39,11 +39,11 @@ class OtelSpanBuilder implements Span.Builder { private Throwable error; - OtelSpanBuilder(io.opentelemetry.api.trace.Span.Builder delegate) { + OtelSpanBuilder(io.opentelemetry.api.trace.SpanBuilder delegate) { this.delegate = delegate; } - static Span.Builder fromOtel(io.opentelemetry.api.trace.Span.Builder builder) { + static Span.Builder fromOtel(io.opentelemetry.api.trace.SpanBuilder builder) { return new OtelSpanBuilder(builder); } diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java index 96af07add1..eac7bdf322 100644 --- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java +++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import io.opentelemetry.api.baggage.Baggage; +import io.opentelemetry.api.baggage.BaggageBuilder; import io.opentelemetry.api.baggage.EntryMetadata; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -73,7 +74,7 @@ public Context extract(Context context, C c, Getter getter) { Map baggageEntries = this.remoteFields.stream() .map(s -> new AbstractMap.SimpleEntry<>(s, getter.get(c, s))).filter(e -> e.getValue() != null) .collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue())); - Baggage.Builder builder = Baggage.builder().setParent(context); + BaggageBuilder builder = Baggage.builder().setParent(context); // TODO: [OTEL] magic string baggageEntries.forEach((key, value) -> builder.put(key, value, EntryMetadata.create("propagation=unlimited"))); Baggage baggage = builder.build();