Skip to content

Commit 3f45f75

Browse files
jamesmoessistraskMateusz Rzeszutek
authored
Spring Webflux Library Instrumentation (#7899)
Resolves #7436 * Created new Module `spring-webflux-5.3` which contains only server-side library instrumentation * Minimum supported version is 5.3 because there are various problems in older versions of reactor and webflux that prevent a few of the tests from passing. * Moved existing `spring-webflux-5.0` (webclient instrumentation) into a common `spring-webflux` folder next to the 5.3 (server) instrumentation. Moved the README to the parent folder so the docs are cohesive between client/server instrumentation. * Implemented `WebFilter` which instruments the server-side * Depends on the `reactor-3.1` instrumentation to pass the context around. Registers the react hook when it creates the `WebFilter` * Tests using the standard HTTP server test suite --------- Co-authored-by: Trask Stalnaker <[email protected]> Co-authored-by: Mateusz Rzeszutek <[email protected]>
1 parent d6c3fdb commit 3f45f75

File tree

67 files changed

+895
-206
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+895
-206
lines changed

docs/supported-libraries.md

+1-1

instrumentation/spring/spring-boot-autoconfigure/README.md

+12-2

instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ dependencies {
2121
implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-5.3:library"))
2222
implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library"))
2323
compileOnly("jakarta.servlet:jakarta.servlet-api:5.0.0")
24-
implementation(project(":instrumentation:spring:spring-webflux-5.0:library"))
24+
implementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.3:library"))
2525
implementation(project(":instrumentation:micrometer:micrometer-1.5:library"))
2626

2727
compileOnly("org.springframework.kafka:spring-kafka:2.9.0")

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
package io.opentelemetry.instrumentation.spring.autoconfigure.httpclients.webclient;
77

88
import io.opentelemetry.api.OpenTelemetry;
9-
import io.opentelemetry.instrumentation.spring.webflux.v5_0.client.SpringWebfluxTelemetry;
9+
import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry;
1010
import org.springframework.beans.factory.ObjectProvider;
1111
import org.springframework.beans.factory.config.BeanPostProcessor;
1212
import org.springframework.web.reactive.function.client.WebClient;

instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java

-38
This file was deleted.

instrumentation/spring/spring-webflux-5.0/library/README.md

-97
This file was deleted.

instrumentation/spring/spring-webflux-5.0/javaagent/build.gradle.kts instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/build.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ muzzle {
3939
}
4040

4141
dependencies {
42-
implementation(project(":instrumentation:spring:spring-webflux-5.0:library"))
42+
implementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.3:library"))
4343

4444
compileOnly("org.springframework:spring-webflux:5.0.0.RELEASE")
4545
compileOnly("io.projectreactor.ipc:reactor-netty:0.7.0.RELEASE")
@@ -51,7 +51,7 @@ dependencies {
5151
testInstrumentation(project(":instrumentation:reactor:reactor-3.1:javaagent"))
5252
testInstrumentation(project(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:javaagent"))
5353

54-
testImplementation(project(":instrumentation:spring:spring-webflux-5.0:testing"))
54+
testImplementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.3:testing"))
5555

5656
testLibrary("org.springframework.boot:spring-boot-starter-webflux:2.0.0.RELEASE")
5757
testLibrary("org.springframework.boot:spring-boot-starter-test:2.0.0.RELEASE")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.client;
7+
8+
import io.opentelemetry.api.GlobalOpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10+
import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor;
11+
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.SpringWebfluxTelemetryClientBuilder;
12+
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientNetAttributesGetter;
13+
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientTracingFilter;
14+
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
15+
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
16+
import java.util.List;
17+
import org.springframework.web.reactive.function.client.ClientRequest;
18+
import org.springframework.web.reactive.function.client.ClientResponse;
19+
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
20+
21+
public final class WebClientHelper {
22+
23+
private static final Instrumenter<ClientRequest, ClientResponse> instrumenter =
24+
new SpringWebfluxTelemetryClientBuilder(GlobalOpenTelemetry.get())
25+
.setCapturedClientRequestHeaders(CommonConfig.get().getClientRequestHeaders())
26+
.setCapturedClientResponseHeaders(CommonConfig.get().getClientResponseHeaders())
27+
.addClientAttributesExtractor(
28+
PeerServiceAttributesExtractor.create(
29+
new WebClientNetAttributesGetter(), CommonConfig.get().getPeerServiceMapping()))
30+
.setCaptureExperimentalSpanAttributes(
31+
InstrumentationConfig.get()
32+
.getBoolean(
33+
"otel.instrumentation.spring-webflux.experimental-span-attributes", false))
34+
.build();
35+
36+
public static void addFilter(List<ExchangeFilterFunction> exchangeFilterFunctions) {
37+
for (ExchangeFilterFunction filterFunction : exchangeFilterFunctions) {
38+
if (filterFunction instanceof WebClientTracingFilter) {
39+
return;
40+
}
41+
}
42+
exchangeFilterFunctions.add(
43+
new WebClientTracingFilter(instrumenter, GlobalOpenTelemetry.get().getPropagators()));
44+
}
45+
46+
private WebClientHelper() {}
47+
}

0 commit comments

Comments
 (0)