Skip to content

Commit bd8ddf4

Browse files
authored
Allow overriding span name in spring web library instrumentation (open-telemetry#8933)
1 parent fd8e361 commit bd8ddf4

File tree

3 files changed

+80
-9
lines changed

3 files changed

+80
-9
lines changed

instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebTelemetryBuilder.java

+24-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1212
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
13+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1314
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
1415
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
1516
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
@@ -19,6 +20,8 @@
1920
import java.util.ArrayList;
2021
import java.util.List;
2122
import java.util.Set;
23+
import java.util.function.Function;
24+
import javax.annotation.Nullable;
2225
import org.springframework.http.HttpRequest;
2326
import org.springframework.http.client.ClientHttpResponse;
2427

@@ -35,6 +38,10 @@ public final class SpringWebTelemetryBuilder {
3538
SpringWebHttpAttributesGetter.INSTANCE, new SpringWebNetAttributesGetter());
3639
private boolean emitExperimentalHttpClientMetrics = false;
3740

41+
@Nullable
42+
private Function<SpanNameExtractor<HttpRequest>, ? extends SpanNameExtractor<? super HttpRequest>>
43+
spanNameExtractorTransformer;
44+
3845
SpringWebTelemetryBuilder(OpenTelemetry openTelemetry) {
3946
this.openTelemetry = openTelemetry;
4047
}
@@ -72,6 +79,15 @@ public SpringWebTelemetryBuilder setCapturedResponseHeaders(List<String> respons
7279
return this;
7380
}
7481

82+
/** Sets custom {@link SpanNameExtractor} via transform function. */
83+
@CanIgnoreReturnValue
84+
public SpringWebTelemetryBuilder setSpanNameExtractor(
85+
Function<SpanNameExtractor<HttpRequest>, ? extends SpanNameExtractor<? super HttpRequest>>
86+
spanNameExtractor) {
87+
this.spanNameExtractorTransformer = spanNameExtractor;
88+
return this;
89+
}
90+
7591
/**
7692
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
7793
*
@@ -111,11 +127,16 @@ public SpringWebTelemetryBuilder setEmitExperimentalHttpClientMetrics(
111127
public SpringWebTelemetry build() {
112128
SpringWebHttpAttributesGetter httpAttributeGetter = SpringWebHttpAttributesGetter.INSTANCE;
113129

130+
SpanNameExtractor<HttpRequest> originalSpanNameExtractor =
131+
HttpSpanNameExtractor.create(httpAttributeGetter);
132+
SpanNameExtractor<? super HttpRequest> spanNameExtractor = originalSpanNameExtractor;
133+
if (spanNameExtractorTransformer != null) {
134+
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);
135+
}
136+
114137
InstrumenterBuilder<HttpRequest, ClientHttpResponse> builder =
115138
Instrumenter.<HttpRequest, ClientHttpResponse>builder(
116-
openTelemetry,
117-
INSTRUMENTATION_NAME,
118-
HttpSpanNameExtractor.create(httpAttributeGetter))
139+
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
119140
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributeGetter))
120141
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
121142
.addAttributesExtractors(additionalExtractors)

instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java

+28-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.api.OpenTelemetry;
1010
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
12+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1213
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
1314
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
1415
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
@@ -18,6 +19,8 @@
1819
import java.util.ArrayList;
1920
import java.util.List;
2021
import java.util.Set;
22+
import java.util.function.Function;
23+
import javax.annotation.Nullable;
2124
import javax.servlet.http.HttpServletRequest;
2225
import javax.servlet.http.HttpServletResponse;
2326

@@ -34,6 +37,12 @@ public final class SpringWebMvcTelemetryBuilder {
3437
HttpServerAttributesExtractor.builder(
3538
SpringWebMvcHttpAttributesGetter.INSTANCE, SpringWebMvcNetAttributesGetter.INSTANCE);
3639

40+
@Nullable
41+
private Function<
42+
SpanNameExtractor<HttpServletRequest>,
43+
? extends SpanNameExtractor<? super HttpServletRequest>>
44+
spanNameExtractorTransformer;
45+
3746
SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) {
3847
this.openTelemetry = openTelemetry;
3948
}
@@ -71,6 +80,17 @@ public SpringWebMvcTelemetryBuilder setCapturedResponseHeaders(List<String> resp
7180
return this;
7281
}
7382

83+
/** Sets custom {@link SpanNameExtractor} via transform function. */
84+
@CanIgnoreReturnValue
85+
public SpringWebMvcTelemetryBuilder setSpanNameExtractor(
86+
Function<
87+
SpanNameExtractor<HttpServletRequest>,
88+
? extends SpanNameExtractor<? super HttpServletRequest>>
89+
spanNameExtractor) {
90+
this.spanNameExtractorTransformer = spanNameExtractor;
91+
return this;
92+
}
93+
7494
/**
7595
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
7696
*
@@ -98,11 +118,16 @@ public SpringWebMvcTelemetry build() {
98118
SpringWebMvcHttpAttributesGetter httpAttributesGetter =
99119
SpringWebMvcHttpAttributesGetter.INSTANCE;
100120

121+
SpanNameExtractor<HttpServletRequest> originalSpanNameExtractor =
122+
HttpSpanNameExtractor.create(httpAttributesGetter);
123+
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor;
124+
if (spanNameExtractorTransformer != null) {
125+
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);
126+
}
127+
101128
Instrumenter<HttpServletRequest, HttpServletResponse> instrumenter =
102129
Instrumenter.<HttpServletRequest, HttpServletResponse>builder(
103-
openTelemetry,
104-
INSTRUMENTATION_NAME,
105-
HttpSpanNameExtractor.create(httpAttributesGetter))
130+
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
106131
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
107132
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
108133
.addAttributesExtractors(additionalExtractors)

instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java

+28-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.api.OpenTelemetry;
1010
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
12+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1213
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
1314
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
1415
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
@@ -20,6 +21,8 @@
2021
import java.util.ArrayList;
2122
import java.util.List;
2223
import java.util.Set;
24+
import java.util.function.Function;
25+
import javax.annotation.Nullable;
2326

2427
/** A builder of {@link SpringWebMvcTelemetry}. */
2528
public final class SpringWebMvcTelemetryBuilder {
@@ -34,6 +37,12 @@ public final class SpringWebMvcTelemetryBuilder {
3437
HttpServerAttributesExtractor.builder(
3538
SpringWebMvcHttpAttributesGetter.INSTANCE, SpringWebMvcNetAttributesGetter.INSTANCE);
3639

40+
@Nullable
41+
private Function<
42+
SpanNameExtractor<HttpServletRequest>,
43+
? extends SpanNameExtractor<? super HttpServletRequest>>
44+
spanNameExtractorTransformer;
45+
3746
SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) {
3847
this.openTelemetry = openTelemetry;
3948
}
@@ -71,6 +80,17 @@ public SpringWebMvcTelemetryBuilder setCapturedResponseHeaders(List<String> resp
7180
return this;
7281
}
7382

83+
/** Sets custom {@link SpanNameExtractor} via transform function. */
84+
@CanIgnoreReturnValue
85+
public SpringWebMvcTelemetryBuilder setSpanNameExtractor(
86+
Function<
87+
SpanNameExtractor<HttpServletRequest>,
88+
? extends SpanNameExtractor<? super HttpServletRequest>>
89+
spanNameExtractor) {
90+
this.spanNameExtractorTransformer = spanNameExtractor;
91+
return this;
92+
}
93+
7494
/**
7595
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
7696
*
@@ -98,11 +118,16 @@ public SpringWebMvcTelemetry build() {
98118
SpringWebMvcHttpAttributesGetter httpAttributesGetter =
99119
SpringWebMvcHttpAttributesGetter.INSTANCE;
100120

121+
SpanNameExtractor<HttpServletRequest> originalSpanNameExtractor =
122+
HttpSpanNameExtractor.create(httpAttributesGetter);
123+
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor;
124+
if (spanNameExtractorTransformer != null) {
125+
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);
126+
}
127+
101128
Instrumenter<HttpServletRequest, HttpServletResponse> instrumenter =
102129
Instrumenter.<HttpServletRequest, HttpServletResponse>builder(
103-
openTelemetry,
104-
INSTRUMENTATION_NAME,
105-
HttpSpanNameExtractor.create(httpAttributesGetter))
130+
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
106131
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
107132
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
108133
.addAttributesExtractors(additionalExtractors)

0 commit comments

Comments
 (0)