Skip to content

Commit 59a8b52

Browse files
Merge pull request #4 from spring-cloud-incubator/otel-upgrade-0.13
Otel upgrade 0.13
2 parents 2fe28f9 + 36dd4c9 commit 59a8b52

File tree

18 files changed

+104
-108
lines changed

18 files changed

+104
-108
lines changed

benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/TracerImplementation.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616

1717
package org.springframework.cloud.sleuth.benchmarks.jmh;
1818

19-
import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
20-
import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
21-
2219
public enum TracerImplementation {
2320

2421
otel;

pom.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@
6767
<spring-cloud-netflix.version>3.0.0-SNAPSHOT</spring-cloud-netflix.version>
6868
<spring-cloud-openfeign.version>3.0.0-SNAPSHOT</spring-cloud-openfeign.version>
6969
<opentracing.version>0.32.0</opentracing.version>
70-
<opentelemetry.version>0.11.0</opentelemetry.version>
70+
<opentelemetry.version>0.13.1</opentelemetry.version>
7171
<!-- From maven local -->
72-
<opentelemetry-instrumentation.version>0.11.0</opentelemetry-instrumentation.version>
72+
<opentelemetry-instrumentation.version>0.13.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>
@@ -87,6 +87,7 @@
8787
<hamcrest-core.version>2.2</hamcrest-core.version>
8888
<awaitility.version>4.0.3</awaitility.version>
8989
<archunit-junit5.version>0.14.1</archunit-junit5.version>
90+
<jsr305.version>3.0.2</jsr305.version>
9091
</properties>
9192

9293
<build>
@@ -289,6 +290,11 @@
289290
<artifactId>archunit-junit5</artifactId>
290291
<version>${archunit-junit5.version}</version>
291292
</dependency>
293+
<dependency>
294+
<groupId>com.google.code.findbugs</groupId>
295+
<artifactId>jsr305</artifactId>
296+
<version>${jsr305.version}</version>
297+
</dependency>
292298
</dependencies>
293299
</dependencyManagement>
294300

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
</dependency>
111111
<dependency>
112112
<groupId>io.opentelemetry</groupId>
113-
<artifactId>opentelemetry-sdk-tracing</artifactId>
113+
<artifactId>opentelemetry-sdk-trace</artifactId>
114114
<exclusions>
115115
<exclusion>
116116
<groupId>io.opentelemetry</groupId>
@@ -257,7 +257,11 @@
257257
<artifactId>archunit-junit5</artifactId>
258258
<scope>test</scope>
259259
</dependency>
260-
260+
<dependency>
261+
<groupId>com.google.code.findbugs</groupId>
262+
<artifactId>jsr305</artifactId>
263+
<scope>test</scope>
264+
</dependency>
261265
</dependencies>
262266

263267
<profiles>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import io.opentelemetry.api.trace.Tracer;
2626
import io.opentelemetry.api.trace.TracerProvider;
2727
import io.opentelemetry.context.propagation.ContextPropagators;
28+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
2829
import io.opentelemetry.sdk.trace.SpanProcessor;
29-
import io.opentelemetry.sdk.trace.TracerSdkProvider;
3030
import io.opentelemetry.sdk.trace.config.TraceConfig;
3131
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
3232
import io.opentelemetry.sdk.trace.export.SpanExporter;
@@ -123,7 +123,7 @@ TraceConfig otelTracerConfig(OtelProperties otelProperties, Sampler sampler) {
123123

124124
@Bean
125125
@ConditionalOnMissingBean
126-
Tracer otelTracer(TracerProvider tracerProvider, ObjectProvider<TracerSdkProvider> tracerSdkObjectProvider,
126+
Tracer otelTracer(TracerProvider tracerProvider, ObjectProvider<SdkTracerProvider> tracerSdkObjectProvider,
127127
TraceConfig traceConfig, OtelProperties otelProperties, ObjectProvider<List<SpanProcessor>> spanProcessors,
128128
ObjectProvider<List<SpanExporter>> spanExporters, SpanExporterCustomizer spanExporterCustomizer) {
129129
tracerSdkObjectProvider.ifAvailable(tracerSdkProvider -> {

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import io.opentelemetry.context.Context;
2424
import io.opentelemetry.context.propagation.ContextPropagators;
25-
import io.opentelemetry.context.propagation.DefaultContextPropagators;
2625
import io.opentelemetry.context.propagation.TextMapPropagator;
2726

2827
import org.springframework.beans.factory.BeanFactory;
@@ -62,9 +61,8 @@ ContextPropagators otelContextPropagators(ObjectProvider<List<TextMapPropagator>
6261
if (mapPropagators.isEmpty()) {
6362
return noOpContextPropagator();
6463
}
65-
DefaultContextPropagators.Builder builder = DefaultContextPropagators.builder();
66-
mapPropagators.forEach(builder::addTextMapPropagator);
67-
return builder.build();
64+
65+
return ContextPropagators.create(TextMapPropagator.composite(mapPropagators));
6866
}
6967

7068
private ContextPropagators noOpContextPropagator() {

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.11.0</opentelemetry.version>
34+
<opentelemetry.version>0.13.1</opentelemetry.version>
3535
</properties>
3636
<dependencyManagement>
3737
<dependencies>

spring-cloud-sleuth-otel/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
</dependency>
6767
<dependency>
6868
<groupId>io.opentelemetry</groupId>
69-
<artifactId>opentelemetry-sdk-tracing</artifactId>
69+
<artifactId>opentelemetry-sdk-trace</artifactId>
7070
<exclusions>
7171
<exclusion>
7272
<groupId>io.opentelemetry</groupId>

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

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
import io.opentelemetry.api.baggage.Baggage;
3030
import io.opentelemetry.api.baggage.BaggageBuilder;
3131
import io.opentelemetry.api.baggage.BaggageConsumer;
32-
import io.opentelemetry.api.baggage.EntryMetadata;
32+
import io.opentelemetry.api.baggage.BaggageEntry;
33+
import io.opentelemetry.api.baggage.BaggageEntryMetadata;
3334
import io.opentelemetry.context.Context;
3435

3536
import org.springframework.cloud.sleuth.BaggageInScope;
@@ -39,6 +40,11 @@
3940
import org.springframework.cloud.sleuth.Tracer;
4041
import org.springframework.context.ApplicationEventPublisher;
4142

43+
import static java.util.Collections.unmodifiableCollection;
44+
import static java.util.Collections.unmodifiableMap;
45+
import static java.util.function.Function.identity;
46+
import static java.util.stream.Collectors.toMap;
47+
4248
/**
4349
* OpenTelemetry implementation of a {@link BaggageManager}. Doesn't implement an
4450
* interface cause {@link Tracer} already implements it.
@@ -149,7 +155,7 @@ private BaggageInScope baggageWithValue(String name, String value) {
149155
List<String> remoteFieldsFields = this.remoteFields;
150156
boolean remoteField = remoteFieldsFields.stream().map(String::toLowerCase)
151157
.anyMatch(s -> s.equals(name.toLowerCase()));
152-
EntryMetadata entryMetadata = EntryMetadata.create(propagationString(remoteField));
158+
BaggageEntryMetadata entryMetadata = BaggageEntryMetadata.create(propagationString(remoteField));
153159
Entry entry = new Entry(name, value, entryMetadata);
154160
return new OtelBaggageInScope(this, this.currentTraceContext, this.publisher, this.tagFields, entry);
155161
}
@@ -167,28 +173,35 @@ private String propagationString(boolean remoteField) {
167173

168174
class CompositeBaggage implements io.opentelemetry.api.baggage.Baggage {
169175

170-
private final Deque<Context> stack;
171-
176+
// TODO: Try to use a Map of BaggageEntry only: delete the Entry class
177+
// (might need a bigger refactor)
172178
private final Collection<Entry> entries;
173179

180+
private final Map<String, BaggageEntry> baggageEntries;
181+
174182
CompositeBaggage(Deque<Context> stack) {
175-
this.stack = stack;
176-
this.entries = getEntries();
183+
this.entries = unmodifiableCollection(createEntries(stack));
184+
this.baggageEntries = unmodifiableMap(this.entries.stream().collect(toMap(Entry::getKey, identity())));
177185
}
178186

179-
Collection<Entry> getEntries() {
187+
private Collection<Entry> createEntries(Deque<Context> stack) {
180188
// parent baggage foo=bar
181189
// child baggage foo=baz - we want the last one to override the previous one
182190
Map<String, Entry> map = new HashMap<>();
183-
Iterator<Context> iterator = this.stack.descendingIterator();
191+
Iterator<Context> iterator = stack.descendingIterator();
184192
while (iterator.hasNext()) {
185193
Context next = iterator.next();
186194
Baggage baggage = Baggage.fromContext(next);
187195
baggage.forEach((key, value, metadata) -> map.put(key, new Entry(key, value, metadata)));
188196
}
197+
189198
return map.values();
190199
}
191200

201+
Collection<Entry> getEntries() {
202+
return this.entries;
203+
}
204+
192205
@Override
193206
public int size() {
194207
return this.entries.size();
@@ -199,6 +212,11 @@ public void forEach(BaggageConsumer consumer) {
199212
this.entries.forEach(entry -> consumer.accept(entry.getKey(), entry.getValue(), entry.getEntryMetadata()));
200213
}
201214

215+
@Override
216+
public Map<String, BaggageEntry> asMap() {
217+
return this.baggageEntries;
218+
}
219+
202220
@Override
203221
public String getEntryValue(String entryKey) {
204222
return this.entries.stream().filter(entry -> entryKey.equals(entry.getKey())).map(Entry::getValue).findFirst()
@@ -212,29 +230,31 @@ public BaggageBuilder toBuilder() {
212230

213231
}
214232

215-
class Entry {
233+
class Entry implements BaggageEntry {
216234

217235
final String key;
218236

219237
final String value;
220238

221-
final EntryMetadata entryMetadata;
239+
final BaggageEntryMetadata entryMetadata;
222240

223-
Entry(String key, String value, EntryMetadata entryMetadata) {
241+
Entry(String key, String value, BaggageEntryMetadata entryMetadata) {
224242
this.key = key;
225243
this.value = value;
226244
this.entryMetadata = entryMetadata;
227245
}
228246

229-
String getKey() {
247+
public String getKey() {
230248
return this.key;
231249
}
232250

233-
String getValue() {
251+
@Override
252+
public String getValue() {
234253
return this.value;
235254
}
236255

237-
EntryMetadata getEntryMetadata() {
256+
@Override
257+
public BaggageEntryMetadata getEntryMetadata() {
238258
return this.entryMetadata;
239259
}
240260

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.Map;
2323
import java.util.stream.Collectors;
2424

25-
import io.opentelemetry.api.common.AttributeConsumer;
2625
import io.opentelemetry.api.common.AttributeKey;
2726
import io.opentelemetry.api.common.Attributes;
2827
import io.opentelemetry.sdk.trace.data.SpanData;
@@ -68,13 +67,9 @@ public long getEndTimestamp() {
6867
@Override
6968
public Map<String, String> getTags() {
7069
if (this.tags.isEmpty()) {
71-
this.spanData.getAttributes().forEach(new AttributeConsumer() {
72-
@Override
73-
public <T> void accept(AttributeKey<T> key, T value) {
74-
tags.put(key.getKey(), String.valueOf(value));
75-
}
76-
});
70+
this.spanData.getAttributes().forEach((key, value) -> tags.put(key.getKey(), String.valueOf(value)));
7771
}
72+
7873
return this.tags;
7974
}
8075

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

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.net.URISyntaxException;
2121

2222
import io.opentelemetry.api.trace.Tracer;
23+
import io.opentelemetry.context.Context;
2324
import io.opentelemetry.context.Scope;
2425
import io.opentelemetry.context.propagation.TextMapPropagator;
2526
import io.opentelemetry.instrumentation.api.tracer.HttpClientTracer;
@@ -71,8 +72,8 @@ public Span handleSend(HttpClientRequest request) {
7172
}
7273
return OtelSpan.fromOtel(io.opentelemetry.api.trace.Span.getInvalid());
7374
}
74-
io.opentelemetry.api.trace.Span span = startSpan(request);
75-
return span(request, span);
75+
Context context = startSpan(Context.current(), request, request);
76+
return span(request, context);
7677
}
7778

7879
@Override
@@ -85,16 +86,17 @@ public Span handleSend(HttpClientRequest request, TraceContext parent) {
8586
}
8687
io.opentelemetry.api.trace.Span span = parent != null ? ((OtelTraceContext) parent).span() : null;
8788
if (span == null) {
88-
return span(request, startSpan(request));
89+
return span(request, startSpan(Context.current(), request, request));
8990
}
9091
try (Scope scope = span.makeCurrent()) {
91-
io.opentelemetry.api.trace.Span withParent = startSpan(request);
92+
Context withParent = startSpan(Context.current(), request, request);
9293
return span(request, withParent);
9394
}
9495
}
9596

96-
private Span span(HttpClientRequest request, io.opentelemetry.api.trace.Span span) {
97-
try (Scope scope = startScope(span, request)) {
97+
private Span span(HttpClientRequest request, Context context) {
98+
try (Scope scope = context.makeCurrent()) {
99+
io.opentelemetry.api.trace.Span span = io.opentelemetry.api.trace.Span.fromContext(context);
98100
if (span.isRecording()) {
99101
String remoteIp = request.remoteIp();
100102
if (StringUtils.hasText(remoteIp)) {
@@ -107,29 +109,25 @@ private Span span(HttpClientRequest request, io.opentelemetry.api.trace.Span spa
107109
}
108110

109111
@Override
110-
protected io.opentelemetry.api.trace.Span onRequest(io.opentelemetry.api.trace.Span span,
111-
HttpClientRequest httpClientRequest) {
112-
io.opentelemetry.api.trace.Span afterRequest = super.onRequest(span, httpClientRequest);
112+
protected void onRequest(io.opentelemetry.api.trace.Span span, HttpClientRequest httpClientRequest) {
113+
super.onRequest(span, httpClientRequest);
113114
if (this.httpClientRequestParser != null) {
114-
Span fromOtel = OtelSpan.fromOtel(afterRequest);
115+
Span fromOtel = OtelSpan.fromOtel(span);
115116
this.httpClientRequestParser.parse(httpClientRequest, fromOtel.context(), fromOtel);
116117
}
117118
String path = httpClientRequest.path();
118119
if (path != null) {
119120
span.setAttribute("http.path", path);
120121
}
121-
return afterRequest;
122122
}
123123

124124
@Override
125-
protected io.opentelemetry.api.trace.Span onResponse(io.opentelemetry.api.trace.Span span,
126-
HttpClientResponse httpClientResponse) {
127-
io.opentelemetry.api.trace.Span afterResponse = super.onResponse(span, httpClientResponse);
125+
protected void onResponse(io.opentelemetry.api.trace.Span span, HttpClientResponse httpClientResponse) {
126+
super.onResponse(span, httpClientResponse);
128127
if (this.httpClientResponseParser != null) {
129-
Span fromOtel = OtelSpan.fromOtel(afterResponse);
128+
Span fromOtel = OtelSpan.fromOtel(span);
130129
this.httpClientResponseParser.parse(httpClientResponse, fromOtel.context(), fromOtel);
131130
}
132-
return afterResponse;
133131
}
134132

135133
@Override
@@ -145,13 +143,13 @@ public void handleReceive(HttpClientResponse response, Span span) {
145143
if (log.isDebugEnabled()) {
146144
log.debug("There was an error, will finish span [" + otel + "] exceptionally");
147145
}
148-
endExceptionally(otel, response, response.error());
146+
endExceptionally(otel.storeInContext(Context.current()), response, response.error());
149147
}
150148
else {
151149
if (log.isDebugEnabled()) {
152150
log.debug("There was no error, will finish span [" + otel + "] in a standard way");
153151
}
154-
end(otel, response);
152+
end(otel.storeInContext(Context.current()), response);
155153
}
156154
}
157155

0 commit comments

Comments
 (0)