Skip to content

Commit df8b73d

Browse files
committed
Merge branch '3.1.x'
Closes gh-36425
2 parents 3995883 + 5881293 commit df8b73d

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-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
@@ -103,9 +103,10 @@ OpenTelemetry openTelemetry(SdkTracerProvider sdkTracerProvider, ContextPropagat
103103
SdkTracerProvider otelSdkTracerProvider(Environment environment, SpanProcessors spanProcessors, Sampler sampler,
104104
ObjectProvider<SdkTracerProviderBuilderCustomizer> customizers) {
105105
String applicationName = environment.getProperty("spring.application.name", DEFAULT_APPLICATION_NAME);
106+
Resource springResource = Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName));
106107
SdkTracerProviderBuilder builder = SdkTracerProvider.builder()
107108
.setSampler(sampler)
108-
.setResource(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName)));
109+
.setResource(Resource.getDefault().merge(springResource));
109110
spanProcessors.forEach(builder::addSpanProcessor);
110111
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
111112
return builder.build();

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

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

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

19+
import java.time.Duration;
1920
import java.util.ArrayList;
2021
import java.util.Collection;
2122
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;
2227
import java.util.stream.Stream;
2328

2429
import io.micrometer.tracing.SpanCustomizer;
@@ -31,24 +36,29 @@
3136
import io.micrometer.tracing.otel.bridge.Slf4JEventListener;
3237
import io.micrometer.tracing.otel.propagation.BaggageTextMapPropagator;
3338
import io.opentelemetry.api.OpenTelemetry;
39+
import io.opentelemetry.api.common.AttributeKey;
40+
import io.opentelemetry.api.common.Attributes;
3441
import io.opentelemetry.api.metrics.MeterProvider;
3542
import io.opentelemetry.api.trace.Tracer;
3643
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
3744
import io.opentelemetry.context.propagation.ContextPropagators;
3845
import io.opentelemetry.context.propagation.TextMapPropagator;
3946
import io.opentelemetry.extension.trace.propagation.B3Propagator;
4047
import io.opentelemetry.sdk.common.CompletableResultCode;
48+
import io.opentelemetry.sdk.resources.Resource;
4149
import io.opentelemetry.sdk.trace.SdkTracerProvider;
4250
import io.opentelemetry.sdk.trace.SpanLimits;
4351
import io.opentelemetry.sdk.trace.SpanProcessor;
4452
import io.opentelemetry.sdk.trace.data.SpanData;
4553
import io.opentelemetry.sdk.trace.export.SpanExporter;
4654
import io.opentelemetry.sdk.trace.samplers.Sampler;
55+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
4756
import org.junit.jupiter.api.Test;
4857
import org.junit.jupiter.params.ParameterizedTest;
4958
import org.junit.jupiter.params.provider.ValueSource;
5059
import org.mockito.Mockito;
5160

61+
import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration;
5262
import org.springframework.boot.autoconfigure.AutoConfigurations;
5363
import org.springframework.boot.test.context.FilteredClassLoader;
5464
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -163,6 +173,26 @@ void shouldBackOffOnCustomBeans() {
163173
});
164174
}
165175

176+
@Test
177+
void shouldSetupDefaultResourceAttributes() {
178+
this.contextRunner
179+
.withConfiguration(
180+
AutoConfigurations.of(ObservationAutoConfiguration.class, MicrometerTracingAutoConfiguration.class))
181+
.withUserConfiguration(InMemoryRecordingSpanExporterConfiguration.class)
182+
.withPropertyValues("management.tracing.sampling.probability=1.0")
183+
.run((context) -> {
184+
context.getBean(io.micrometer.tracing.Tracer.class).nextSpan().name("test").end();
185+
InMemoryRecordingSpanExporter exporter = context.getBean(InMemoryRecordingSpanExporter.class);
186+
exporter.await(Duration.ofSeconds(10));
187+
SpanData spanData = exporter.getExportedSpans().get(0);
188+
Map<AttributeKey<?>, Object> expectedAttributes = Resource.getDefault()
189+
.merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "application")))
190+
.getAttributes()
191+
.asMap();
192+
assertThat(spanData.getResource().getAttributes().asMap()).isEqualTo(expectedAttributes);
193+
});
194+
}
195+
166196
@Test
167197
void shouldAllowMultipleSpanProcessors() {
168198
this.contextRunner.withUserConfiguration(AdditionalSpanProcessorConfiguration.class).run((context) -> {
@@ -438,4 +468,50 @@ public CompletableResultCode shutdown() {
438468

439469
}
440470

471+
@Configuration(proxyBeanMethods = false)
472+
private static class InMemoryRecordingSpanExporterConfiguration {
473+
474+
@Bean
475+
InMemoryRecordingSpanExporter spanExporter() {
476+
return new InMemoryRecordingSpanExporter();
477+
}
478+
479+
}
480+
481+
private static class InMemoryRecordingSpanExporter implements SpanExporter {
482+
483+
private final List<SpanData> exportedSpans = new ArrayList<>();
484+
485+
private final CountDownLatch latch = new CountDownLatch(1);
486+
487+
@Override
488+
public CompletableResultCode export(Collection<SpanData> spans) {
489+
this.exportedSpans.addAll(spans);
490+
this.latch.countDown();
491+
return CompletableResultCode.ofSuccess();
492+
}
493+
494+
@Override
495+
public CompletableResultCode flush() {
496+
return CompletableResultCode.ofSuccess();
497+
}
498+
499+
@Override
500+
public CompletableResultCode shutdown() {
501+
this.exportedSpans.clear();
502+
return CompletableResultCode.ofSuccess();
503+
}
504+
505+
List<SpanData> getExportedSpans() {
506+
return this.exportedSpans;
507+
}
508+
509+
void await(Duration timeout) throws InterruptedException, TimeoutException {
510+
if (!this.latch.await(timeout.toMillis(), TimeUnit.MILLISECONDS)) {
511+
throw new TimeoutException("Waiting for exporting spans timed out (%s)".formatted(timeout));
512+
}
513+
}
514+
515+
}
516+
441517
}

0 commit comments

Comments
 (0)