Skip to content

Commit

Permalink
Extract HTTP request & response content length from headers (open-tel…
Browse files Browse the repository at this point in the history
…emetry#6415)

* Extract HTTP request & response content length from headers

* remove unused method

* fix camel tests

* fix google http client tests

* fix HttpUrlConnection tests

* fix k8s and jaxrs tests

* fix aws tests

* actually fix aws tests 🤞

* fix elasticsearch tests

* fix ratpack tests

* fix spring webflux tests

* fix vertx tests

* fix reactor netty tests
  • Loading branch information
Mateusz Rzeszutek authored Aug 5, 2022
1 parent 6b1d415 commit b2c90c7
Show file tree
Hide file tree
Showing 81 changed files with 171 additions and 746 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@ public void onEnd(
@Nullable Throwable error) {

internalSet(
attributes,
SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH,
getter.requestContentLength(request, response));
attributes, SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH, requestContentLength(request));

if (response != null) {
Integer statusCode = getter.statusCode(request, response);
Expand All @@ -71,7 +69,7 @@ public void onEnd(
internalSet(
attributes,
SemanticAttributes.HTTP_RESPONSE_CONTENT_LENGTH,
getter.responseContentLength(request, response));
responseContentLength(request, response));

for (String name : capturedResponseHeaders) {
List<String> values = getter.responseHeader(request, response, name);
Expand All @@ -87,8 +85,32 @@ private String userAgent(REQUEST request) {
return firstHeaderValue(getter.requestHeader(request, "user-agent"));
}

@Nullable
private Long requestContentLength(REQUEST request) {
return parseNumber(firstHeaderValue(getter.requestHeader(request, "content-length")));
}

@Nullable
private Long responseContentLength(REQUEST request, RESPONSE response) {
return parseNumber(
firstHeaderValue(getter.responseHeader(request, response, "content-length")));
}

@Nullable
static String firstHeaderValue(List<String> values) {
return values.isEmpty() ? null : values.get(0);
}

@Nullable
private static Long parseNumber(@Nullable String number) {
if (number == null) {
return null;
}
try {
return Long.parseLong(number);
} catch (NumberFormatException e) {
// not a number
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,15 @@ public interface HttpCommonAttributesGetter<REQUEST, RESPONSE> {
*
* <p>This is called from {@link Instrumenter#end(Context, Object, Object, Throwable)}, whether
* {@code response} is {@code null} or not.
*
* @deprecated Request content length is now being calculated based on the request headers. This
* method is deprecated and will be removed in the next release.
*/
@Deprecated
@Nullable
Long requestContentLength(REQUEST request, @Nullable RESPONSE response);
default Long requestContentLength(REQUEST request, @Nullable RESPONSE response) {
throw new UnsupportedOperationException("This method is deprecated and will be removed");
}

/**
* Extracts the {@code http.request_content_length_uncompressed} span attribute.
Expand Down Expand Up @@ -66,9 +72,15 @@ default Long requestContentLengthUncompressed(REQUEST request, @Nullable RESPONS
*
* <p>This is called from {@link Instrumenter#end(Context, Object, Object, Throwable)}, only when
* {@code response} is non-{@code null}.
*
* @deprecated Request content length is now being calculated based on the request headers. This
* method is deprecated and will be removed in the next release.
*/
@Deprecated
@Nullable
Long responseContentLength(REQUEST request, RESPONSE response);
default Long responseContentLength(REQUEST request, RESPONSE response) {
throw new UnsupportedOperationException("This method is deprecated and will be removed");
}

/**
* Extracts the {@code http.response_content_length_uncompressed} span attribute.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,6 @@ public List<String> requestHeader(Map<String, String> request, String name) {
return value == null ? emptyList() : asList(value.split(","));
}

@Override
public Long requestContentLength(Map<String, String> request, Map<String, String> response) {
String value = request.get("requestContentLength");
return value == null ? null : Long.parseLong(value);
}

@Override
public Integer statusCode(Map<String, String> request, Map<String, String> response) {
return Integer.parseInt(response.get("statusCode"));
Expand All @@ -58,12 +52,6 @@ public String flavor(Map<String, String> request, Map<String, String> response)
return request.get("flavor");
}

@Override
public Long responseContentLength(Map<String, String> request, Map<String, String> response) {
String value = response.get("responseContentLength");
return value == null ? null : Long.parseLong(value);
}

@Override
public List<String> responseHeader(
Map<String, String> request, Map<String, String> response, String name) {
Expand All @@ -77,14 +65,14 @@ void normal() {
Map<String, String> request = new HashMap<>();
request.put("method", "POST");
request.put("url", "https://github.com");
request.put("requestContentLength", "10");
request.put("header.content-length", "10");
request.put("flavor", "http/2");
request.put("header.user-agent", "okhttp 3.x");
request.put("header.custom-request-header", "123,456");

Map<String, String> response = new HashMap<>();
response.put("statusCode", "202");
response.put("responseContentLength", "20");
response.put("header.content-length", "20");
response.put("header.custom-response-header", "654,321");

HttpClientAttributesExtractor<Map<String, String>, Map<String, String>> extractor =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,6 @@ public List<String> requestHeader(Map<String, String> request, String name) {
return values == null ? emptyList() : asList(values.split(","));
}

@Override
public Long requestContentLength(Map<String, String> request, Map<String, String> response) {
String value = request.get("requestContentLength");
return value == null ? null : Long.parseLong(value);
}

@Override
public Integer statusCode(Map<String, String> request, Map<String, String> response) {
String value = response.get("statusCode");
Expand All @@ -75,12 +69,6 @@ public String flavor(Map<String, String> request) {
return request.get("flavor");
}

@Override
public Long responseContentLength(Map<String, String> request, Map<String, String> response) {
String value = response.get("responseContentLength");
return value == null ? null : Long.parseLong(value);
}

@Override
public List<String> responseHeader(
Map<String, String> request, Map<String, String> response, String name) {
Expand All @@ -96,7 +84,7 @@ void normal() {
request.put("url", "https://github.com");
request.put("target", "/repositories/1");
request.put("scheme", "http");
request.put("requestContentLength", "10");
request.put("header.content-length", "10");
request.put("flavor", "http/2");
request.put("route", "/repositories/{id}");
request.put("serverName", "server");
Expand All @@ -107,7 +95,7 @@ void normal() {

Map<String, String> response = new HashMap<>();
response.put("statusCode", "202");
response.put("responseContentLength", "20");
response.put("header.content-length", "20");
response.put("header.custom-response-header", "654,321");

Function<Context, String> routeFromContext = ctx -> "/repositories/{repoId}";
Expand Down Expand Up @@ -147,11 +135,11 @@ void normal() {
entry(SemanticAttributes.HTTP_ROUTE, "/repositories/{repoId}"),
entry(SemanticAttributes.HTTP_SERVER_NAME, "server"),
entry(SemanticAttributes.HTTP_CLIENT_IP, "1.1.1.1"),
entry(SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH, 10L),
entry(
AttributeKey.stringArrayKey("http.request.header.custom_request_header"),
asList("123", "456")),
entry(SemanticAttributes.HTTP_SERVER_NAME, "server"),
entry(SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH, 10L),
entry(SemanticAttributes.HTTP_FLAVOR, "http/2"),
entry(SemanticAttributes.HTTP_STATUS_CODE, 202L),
entry(SemanticAttributes.HTTP_RESPONSE_CONTENT_LENGTH, 20L),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,6 @@ public List<String> requestHeader(Void unused, String name) {
return Collections.emptyList();
}

@Override
public Long requestContentLength(Void unused, @Nullable Void unused2) {
return 100L;
}

@Override
public String flavor(Void unused, @Nullable Void unused2) {
return SemanticAttributes.HttpFlavorValues.HTTP_2_0;
Expand All @@ -95,11 +90,6 @@ public Integer statusCode(Void unused, Void unused2) {
return 200;
}

@Override
public Long responseContentLength(Void unused, Void unused2) {
return 100L;
}

@Override
public List<String> responseHeader(Void unused, Void unused2, String name) {
return Collections.emptyList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,23 +35,11 @@ public List<String> requestHeader(HttpRequest httpRequest, String name) {
return AkkaHttpUtil.requestHeader(httpRequest, name);
}

@Override
@Nullable
public Long requestContentLength(HttpRequest httpRequest, @Nullable HttpResponse httpResponse) {
return null;
}

@Override
public Integer statusCode(HttpRequest httpRequest, HttpResponse httpResponse) {
return httpResponse.status().intValue();
}

@Override
@Nullable
public Long responseContentLength(HttpRequest httpRequest, HttpResponse httpResponse) {
return null;
}

@Override
public List<String> responseHeader(
HttpRequest httpRequest, HttpResponse httpResponse, String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,11 @@ public List<String> requestHeader(HttpRequest request, String name) {
return AkkaHttpUtil.requestHeader(request, name);
}

@Override
@Nullable
public Long requestContentLength(HttpRequest request, @Nullable HttpResponse httpResponse) {
return null;
}

@Override
public Integer statusCode(HttpRequest request, HttpResponse httpResponse) {
return httpResponse.status().intValue();
}

@Override
@Nullable
public Long responseContentLength(HttpRequest request, HttpResponse httpResponse) {
return null;
}

@Override
public List<String> responseHeader(HttpRequest request, HttpResponse httpResponse, String name) {
return AkkaHttpUtil.responseHeader(httpResponse, name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class AwsSpan {
"http.url" String
"net.peer.name" String
"net.transport" IP_TCP
"net.peer.port" { it == null || Number }
"net.peer.port" { it == null || it instanceof Number }
}
}
}
Expand All @@ -60,9 +60,11 @@ class AwsSpan {
"http.method" "POST"
"http.status_code" 200
"http.url" String
"http.user_agent" { it == null || String }
"http.user_agent" { it == null || it instanceof String }
"http.request_content_length" { it == null || it instanceof Long }
"http.response_content_length" { it == null || it instanceof Long }
"net.peer.name" String
"net.peer.port" { it == null || Number }
"net.peer.port" { it == null || it instanceof Number }
"net.transport" IP_TCP
}
}
Expand All @@ -88,7 +90,7 @@ class AwsSpan {
"http.status_code" 200
"http.url" String
"net.peer.name" String
"net.peer.port" { it == null || Number }
"net.peer.port" { it == null || it instanceof Number }
"net.transport" IP_TCP
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,6 @@ public List<String> requestHeader(ApacheHttpClientRequest request, String name)
return request.getHeader(name);
}

@Override
@Nullable
public Long requestContentLength(
ApacheHttpClientRequest request, @Nullable HttpResponse response) {
return null;
}

@Override
@Nullable
public Integer statusCode(ApacheHttpClientRequest request, HttpResponse response) {
Expand All @@ -51,12 +44,6 @@ public String flavor(ApacheHttpClientRequest request, @Nullable HttpResponse res
return request.getFlavor();
}

@Override
@Nullable
public Long responseContentLength(ApacheHttpClientRequest request, HttpResponse response) {
return null;
}

@Override
public List<String> responseHeader(
ApacheHttpClientRequest request, HttpResponse response, String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,6 @@ public List<String> requestHeader(HttpMethod request, String name) {
return header == null ? emptyList() : singletonList(header.getValue());
}

@Override
@Nullable
public Long requestContentLength(HttpMethod request, @Nullable HttpMethod response) {
return null;
}

@Override
@Nullable
public Integer statusCode(HttpMethod request, HttpMethod response) {
Expand All @@ -61,12 +55,6 @@ public String flavor(HttpMethod request, @Nullable HttpMethod response) {
return null;
}

@Override
@Nullable
public Long responseContentLength(HttpMethod request, HttpMethod response) {
return null;
}

@Override
public List<String> responseHeader(HttpMethod request, HttpMethod response, String name) {
Header header = response.getResponseHeader(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,6 @@ public List<String> requestHeader(ApacheHttpClientRequest request, String name)
return request.getHeader(name);
}

@Override
@Nullable
public Long requestContentLength(
ApacheHttpClientRequest request, @Nullable HttpResponse response) {
return null;
}

@Override
public Integer statusCode(ApacheHttpClientRequest request, HttpResponse response) {
return response.getStatusLine().getStatusCode();
Expand All @@ -48,12 +41,6 @@ public String flavor(ApacheHttpClientRequest request, @Nullable HttpResponse res
return request.getFlavor();
}

@Override
@Nullable
public Long responseContentLength(ApacheHttpClientRequest request, HttpResponse response) {
return null;
}

@Override
public List<String> responseHeader(
ApacheHttpClientRequest request, HttpResponse response, String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,6 @@ public List<String> requestHeader(ApacheHttpClientRequest request, String name)
return request.getHeader(name);
}

@Override
@Nullable
public Long requestContentLength(
ApacheHttpClientRequest request, @Nullable HttpResponse response) {
return null;
}

@Override
public Integer statusCode(ApacheHttpClientRequest request, HttpResponse response) {
return response.getStatusLine().getStatusCode();
Expand All @@ -50,12 +43,6 @@ public String flavor(ApacheHttpClientRequest request, @Nullable HttpResponse res
return request.getFlavor();
}

@Override
@Nullable
public Long responseContentLength(ApacheHttpClientRequest request, HttpResponse response) {
return null;
}

@Override
public List<String> responseHeader(
ApacheHttpClientRequest request, HttpResponse response, String name) {
Expand Down
Loading

0 comments on commit b2c90c7

Please sign in to comment.