From b6118f0397b6ca61b6e1b224821d6ae7066cadeb Mon Sep 17 00:00:00 2001 From: Nikolay Martynov Date: Fri, 27 Jul 2018 10:29:17 -0400 Subject: [PATCH] Apache HTTP Client: add test for redirected request --- .../test/groovy/ApacheHttpClientTest.groovy | 270 ++++++++++-------- 1 file changed, 154 insertions(+), 116 deletions(-) diff --git a/dd-java-agent/instrumentation/apache-httpclient-4.3/src/test/groovy/ApacheHttpClientTest.groovy b/dd-java-agent/instrumentation/apache-httpclient-4.3/src/test/groovy/ApacheHttpClientTest.groovy index 88d2d01b1f..5fbc1d680f 100644 --- a/dd-java-agent/instrumentation/apache-httpclient-4.3/src/test/groovy/ApacheHttpClientTest.groovy +++ b/dd-java-agent/instrumentation/apache-httpclient-4.3/src/test/groovy/ApacheHttpClientTest.groovy @@ -1,10 +1,13 @@ import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.agent.test.ListWriterAssert import datadog.trace.agent.test.RatpackUtils +import datadog.trace.agent.test.TraceAssert import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDTags import io.opentracing.tag.Tags import org.apache.http.HttpResponse import org.apache.http.client.HttpClient +import org.apache.http.client.config.RequestConfig import org.apache.http.client.methods.HttpGet import org.apache.http.impl.client.HttpClientBuilder import org.apache.http.message.BasicHeader @@ -19,151 +22,186 @@ class ApacheHttpClientTest extends AgentTestRunner { @Shared def server = ratpack { handlers { - get { - RatpackUtils.handleDistributedRequest(context) + prefix("success") { + get { + RatpackUtils.handleDistributedRequest(context) - String msg = "

Hello test.

\n" - response.status(200).send(msg) + String msg = "

Hello test.

\n" + response.status(200).send(msg) + } + } + prefix("redirect") { + get { + RatpackUtils.handleDistributedRequest(context) + + redirect(server.address.resolve("/success").toURL().toString()) + } } } } @Shared - int port = server.getAddress().port + int port = server.address.port + @Shared + def successUrl = server.address.resolve("/success") + @Shared + def redirectUrl = server.address.resolve("/redirect") + + final HttpClientBuilder builder = HttpClientBuilder.create() + final HttpClient client = builder.build() def "trace request with propagation"() { setup: - final HttpClientBuilder builder = HttpClientBuilder.create() - - final HttpClient client = builder.build() runUnderTrace("someTrace") { - try { - HttpResponse response = client.execute(new HttpGet(server.getAddress())) - assert response.getStatusLine().getStatusCode() == 200 - } catch (Exception e) { - e.printStackTrace() - throw new RuntimeException(e) - } + HttpResponse response = client.execute(new HttpGet(successUrl)) + assert response.getStatusLine().getStatusCode() == 200 } expect: // one trace on the server, one trace on the client assertTraces(TEST_WRITER, 2) { - trace(0, 1) { - span(0) { - childOf TEST_WRITER[1][2] - serviceName "unnamed-java-app" - operationName "test-http-server" - resourceName "test-http-server" - errored false - tags { - defaultTags() - } - } - } + serverTrace(it, 0, TEST_WRITER[1][2]) trace(1, 3) { - span(0) { - parent() - serviceName "unnamed-java-app" - operationName "someTrace" - resourceName "someTrace" - errored false - tags { - defaultTags() - } - } - span(1) { - childOf span(0) - serviceName "unnamed-java-app" - operationName "apache.http" - resourceName "apache.http" - errored false - tags { - defaultTags() - "$Tags.COMPONENT.key" "apache-httpclient" - } - } - span(2) { - childOf span(1) - serviceName "unnamed-java-app" - operationName "http.request" - resourceName "GET /" - spanType DDSpanTypes.HTTP_CLIENT - errored false - tags { - defaultTags() - "$Tags.HTTP_STATUS.key" 200 - "$Tags.HTTP_URL.key" "http://localhost:$port/" - "$Tags.PEER_HOSTNAME.key" "localhost" - "$Tags.PEER_PORT.key" server.getAddress().port - "$Tags.HTTP_METHOD.key" "GET" - "$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT - "$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT - } - } + outerSpan(it, 0) + clientParentSpan(it, 1, span(0)) + successClientSpan(it, 2, span(1)) + } + } + } + + def "trace redirected request with propagation many redirects allowed"() { + setup: + final RequestConfig.Builder requestConfigBuilder = new RequestConfig.Builder() + requestConfigBuilder.setMaxRedirects(10) + runUnderTrace("someTrace") { + HttpGet request = new HttpGet(redirectUrl) + request.setConfig(requestConfigBuilder.build()) + HttpResponse response = client.execute(request) + assert response.getStatusLine().getStatusCode() == 200 + } + + expect: + // two traces on the server, one trace on the client + assertTraces(TEST_WRITER, 3) { + serverTrace(it, 0, TEST_WRITER[2][3]) + serverTrace(it, 1, TEST_WRITER[2][2]) + trace(2, 4) { + outerSpan(it, 0) + clientParentSpan(it, 1, span(0)) + successClientSpan(it, 2, span(1)) + redirectClientSpan(it, 3, span(1)) + } + } + } + + def "trace redirected request with propagation 1 redirect allowed"() { + setup: + final RequestConfig.Builder requestConfigBuilder = new RequestConfig.Builder() + requestConfigBuilder.setMaxRedirects(1) + runUnderTrace("someTrace") { + HttpGet request = new HttpGet(redirectUrl) + request.setConfig(requestConfigBuilder.build()) + HttpResponse response = client.execute(request) + assert response.getStatusLine().getStatusCode() == 200 + } + + expect: + print(TEST_WRITER) + // two traces on the server, one trace on the client + assertTraces(TEST_WRITER, 3) { + serverTrace(it, 0, TEST_WRITER[2][3]) + serverTrace(it, 1, TEST_WRITER[2][1]) + trace(2, 4) { + outerSpan(it, 0) + // Note: this is kind of an weird order? + successClientSpan(it, 1, span(2)) + clientParentSpan(it, 2, span(0)) + redirectClientSpan(it, 3, span(2)) } } } def "trace request without propagation"() { setup: - final HttpClientBuilder builder = HttpClientBuilder.create() - - final HttpClient client = builder.build() runUnderTrace("someTrace") { - try { - HttpGet request = new HttpGet(server.getAddress()) - request.addHeader(new BasicHeader("is-dd-server", "false")) - HttpResponse response = client.execute(request) - assert response.getStatusLine().getStatusCode() == 200 - } catch (Exception e) { - e.printStackTrace() - throw new RuntimeException(e) - } + HttpGet request = new HttpGet(successUrl) + request.addHeader(new BasicHeader("is-dd-server", "false")) + HttpResponse response = client.execute(request) + assert response.getStatusLine().getStatusCode() == 200 } expect: // only one trace (client). assertTraces(TEST_WRITER, 1) { trace(0, 3) { - span(0) { - parent() - serviceName "unnamed-java-app" - operationName "someTrace" - resourceName "someTrace" - errored false - tags { - defaultTags() - } - } - span(1) { - childOf span(0) - serviceName "unnamed-java-app" - operationName "apache.http" - resourceName "apache.http" - errored false - tags { - defaultTags() - "$Tags.COMPONENT.key" "apache-httpclient" - } - } - span(2) { - childOf span(1) - serviceName "unnamed-java-app" - operationName "http.request" - resourceName "GET /" - spanType DDSpanTypes.HTTP_CLIENT - errored false - tags { - defaultTags() - "$Tags.HTTP_STATUS.key" 200 - "$Tags.HTTP_URL.key" "http://localhost:$port/" - "$Tags.PEER_HOSTNAME.key" "localhost" - "$Tags.PEER_PORT.key" server.getAddress().port - "$Tags.HTTP_METHOD.key" "GET" - "$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT - "$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT - } + outerSpan(it, 0) + clientParentSpan(it, 1, span(0)) + successClientSpan(it, 2, span(1)) + } + } + } + + def serverTrace(ListWriterAssert writer, index, parent) { + writer.trace(index, 1) { + span(0) { + childOf parent + serviceName "unnamed-java-app" + operationName "test-http-server" + resourceName "test-http-server" + errored false + tags { + defaultTags() } } } } + + def outerSpan(TraceAssert trace, index) { + trace.span(index) { + parent() + serviceName "unnamed-java-app" + operationName "someTrace" + resourceName "someTrace" + errored false + tags { + defaultTags() + } + } + } + + def clientParentSpan(TraceAssert trace, index, parent) { + trace.span(index) { + childOf parent + serviceName "unnamed-java-app" + operationName "apache.http" + resourceName "apache.http" + errored false + tags { + defaultTags() + "$Tags.COMPONENT.key" "apache-httpclient" + } + } + } + + def successClientSpan(TraceAssert trace, index, parent, status = 200, route = "success") { + trace.span(index) { + childOf parent + serviceName "unnamed-java-app" + operationName "http.request" + resourceName "GET /$route" + errored false + tags { + defaultTags() + "$Tags.HTTP_STATUS.key" status + "$Tags.HTTP_URL.key" "http://localhost:$port/$route" + "$Tags.PEER_HOSTNAME.key" "localhost" + "$Tags.PEER_PORT.key" server.getAddress().port + "$Tags.HTTP_METHOD.key" "GET" + "$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT + "$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT + } + } + } + + def redirectClientSpan(TraceAssert trace, index, parent) { + successClientSpan(trace, index, parent, 302, "redirect") + } }