Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Handle multi-value tagging for client spans #7943

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,21 @@ public AgentSpan onRequest(final AgentSpan span, final REQUEST request) {

ssrfIastCheck(request);

System.out.println("hi im here");
if (CLIENT_TAG_HEADERS) {
System.out.println("now im here");
for (Map.Entry<String, String> headerTag :
traceConfig(span).getRequestHeaderTags().entrySet()) {
System.out.println("now im inside");
String headerValue = getRequestHeader(request, headerTag.getKey());
if (null != headerValue) {
System.out.println("now im inside inside");
System.out.println("headerTag: " + headerTag.getValue());
System.out.println("headerValue: " + headerValue);
span.setTag(headerTag.getValue(), headerValue);
}
}
System.out.println("now im outside");
}
}
return span;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
Expand Down Expand Up @@ -53,12 +54,34 @@ protected int status(final HttpContext context) {
return 0;
}

// RUN ./gradlew :dd-java-agent:instrumentation:apache-httpasyncclient-4:test --tests
// "ApacheHttpAsyncClientV0Test"
@Override
protected String getRequestHeader(HttpUriRequest request, String headerName) {
System.out.println("HEADERNAME: " + headerName);
System.out.println(
"ALL REQUEST HEADERS: "
+ Arrays.toString(request.getAllHeaders())); // not printing first request header
System.out.println(
"SPECIFIC REQUEST HEADERS: " + Arrays.toString(request.getHeaders(headerName)));
System.out.println("FIRST REQUEST HEADER: " + request.getFirstHeader(headerName));

Header header = request.getFirstHeader(headerName);
if (header != null) {
System.out.println("RETURNING " + header.getValue());
return header.getValue();

// Header[] headers = request.getHeaders(headerName);
// List<String> values = new ArrayList<>();
// if (headers.length > 0) {
// for (Header header : headers) {
// values.add(header.getValue());
// }
// System.out.println("RETURNING " + values);
// return String.join(", ", values);

}
System.out.println("RETURNING NULL");
return null;
}

Expand All @@ -69,6 +92,15 @@ protected String getResponseHeader(HttpContext context, String headerName) {
Header header = ((HttpResponse) responseObject).getFirstHeader(headerName);
if (header != null) {
return header.getValue();

// Header[] headers = ((HttpResponse) responseObject).getHeaders(headerName);
// List<String> values = new ArrayList<>();
// if (headers.length > 0) {
// for (Header header : headers) {
// values.add(header.getValue());
// }
// return String.join(", ", values);

}
}
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
Expand Down Expand Up @@ -46,18 +48,26 @@ protected int status(final HttpResponse httpResponse) {

@Override
protected String getRequestHeader(HttpUriRequest request, String headerName) {
Header header = request.getFirstHeader(headerName);
if (null != header) {
return header.getValue();
Header[] headers = request.getHeaders(headerName);
List<String> values = new ArrayList<>();
if (null != headers) {
for (Header header : headers) {
values.add(header.getValue());
}
return String.join(", ", values);
}
return null;
}

@Override
protected String getResponseHeader(HttpResponse response, String headerName) {
Header header = response.getFirstHeader(headerName);
if (null != header) {
return header.getValue();
Header[] headers = response.getHeaders(headerName);
List<String> values = new ArrayList<>();
if (headers.length > 0) {
for (Header header : headers) {
values.add(header.getValue());
}
return String.join(", ", values);
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.HttpRequest;
import org.apache.hc.core5.http.HttpResponse;
Expand Down Expand Up @@ -49,19 +52,37 @@ protected int status(final HttpResponse httpResponse) {

@Override
protected String getRequestHeader(HttpRequest request, String headerName) {
Header header = request.getFirstHeader(headerName);
if (null != header) {
return header.getValue();
System.out.println("HEADERNAME: " + headerName);
System.out.println(
"SPECIFIC REQUEST HEADERS: " + Arrays.toString(request.getHeaders(headerName)));
Header[] headers = request.getHeaders(headerName);
List<String> values = new ArrayList<>();
if (null != headers) {
for (Header header : headers) {
values.add(header.getValue());
}
System.out.println("RETURNING " + String.join(",", values));
return String.join(",", values);
}
System.out.println("RETURNING NULL");
return null;
}

@Override
protected String getResponseHeader(HttpResponse response, String headerName) {
Header header = response.getFirstHeader(headerName);
if (null != header) {
return header.getValue();
System.out.println("HEADERNAME: " + headerName);
System.out.println(
"SPECIFIC RESPONSE HEADERS: " + Arrays.toString(response.getHeaders(headerName)));
Header[] headers = response.getHeaders(headerName);
List<String> values = new ArrayList<>();
if (headers.length > 0) {
for (Header header : headers) {
values.add(header.getValue());
}
System.out.println("RETURNING " + String.join(",", values));
return String.join(",", values);
}
System.out.println("RETURNING NULL");
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.apache.hc.client5.http.async.methods.SimpleHttpRequests
import org.apache.hc.client5.http.config.RequestConfig
import org.apache.hc.client5.http.impl.async.HttpAsyncClients
import org.apache.hc.core5.http.HttpRequest
import org.apache.hc.core5.http.message.BasicHeader
import spock.lang.AutoCleanup
import spock.lang.Shared

Expand Down Expand Up @@ -55,6 +56,21 @@ abstract class ApacheHttpAsyncClient5Test<T extends HttpRequest> extends HttpCli
callback?.call()
return response.code
}

@Override
int doRequest(String method, URI uri, String[] headers, String body, Closure callback) {
def request = SimpleHttpRequests.create(method, uri)
request.setConfig(RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS).build())
for (String header : headers) {
String[] keyVal = header.split(":")
request.addHeader(new BasicHeader(keyVal[0], keyVal[1]))
}

def future = client.execute(request, null)
def response = future.get(READ_TIMEOUT_MS, TimeUnit.MILLISECONDS)
callback?.call()
return response.code
}
}

class ApacheHttpAsyncClient5NamingV0ForkedTest extends ApacheHttpAsyncClient5Test implements TestingGenericHttpNamingConventions.ClientV0 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,23 @@ class ApacheHttpClientResponseHandlerTest extends HttpClientTest implements Test
return status
}

@Override
int doRequest(String method, URI uri, String[] headers, String body, Closure callback) {
def request = new BasicClassicHttpRequest(method, uri)
for (String header : headers) {
String[] keyVal = header.split(":")
request.addHeader(new BasicHeader(keyVal[0], keyVal[1]))
}

CloseableHttpResponse response = null
def status = client.execute(request, handler)

// handler execution is included within the client span, so we can't call the callback there.
callback?.call()

return status
}

@Override
CharSequence component() {
return ApacheHttpClientDecorator.DECORATE.component()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,25 @@ abstract class ApacheHttpClientTest<T extends HttpRequest> extends HttpClientTes
}
}

@Override
int doRequest(String method, URI uri, String[] headers, String body, Closure callback) {
def request = createRequest(method, uri)
for (String header : headers) {
String[] keyVal = header.split(":")
request.addHeader(new BasicHeader(keyVal[0], keyVal[1]))
}

CloseableHttpResponse response = null
try {
response = executeRequest(request, uri)
callback?.call()
return response.code
}
finally {
response?.close()
}
}

abstract T createRequest(String method, URI uri)

abstract CloseableHttpResponse executeRequest(T request, URI uri)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,12 +450,20 @@ public void set(SdkHttpRequest.Builder carrier, String key, String value) {

@Override
protected String getRequestHeader(SdkHttpRequest request, String headerName) {
return request.firstMatchingHeader(headerName).orElse(null);
List<String> headers = request.headers().get(headerName);
if (!headers.isEmpty()) {
return String.join(", ", headers);
}
return null;
}

@Override
protected String getResponseHeader(SdkHttpResponse response, String headerName) {
return response.firstMatchingHeader(headerName).orElse(null);
List<String> headers = response.headers().get(headerName);
if (!headers.isEmpty()) {
return String.join(", ", headers);
}
return null;
}

private void awsPojoToTags(AgentSpan span, String tagsPrefix, Object pojo) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ protected int status(final Response response) {

@Override
protected String getRequestHeader(Request request, String headerName) {
return request.getHeaders().getFirstValue(headerName);
return request.getHeaders().getJoinedValue(headerName, ", ");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

public class JaxRsClientV1Decorator extends HttpClientDecorator<ClientRequest, ClientResponse> {

Expand Down Expand Up @@ -41,15 +43,23 @@ protected int status(final ClientResponse clientResponse) {

@Override
protected String getRequestHeader(ClientRequest request, String headerName) {
Object headerValue = request.getHeaders().getFirst(headerName);
if (null != headerValue) {
return headerValue.toString();
List<Object> headers = request.getHeaders().get(headerName);
if (!headers.isEmpty()) {
List<String> result = new ArrayList<>();
for (Object header : headers) {
result.add(header.toString());
}
return String.join(", ", result);
}
return null;
}

@Override
protected String getResponseHeader(ClientResponse response, String headerName) {
return response.getHeaders().getFirst(headerName);
List<String> headers = response.getHeaders().get(headerName);
if (!headers.isEmpty()) {
return String.join(", ", headers);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,19 @@ protected int status(final ClientResponse httpResponse) {

@Override
protected String getRequestHeader(ClientRequest request, String headerName) {
return request.headers().getFirst(headerName);
System.out.println("REQUEST HEADERS: " + request.headers().getValuesAsList(headerName));
String result = String.join(",", request.headers().getValuesAsList(headerName));
System.out.println("RESULT: " + result);
return result;
}

@Override
protected String getResponseHeader(ClientResponse response, String headerName) {
return response.headers().asHttpHeaders().getFirst(headerName);
System.out.println(
"RESPONSE HEADERS: " + response.headers().asHttpHeaders().getValuesAsList(headerName));
String result =
String.join(",", response.headers().asHttpHeaders().getValuesAsList(headerName));
System.out.println("RESULT: " + result);
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
Expand Down Expand Up @@ -47,18 +49,26 @@ protected int status(final HttpResponse response) {

@Override
protected String getRequestHeader(HttpRequest request, String headerName) {
Header header = request.getFirstHeader(headerName);
if (null != header) {
return header.getValue();
Header[] headers = request.getHeaders(headerName);
List<String> values = new ArrayList<>();
if (headers.length > 0) {
for (Header header : headers) {
values.add(header.getValue());
}
return String.join(", ", values);
}
return null;
}

@Override
protected String getResponseHeader(HttpResponse response, String headerName) {
Header header = response.getFirstHeader(headerName);
if (null != header) {
return header.getValue();
Header[] headers = response.getHeaders(headerName);
List<String> values = new ArrayList<>();
if (headers.length > 0) {
for (Header header : headers) {
values.add(header.getValue());
}
return String.join(", ", values);
}
return null;
}
Expand Down
Loading