Skip to content

Commit 5881293

Browse files
committed
Merge branch '3.0.x' into 3.1.x
Closes gh-36423
2 parents 940ef7f + bbaac07 commit 5881293

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,10 @@ OpenTelemetry openTelemetry(SdkTracerProvider sdkTracerProvider, ContextPropagat
102102
SdkTracerProvider otelSdkTracerProvider(Environment environment, ObjectProvider<SpanProcessor> spanProcessors,
103103
Sampler sampler, ObjectProvider<SdkTracerProviderBuilderCustomizer> customizers) {
104104
String applicationName = environment.getProperty("spring.application.name", DEFAULT_APPLICATION_NAME);
105+
Resource springResource = Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName));
105106
SdkTracerProviderBuilder builder = SdkTracerProvider.builder()
106107
.setSampler(sampler)
107-
.setResource(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName)));
108+
.setResource(Resource.getDefault().merge(springResource));
108109
spanProcessors.orderedStream().forEach(builder::addSpanProcessor);
109110
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
110111
return builder.build();

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,14 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.tracing;
1818

19+
import java.time.Duration;
1920
import java.util.ArrayList;
21+
import java.util.Collection;
2022
import java.util.List;
23+
import java.util.Map;
24+
import java.util.concurrent.CountDownLatch;
25+
import java.util.concurrent.TimeUnit;
26+
import java.util.concurrent.TimeoutException;
2127
import java.util.stream.Stream;
2228

2329
import io.micrometer.tracing.SpanCustomizer;
@@ -30,19 +36,27 @@
3036
import io.micrometer.tracing.otel.bridge.Slf4JEventListener;
3137
import io.micrometer.tracing.otel.propagation.BaggageTextMapPropagator;
3238
import io.opentelemetry.api.OpenTelemetry;
39+
import io.opentelemetry.api.common.AttributeKey;
40+
import io.opentelemetry.api.common.Attributes;
3341
import io.opentelemetry.api.trace.Tracer;
3442
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
3543
import io.opentelemetry.context.propagation.ContextPropagators;
3644
import io.opentelemetry.context.propagation.TextMapPropagator;
3745
import io.opentelemetry.extension.trace.propagation.B3Propagator;
46+
import io.opentelemetry.sdk.common.CompletableResultCode;
47+
import io.opentelemetry.sdk.resources.Resource;
3848
import io.opentelemetry.sdk.trace.SdkTracerProvider;
3949
import io.opentelemetry.sdk.trace.SpanLimits;
4050
import io.opentelemetry.sdk.trace.SpanProcessor;
51+
import io.opentelemetry.sdk.trace.data.SpanData;
52+
import io.opentelemetry.sdk.trace.export.SpanExporter;
4153
import io.opentelemetry.sdk.trace.samplers.Sampler;
54+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
4255
import org.junit.jupiter.api.Test;
4356
import org.junit.jupiter.params.ParameterizedTest;
4457
import org.junit.jupiter.params.provider.ValueSource;
4558

59+
import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration;
4660
import org.springframework.boot.autoconfigure.AutoConfigurations;
4761
import org.springframework.boot.test.context.FilteredClassLoader;
4862
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -146,6 +160,26 @@ void shouldBackOffOnCustomBeans() {
146160
});
147161
}
148162

163+
@Test
164+
void shouldSetupDefaultResourceAttributes() {
165+
this.contextRunner
166+
.withConfiguration(
167+
AutoConfigurations.of(ObservationAutoConfiguration.class, MicrometerTracingAutoConfiguration.class))
168+
.withUserConfiguration(InMemoryRecordingSpanExporterConfiguration.class)
169+
.withPropertyValues("management.tracing.sampling.probability=1.0")
170+
.run((context) -> {
171+
context.getBean(io.micrometer.tracing.Tracer.class).nextSpan().name("test").end();
172+
InMemoryRecordingSpanExporter exporter = context.getBean(InMemoryRecordingSpanExporter.class);
173+
exporter.await(Duration.ofSeconds(10));
174+
SpanData spanData = exporter.getExportedSpans().get(0);
175+
Map<AttributeKey<?>, Object> expectedAttributes = Resource.getDefault()
176+
.merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "application")))
177+
.getAttributes()
178+
.asMap();
179+
assertThat(spanData.getResource().getAttributes().asMap()).isEqualTo(expectedAttributes);
180+
});
181+
}
182+
149183
@Test
150184
void shouldAllowMultipleSpanProcessors() {
151185
this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> {
@@ -332,4 +366,50 @@ SdkTracerProviderBuilderCustomizer sdkTracerProviderBuilderCustomizerTwo() {
332366

333367
}
334368

369+
@Configuration(proxyBeanMethods = false)
370+
private static class InMemoryRecordingSpanExporterConfiguration {
371+
372+
@Bean
373+
InMemoryRecordingSpanExporter spanExporter() {
374+
return new InMemoryRecordingSpanExporter();
375+
}
376+
377+
}
378+
379+
private static class InMemoryRecordingSpanExporter implements SpanExporter {
380+
381+
private final List<SpanData> exportedSpans = new ArrayList<>();
382+
383+
private final CountDownLatch latch = new CountDownLatch(1);
384+
385+
@Override
386+
public CompletableResultCode export(Collection<SpanData> spans) {
387+
this.exportedSpans.addAll(spans);
388+
this.latch.countDown();
389+
return CompletableResultCode.ofSuccess();
390+
}
391+
392+
@Override
393+
public CompletableResultCode flush() {
394+
return CompletableResultCode.ofSuccess();
395+
}
396+
397+
@Override
398+
public CompletableResultCode shutdown() {
399+
this.exportedSpans.clear();
400+
return CompletableResultCode.ofSuccess();
401+
}
402+
403+
List<SpanData> getExportedSpans() {
404+
return this.exportedSpans;
405+
}
406+
407+
void await(Duration timeout) throws InterruptedException, TimeoutException {
408+
if (!this.latch.await(timeout.toMillis(), TimeUnit.MILLISECONDS)) {
409+
throw new TimeoutException("Waiting for exporting spans timed out (%s)".formatted(timeout));
410+
}
411+
}
412+
413+
}
414+
335415
}

0 commit comments

Comments
 (0)