Skip to content

Commit be2a480

Browse files
author
Adrian Cole
committed
test backfill
Signed-off-by: Adrian Cole <adrian@tetrate.io>
1 parent 1c9b89f commit be2a480

File tree

5 files changed

+104
-31
lines changed

5 files changed

+104
-31
lines changed

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
import zipkin2.reporter.BytesMessageSender;
2020
import zipkin2.reporter.Encoding;
21-
import zipkin2.reporter.HttpEndpointSupplier;
22-
import zipkin2.reporter.HttpEndpointSuppliers;
2321

2422
import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConfigurations.BraveConfiguration;
2523
import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConfigurations.OpenTelemetryConfiguration;
@@ -48,12 +46,6 @@
4846
@EnableConfigurationProperties(ZipkinProperties.class)
4947
public class ZipkinAutoConfiguration {
5048

51-
@Bean
52-
@ConditionalOnMissingBean(HttpEndpointSupplier.Factory.class)
53-
HttpEndpointSupplier.Factory endpointSupplierFactory() {
54-
return HttpEndpointSuppliers.constantFactory();
55-
}
56-
5749
@Bean
5850
@ConditionalOnMissingBean(ZipkinConnectionDetails.class)
5951
PropertiesZipkinConnectionDetails zipkinConnectionDetails(ZipkinProperties properties) {

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,15 +150,10 @@ static class BraveConfiguration {
150150
@Bean
151151
@ConditionalOnMissingBean(value = MutableSpan.class, parameterizedContainer = BytesEncoder.class)
152152
@ConditionalOnEnabledTracing
153-
Tag<Throwable> errorTag() {
154-
return Tags.ERROR;
155-
}
156-
157-
@Bean
158-
@ConditionalOnMissingBean(value = MutableSpan.class, parameterizedContainer = BytesEncoder.class)
159-
@ConditionalOnEnabledTracing
160-
BytesEncoder<MutableSpan> braveSpanEncoder(Encoding encoding, Tag<Throwable> errorTag) {
161-
return MutableSpanBytesEncoder.create(encoding, errorTag);
153+
BytesEncoder<MutableSpan> braveSpanEncoder(Encoding encoding,
154+
ObjectProvider<Tag<Throwable>> throwableTagProvider) {
155+
Tag<Throwable> throwableTag = throwableTagProvider.getIfAvailable(() -> Tags.ERROR);
156+
return MutableSpanBytesEncoder.create(encoding, throwableTag);
162157
}
163158

164159
@Bean

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

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

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

19+
import java.nio.charset.StandardCharsets;
20+
1921
import brave.Tag;
2022
import brave.handler.MutableSpan;
2123
import brave.handler.SpanHandler;
@@ -121,6 +123,43 @@ void shouldUseCustomEncodingBean() {
121123
});
122124
}
123125

126+
@Test
127+
void shouldUseDefaultThrowableTagBean() {
128+
this.contextRunner.withUserConfiguration(SenderConfiguration.class).run((context) -> {
129+
@SuppressWarnings("unchecked")
130+
BytesEncoder<MutableSpan> encoder = context.getBean(BytesEncoder.class);
131+
132+
MutableSpan span = new MutableSpan();
133+
span.traceId("1");
134+
span.id("1");
135+
span.tag("error", "true");
136+
span.error(new RuntimeException("ice cream"));
137+
138+
// default tag key name is "error", and doesn't overwrite
139+
assertThat(new String(encoder.encode(span), StandardCharsets.UTF_8)).isEqualTo(
140+
"{\"traceId\":\"0000000000000001\",\"id\":\"0000000000000001\",\"tags\":{\"error\":\"true\"}}");
141+
});
142+
}
143+
144+
@Test
145+
void shouldUseCustomThrowableTagBean() {
146+
this.contextRunner.withUserConfiguration(SenderConfiguration.class, CustomThrowableTagConfiguration.class)
147+
.run((context) -> {
148+
@SuppressWarnings("unchecked")
149+
BytesEncoder<MutableSpan> encoder = context.getBean(BytesEncoder.class);
150+
151+
MutableSpan span = new MutableSpan();
152+
span.traceId("1");
153+
span.id("1");
154+
span.tag("error", "true");
155+
span.error(new RuntimeException("ice cream"));
156+
157+
// The custom throwable parser doesn't use the key "error" we can see both
158+
assertThat(new String(encoder.encode(span), StandardCharsets.UTF_8)).isEqualTo(
159+
"{\"traceId\":\"0000000000000001\",\"id\":\"0000000000000001\",\"tags\":{\"error\":\"true\",\"exception\":\"ice cream\"}}");
160+
});
161+
}
162+
124163
@Configuration(proxyBeanMethods = false)
125164
private static final class SenderConfiguration {
126165

@@ -142,10 +181,10 @@ AsyncZipkinSpanHandler customAsyncZipkinSpanHandler() {
142181
}
143182

144183
@Configuration(proxyBeanMethods = false)
145-
private static final class CustomErrorTagConfiguration {
184+
private static final class CustomThrowableTagConfiguration {
146185

147186
@Bean
148-
Tag<Throwable> errorTag() {
187+
Tag<Throwable> throwableTag() {
149188
return new Tag<Throwable>("exception") {
150189
@Override
151190
protected String parseValue(Throwable throwable, TraceContext traceContext) {

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,18 +144,7 @@ BytesEncoder<Span> encoder(Encoding encoding) {
144144

145145
}
146146

147-
private static final class CustomSpanEncoder implements BytesEncoder<Span> {
148-
149-
private final Encoding encoding;
150-
151-
private CustomSpanEncoder(Encoding encoding) {
152-
this.encoding = encoding;
153-
}
154-
155-
@Override
156-
public Encoding encoding() {
157-
return this.encoding;
158-
}
147+
record CustomSpanEncoder(Encoding encoding) implements BytesEncoder<Span> {
159148

160149
@Override
161150
public int sizeInBytes(Span span) {

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.junit.jupiter.api.Test;
2828
import org.mockito.ArgumentMatchers;
2929
import zipkin2.reporter.BytesMessageSender;
30+
import zipkin2.reporter.HttpEndpointSupplier;
3031
import zipkin2.reporter.urlconnection.URLConnectionSender;
3132

3233
import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConfigurations.SenderConfiguration;
@@ -173,6 +174,32 @@ void shouldApplyZipkinRestTemplateBuilderCustomizers() throws IOException {
173174
}
174175
}
175176

177+
@Test
178+
void shouldUseCustomHttpEndpointSupplierFactory() {
179+
this.contextRunner.withUserConfiguration(CustomHttpEndpointSupplierFactoryConfiguration.class)
180+
.run((context) -> assertThat(context.getBean(URLConnectionSender.class))
181+
.extracting("delegate.endpointSupplier")
182+
.isInstanceOf(CustomHttpEndpointSupplier.class));
183+
}
184+
185+
@Test
186+
void shouldUseCustomHttpEndpointSupplierFactoryWhenReactive() {
187+
this.reactiveContextRunner.withUserConfiguration(WebClientConfiguration.class)
188+
.withClassLoader(new FilteredClassLoader(URLConnectionSender.class))
189+
.withUserConfiguration(CustomHttpEndpointSupplierFactoryConfiguration.class)
190+
.run((context) -> assertThat(context.getBean(ZipkinWebClientSender.class)).extracting("endpointSupplier")
191+
.isInstanceOf(CustomHttpEndpointSupplier.class));
192+
}
193+
194+
@Test
195+
void shouldUseCustomHttpEndpointSupplierFactoryWhenRestTemplate() {
196+
this.contextRunner.withUserConfiguration(RestTemplateConfiguration.class)
197+
.withClassLoader(new FilteredClassLoader(URLConnectionSender.class, WebClient.class))
198+
.withUserConfiguration(CustomHttpEndpointSupplierFactoryConfiguration.class)
199+
.run((context) -> assertThat(context.getBean(ZipkinRestTemplateSender.class)).extracting("endpointSupplier")
200+
.isInstanceOf(CustomHttpEndpointSupplier.class));
201+
}
202+
176203
@Configuration(proxyBeanMethods = false)
177204
private static final class RestTemplateConfiguration {
178205

@@ -212,4 +239,35 @@ public RestTemplateBuilder customize(RestTemplateBuilder restTemplateBuilder) {
212239

213240
}
214241

242+
@Configuration(proxyBeanMethods = false)
243+
private static final class CustomHttpEndpointSupplierFactoryConfiguration {
244+
245+
@Bean
246+
HttpEndpointSupplier.Factory httpEndpointSupplier() {
247+
return new CustomHttpEndpointSupplierFactory();
248+
}
249+
250+
}
251+
252+
private static final class CustomHttpEndpointSupplierFactory implements HttpEndpointSupplier.Factory {
253+
254+
@Override
255+
public HttpEndpointSupplier create(String endpoint) {
256+
return new CustomHttpEndpointSupplier(endpoint);
257+
}
258+
259+
}
260+
261+
private record CustomHttpEndpointSupplier(String endpoint) implements HttpEndpointSupplier {
262+
263+
@Override
264+
public String get() {
265+
return this.endpoint;
266+
}
267+
268+
@Override
269+
public void close() {
270+
}
271+
}
272+
215273
}

0 commit comments

Comments
 (0)