Skip to content

Commit 671b2e9

Browse files
authored
Add library instrumentation for servlet (#15473)
1 parent 5a392fd commit 671b2e9

File tree

134 files changed

+2107
-937
lines changed

Some content is hidden

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

134 files changed

+2107
-937
lines changed

.fossa.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,9 @@ targets:
928928
- type: gradle
929929
path: ./
930930
target: ':instrumentation:servlet:servlet-3.0:javaagent'
931+
- type: gradle
932+
path: ./
933+
target: ':instrumentation:servlet:servlet-3.0:library'
931934
- type: gradle
932935
path: ./
933936
target: ':instrumentation:servlet:servlet-5.0:javaagent'
@@ -939,7 +942,10 @@ targets:
939942
target: ':instrumentation:servlet:servlet-common:javaagent'
940943
- type: gradle
941944
path: ./
942-
target: ':instrumentation:servlet:servlet-javax-common:javaagent'
945+
target: ':instrumentation:servlet:servlet-common:library'
946+
- type: gradle
947+
path: ./
948+
target: ':instrumentation:servlet:servlet-javax-common:library'
943949
- type: gradle
944950
path: ./
945951
target: ':instrumentation:spring:spring-batch-3.0:javaagent'

.github/scripts/check-package-names.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ for dir in $(find instrumentation -name "*.java" | grep library/src/main/java |
1919
if [[ "$module_name" == "oshi" ]]; then
2020
continue
2121
fi
22+
if [[ "$module_name" == "servlet-common" ]]; then
23+
continue
24+
fi
2225

2326
# these are possibly problematic
2427
if [[ "$dir" == "instrumentation/grpc-1.6/library/src/main/java/io/grpc/override" ]]; then

conventions/src/main/kotlin/otel.errorprone-conventions.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ tasks {
136136
// Allow underscore in test-type method names
137137
disable("MemberName")
138138
}
139-
if ((project.path.endsWith(":testing") || name.contains("Test")) && !project.name.equals("custom-checks")) {
139+
if ((project.path.endsWith("testing") || name.contains("Test")) && !project.name.equals("custom-checks")) {
140140
// This check causes too many failures, ignore the ones in tests
141141
disable("OtelCanIgnoreReturnValueSuggester")
142142
disable("OtelInternalJavadoc")

docs/supported-libraries.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ These are the supported libraries and frameworks:
136136
| [RMI](https://docs.oracle.com/en/java/javase/11/docs/api/java.rmi/java/rmi/package-summary.html) | Java 8+ | | [RPC Client Spans], [RPC Server Spans] |
137137
| [RxJava](https://github.com/ReactiveX/RxJava) | 1.0+ | [opentelemetry-rxjava-1.0](../instrumentation/rxjava/rxjava-1.0/library),<br>[opentelemetry-rxjava-2.0](../instrumentation/rxjava/rxjava-2.0/library),<br>[opentelemetry-rxjava-3.0](../instrumentation/rxjava/rxjava-3.0/library),<br>[opentelemetry-rxjava-3.1.1](../instrumentation/rxjava/rxjava-3.1.1/library) | Context propagation |
138138
| [Scala ForkJoinPool](https://www.scala-lang.org/api/2.12.0/scala/concurrent/forkjoin/package$$ForkJoinPool$.html) | 2.8+ | N/A | Context propagation |
139-
| [Servlet](https://javaee.github.io/javaee-spec/javadocs/javax/servlet/package-summary.html) | 2.2+ | N/A | [HTTP Server Spans], [HTTP Server Metrics] |
139+
| [Servlet](https://javaee.github.io/javaee-spec/javadocs/javax/servlet/package-summary.html) | 2.2+ | [opentelemetry-servlet-3.0](../instrumentation/servlet/servlet-3.0/library) | [HTTP Server Spans], [HTTP Server Metrics] |
140140
| [Spark Web Framework](https://github.com/perwendel/spark) | 2.3+ | N/A | Provides `http.route` [2] |
141141
| [Spring Batch](https://spring.io/projects/spring-batch) | 3.0+ (not including 5.0+ yet) | N/A | none |
142142
| [Spring Boot](https://spring.io/projects/spring-boot) | | [opentelemetry-spring-boot-resources](https://opentelemetry.io/docs/zero-code/java/spring-boot/) | none |

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@
66
package io.opentelemetry.instrumentation.api.internal;
77

88
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.api.common.AttributesBuilder;
910
import io.opentelemetry.api.trace.SpanKind;
1011
import io.opentelemetry.context.Context;
1112
import io.opentelemetry.context.propagation.TextMapGetter;
1213
import io.opentelemetry.context.propagation.TextMapSetter;
14+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1315
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1416
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1517
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
18+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
19+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
1620
import java.time.Instant;
21+
import java.util.function.Function;
22+
import java.util.function.UnaryOperator;
1723
import javax.annotation.Nullable;
1824

1925
/**
@@ -85,5 +91,72 @@ InstrumenterBuilder<REQUEST, RESPONSE> propagateOperationListenersToOnEnd(
8591
return builder;
8692
}
8793

94+
public static <REQUESTFROM, RESPONSEFROM, REQUESTTO, RESPONSETO>
95+
UnaryOperator<SpanStatusExtractor<REQUESTTO, RESPONSETO>> convertSpanStatusExtractor(
96+
UnaryOperator<SpanStatusExtractor<REQUESTFROM, RESPONSEFROM>> extractor,
97+
Function<REQUESTFROM, REQUESTTO> requestConverter,
98+
Function<RESPONSEFROM, RESPONSETO> responseConverter,
99+
Function<REQUESTTO, REQUESTFROM> requestReverseConverter,
100+
Function<RESPONSETO, RESPONSEFROM> responseReverseConverter) {
101+
return inputExtractor -> {
102+
SpanStatusExtractor<REQUESTFROM, RESPONSEFROM> outputExtractor =
103+
extractor.apply(
104+
(spanStatusBuilder, requestFrom, responseFrom, error) ->
105+
inputExtractor.extract(
106+
spanStatusBuilder,
107+
requestConverter.apply(requestFrom),
108+
responseFrom == null ? null : responseConverter.apply(responseFrom),
109+
error));
110+
return (spanStatusBuilder, requestTo, responseTo, error) ->
111+
outputExtractor.extract(
112+
spanStatusBuilder,
113+
requestReverseConverter.apply(requestTo),
114+
responseTo == null ? null : responseReverseConverter.apply(responseTo),
115+
error);
116+
};
117+
}
118+
119+
public static <REQUESTFROM, REQUESTTO>
120+
UnaryOperator<SpanNameExtractor<REQUESTTO>> convertSpanNameExtractor(
121+
UnaryOperator<SpanNameExtractor<REQUESTFROM>> extractor,
122+
Function<REQUESTFROM, REQUESTTO> requestConverter,
123+
Function<REQUESTTO, REQUESTFROM> requestReverseConverter) {
124+
return inputExtractor -> {
125+
SpanNameExtractor<REQUESTFROM> outputExtractor =
126+
extractor.apply(
127+
requestFrom -> inputExtractor.extract(requestConverter.apply(requestFrom)));
128+
return requestTo -> outputExtractor.extract(requestReverseConverter.apply(requestTo));
129+
};
130+
}
131+
132+
public static <REQUESTFROM, RESPONSEFROM, REQUESTTO, RESPONSETO>
133+
AttributesExtractor<REQUESTTO, RESPONSETO> convertAttributesExtractor(
134+
AttributesExtractor<REQUESTFROM, RESPONSEFROM> extractor,
135+
Function<REQUESTTO, REQUESTFROM> requestConverter,
136+
Function<RESPONSETO, RESPONSEFROM> responseConverter) {
137+
return new AttributesExtractor<REQUESTTO, RESPONSETO>() {
138+
@Override
139+
public void onStart(
140+
AttributesBuilder attributes, Context parentContext, REQUESTTO requestTo) {
141+
extractor.onStart(attributes, parentContext, requestConverter.apply(requestTo));
142+
}
143+
144+
@Override
145+
public void onEnd(
146+
AttributesBuilder attributes,
147+
Context context,
148+
REQUESTTO requestTo,
149+
@Nullable RESPONSETO responseTo,
150+
@Nullable Throwable error) {
151+
extractor.onEnd(
152+
attributes,
153+
context,
154+
requestConverter.apply(requestTo),
155+
responseConverter.apply(responseTo),
156+
error);
157+
}
158+
};
159+
}
160+
88161
private InstrumenterUtil() {}
89162
}

instrumentation/grails-3.0/javaagent/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ dependencies {
2727
library("org.grails:grails-plugin-url-mappings:$grailsVersion")
2828

2929
testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent"))
30-
testInstrumentation(project(":instrumentation:servlet:servlet-javax-common:javaagent"))
3130
testInstrumentation(project(":instrumentation:tomcat:tomcat-7.0:javaagent"))
3231
testInstrumentation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-3.1:javaagent"))
3332

instrumentation/gwt-2.0/javaagent/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ dependencies {
4545
}
4646

4747
testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent"))
48-
testInstrumentation(project(":instrumentation:servlet:servlet-javax-common:javaagent"))
4948
testInstrumentation(project(":instrumentation:jetty:jetty-8.0:javaagent"))
5049

5150
testImplementation("org.testcontainers:testcontainers-selenium")

instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/javaagent/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ dependencies {
3131

3232
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-annotations:javaagent"))
3333
testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent"))
34-
testInstrumentation(project(":instrumentation:servlet:servlet-javax-common:javaagent"))
3534
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-cxf-3.2:javaagent"))
3635
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-resteasy-3.0:javaagent"))
3736
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-resteasy-3.1:javaagent"))

instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/javaagent/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ dependencies {
4545
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-annotations:javaagent"))
4646

4747
testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent"))
48-
testInstrumentation(project(":instrumentation:servlet:servlet-javax-common:javaagent"))
4948
testInstrumentation(project(":instrumentation:undertow-1.4:javaagent"))
5049
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-cxf-3.2:javaagent"))
5150
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-jersey-2.0:javaagent"))

instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/javaagent/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ dependencies {
4343
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-annotations:javaagent"))
4444

4545
testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent"))
46-
testInstrumentation(project(":instrumentation:servlet:servlet-javax-common:javaagent"))
4746
testInstrumentation(project(":instrumentation:undertow-1.4:javaagent"))
4847
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-cxf-3.2:javaagent"))
4948
testInstrumentation(project(":instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-jersey-2.0:javaagent"))

0 commit comments

Comments
 (0)