Apache HTTP Client: add test for redirected request

This commit is contained in:
Nikolay Martynov 2018-07-27 10:29:17 -04:00
parent 342b7d4594
commit b6118f0397
1 changed files with 154 additions and 116 deletions

View File

@ -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 = "<html><body><h1>Hello test.</h1>\n"
response.status(200).send(msg)
String msg = "<html><body><h1>Hello test.</h1>\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")
}
}