Skip to content

Commit f1a7737

Browse files
committed
server for spring starter
1 parent 0c3722b commit f1a7737

File tree

7 files changed

+82
-17
lines changed

7 files changed

+82
-17
lines changed

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
10-
import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry;
10+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1111
import org.springframework.beans.factory.ObjectProvider;
1212
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1313
import org.springframework.context.annotation.Bean;
@@ -30,14 +30,14 @@ public SpringWebfluxInstrumentationAutoConfiguration() {}
3030
// static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning
3131
@Bean
3232
static WebClientBeanPostProcessor otelWebClientBeanPostProcessor(
33-
ObjectProvider<OpenTelemetry> openTelemetryProvider) {
34-
return new WebClientBeanPostProcessor(openTelemetryProvider);
33+
ObjectProvider<OpenTelemetry> openTelemetryProvider,
34+
ObjectProvider<ConfigProperties> configPropertiesProvider) {
35+
return new WebClientBeanPostProcessor(openTelemetryProvider, configPropertiesProvider);
3536
}
3637

3738
@Bean
38-
WebFilter telemetryFilter(OpenTelemetry openTelemetry) {
39-
return SpringWebfluxTelemetry.builder(openTelemetry)
40-
.build()
39+
WebFilter telemetryFilter(OpenTelemetry openTelemetry, ConfigProperties config) {
40+
return WebClientBeanPostProcessor.getWebfluxTelemetry(openTelemetry, config)
4141
.createWebFilterAndRegisterReactorHook();
4242
}
4343
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessor.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux;
77

88
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.HttpServerInstrumenterBuilder;
10+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.CommonConfigUtil;
911
import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry;
12+
import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetryBuilder;
13+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1014
import org.springframework.beans.factory.ObjectProvider;
1115
import org.springframework.beans.factory.config.BeanPostProcessor;
1216
import org.springframework.web.reactive.function.client.WebClient;
@@ -19,9 +23,20 @@
1923
final class WebClientBeanPostProcessor implements BeanPostProcessor {
2024

2125
private final ObjectProvider<OpenTelemetry> openTelemetryProvider;
26+
private final ObjectProvider<ConfigProperties> configPropertiesProvider;
2227

23-
WebClientBeanPostProcessor(ObjectProvider<OpenTelemetry> openTelemetryProvider) {
28+
WebClientBeanPostProcessor(
29+
ObjectProvider<OpenTelemetry> openTelemetryProvider,
30+
ObjectProvider<ConfigProperties> configPropertiesProvider) {
2431
this.openTelemetryProvider = openTelemetryProvider;
32+
this.configPropertiesProvider = configPropertiesProvider;
33+
}
34+
35+
static SpringWebfluxTelemetry getWebfluxTelemetry(
36+
OpenTelemetry openTelemetry, ConfigProperties config) {
37+
SpringWebfluxTelemetryBuilder builder = SpringWebfluxTelemetry.builder(openTelemetry);
38+
HttpServerInstrumenterBuilder.configure(CommonConfigUtil.getCommonConfig(config), builder);
39+
return builder.build();
2540
}
2641

2742
@Override
@@ -38,7 +53,8 @@ public Object postProcessAfterInitialization(Object bean, String beanName) {
3853

3954
private WebClient.Builder wrapBuilder(WebClient.Builder webClientBuilder) {
4055
SpringWebfluxTelemetry instrumentation =
41-
SpringWebfluxTelemetry.create(openTelemetryProvider.getObject());
56+
getWebfluxTelemetry(
57+
openTelemetryProvider.getObject(), configPropertiesProvider.getObject());
4258
return webClientBuilder.filters(instrumentation::addClientTracingFilter);
4359
}
4460
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@
66
package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc;
77

88
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.HttpServerInstrumenterBuilder;
910
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
11+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.CommonConfigUtil;
1012
import io.opentelemetry.instrumentation.spring.webmvc.v5_3.SpringWebMvcTelemetry;
13+
import io.opentelemetry.instrumentation.spring.webmvc.v5_3.SpringWebMvcTelemetryBuilder;
14+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1115
import javax.servlet.Filter;
1216
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1317
import org.springframework.context.annotation.Bean;
@@ -22,7 +26,9 @@
2226
public class SpringWebMvc5InstrumentationAutoConfiguration {
2327

2428
@Bean
25-
Filter otelWebMvcFilter(OpenTelemetry openTelemetry) {
26-
return SpringWebMvcTelemetry.create(openTelemetry).createServletFilter();
29+
Filter otelWebMvcFilter(OpenTelemetry openTelemetry, ConfigProperties config) {
30+
SpringWebMvcTelemetryBuilder builder = SpringWebMvcTelemetry.builder(openTelemetry);
31+
HttpServerInstrumenterBuilder.configure(CommonConfigUtil.getCommonConfig(config), builder);
32+
return builder.build().createServletFilter();
2733
}
2834
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@
66
package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc;
77

88
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.HttpServerInstrumenterBuilder;
910
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
11+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.CommonConfigUtil;
1012
import io.opentelemetry.instrumentation.spring.webmvc.v6_0.SpringWebMvcTelemetry;
13+
import io.opentelemetry.instrumentation.spring.webmvc.v6_0.SpringWebMvcTelemetryBuilder;
14+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1115
import jakarta.servlet.Filter;
1216
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1317
import org.springframework.context.annotation.Bean;
@@ -22,7 +26,9 @@
2226
public class SpringWebMvc6InstrumentationAutoConfiguration {
2327

2428
@Bean
25-
Filter otelWebMvcFilter(OpenTelemetry openTelemetry) {
26-
return SpringWebMvcTelemetry.create(openTelemetry).createServletFilter();
29+
Filter otelWebMvcFilter(OpenTelemetry openTelemetry, ConfigProperties config) {
30+
SpringWebMvcTelemetryBuilder builder = SpringWebMvcTelemetry.builder(openTelemetry);
31+
HttpServerInstrumenterBuilder.configure(CommonConfigUtil.getCommonConfig(config), builder);
32+
return builder.build().createServletFilter();
2733
}
2834
}

instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,22 @@
306306
"description": "Configures the instrumentation to recognize an alternative set of HTTP request methods. All other methods will be treated as <code>_OTHER</code>.",
307307
"defaultValue": "CONNECT,DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,TRACE"
308308
},
309+
{
310+
"name": "otel.instrumentation.http.server.capture-request-headers",
311+
"type": "java.util.List<java.lang.String>",
312+
"description": "List of HTTP request headers to capture in HTTP servers."
313+
},
314+
{
315+
"name": "otel.instrumentation.http.server.capture-response-headers",
316+
"type": "java.util.List<java.lang.String>",
317+
"description": "List of HTTP response headers to capture in HTTP servers."
318+
},
319+
{
320+
"name": "otel.instrumentation.http.server.emit-experimental-telemetry",
321+
"type": "java.lang.Boolean",
322+
"description": "Enable the capture of experimental HTTP server telemetry. Add the <code>http.request.body.size</code> and <code>http.response.body.size> attributes to spans, and record the <code>http.server.request.size</code> and <code>http.server.response.size</code> metrics.",
323+
"defaultValue": false
324+
},
309325
{
310326
"name": "otel.instrumentation.jdbc.enabled",
311327
"type": "java.lang.Boolean",

instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99

1010
import io.opentelemetry.api.OpenTelemetry;
11+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
12+
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
13+
import java.util.Collections;
1114
import org.junit.jupiter.api.Test;
1215
import org.springframework.boot.autoconfigure.AutoConfigurations;
1316
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -17,6 +20,9 @@ class SpringWebfluxInstrumentationAutoConfigurationTest {
1720
private final ApplicationContextRunner contextRunner =
1821
new ApplicationContextRunner()
1922
.withBean(OpenTelemetry.class, OpenTelemetry::noop)
23+
.withBean(
24+
ConfigProperties.class,
25+
() -> DefaultConfigProperties.createFromMap(Collections.emptyMap()))
2026
.withConfiguration(
2127
AutoConfigurations.of(SpringWebfluxInstrumentationAutoConfiguration.class));
2228

instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessorTest.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99

1010
import io.opentelemetry.api.OpenTelemetry;
11+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
12+
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
13+
import java.util.Collections;
1114
import org.junit.jupiter.api.DisplayName;
1215
import org.junit.jupiter.api.Test;
1316
import org.springframework.beans.factory.config.BeanPostProcessor;
@@ -20,14 +23,18 @@ class WebClientBeanPostProcessorTest {
2023

2124
static {
2225
beanFactory.registerSingleton("openTelemetry", OpenTelemetry.noop());
26+
beanFactory.registerSingleton(
27+
"configProperties", DefaultConfigProperties.createFromMap(Collections.emptyMap()));
2328
}
2429

2530
@Test
2631
@DisplayName(
2732
"when processed bean is NOT of type WebClient or WebClientBuilder should return Object")
2833
void returnsObject() {
2934
BeanPostProcessor underTest =
30-
new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
35+
new WebClientBeanPostProcessor(
36+
beanFactory.getBeanProvider(OpenTelemetry.class),
37+
beanFactory.getBeanProvider(ConfigProperties.class));
3138

3239
assertThat(underTest.postProcessAfterInitialization(new Object(), "testObject"))
3340
.isExactlyInstanceOf(Object.class);
@@ -37,7 +44,9 @@ void returnsObject() {
3744
@DisplayName("when processed bean is of type WebClient should return WebClient")
3845
void returnsWebClient() {
3946
BeanPostProcessor underTest =
40-
new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
47+
new WebClientBeanPostProcessor(
48+
beanFactory.getBeanProvider(OpenTelemetry.class),
49+
beanFactory.getBeanProvider(ConfigProperties.class));
4150

4251
assertThat(underTest.postProcessAfterInitialization(WebClient.create(), "testWebClient"))
4352
.isInstanceOf(WebClient.class);
@@ -47,7 +56,9 @@ void returnsWebClient() {
4756
@DisplayName("when processed bean is of type WebClientBuilder should return WebClientBuilder")
4857
void returnsWebClientBuilder() {
4958
BeanPostProcessor underTest =
50-
new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
59+
new WebClientBeanPostProcessor(
60+
beanFactory.getBeanProvider(OpenTelemetry.class),
61+
beanFactory.getBeanProvider(ConfigProperties.class));
5162

5263
assertThat(
5364
underTest.postProcessAfterInitialization(WebClient.builder(), "testWebClientBuilder"))
@@ -58,7 +69,9 @@ void returnsWebClientBuilder() {
5869
@DisplayName("when processed bean is of type WebClient should add exchange filter to WebClient")
5970
void addsExchangeFilterWebClient() {
6071
BeanPostProcessor underTest =
61-
new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
72+
new WebClientBeanPostProcessor(
73+
beanFactory.getBeanProvider(OpenTelemetry.class),
74+
beanFactory.getBeanProvider(ConfigProperties.class));
6275

6376
WebClient webClient = WebClient.create();
6477
Object processedWebClient =
@@ -81,7 +94,9 @@ void addsExchangeFilterWebClient() {
8194
"when processed bean is of type WebClientBuilder should add ONE exchange filter to WebClientBuilder")
8295
void addsExchangeFilterWebClientBuilder() {
8396
BeanPostProcessor underTest =
84-
new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
97+
new WebClientBeanPostProcessor(
98+
beanFactory.getBeanProvider(OpenTelemetry.class),
99+
beanFactory.getBeanProvider(ConfigProperties.class));
85100

86101
WebClient.Builder webClientBuilder = WebClient.builder();
87102
underTest.postProcessAfterInitialization(webClientBuilder, "testWebClientBuilder");

0 commit comments

Comments
 (0)