Skip to content

Commit b00858f

Browse files
authored
Implement ExtendedTextMapGetter in http server instrumentations (#13053)
1 parent 69bcebd commit b00858f

File tree

24 files changed

+242
-75
lines changed

24 files changed

+242
-75
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.internal;
7+
8+
import java.util.Collections;
9+
import java.util.Enumeration;
10+
import java.util.Iterator;
11+
import javax.annotation.Nullable;
12+
13+
/**
14+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
15+
* any time.
16+
*/
17+
public final class EnumerationUtil {
18+
19+
public static <E> Iterator<E> asIterator(@Nullable Enumeration<E> enumeration) {
20+
if (enumeration == null) {
21+
return Collections.emptyIterator();
22+
}
23+
return new Iterator<E>() {
24+
@Override
25+
public boolean hasNext() {
26+
return enumeration.hasMoreElements();
27+
}
28+
29+
@Override
30+
public E next() {
31+
return enumeration.nextElement();
32+
}
33+
};
34+
}
35+
36+
private EnumerationUtil() {}
37+
}

instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerHeaders.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77

88
import akka.http.javadsl.model.HttpHeader;
99
import akka.http.scaladsl.model.HttpRequest;
10-
import io.opentelemetry.context.propagation.TextMapGetter;
10+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
11+
import java.util.ArrayList;
12+
import java.util.Iterator;
13+
import java.util.List;
14+
import java.util.Locale;
1115
import java.util.Optional;
1216
import java.util.stream.Collectors;
1317
import java.util.stream.StreamSupport;
1418

15-
enum AkkaHttpServerHeaders implements TextMapGetter<HttpRequest> {
19+
enum AkkaHttpServerHeaders implements ExtendedTextMapGetter<HttpRequest> {
1620
INSTANCE;
1721

1822
@Override
@@ -27,4 +31,16 @@ public String get(HttpRequest carrier, String key) {
2731
Optional<HttpHeader> header = carrier.getHeader(key);
2832
return header.map(HttpHeader::value).orElse(null);
2933
}
34+
35+
@Override
36+
public Iterator<String> getAll(HttpRequest carrier, String key) {
37+
String headerName = key.toLowerCase(Locale.ROOT);
38+
List<String> result = new ArrayList<>();
39+
for (HttpHeader header : carrier.getHeaders()) {
40+
if (header.is(headerName)) {
41+
result.add(header.value());
42+
}
43+
}
44+
return result.iterator();
45+
}
3046
}

instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/internal/RequestContextGetter.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
import com.linecorp.armeria.server.ServiceRequestContext;
99
import io.netty.util.AsciiString;
10-
import io.opentelemetry.context.propagation.TextMapGetter;
10+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
1111
import java.util.Collections;
12+
import java.util.Iterator;
1213
import java.util.stream.Collectors;
1314
import javax.annotation.Nullable;
1415

15-
enum RequestContextGetter implements TextMapGetter<ServiceRequestContext> {
16+
enum RequestContextGetter implements ExtendedTextMapGetter<ServiceRequestContext> {
1617
INSTANCE;
1718

1819
@Override
@@ -33,4 +34,12 @@ public String get(@Nullable ServiceRequestContext carrier, String key) {
3334
}
3435
return carrier.request().headers().get(key);
3536
}
37+
38+
@Override
39+
public Iterator<String> getAll(@Nullable ServiceRequestContext carrier, String key) {
40+
if (carrier == null) {
41+
return Collections.emptyIterator();
42+
}
43+
return carrier.request().headers().valueIterator(key);
44+
}
3645
}

instrumentation/grizzly-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/HttpRequestHeadersGetter.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55

66
package io.opentelemetry.javaagent.instrumentation.grizzly;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
9+
import java.util.Iterator;
910
import org.glassfish.grizzly.http.HttpRequestPacket;
1011

11-
enum HttpRequestHeadersGetter implements TextMapGetter<HttpRequestPacket> {
12+
enum HttpRequestHeadersGetter implements ExtendedTextMapGetter<HttpRequestPacket> {
1213
INSTANCE;
1314

1415
@Override
@@ -20,4 +21,9 @@ public Iterable<String> keys(HttpRequestPacket request) {
2021
public String get(HttpRequestPacket request, String key) {
2122
return request.getHeader(key);
2223
}
24+
25+
@Override
26+
public Iterator<String> getAll(HttpRequestPacket request, String key) {
27+
return request.getHeaders().values(key).iterator();
28+
}
2329
}

instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12TextMapGetter.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55

66
package io.opentelemetry.javaagent.instrumentation.jetty.v12_0;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
9+
import io.opentelemetry.instrumentation.api.internal.EnumerationUtil;
10+
import java.util.Iterator;
911
import org.eclipse.jetty.server.Request;
1012

11-
enum Jetty12TextMapGetter implements TextMapGetter<Request> {
13+
enum Jetty12TextMapGetter implements ExtendedTextMapGetter<Request> {
1214
INSTANCE;
1315

1416
@Override
@@ -20,4 +22,9 @@ public Iterable<String> keys(Request carrier) {
2022
public String get(Request carrier, String key) {
2123
return carrier.getHeaders().get(key);
2224
}
25+
26+
@Override
27+
public Iterator<String> getAll(Request carrier, String key) {
28+
return EnumerationUtil.asIterator(carrier.getHeaders().getValues(key));
29+
}
2330
}

instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/ApplicationRequestGetter.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
package io.opentelemetry.instrumentation.ktor.v1_0
77

88
import io.ktor.request.*
9-
import io.opentelemetry.context.propagation.TextMapGetter
9+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter
10+
import java.util.Collections
1011

11-
internal object ApplicationRequestGetter : TextMapGetter<ApplicationRequest> {
12+
internal object ApplicationRequestGetter : ExtendedTextMapGetter<ApplicationRequest> {
1213
override fun keys(carrier: ApplicationRequest): Iterable<String> = carrier.headers.names()
1314

1415
override fun get(carrier: ApplicationRequest?, name: String): String? = carrier?.headers?.get(name)
16+
17+
override fun getAll(carrier: ApplicationRequest?, name: String): Iterator<String> = carrier?.headers?.getAll(name)?.iterator() ?: Collections.emptyIterator()
1518
}

instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/ApplicationRequestGetter.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
package io.opentelemetry.instrumentation.ktor.v2_0.common
77

88
import io.ktor.server.request.*
9-
import io.opentelemetry.context.propagation.TextMapGetter
9+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter
10+
import java.util.Collections
1011

11-
internal object ApplicationRequestGetter : TextMapGetter<ApplicationRequest> {
12+
internal object ApplicationRequestGetter : ExtendedTextMapGetter<ApplicationRequest> {
1213
override fun keys(carrier: ApplicationRequest): Iterable<String> = carrier.headers.names()
1314

1415
override fun get(carrier: ApplicationRequest?, name: String): String? = carrier?.headers?.get(name)
16+
17+
override fun getAll(carrier: ApplicationRequest?, name: String): Iterator<String> = carrier?.headers?.getAll(name)?.iterator() ?: Collections.emptyIterator()
1518
}

instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherRequestGetter.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55

66
package io.opentelemetry.javaagent.instrumentation.liberty.dispatcher;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
9+
import java.util.Iterator;
910

10-
enum LibertyDispatcherRequestGetter implements TextMapGetter<LibertyRequest> {
11+
enum LibertyDispatcherRequestGetter implements ExtendedTextMapGetter<LibertyRequest> {
1112
INSTANCE;
1213

1314
@Override
@@ -19,4 +20,9 @@ public Iterable<String> keys(LibertyRequest carrier) {
1920
public String get(LibertyRequest carrier, String key) {
2021
return carrier.getHeaderValue(key);
2122
}
23+
24+
@Override
25+
public Iterator<String> getAll(LibertyRequest carrier, String key) {
26+
return carrier.getHeaderValues(key).iterator();
27+
}
2228
}

instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/NettyHeadersGetter.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55

66
package io.opentelemetry.javaagent.instrumentation.netty.v3_8.server;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
99
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.HttpRequestAndChannel;
10+
import java.util.Iterator;
1011
import javax.annotation.Nullable;
1112

12-
enum NettyHeadersGetter implements TextMapGetter<HttpRequestAndChannel> {
13+
enum NettyHeadersGetter implements ExtendedTextMapGetter<HttpRequestAndChannel> {
1314
INSTANCE;
1415

1516
@Override
@@ -22,4 +23,9 @@ public Iterable<String> keys(HttpRequestAndChannel requestAndChannel) {
2223
public String get(@Nullable HttpRequestAndChannel requestAndChannel, String s) {
2324
return requestAndChannel.request().headers().get(s);
2425
}
26+
27+
@Override
28+
public Iterator<String> getAll(@Nullable HttpRequestAndChannel carrier, String key) {
29+
return carrier.request().headers().getAll(key).iterator();
30+
}
2531
}

instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/server/HttpRequestHeadersGetter.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@
55

66
package io.opentelemetry.instrumentation.netty.v4.common.internal.server;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
99
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
10+
import java.util.Collections;
11+
import java.util.Iterator;
12+
import java.util.List;
1013
import javax.annotation.Nullable;
1114

1215
/**
1316
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
1417
* any time.
1518
*/
16-
public enum HttpRequestHeadersGetter implements TextMapGetter<HttpRequestAndChannel> {
19+
public enum HttpRequestHeadersGetter implements ExtendedTextMapGetter<HttpRequestAndChannel> {
1720
INSTANCE;
1821

1922
@Override
@@ -26,4 +29,10 @@ public Iterable<String> keys(HttpRequestAndChannel carrier) {
2629
public String get(@Nullable HttpRequestAndChannel carrier, String key) {
2730
return carrier.request().headers().get(key);
2831
}
32+
33+
@Override
34+
public Iterator<String> getAll(@Nullable HttpRequestAndChannel carrier, String key) {
35+
List<String> list = carrier.request().headers().getAll(key);
36+
return list != null ? list.iterator() : Collections.emptyIterator();
37+
}
2938
}

instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoHttpServerHeaders.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55

66
package io.opentelemetry.javaagent.instrumentation.pekkohttp.v1_0.server;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
9+
import java.util.ArrayList;
10+
import java.util.Iterator;
11+
import java.util.List;
12+
import java.util.Locale;
913
import java.util.Optional;
1014
import java.util.stream.Collectors;
1115
import java.util.stream.StreamSupport;
1216
import org.apache.pekko.http.javadsl.model.HttpHeader;
1317
import org.apache.pekko.http.scaladsl.model.HttpRequest;
1418

15-
enum PekkoHttpServerHeaders implements TextMapGetter<HttpRequest> {
19+
enum PekkoHttpServerHeaders implements ExtendedTextMapGetter<HttpRequest> {
1620
INSTANCE;
1721

1822
@Override
@@ -27,4 +31,16 @@ public String get(HttpRequest carrier, String key) {
2731
Optional<HttpHeader> header = carrier.getHeader(key);
2832
return header.map(HttpHeader::value).orElse(null);
2933
}
34+
35+
@Override
36+
public Iterator<String> getAll(HttpRequest carrier, String key) {
37+
String headerName = key.toLowerCase(Locale.ROOT);
38+
List<String> result = new ArrayList<>();
39+
for (HttpHeader header : carrier.getHeaders()) {
40+
if (header.is(headerName)) {
41+
result.add(header.value());
42+
}
43+
}
44+
return result.iterator();
45+
}
3046
}

instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/internal/RatpackGetter.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55

66
package io.opentelemetry.instrumentation.ratpack.v1_7.internal;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
9+
import java.util.Collections;
10+
import java.util.Iterator;
911
import javax.annotation.Nullable;
1012
import ratpack.http.Request;
1113

1214
/**
1315
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
1416
* any time.
1517
*/
16-
enum RatpackGetter implements TextMapGetter<Request> {
18+
enum RatpackGetter implements ExtendedTextMapGetter<Request> {
1719
INSTANCE;
1820

1921
@Override
@@ -29,4 +31,12 @@ public String get(@Nullable Request request, String key) {
2931
}
3032
return request.getHeaders().get(key);
3133
}
34+
35+
@Override
36+
public Iterator<String> getAll(@Nullable Request request, String key) {
37+
if (request == null) {
38+
return Collections.emptyIterator();
39+
}
40+
return request.getHeaders().getAll(key).iterator();
41+
}
3242
}

instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletHeadersGetter.java

+14-9
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55

66
package io.opentelemetry.instrumentation.restlet.v1_1.internal;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
9-
import java.util.Locale;
8+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
9+
import java.util.Iterator;
10+
import java.util.stream.Collectors;
1011
import org.restlet.data.Form;
1112
import org.restlet.data.Message;
13+
import org.restlet.data.Parameter;
1214
import org.restlet.data.Request;
1315

14-
enum RestletHeadersGetter implements TextMapGetter<Request> {
16+
enum RestletHeadersGetter implements ExtendedTextMapGetter<Request> {
1517
INSTANCE;
1618

1719
@Override
@@ -21,14 +23,17 @@ public Iterable<String> keys(Request carrier) {
2123

2224
@Override
2325
public String get(Request carrier, String key) {
24-
2526
Form headers = getHeaders(carrier);
27+
return headers.getFirstValue(key, true);
28+
}
2629

27-
String value = headers.getFirstValue(key);
28-
if (value != null) {
29-
return value;
30-
}
31-
return headers.getFirstValue(key.toLowerCase(Locale.ROOT));
30+
@Override
31+
public Iterator<String> getAll(Request carrier, String key) {
32+
Form headers = getHeaders(carrier);
33+
return headers.subList(key, true).stream()
34+
.map(Parameter::getValue)
35+
.collect(Collectors.toList())
36+
.iterator();
3237
}
3338

3439
static Form getHeaders(Message carrier) {

0 commit comments

Comments
 (0)