Skip to content

Commit bbde7a0

Browse files
authored
Update for changes/deprecations in release 0.16.0 of opentelemetry (#10)
* WIP on updating to 0.15.0 otel * Finish work on updating for the 0.15.0 opentelemetry-java release * remove some debug lines * remove an unused parameter * code building against 0.16.0, async test failures to investigate * get all the tests passing * remove the no longer needed setting and re-setting of the global
1 parent 391ca5d commit bbde7a0

File tree

21 files changed

+197
-162
lines changed

21 files changed

+197
-162
lines changed

pom.xml

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@
6767
<spring-cloud-netflix.version>3.0.0</spring-cloud-netflix.version>
6868
<spring-cloud-openfeign.version>3.0.0</spring-cloud-openfeign.version>
6969
<opentracing.version>0.32.0</opentracing.version>
70-
<opentelemetry.version>0.14.1</opentelemetry.version>
71-
<!-- From maven local -->
72-
<opentelemetry-instrumentation.version>0.14.0</opentelemetry-instrumentation.version>
70+
<opentelemetry.version>0.16.0</opentelemetry.version>
71+
<opentelemetry.alpha.version>0.16.0-alpha</opentelemetry.alpha.version>
72+
<opentelemetry-instrumentation.version>0.16.0</opentelemetry-instrumentation.version>
7373
<spring-security-boot-autoconfigure.version>2.3.4.RELEASE</spring-security-boot-autoconfigure.version>
7474
<disable.nohttp.checks>false</disable.nohttp.checks>
7575
<okhttp.version>4.9.0</okhttp.version>
@@ -240,6 +240,13 @@
240240
<type>pom</type>
241241
<scope>import</scope>
242242
</dependency>
243+
<dependency>
244+
<groupId>io.opentelemetry</groupId>
245+
<artifactId>opentelemetry-bom-alpha</artifactId>
246+
<version>${opentelemetry.alpha.version}</version>
247+
<type>pom</type>
248+
<scope>import</scope>
249+
</dependency>
243250
<dependency>
244251
<groupId>org.springframework.security.oauth.boot</groupId>
245252
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
@@ -300,20 +307,14 @@
300307

301308
<repositories>
302309
<repository>
303-
<snapshots>
310+
<id>open-telemetry-maven-central-snapshots</id>
311+
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
312+
<releases>
304313
<enabled>false</enabled>
305-
</snapshots>
306-
<id>bintray-open-telemetry-maven</id>
307-
<name>bintray</name>
308-
<url>https://dl.bintray.com/open-telemetry/maven</url>
309-
</repository>
310-
<repository>
314+
</releases>
311315
<snapshots>
312316
<enabled>true</enabled>
313317
</snapshots>
314-
<id>bintray-open-telemetry-maven-snapshot</id>
315-
<name>bintray</name>
316-
<url>https://oss.jfrog.org/oss-snapshot-local/</url>
317318
</repository>
318319
</repositories>
319320
<pluginRepositories>

spring-cloud-sleuth-otel-autoconfigure/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,16 @@
122122
</exclusion>
123123
</exclusions>
124124
</dependency>
125+
<dependency>
126+
<groupId>io.opentelemetry</groupId>
127+
<artifactId>opentelemetry-sdk</artifactId>
128+
<exclusions>
129+
<exclusion>
130+
<groupId>io.opentelemetry</groupId>
131+
<artifactId>*</artifactId>
132+
</exclusion>
133+
</exclusions>
134+
</dependency>
125135
<dependency>
126136
<groupId>io.opentelemetry.instrumentation</groupId>
127137
<artifactId>opentelemetry-instrumentation-api</artifactId>

spring-cloud-sleuth-otel-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,21 @@
2020
import java.util.List;
2121
import java.util.stream.Collectors;
2222

23-
import io.opentelemetry.api.DefaultOpenTelemetry;
24-
import io.opentelemetry.api.GlobalOpenTelemetry;
2523
import io.opentelemetry.api.OpenTelemetry;
24+
import io.opentelemetry.api.common.Attributes;
2625
import io.opentelemetry.api.trace.Tracer;
2726
import io.opentelemetry.api.trace.TracerProvider;
2827
import io.opentelemetry.context.propagation.ContextPropagators;
28+
import io.opentelemetry.sdk.OpenTelemetrySdk;
29+
import io.opentelemetry.sdk.resources.Resource;
2930
import io.opentelemetry.sdk.trace.SdkTracerProvider;
31+
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
32+
import io.opentelemetry.sdk.trace.SpanLimits;
3033
import io.opentelemetry.sdk.trace.SpanProcessor;
31-
import io.opentelemetry.sdk.trace.config.TraceConfig;
3234
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
3335
import io.opentelemetry.sdk.trace.export.SpanExporter;
3436
import io.opentelemetry.sdk.trace.samplers.Sampler;
35-
import io.opentelemetry.sdk.trace.spi.SdkTracerProviderFactory;
36-
import io.opentelemetry.spi.trace.TracerProviderFactory;
37+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
3738

3839
import org.springframework.beans.factory.ObjectProvider;
3940
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
@@ -52,12 +53,14 @@
5253
import org.springframework.context.annotation.Bean;
5354
import org.springframework.context.annotation.Configuration;
5455
import org.springframework.context.annotation.Import;
56+
import org.springframework.core.env.Environment;
5557

5658
/**
5759
* {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
5860
* Auto-configuration} to enable tracing via Spring Cloud Sleuth and OpenTelemetry SDK.
5961
*
6062
* @author Marcin Grzejszczak
63+
* @author John Watson
6164
* @since 3.0.0
6265
*/
6366
@Configuration(proxyBeanMethods = false)
@@ -67,7 +70,7 @@
6770
@ConditionalOnMissingBean(org.springframework.cloud.sleuth.Tracer.class)
6871
@EnableConfigurationProperties({ OtelProperties.class, SleuthSpanFilterProperties.class, SleuthBaggageProperties.class,
6972
SleuthTracerProperties.class })
70-
@Import({ OtelBridgeConfiguation.class, OtelPropagationConfiguration.class, TraceConfiguration.class,
73+
@Import({ OtelBridgeConfiguration.class, OtelPropagationConfiguration.class, TraceConfiguration.class,
7174
SleuthAnnotationConfiguration.class })
7275
// Autoconfigurations in the instrumentation module are set to be configured before
7376
// BraveAutoConfiguration
@@ -76,49 +79,54 @@ public class OtelAutoConfiguration {
7679

7780
@Bean
7881
@ConditionalOnMissingBean
79-
OpenTelemetry otel(TracerProvider tracerProvider, ContextPropagators contextPropagators) {
80-
OpenTelemetry openTelemetry = DefaultOpenTelemetry.builder().setTracerProvider(tracerProvider)
81-
.setPropagators(contextPropagators).build();
82-
GlobalOpenTelemetry.set(openTelemetry);
83-
return openTelemetry;
82+
OpenTelemetry otel(SdkTracerProvider tracerProvider, ContextPropagators contextPropagators) {
83+
return OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).setPropagators(contextPropagators).build();
8484
}
8585

8686
@Bean
8787
@ConditionalOnMissingBean
88-
TracerProviderFactory otelTracerProviderFactory() {
89-
return new SdkTracerProviderFactory();
88+
SdkTracerProvider otelTracerProvider(SpanLimits spanLimits, ObjectProvider<List<SpanProcessor>> spanProcessors,
89+
SpanExporterCustomizer spanExporterCustomizer, ObjectProvider<List<SpanExporter>> spanExporters,
90+
Sampler sampler, Resource resource) {
91+
SdkTracerProviderBuilder sdkTracerProviderBuilder = SdkTracerProvider.builder().setResource(resource)
92+
.setSampler(sampler).setSpanLimits(spanLimits);
93+
List<SpanProcessor> processors = spanProcessors.getIfAvailable(ArrayList::new);
94+
processors.addAll(spanExporters.getIfAvailable(ArrayList::new).stream()
95+
.map(e -> SimpleSpanProcessor.create(spanExporterCustomizer.customize(e)))
96+
.collect(Collectors.toList()));
97+
processors.forEach(sdkTracerProviderBuilder::addSpanProcessor);
98+
return sdkTracerProviderBuilder.build();
9099
}
91100

92101
@Bean
93102
@ConditionalOnMissingBean
94-
TracerProvider otelTracerProvider(TracerProviderFactory tracerProviderFactory) {
95-
return tracerProviderFactory.create();
103+
Resource otelResource(Environment env) {
104+
// todo: populate the resource with the right stuff (service.name, etc)
105+
// this was the code in the zipkin exporter configuration previously:
106+
// env.getProperty("spring.application.name", env.getProperty(
107+
// "spring.zipkin.service.name", ZipkinSpanExporter.DEFAULT_SERVICE_NAME)
108+
String applicationName = env.getProperty("spring.application.name");
109+
if (applicationName == null) {
110+
return Resource.getDefault();
111+
}
112+
return Resource.getDefault()
113+
.merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName)));
96114
}
97115

98116
@Bean
99117
@ConditionalOnMissingBean
100-
TraceConfig otelTracerConfig(OtelProperties otelProperties, Sampler sampler) {
101-
return TraceConfig.getDefault().toBuilder().setMaxLengthOfAttributeValues(otelProperties.getMaxAttrLength())
118+
SpanLimits otelSpanLimits(OtelProperties otelProperties) {
119+
return SpanLimits.getDefault().toBuilder().setMaxLengthOfAttributeValues(otelProperties.getMaxAttrLength())
102120
.setMaxNumberOfAttributes(otelProperties.getMaxAttrs())
103121
.setMaxNumberOfAttributesPerEvent(otelProperties.getMaxEventAttrs())
104122
.setMaxNumberOfAttributesPerLink(otelProperties.getMaxLinkAttrs())
105123
.setMaxNumberOfEvents(otelProperties.getMaxEvents()).setMaxNumberOfLinks(otelProperties.getMaxLinks())
106-
.setSampler(sampler).build();
124+
.build();
107125
}
108126

109127
@Bean
110128
@ConditionalOnMissingBean
111-
Tracer otelTracer(TracerProvider tracerProvider, ObjectProvider<SdkTracerProvider> tracerSdkObjectProvider,
112-
TraceConfig traceConfig, OtelProperties otelProperties, ObjectProvider<List<SpanProcessor>> spanProcessors,
113-
ObjectProvider<List<SpanExporter>> spanExporters, SpanExporterCustomizer spanExporterCustomizer) {
114-
tracerSdkObjectProvider.ifAvailable(tracerSdkProvider -> {
115-
List<SpanProcessor> processors = spanProcessors.getIfAvailable(ArrayList::new);
116-
processors.addAll(spanExporters.getIfAvailable(ArrayList::new).stream()
117-
.map(e -> SimpleSpanProcessor.builder(spanExporterCustomizer.customize(e)).build())
118-
.collect(Collectors.toList()));
119-
processors.forEach(tracerSdkProvider::addSpanProcessor);
120-
tracerSdkProvider.updateActiveTraceConfig(traceConfig);
121-
});
129+
Tracer otelTracer(TracerProvider tracerProvider, OtelProperties otelProperties) {
122130
return tracerProvider.get(otelProperties.getInstrumentationName());
123131
}
124132

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
@Configuration(proxyBeanMethods = false)
7070
@ConditionalOnClass(OpenTelemetry.class)
7171
@Import({ OtelLogConfiguration.class, OtelExporterConfiguration.class })
72-
class OtelBridgeConfiguation {
72+
class OtelBridgeConfiguration {
7373

7474
@Bean
7575
Tracer otelTracerBridge(io.opentelemetry.api.trace.Tracer tracer, ApplicationEventPublisher publisher,
@@ -109,20 +109,20 @@ SpanExporterCustomizer noOpSleuthSpanFilterConverter() {
109109
static class TraceOtelHttpBridgeConfiguration {
110110

111111
@Bean
112-
HttpClientHandler otelHttpClientHandler(io.opentelemetry.api.trace.Tracer tracer,
112+
HttpClientHandler otelHttpClientHandler(io.opentelemetry.api.OpenTelemetry openTelemetry,
113113
@Nullable @HttpClientRequestParser HttpRequestParser httpClientRequestParser,
114114
@Nullable @HttpClientResponseParser HttpResponseParser httpClientResponseParser,
115115
SamplerFunction<HttpRequest> samplerFunction) {
116-
return new OtelHttpClientHandler(tracer, httpClientRequestParser, httpClientResponseParser,
116+
return new OtelHttpClientHandler(openTelemetry, httpClientRequestParser, httpClientResponseParser,
117117
samplerFunction);
118118
}
119119

120120
@Bean
121-
HttpServerHandler otelHttpServerHandler(io.opentelemetry.api.trace.Tracer tracer,
121+
HttpServerHandler otelHttpServerHandler(io.opentelemetry.api.OpenTelemetry openTelemetry,
122122
@Nullable @HttpServerRequestParser HttpRequestParser httpServerRequestParser,
123123
@Nullable @HttpServerResponseParser HttpResponseParser httpServerResponseParser,
124124
ObjectProvider<SkipPatternProvider> skipPatternProvider) {
125-
return new OtelHttpServerHandler(tracer, httpServerRequestParser, httpServerResponseParser,
125+
return new OtelHttpServerHandler(openTelemetry, httpServerRequestParser, httpServerResponseParser,
126126
skipPatternProvider.getIfAvailable(() -> () -> Pattern.compile("")));
127127
}
128128

spring-cloud-sleuth-otel-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelProperties.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.springframework.cloud.sleuth.autoconfig.otel;
1818

1919
import io.opentelemetry.api.trace.Span;
20-
import io.opentelemetry.sdk.trace.config.TraceConfig;
20+
import io.opentelemetry.sdk.trace.SpanLimits;
2121

2222
import org.springframework.boot.context.properties.ConfigurationProperties;
2323

@@ -48,32 +48,32 @@ public class OtelProperties {
4848
/**
4949
* Returns the global default max number of attributes per {@link Span}.
5050
*/
51-
private int maxAttrs = TraceConfig.getDefault().getMaxNumberOfAttributes();
51+
private int maxAttrs = SpanLimits.getDefault().getMaxNumberOfAttributes();
5252

5353
/**
5454
* Returns the global default max number of events per {@link Span}.
5555
*/
56-
private int maxEvents = TraceConfig.getDefault().getMaxNumberOfEvents();
56+
private int maxEvents = SpanLimits.getDefault().getMaxNumberOfEvents();
5757

5858
/**
5959
* Returns the global default max number of link entries per {@link Span}.
6060
*/
61-
private int maxLinks = TraceConfig.getDefault().getMaxNumberOfLinks();
61+
private int maxLinks = SpanLimits.getDefault().getMaxNumberOfLinks();
6262

6363
/**
6464
* Returns the global default max number of attributes per event.
6565
*/
66-
private int maxEventAttrs = TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent();
66+
private int maxEventAttrs = SpanLimits.getDefault().getMaxNumberOfAttributesPerEvent();
6767

6868
/**
6969
* Returns the global default max number of attributes per link.
7070
*/
71-
private int maxLinkAttrs = TraceConfig.getDefault().getMaxNumberOfAttributesPerLink();
71+
private int maxLinkAttrs = SpanLimits.getDefault().getMaxNumberOfAttributesPerLink();
7272

7373
/**
7474
* Returns the global default max length of string attribute value in characters.
7575
*/
76-
private int maxAttrLength = TraceConfig.getDefault().getMaxLengthOfAttributeValues();
76+
private int maxAttrLength = SpanLimits.getDefault().getMaxLengthOfAttributeValues();
7777

7878
public String getInstrumentationName() {
7979
return this.instrumentationName;

spring-cloud-sleuth-otel-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/zipkin2/ZipkinOtelAutoConfiguration.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.context.annotation.Configuration;
3535
import org.springframework.core.env.Environment;
36-
import org.springframework.util.StringUtils;
3736
import org.springframework.web.client.RestTemplate;
3837

3938
/**
@@ -65,13 +64,7 @@ static class ZipkinConfiguration {
6564
ZipkinSpanExporter otelZipkinSpanExporter(ZipkinProperties zipkinProperties,
6665
@Qualifier(ZipkinAutoConfiguration.SENDER_BEAN_NAME) Sender sender, Environment env) {
6766
return ZipkinSpanExporter.builder().setEndpoint(zipkinProperties.getBaseUrl() + "api/v2/spans")
68-
.setSender(sender).setEncoder(zipkinProperties.getEncoder())
69-
.setServiceName(
70-
StringUtils.hasText(zipkinProperties.getService().getName())
71-
? zipkinProperties.getService().getName()
72-
: env.getProperty("spring.application.name", env.getProperty(
73-
"spring.zipkin.service.name", ZipkinSpanExporter.DEFAULT_SERVICE_NAME)))
74-
.build();
67+
.setSender(sender).setEncoder(zipkinProperties.getEncoder()).build();
7568
}
7669

7770
}

spring-cloud-sleuth-otel-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfigurationTests.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,8 @@ public String get(@Nullable Map<String, String> carrier, String key) {
114114
}
115115
});
116116
Span spanFromContext = Span.fromContext(extract);
117-
assertThat(spanFromContext.getSpanContext().getTraceIdAsHexString())
118-
.isEqualTo("ff000000000000000000000000000041");
119-
assertThat(spanFromContext.getSpanContext().getSpanIdAsHexString()).isEqualTo("ff00000000000041");
117+
assertThat(spanFromContext.getSpanContext().getTraceId()).isEqualTo("ff000000000000000000000000000041");
118+
assertThat(spanFromContext.getSpanContext().getSpanId()).isEqualTo("ff00000000000041");
120119

121120
// Injection
122121
Map<String, String> emptyMap = new HashMap<>();
@@ -165,8 +164,8 @@ public <C> void inject(Context context, C carrier, Setter<C> setter) {
165164
if (!spanContext.isValid()) {
166165
return;
167166
}
168-
setter.set(carrier, "myCustomTraceId", spanContext.getTraceIdAsHexString());
169-
setter.set(carrier, "myCustomSpanId", spanContext.getSpanIdAsHexString());
167+
setter.set(carrier, "myCustomTraceId", spanContext.getTraceId());
168+
setter.set(carrier, "myCustomSpanId", spanContext.getSpanId());
170169
}
171170

172171
@Override

spring-cloud-sleuth-otel-dependencies/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<name>spring-cloud-sleuth-otel-dependencies</name>
3232
<description>Spring Cloud Sleuth OTel Dependencies</description>
3333
<properties>
34-
<opentelemetry.version>0.14.1</opentelemetry.version>
34+
<opentelemetry.version>0.16.0</opentelemetry.version>
3535
</properties>
3636
<dependencyManagement>
3737
<dependencies>

spring-cloud-sleuth-otel/pom.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@
5454
<groupId>io.opentelemetry</groupId>
5555
<artifactId>opentelemetry-api</artifactId>
5656
</dependency>
57+
<dependency>
58+
<groupId>io.opentelemetry</groupId>
59+
<artifactId>opentelemetry-extension-aws</artifactId>
60+
</dependency>
5761
<dependency>
5862
<groupId>io.opentelemetry</groupId>
5963
<artifactId>opentelemetry-semconv</artifactId>
@@ -78,6 +82,16 @@
7882
</exclusion>
7983
</exclusions>
8084
</dependency>
85+
<dependency>
86+
<groupId>io.opentelemetry</groupId>
87+
<artifactId>opentelemetry-sdk</artifactId>
88+
<exclusions>
89+
<exclusion>
90+
<groupId>io.opentelemetry</groupId>
91+
<artifactId>*</artifactId>
92+
</exclusion>
93+
</exclusions>
94+
</dependency>
8195
<dependency>
8296
<groupId>io.opentelemetry.instrumentation</groupId>
8397
<artifactId>opentelemetry-instrumentation-api</artifactId>

spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageInScope.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ private BaggageInScope doSet(TraceContext context, String value) {
9191
OtelTraceContext ctx = (OtelTraceContext) context;
9292
Context storedCtx = ctx.context();
9393
Baggage fromContext = Baggage.fromContext(storedCtx);
94-
baggage = fromContext.toBuilder().setParent(current)
95-
.put(entry().getKey(), value, entry().getEntryMetadata()).build();
94+
baggage = fromContext.toBuilder().setParent(current).put(entry().getKey(), value, entry().getMetadata())
95+
.build();
9696
current = baggage.storeInContext(current);
9797
ctx.updateContext(current);
9898
}
9999
else {
100-
baggage = Baggage.builder().put(entry().getKey(), value, entry().getEntryMetadata()).build();
100+
baggage = Baggage.builder().put(entry().getKey(), value, entry().getMetadata()).build();
101101
}
102102
Context withBaggage = current.with(baggage);
103103
this.scope.set(withBaggage.makeCurrent());
@@ -106,7 +106,7 @@ private BaggageInScope doSet(TraceContext context, String value) {
106106
}
107107
this.publisher.publishEvent(new BaggageChanged(this, baggage, entry().getKey(), value));
108108
Entry previous = entry();
109-
this.entry.set(new Entry(previous.getKey(), value, previous.getEntryMetadata()));
109+
this.entry.set(new Entry(previous.getKey(), value, previous.getMetadata()));
110110
return this;
111111
}
112112

@@ -123,7 +123,7 @@ public BaggageInScope set(TraceContext traceContext, String value) {
123123
public BaggageInScope makeCurrent() {
124124
close();
125125
Entry entry = entry();
126-
Scope scope = Baggage.builder().put(entry.getKey(), entry.getValue(), entry.getEntryMetadata()).build()
126+
Scope scope = Baggage.builder().put(entry.getKey(), entry.getValue(), entry.getMetadata()).build()
127127
.makeCurrent();
128128
this.scope.set(scope);
129129
return this;

0 commit comments

Comments
 (0)