Merge pull request #691 from DataDog/tyler/split-service-http-client

Add setting to set service name by domain for http clients
This commit is contained in:
Tyler Benson 2019-02-05 13:17:46 -08:00 committed by GitHub
commit 7a430647a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
79 changed files with 709 additions and 470 deletions

View File

@ -227,15 +227,5 @@ public interface Instrumenter {
protected boolean defaultEnabled() {
return getConfigEnabled("dd.integrations.enabled", true);
}
// TODO: move common config helpers to Utils
public static String getPropOrEnv(final String name) {
return System.getProperty(name, System.getenv(propToEnvName(name)));
}
public static String propToEnvName(final String name) {
return name.toUpperCase().replace(".", "_");
}
}
}

View File

@ -13,6 +13,7 @@ import akka.http.scaladsl.model.HttpResponse;
import akka.stream.scaladsl.Flow;
import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.api.Config;
import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags;
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
@ -101,17 +102,21 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
return null;
}
Tracer.SpanBuilder builder =
final Tracer.SpanBuilder builder =
GlobalTracer.get()
.buildSpan("akka-http.request")
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.withTag(DDTags.SPAN_TYPE, DDSpanTypes.HTTP_CLIENT)
.withTag(Tags.COMPONENT.getKey(), "akka-http-client");
if (request != null) {
builder =
builder
.withTag(Tags.HTTP_METHOD.getKey(), request.method().value())
.withTag(Tags.HTTP_URL.getKey(), request.getUri().toString());
.withTag(Tags.HTTP_URL.getKey(), request.getUri().toString())
.withTag(Tags.PEER_PORT.getKey(), request.getUri().port())
.withTag(Tags.PEER_HOSTNAME.getKey(), request.getUri().host().address());
if (Config.get().isHttpClientSplitByDomain()) {
builder.withTag(DDTags.SERVICE_NAME, request.getUri().host().address());
}
}
final Scope scope = builder.startActive(false);

View File

@ -5,7 +5,7 @@ import java.util.Collections
import akka.NotUsed
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.stream.scaladsl.Flow
import datadog.trace.api.{DDSpanTypes, DDTags}
import datadog.trace.api.{Config, DDSpanTypes, DDTags}
import io.opentracing.Span
import io.opentracing.log.Fields.ERROR_OBJECT
import io.opentracing.propagation.Format
@ -20,18 +20,21 @@ object AkkaHttpClientTransformFlow {
Flow.fromFunction((input: (HttpRequest, T)) => {
val (request, data) = input
val scope = GlobalTracer.get
span = GlobalTracer.get
.buildSpan("akka-http.request")
.withTag(Tags.SPAN_KIND.getKey, Tags.SPAN_KIND_CLIENT)
.withTag(Tags.HTTP_METHOD.getKey, request.method.value)
.withTag(Tags.PEER_HOSTNAME.getKey, request.getUri().host().address())
.withTag(Tags.PEER_PORT.getKey, request.getUri().port())
.withTag(DDTags.SPAN_TYPE, DDSpanTypes.HTTP_CLIENT)
.withTag(Tags.COMPONENT.getKey, "akka-http-client")
.withTag(Tags.HTTP_URL.getKey, request.getUri.toString)
.startActive(false)
.start()
if (Config.get.isHttpClientSplitByDomain) {
span.setTag(DDTags.SERVICE_NAME, request.getUri.host.address)
}
val headers = new AkkaHttpClientInstrumentation.AkkaHttpHeaders(request)
GlobalTracer.get.inject(scope.span.context, Format.Builtin.HTTP_HEADERS, headers)
span = scope.span
scope.close()
GlobalTracer.get.inject(span.context, Format.Builtin.HTTP_HEADERS, headers)
(headers.getRequest, data)
}).via(flow).map(output => {
output._1 match {

View File

@ -8,6 +8,7 @@ import akka.stream.StreamTcpException
import akka.stream.javadsl.Sink
import akka.stream.javadsl.Source
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -19,6 +20,7 @@ import java.util.concurrent.CompletionStage
import java.util.concurrent.ExecutionException
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.withConfigOverride
class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
@ -56,12 +58,13 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
def url = server.address.resolve("/" + route).toURL()
HttpRequest request = HttpRequest.create(url.toString())
CompletionStage<HttpResponse> responseFuture =
Http.get(system)
.singleRequest(request, materializer)
when:
HttpResponse response = responseFuture.toCompletableFuture().get()
HttpResponse response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
Http.get(system)
.singleRequest(request, materializer)
.toCompletableFuture().get()
}
String message = readMessage(response)
then:
@ -75,7 +78,7 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
trace(1, 1) {
span(0) {
parent()
serviceName "unnamed-java-app"
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName "akka-http.request"
resourceName "GET /$route"
spanType DDSpanTypes.HTTP_CLIENT
@ -87,6 +90,8 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
"$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT
"$Tags.PEER_HOSTNAME.key" server.address.host
"$Tags.PEER_PORT.key" server.address.port
"$Tags.COMPONENT.key" "akka-http-client"
if (expectedError) {
"$Tags.ERROR.key" true
@ -97,9 +102,9 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
}
where:
route | expectedStatus | expectedError | expectedMessage
"success" | 200 | false | MESSAGE
"error" | 500 | true | null
route | expectedStatus | expectedError | expectedMessage | renameService
"success" | 200 | false | MESSAGE | true
"error" | 500 | true | null | false
}
def "error request trace"() {
@ -108,8 +113,10 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
HttpRequest request = HttpRequest.create(url.toString())
CompletionStage<HttpResponse> responseFuture =
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
Http.get(system)
.singleRequest(request, materializer)
}
when:
responseFuture.toCompletableFuture().get()
@ -120,7 +127,7 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
trace(0, 1) {
span(0) {
parent()
serviceName "unnamed-java-app"
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName "akka-http.request"
resourceName "GET /test"
spanType DDSpanTypes.HTTP_CLIENT
@ -131,6 +138,8 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
"$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT
"$Tags.PEER_HOSTNAME.key" server.address.host
"$Tags.PEER_PORT.key" UNUSED_PORT
"$Tags.COMPONENT.key" "akka-http-client"
"$Tags.ERROR.key" true
errorTags(StreamTcpException, { it.contains("Tcp command") })
@ -138,6 +147,9 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
}
}
}
where:
renameService << [false, true]
}
def "singleRequest exception trace"() {
@ -168,19 +180,22 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
}
}
where:
renameService << [false, true]
}
def "#route pool request trace"() {
setup:
def url = server.address.resolve("/" + route).toURL()
CompletionStage<Pair<Try<HttpResponse>, Integer>> sink = Source
when:
HttpResponse response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
Source
.<Pair<HttpRequest, Integer>> single(new Pair(HttpRequest.create(url.toString()), 1))
.via(pool)
.runWith(Sink.<Pair<Try<HttpResponse>, Integer>> head(), materializer)
when:
HttpResponse response = sink.toCompletableFuture().get().first().get()
.toCompletableFuture().get().first().get()
}
String message = readMessage(response)
then:
@ -194,7 +209,7 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
trace(1, 1) {
span(0) {
parent()
serviceName "unnamed-java-app"
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName "akka-http.request"
resourceName "GET /$route"
spanType DDSpanTypes.HTTP_CLIENT
@ -206,6 +221,8 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
"$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT
"$Tags.PEER_HOSTNAME.key" server.address.host
"$Tags.PEER_PORT.key" server.address.port
"$Tags.COMPONENT.key" "akka-http-client"
if (expectedError) {
"$Tags.ERROR.key" true
@ -216,9 +233,9 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
}
where:
route | expectedStatus | expectedError | expectedMessage
"success" | 200 | false | MESSAGE
"error" | 500 | true | null
route | expectedStatus | expectedError | expectedMessage | renameService
"success" | 200 | false | MESSAGE | true
"error" | 500 | true | null | false
}
def "error request pool trace"() {
@ -226,11 +243,13 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
// Use port number that really should be closed
def url = new URL("http://localhost:$UNUSED_PORT/test")
CompletionStage<Pair<Try<HttpResponse>, Integer>> sink = Source
def response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
Source
.<Pair<HttpRequest, Integer>> single(new Pair(HttpRequest.create(url.toString()), 1))
.via(pool)
.runWith(Sink.<Pair<Try<HttpResponse>, Integer>> head(), materializer)
def response = sink.toCompletableFuture().get().first()
.toCompletableFuture().get().first()
}
when:
response.get()
@ -241,7 +260,7 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
trace(0, 1) {
span(0) {
parent()
serviceName "unnamed-java-app"
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName "akka-http.request"
resourceName "GET /test"
spanType DDSpanTypes.HTTP_CLIENT
@ -252,6 +271,8 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
"$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT
"$Tags.PEER_HOSTNAME.key" server.address.host
"$Tags.PEER_PORT.key" UNUSED_PORT
"$Tags.COMPONENT.key" "akka-http-client"
"$Tags.ERROR.key" true
errorTags(StreamTcpException, { it.contains("Tcp command") })
@ -259,10 +280,12 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner {
}
}
}
where:
renameService << [false, true]
}
String readMessage(HttpResponse response) {
response.entity().toStrict(TIMEOUT, materializer).toCompletableFuture().get().getData().utf8String()
}
}

View File

@ -4,13 +4,13 @@ import akka.http.scaladsl.Http.ServerBinding
import akka.http.scaladsl.model.HttpMethods.GET
import akka.http.scaladsl.model._
import akka.stream.ActorMaterializer
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.Trace
import scala.concurrent.{Await, Future}
object AkkaHttpTestAsyncWebServer {
val port = TestUtils.randomOpenPort()
val port = PortUtils.randomOpenPort()
implicit val system = ActorSystem("my-system")
implicit val materializer = ActorMaterializer()
// needed for the future flatMap/onComplete in the end
@ -60,7 +60,7 @@ object AkkaHttpTestAsyncWebServer {
}
object AkkaHttpTestSyncWebServer {
val port = TestUtils.randomOpenPort()
val port = PortUtils.randomOpenPort()
implicit val system = ActorSystem("my-system")
implicit val materializer = ActorMaterializer()
// needed for the future flatMap/onComplete in the end

View File

@ -1,6 +1,7 @@
import datadog.opentracing.DDSpan
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.asserts.TraceAssert
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -15,8 +16,9 @@ import org.apache.http.message.BasicHeader
import spock.lang.AutoCleanup
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.withConfigOverride
class ApacheHttpClientTest extends AgentTestRunner {
@ -55,13 +57,16 @@ class ApacheHttpClientTest extends AgentTestRunner {
def "trace request with propagation"() {
when:
String response = runUnderTrace("parent") {
String response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("parent") {
if (responseHandler) {
client.execute(new HttpGet(successUrl), responseHandler)
} else {
client.execute(new HttpGet(successUrl)).entity.content.text
}
}
}
then:
response == "Hello."
@ -70,12 +75,13 @@ class ApacheHttpClientTest extends AgentTestRunner {
server.distributedRequestTrace(it, 0, TEST_WRITER[1][1])
trace(1, 2) {
parentSpan(it, 0)
successClientSpan(it, 1, span(0))
successClientSpan(it, 1, span(0), renameService)
}
}
where:
responseHandler << [null, handler]
renameService << [false, true]
}
def "trace redirected request with propagation many redirects allowed"() {
@ -87,9 +93,11 @@ class ApacheHttpClientTest extends AgentTestRunner {
request.setConfig(requestConfigBuilder.build())
when:
HttpResponse response = runUnderTrace("parent") {
HttpResponse response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("parent") {
client.execute(request)
}
}
then:
response.getStatusLine().getStatusCode() == 200
@ -99,9 +107,12 @@ class ApacheHttpClientTest extends AgentTestRunner {
server.distributedRequestTrace(it, 1, TEST_WRITER[2][1])
trace(2, 2) {
parentSpan(it, 0)
successClientSpan(it, 1, span(0), 200, "redirect")
successClientSpan(it, 1, span(0), renameService, 200, "redirect")
}
}
where:
renameService << [false, true]
}
def "trace redirected request with propagation 1 redirect allowed"() {
@ -112,9 +123,11 @@ class ApacheHttpClientTest extends AgentTestRunner {
request.setConfig(requestConfigBuilder.build())
when:
HttpResponse response = runUnderTrace("parent") {
HttpResponse response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("parent") {
client.execute(request)
}
}
then:
response.getStatusLine().getStatusCode() == 200
@ -124,9 +137,12 @@ class ApacheHttpClientTest extends AgentTestRunner {
server.distributedRequestTrace(it, 1, TEST_WRITER[2][1])
trace(2, 2) {
parentSpan(it, 0)
successClientSpan(it, 1, span(0), 200, "redirect")
successClientSpan(it, 1, span(0), renameService, 200, "redirect")
}
}
where:
renameService << [false, true]
}
def "trace redirected request with propagation too many redirects"() {
@ -138,9 +154,11 @@ class ApacheHttpClientTest extends AgentTestRunner {
request.setConfig(requestConfigBuilder.build())
when:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("parent") {
client.execute(request)
}
}
then:
def exception = thrown(ClientProtocolException)
@ -150,9 +168,12 @@ class ApacheHttpClientTest extends AgentTestRunner {
server.distributedRequestTrace(it, 1, TEST_WRITER[2][1])
trace(2, 2) {
parentSpan(it, 0, exception)
successClientSpan(it, 1, span(0), null, "another-redirect", exception)
successClientSpan(it, 1, span(0), renameService, null, "another-redirect", exception)
}
}
where:
renameService << [false, true]
}
def "trace request without propagation"() {
@ -161,9 +182,11 @@ class ApacheHttpClientTest extends AgentTestRunner {
request.addHeader(new BasicHeader("is-dd-server", "false"))
when:
HttpResponse response = runUnderTrace("parent") {
HttpResponse response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("parent") {
client.execute(request)
}
}
then:
response.getStatusLine().getStatusCode() == 200
@ -171,9 +194,12 @@ class ApacheHttpClientTest extends AgentTestRunner {
assertTraces(1) {
trace(0, 2) {
parentSpan(it, 0)
successClientSpan(it, 1, span(0))
successClientSpan(it, 1, span(0), renameService)
}
}
where:
renameService << [false, true]
}
def parentSpan(TraceAssert trace, int index, Throwable exception = null) {
@ -192,10 +218,10 @@ class ApacheHttpClientTest extends AgentTestRunner {
}
}
def successClientSpan(TraceAssert trace, int index, DDSpan parent, status = 200, route = "success", Throwable exception = null) {
def successClientSpan(TraceAssert trace, int index, DDSpan parent, boolean renameService, status = 200, route = "success", Throwable exception = null) {
trace.span(index) {
childOf parent
serviceName "unnamed-java-app"
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName "http.request"
resourceName "GET /$route"
errored exception != null
@ -208,7 +234,7 @@ class ApacheHttpClientTest extends AgentTestRunner {
"$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.PEER_PORT.key" server.address.port
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
"$DDTags.SPAN_TYPE" DDSpanTypes.HTTP_CLIENT

View File

@ -11,6 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.api.Config;
import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags;
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
@ -120,6 +121,9 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default {
if (null != uri) {
Tags.PEER_PORT.set(span, uri.getPort() == -1 ? 80 : uri.getPort());
Tags.PEER_HOSTNAME.set(span, uri.getHost());
if (Config.get().isHttpClientSplitByDomain()) {
span.setTag(DDTags.SERVICE_NAME, uri.getHost());
}
}
return scope;
}

View File

@ -1,6 +1,7 @@
import datadog.opentracing.DDSpan
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.asserts.TraceAssert
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -13,8 +14,9 @@ import org.apache.http.message.BasicHeader
import spock.lang.AutoCleanup
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.withConfigOverride
class ApacheHttpClientTest extends AgentTestRunner {
@ -52,13 +54,16 @@ class ApacheHttpClientTest extends AgentTestRunner {
def "trace request with propagation"() {
when:
String response = runUnderTrace("parent") {
String response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("parent") {
if (responseHandler) {
client.execute(new HttpGet(successUrl), responseHandler)
} else {
client.execute(new HttpGet(successUrl)).entity.content.text
}
}
}
then:
response == "Hello."
@ -67,12 +72,13 @@ class ApacheHttpClientTest extends AgentTestRunner {
server.distributedRequestTrace(it, 0, TEST_WRITER[1][1])
trace(1, 2) {
parentSpan(it, 0)
successClientSpan(it, 1, span(0))
successClientSpan(it, 1, span(0), renameService)
}
}
where:
responseHandler << [null, handler]
renameService << [false, true]
}
def "trace request without propagation"() {
@ -81,9 +87,11 @@ class ApacheHttpClientTest extends AgentTestRunner {
request.addHeader(new BasicHeader("is-dd-server", "false"))
when:
HttpResponse response = runUnderTrace("parent") {
HttpResponse response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("parent") {
client.execute(request)
}
}
then:
response.getStatusLine().getStatusCode() == 200
@ -91,9 +99,12 @@ class ApacheHttpClientTest extends AgentTestRunner {
assertTraces(1) {
trace(0, 2) {
parentSpan(it, 0)
successClientSpan(it, 1, span(0))
successClientSpan(it, 1, span(0), renameService)
}
}
where:
renameService << [false, true]
}
def parentSpan(TraceAssert trace, int index, Throwable exception = null) {
@ -112,10 +123,10 @@ class ApacheHttpClientTest extends AgentTestRunner {
}
}
def successClientSpan(TraceAssert trace, int index, DDSpan parent, status = 200, route = "success", Throwable exception = null) {
def successClientSpan(TraceAssert trace, int index, DDSpan parent, boolean renameService, status = 200, route = "success", Throwable exception = null) {
trace.span(index) {
childOf parent
serviceName "unnamed-java-app"
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName "http.request"
resourceName "GET /$route"
errored exception != null

View File

@ -15,7 +15,7 @@ import com.couchbase.mock.BucketConfiguration
import com.couchbase.mock.CouchbaseMock
import com.couchbase.mock.http.query.QueryServer
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import spock.lang.Shared
import java.util.concurrent.RejectedExecutionException
@ -27,7 +27,7 @@ abstract class AbstractCouchbaseTest extends AgentTestRunner {
private static final PASSWORD = "password"
@Shared
private int port = TestUtils.randomOpenPort()
private int port = PortUtils.randomOpenPort()
@Shared
private String testBucketName = this.getClass().simpleName

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import groovy.json.JsonSlurper
@ -33,8 +33,8 @@ class Elasticsearch6RestClientTest extends AgentTestRunner {
RestClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import groovy.json.JsonSlurper
@ -36,8 +36,8 @@ class Elasticsearch5RestClientTest extends AgentTestRunner {
static RestClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import groovy.json.JsonSlurper
@ -36,8 +36,8 @@ class Elasticsearch6RestClientTest extends AgentTestRunner {
RestClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import groovy.json.JsonSlurper
@ -33,8 +33,8 @@ class Elasticsearch6RestClientTest extends AgentTestRunner {
RestClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -12,7 +12,7 @@ import org.elasticsearch.node.Node
import org.elasticsearch.node.NodeBuilder
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch2NodeClientTest extends AgentTestRunner {
@ -30,8 +30,8 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner {
def client = testNode.client()
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -15,7 +15,7 @@ import org.elasticsearch.node.NodeBuilder
import org.elasticsearch.transport.RemoteTransportException
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch2TransportClientTest extends AgentTestRunner {
@ -34,8 +34,8 @@ class Elasticsearch2TransportClientTest extends AgentTestRunner {
TransportClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -9,7 +9,7 @@ import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch2SpringRepositoryTest extends AgentTestRunner {

View File

@ -2,7 +2,7 @@ package springdata
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -40,8 +40,8 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner {
ElasticsearchTemplate template
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -12,7 +12,7 @@ import org.elasticsearch.node.Node
import org.elasticsearch.node.NodeBuilder
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch2NodeClientTest extends AgentTestRunner {
@ -30,8 +30,8 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner {
def client = testNode.client()
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -15,7 +15,7 @@ import org.elasticsearch.node.NodeBuilder
import org.elasticsearch.transport.RemoteTransportException
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch2TransportClientTest extends AgentTestRunner {
@ -34,8 +34,8 @@ class Elasticsearch2TransportClientTest extends AgentTestRunner {
TransportClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -9,7 +9,7 @@ import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch2SpringRepositoryTest extends AgentTestRunner {

View File

@ -2,7 +2,7 @@ package springdata
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -40,8 +40,8 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner {
ElasticsearchTemplate template
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -14,7 +14,7 @@ import org.elasticsearch.node.Node
import org.elasticsearch.transport.Netty3Plugin
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
@RetryOnFailure(times = 3, delaySeconds = 1)
@ -33,8 +33,8 @@ class Elasticsearch53NodeClientTest extends AgentTestRunner {
def client = testNode.client()
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -18,7 +18,7 @@ import org.elasticsearch.transport.RemoteTransportException
import org.elasticsearch.transport.client.PreBuiltTransportClient
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
@RetryOnFailure(times = 3, delaySeconds = 1)
@ -38,8 +38,8 @@ class Elasticsearch53TransportClientTest extends AgentTestRunner {
TransportClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -9,7 +9,7 @@ import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch53SpringRepositoryTest extends AgentTestRunner {

View File

@ -3,7 +3,7 @@ package springdata
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import com.google.common.collect.ImmutableSet
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -26,7 +26,7 @@ import spock.lang.Shared
import java.util.concurrent.atomic.AtomicLong
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
@RetryOnFailure(times = 3, delaySeconds = 1)
@ -51,8 +51,8 @@ class Elasticsearch53SpringTemplateTest extends AgentTestRunner {
ElasticsearchTemplate template
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -14,7 +14,7 @@ import org.elasticsearch.node.internal.InternalSettingsPreparer
import org.elasticsearch.transport.Netty3Plugin
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
@RetryOnFailure(times = 3, delaySeconds = 1)
@ -33,8 +33,8 @@ class Elasticsearch5NodeClientTest extends AgentTestRunner {
def client = testNode.client()
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -18,7 +18,7 @@ import org.elasticsearch.transport.RemoteTransportException
import org.elasticsearch.transport.client.PreBuiltTransportClient
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
@RetryOnFailure(times = 3, delaySeconds = 1)
@ -38,8 +38,8 @@ class Elasticsearch5TransportClientTest extends AgentTestRunner {
TransportClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -13,7 +13,7 @@ import org.elasticsearch.node.Node
import org.elasticsearch.transport.Netty4Plugin
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
@RetryOnFailure(times = 3, delaySeconds = 1)
@ -32,8 +32,8 @@ class Elasticsearch6NodeClientTest extends AgentTestRunner {
def client = testNode.client()
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -1,6 +1,6 @@
import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -17,7 +17,7 @@ import org.elasticsearch.transport.RemoteTransportException
import org.elasticsearch.transport.client.PreBuiltTransportClient
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
@RetryOnFailure(times = 3, delaySeconds = 1)
@ -37,8 +37,8 @@ class Elasticsearch6TransportClientTest extends AgentTestRunner {
TransportClient client
def setupSpec() {
httpPort = TestUtils.randomOpenPort()
tcpPort = TestUtils.randomOpenPort()
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()

View File

@ -10,12 +10,12 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.api.Config;
import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags;
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
import datadog.trace.bootstrap.ContextStore;
import datadog.trace.bootstrap.InstrumentationContext;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.propagation.Format;
@ -184,12 +184,15 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
.buildSpan(OPERATION_NAME)
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.withTag(DDTags.SPAN_TYPE, DDSpanTypes.HTTP_CLIENT);
try (final Scope scope = builder.startActive(false)) {
span = scope.span();
span = builder.start();
final URL url = connection.getURL();
Tags.COMPONENT.set(span, COMPONENT_NAME);
Tags.HTTP_URL.set(span, url.toString());
Tags.PEER_HOSTNAME.set(span, url.getHost());
if (Config.get().isHttpClientSplitByDomain()) {
span.setTag(DDTags.SERVICE_NAME, url.getHost());
}
if (url.getPort() > 0) {
Tags.PEER_PORT.set(span, url.getPort());
} else if (connection instanceof HttpsURLConnection) {
@ -200,7 +203,6 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
Tags.HTTP_METHOD.set(span, connection.getRequestMethod());
return span;
}
}
public boolean hasSpan() {
return span != null;
@ -215,10 +217,9 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
}
public void finishSpan(final Throwable throwable) {
try (final Scope scope = GlobalTracer.get().scopeManager().activate(span, true)) {
Tags.ERROR.set(span, true);
span.log(singletonMap(ERROR_OBJECT, throwable));
}
span.finish();
span = null;
finished = true;
}
@ -230,12 +231,11 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
* (e.g. breaks getOutputStream).
*/
if (responseCode > 0) {
try (final Scope scope = GlobalTracer.get().scopeManager().activate(span, true)) {
Tags.HTTP_STATUS.set(span, responseCode);
span.finish();
span = null;
finished = true;
}
}
}
}
}

View File

@ -9,9 +9,9 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.api.Config;
import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
@ -58,22 +58,24 @@ public class UrlInstrumentation extends Instrumenter.Default {
String protocol = url.getProtocol();
protocol = protocol != null ? protocol : "url";
final Scope scope =
final Span span =
GlobalTracer.get()
.buildSpan(protocol + ".request")
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.withTag(DDTags.SPAN_TYPE, DDSpanTypes.HTTP_CLIENT)
.withTag(Tags.COMPONENT.getKey(), COMPONENT)
.startActive(true);
.start();
final Span span = scope.span();
Tags.HTTP_URL.set(span, url.toString());
Tags.PEER_PORT.set(span, url.getPort() == -1 ? 80 : url.getPort());
Tags.PEER_HOSTNAME.set(span, url.getHost());
if (Config.get().isHttpClientSplitByDomain()) {
span.setTag(DDTags.SERVICE_NAME, url.getHost());
}
Tags.ERROR.set(span, true);
span.log(Collections.singletonMap(ERROR_OBJECT, throwable));
scope.close();
span.finish();
}
}
}

View File

@ -1,4 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -7,8 +8,9 @@ import org.springframework.web.client.RestTemplate
import spock.lang.AutoCleanup
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.withConfigOverride
import static datadog.trace.instrumentation.http_url_connection.HttpUrlConnectionInstrumentation.HttpUrlState.COMPONENT_NAME
import static datadog.trace.instrumentation.http_url_connection.HttpUrlConnectionInstrumentation.HttpUrlState.OPERATION_NAME
@ -31,6 +33,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
def "trace request with propagation (useCaches: #useCaches)"() {
setup:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
HttpURLConnection connection = server.address.toURL().openConnection()
connection.useCaches = useCaches
@ -52,6 +55,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
stream.close()
assert lines == [RESPONSE]
}
}
expect:
assertTraces(3) {
@ -67,6 +71,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -83,6 +88,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(2) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -103,10 +109,12 @@ class HttpUrlConnectionTest extends AgentTestRunner {
where:
useCaches << [false, true]
renameService << [true, false]
}
def "trace request without propagation (useCaches: #useCaches)"() {
setup:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
HttpURLConnection connection = server.address.toURL().openConnection()
connection.useCaches = useCaches
@ -130,6 +138,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
stream.close()
assert lines == [RESPONSE]
}
}
expect:
assertTraces(1) {
@ -143,6 +152,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -159,6 +169,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(2) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -179,10 +190,12 @@ class HttpUrlConnectionTest extends AgentTestRunner {
where:
useCaches << [false, true]
renameService << [false, true]
}
def "test response code"() {
setup:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
HttpURLConnection connection = server.address.toURL().openConnection()
connection.setRequestMethod("HEAD")
@ -190,6 +203,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
assert GlobalTracer.get().scopeManager().active() != null
assert connection.getResponseCode() == STATUS
}
}
expect:
assertTraces(1) {
@ -203,6 +217,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -220,11 +235,15 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
}
where:
renameService << [false, true]
}
def "test broken API usage"() {
setup:
HttpURLConnection conn = runUnderTrace("someTrace") {
HttpURLConnection conn = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
HttpURLConnection connection = server.address.toURL().openConnection()
connection.setRequestProperty("Connection", "close")
connection.addRequestProperty("is-dd-server", "false")
@ -232,6 +251,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
assert connection.getResponseCode() == STATUS
return connection
}
}
expect:
assertTraces(1) {
@ -245,6 +265,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -268,10 +289,12 @@ class HttpUrlConnectionTest extends AgentTestRunner {
where:
iteration << (1..10)
renameService = (iteration % 2 == 0) // alternate even/odd
}
def "test post request"() {
setup:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
HttpURLConnection connection = server.address.toURL().openConnection()
connection.setRequestMethod("POST")
@ -292,6 +315,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
stream.close()
assert lines == [RESPONSE]
}
}
expect:
assertTraces(2) {
@ -306,6 +330,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -323,6 +348,9 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
}
where:
renameService << [false, true]
}
def "request that looks like a trace submission is ignored"() {
@ -355,6 +383,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
def "top level httpurlconnection tracing disabled"() {
setup:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
HttpURLConnection connection = server.address.toURL().openConnection()
connection.addRequestProperty("is-dd-server", "false")
def stream = connection.inputStream
@ -362,11 +391,13 @@ class HttpUrlConnectionTest extends AgentTestRunner {
stream.close()
assert connection.getResponseCode() == STATUS
assert lines == [RESPONSE]
}
expect:
assertTraces(1) {
trace(0, 1) {
span(0) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
parent()
errored false
@ -384,15 +415,20 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
}
where:
renameService << [false, true]
}
def "rest template"() {
setup:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
RestTemplate restTemplate = new RestTemplate()
String res = restTemplate.postForObject(server.address.toString(), "Hello", String)
assert res == "$RESPONSE"
}
}
expect:
assertTraces(2) {
@ -407,6 +443,7 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored false
@ -424,5 +461,8 @@ class HttpUrlConnectionTest extends AgentTestRunner {
}
}
}
where:
renameService << [false, true]
}
}

View File

@ -1,21 +1,23 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import datadog.trace.instrumentation.http_url_connection.UrlInstrumentation
import io.opentracing.tag.Tags
import io.opentracing.util.GlobalTracer
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.withConfigOverride
import static datadog.trace.instrumentation.http_url_connection.HttpUrlConnectionInstrumentation.HttpUrlState.COMPONENT_NAME
import static datadog.trace.instrumentation.http_url_connection.HttpUrlConnectionInstrumentation.HttpUrlState.OPERATION_NAME
class UrlConnectionTest extends AgentTestRunner {
private static final int INVALID_PORT = TestUtils.randomOpenPort()
private static final int UNUSED_PORT = 61 // this port should always be closed
def "trace request with connection failure #scheme"() {
when:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
URLConnection connection = url.openConnection()
connection.setConnectTimeout(10000)
@ -23,6 +25,7 @@ class UrlConnectionTest extends AgentTestRunner {
assert GlobalTracer.get().scopeManager().active() != null
connection.inputStream
}
}
then:
thrown ConnectException
@ -40,6 +43,7 @@ class UrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName renameService ? "localhost" : "unnamed-java-app"
operationName OPERATION_NAME
childOf span(0)
errored true
@ -50,7 +54,7 @@ class UrlConnectionTest extends AgentTestRunner {
"$Tags.HTTP_URL.key" "$url"
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.PEER_HOSTNAME.key" "localhost"
"$Tags.PEER_PORT.key" INVALID_PORT
"$Tags.PEER_PORT.key" UNUSED_PORT
errorTags ConnectException, String
defaultTags()
}
@ -59,11 +63,11 @@ class UrlConnectionTest extends AgentTestRunner {
}
where:
scheme | _
"http" | _
"https" | _
scheme | renameService
"http" | true
"https" | false
url = new URI("$scheme://localhost:$INVALID_PORT").toURL()
url = new URI("$scheme://localhost:$UNUSED_PORT").toURL()
}
def "trace request with connection failure to a local file with broken url path"() {
@ -71,9 +75,11 @@ class UrlConnectionTest extends AgentTestRunner {
def url = new URI("file:/some-random-file%abc").toURL()
when:
withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
runUnderTrace("someTrace") {
url.openConnection()
}
}
then:
thrown IllegalArgumentException
@ -91,6 +97,7 @@ class UrlConnectionTest extends AgentTestRunner {
}
}
span(1) {
serviceName "unnamed-java-app"
operationName "file.request"
childOf span(0)
errored true
@ -107,5 +114,8 @@ class UrlConnectionTest extends AgentTestRunner {
}
}
}
where:
renameService << [false, true]
}
}

View File

@ -7,7 +7,7 @@ import java.util.concurrent.BlockingQueue
import java.util.concurrent.LinkedBlockingQueue
import static com.netflix.hystrix.HystrixCommandGroupKey.Factory.asKey
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
class HystrixTest extends AgentTestRunner {
// Uncomment for debugging:

View File

@ -9,7 +9,7 @@ import javax.ws.rs.POST
import javax.ws.rs.PUT
import javax.ws.rs.Path
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
class JaxRsAnnotationsInstrumentationTest extends AgentTestRunner {

View File

@ -3,7 +3,7 @@ import io.dropwizard.testing.junit.ResourceTestRule
import org.junit.ClassRule
import spock.lang.Shared
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
class JerseyTest extends AgentTestRunner {

View File

@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -23,7 +23,7 @@ import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
class JaxRsClientTest extends AgentTestRunner {
@Shared
def emptyPort = TestUtils.randomOpenPort()
def emptyPort = PortUtils.randomOpenPort()
@AutoCleanup
@Shared

View File

@ -17,7 +17,7 @@ import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.Statement
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
class JDBCInstrumentationTest extends AgentTestRunner {

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import okhttp3.OkHttpClient
@ -23,7 +23,7 @@ class JettyHandlerTest extends AgentTestRunner {
System.setProperty("dd.integration.jetty.enabled", "true")
}
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
Server server = new Server(port)
OkHttpClient client = OkHttpUtils.client()

View File

@ -1,7 +1,7 @@
import com.google.common.io.Files
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
@ -49,7 +49,7 @@ class JSPInstrumentationBasicTests extends AgentTestRunner {
baseDir.deleteOnExit()
expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
tomcatServer = new Tomcat()
tomcatServer.setBaseDir(baseDir.getAbsolutePath())

View File

@ -1,7 +1,7 @@
import com.google.common.io.Files
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import okhttp3.OkHttpClient
import okhttp3.Request
@ -47,7 +47,7 @@ class JSPInstrumentationForwardTests extends AgentTestRunner {
baseDir.deleteOnExit()
expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
tomcatServer = new Tomcat()
tomcatServer.setBaseDir(baseDir.getAbsolutePath())

View File

@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.lettuce.core.ClientOptions
@ -62,8 +62,8 @@ class LettuceAsyncClientTest extends AgentTestRunner {
RedisCommands<String, ?> syncCommands
def setupSpec() {
port = TestUtils.randomOpenPort()
incorrectPort = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
incorrectPort = PortUtils.randomOpenPort()
dbAddr = HOST + ":" + port + "/" + DB_INDEX
dbAddrNonExistent = HOST + ":" + incorrectPort + "/" + DB_INDEX
dbUriNonExistent = "redis://" + dbAddrNonExistent

View File

@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.lettuce.core.ClientOptions
@ -33,7 +33,7 @@ class LettuceReactiveClientTest extends AgentTestRunner {
RedisCommands<String, ?> syncCommands
def setupSpec() {
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
String dbAddr = HOST + ":" + port + "/" + DB_INDEX
embeddedDbUri = "redis://" + dbAddr

View File

@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.lettuce.core.ClientOptions
@ -48,8 +48,8 @@ class LettuceSyncClientTest extends AgentTestRunner {
RedisCommands<String, ?> syncCommands
def setupSpec() {
port = TestUtils.randomOpenPort()
incorrectPort = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
incorrectPort = PortUtils.randomOpenPort()
dbAddr = HOST + ":" + port + "/" + DB_INDEX
dbAddrNonExistent = HOST + ":" + incorrectPort + "/" + DB_INDEX
dbUriNonExistent = "redis://" + dbAddrNonExistent

View File

@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.opentracing.tag.Tags
@ -11,8 +11,8 @@ import spock.lang.Shared
import java.util.concurrent.ExecutionException
import java.util.concurrent.TimeUnit
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.asynchttpclient.Dsl.asyncHttpClient
class Netty40ClientTest extends AgentTestRunner {
@ -78,7 +78,7 @@ class Netty40ClientTest extends AgentTestRunner {
def "test connection failure"() {
setup:
def invalidPort = TestUtils.randomOpenPort()
def invalidPort = PortUtils.randomOpenPort()
def responseFuture = runUnderTrace("parent") {
asyncHttpClient.prepareGet("http://localhost:$invalidPort/").execute()

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.netty.bootstrap.ServerBootstrap
@ -35,7 +35,7 @@ class Netty40ServerTest extends AgentTestRunner {
def "test server request/response"() {
setup:
EventLoopGroup eventLoopGroup = new NioEventLoopGroup()
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
initializeServer(eventLoopGroup, port, handlers, HttpResponseStatus.OK)
def request = new Request.Builder()
@ -88,7 +88,7 @@ class Netty40ServerTest extends AgentTestRunner {
def "test #responseCode response handling"() {
setup:
EventLoopGroup eventLoopGroup = new NioEventLoopGroup()
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
initializeServer(eventLoopGroup, port, new HttpServerCodec(), responseCode)
def request = new Request.Builder().url("http://localhost:$port/").get().build()

View File

@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.netty.channel.AbstractChannel
@ -12,8 +12,8 @@ import spock.lang.Shared
import java.util.concurrent.ExecutionException
import java.util.concurrent.TimeUnit
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static org.asynchttpclient.Dsl.asyncHttpClient
class Netty41ClientTest extends AgentTestRunner {
@ -79,7 +79,7 @@ class Netty41ClientTest extends AgentTestRunner {
def "test connection failure"() {
setup:
def invalidPort = TestUtils.randomOpenPort()
def invalidPort = PortUtils.randomOpenPort()
def responseFuture = runUnderTrace("parent") {
asyncHttpClient.prepareGet("http://localhost:$invalidPort/").execute()

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.netty.bootstrap.ServerBootstrap
@ -37,7 +37,7 @@ class Netty41ServerTest extends AgentTestRunner {
def "test server request/response"() {
setup:
EventLoopGroup eventLoopGroup = new NioEventLoopGroup()
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
initializeServer(eventLoopGroup, port, handlers, HttpResponseStatus.OK)
def request = new Request.Builder()
@ -90,7 +90,7 @@ class Netty41ServerTest extends AgentTestRunner {
def "test #responseCode response handling"() {
setup:
EventLoopGroup eventLoopGroup = new NioEventLoopGroup()
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
initializeServer(eventLoopGroup, port, new HttpServerCodec(), responseCode)
def request = new Request.Builder().url("http://localhost:$port/").get().build()

View File

@ -2,6 +2,8 @@ package datadog.trace.instrumentation.okhttp3;
import static io.opentracing.log.Fields.ERROR_OBJECT;
import datadog.trace.api.Config;
import datadog.trace.api.DDTags;
import io.opentracing.Span;
import io.opentracing.tag.Tags;
import java.net.Inet6Address;
@ -60,6 +62,9 @@ public interface OkHttpClientSpanDecorator {
Tags.COMPONENT.set(span, TracingCallFactory.COMPONENT_NAME);
Tags.HTTP_METHOD.set(span, request.method());
Tags.HTTP_URL.set(span, request.url().toString());
if (Config.get().isHttpClientSplitByDomain()) {
span.setTag(DDTags.SERVICE_NAME, request.url().host());
}
}
@Override

View File

@ -1,5 +1,6 @@
package datadog.trace.instrumentation.okhttp3;
import datadog.trace.api.Config;
import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags;
import io.opentracing.Scope;
@ -55,6 +56,10 @@ public class TracingCallFactory implements Call.Factory {
.withTag(DDTags.SPAN_TYPE, DDSpanTypes.HTTP_CLIENT)
.startActive(false);
if (Config.get().isHttpClientSplitByDomain()) {
scope.span().setTag(DDTags.SERVICE_NAME, request.url().host());
}
/** In case of exception network interceptor is not called */
final OkHttpClient.Builder okBuilder = okHttpClient.newBuilder();
okBuilder

View File

@ -1,10 +1,12 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes
import io.opentracing.tag.Tags
import okhttp3.OkHttpClient
import okhttp3.Request
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.withConfigOverride
class OkHttp3Test extends AgentTestRunner {
@ -22,7 +24,9 @@ class OkHttp3Test extends AgentTestRunner {
.url("http://localhost:$server.address.port/ping")
.build()
def response = client.newCall(request).execute()
def response = withConfigOverride(Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "$renameService") {
client.newCall(request).execute()
}
expect:
response.body.string() == "pong"
@ -43,7 +47,7 @@ class OkHttp3Test extends AgentTestRunner {
}
span(1) {
operationName "okhttp.http"
serviceName "okhttp"
serviceName renameService ? "localhost" : "okhttp"
resourceName "GET /ping"
errored false
childOf(span(0))
@ -68,5 +72,8 @@ class OkHttp3Test extends AgentTestRunner {
cleanup:
server.close()
where:
renameService << [false, true]
}
}

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import okhttp3.Request
import play.api.test.TestServer
@ -21,7 +21,7 @@ class Play26Test extends AgentTestRunner {
def client = OkHttpUtils.client()
def setupSpec() {
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
testServer = Helpers.testServer(port, Play26TestUtils.buildTestApp())
testServer.start()
}

View File

@ -1,7 +1,7 @@
import datadog.opentracing.DDSpan
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import okhttp3.Request
import play.api.test.TestServer
@ -18,7 +18,7 @@ class Play24Test extends AgentTestRunner {
def client = OkHttpUtils.client()
def setupSpec() {
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
testServer = Helpers.testServer(port, Play24TestUtils.buildTestApp())
testServer.start()
}

View File

@ -25,7 +25,7 @@ import spock.lang.Shared
import java.util.concurrent.Phaser
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
// Do not run tests locally on Java7 since testcontainers are not compatible with Java7
// It is fine to run on CI because CI provides rabbitmq externally, not through testcontainers

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import okhttp3.Credentials
@ -35,7 +35,7 @@ class JettyServlet2Test extends AgentTestRunner {
private ServletContextHandler servletContext
def setup() {
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
jettyServer = new Server(port)
servletContext = new ServletContextHandler()
servletContext.contextPath = "/ctx"

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import okhttp3.Credentials
@ -30,7 +30,7 @@ abstract class AbstractServlet3Test<CONTEXT> extends AgentTestRunner {
.build()
@Shared
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
@Shared
protected String user = "user"
@Shared

View File

@ -1,4 +1,4 @@
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import org.eclipse.jetty.security.ConstraintMapping
import org.eclipse.jetty.security.ConstraintSecurityHandler
import org.eclipse.jetty.security.HashLoginService
@ -17,7 +17,7 @@ class JettyServlet3Test extends AbstractServlet3Test<ServletContextHandler> {
private Server jettyServer
def setupSpec() {
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
jettyServer = new Server(port)
ServletContextHandler servletContext = new ServletContextHandler(null, "/$context")

View File

@ -34,10 +34,8 @@ public class MDCInjectionInstrumentation extends Instrumenter.Default {
@Override
protected boolean defaultEnabled() {
final String enableInjection = getPropOrEnv("dd." + Config.LOGS_INJECTION_ENABLED);
return null == enableInjection
? Config.DEFAULT_LOGS_INJECTION_ENABLED
: Boolean.parseBoolean(enableInjection);
return Config.getBooleanSettingFromEnvironment(
Config.LOGS_INJECTION_ENABLED, Config.DEFAULT_LOGS_INJECTION_ENABLED);
}
@Override

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import okhttp3.OkHttpClient
@ -21,7 +21,7 @@ class SparkJavaBasedTest extends AgentTestRunner {
OkHttpClient client = OkHttpUtils.client()
def setupSpec() {
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
TestSparkJavaApplication.initSpark(port)
}

View File

@ -26,7 +26,7 @@ import java.util.concurrent.locks.ReentrantLock
import static CompletionListener.COMPONENT_NAME
import static CompletionListener.OPERATION_NAME
import static CompletionListener.SERVICE_NAME
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
import static net.spy.memcached.ConnectionFactoryBuilder.Protocol.BINARY
// Do not run tests locally on Java7 since testcontainers are not compatible with Java7

View File

@ -10,6 +10,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
import com.google.auto.service.AutoService;
import com.google.common.collect.Sets;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.api.Config;
import datadog.trace.api.Trace;
import java.util.Collections;
import java.util.Map;
@ -23,7 +24,6 @@ import net.bytebuddy.matcher.ElementMatcher;
@Slf4j
@AutoService(Instrumenter.class)
public final class TraceAnnotationsInstrumentation extends Instrumenter.Default {
private static final String CONFIG_NAME = "dd.trace.annotations";
static final String CONFIG_FORMAT =
"(?:\\s*"
@ -47,7 +47,7 @@ public final class TraceAnnotationsInstrumentation extends Instrumenter.Default
public TraceAnnotationsInstrumentation() {
super("trace", "trace-annotation");
final String configString = getPropOrEnv(CONFIG_NAME);
final String configString = Config.getSettingFromEnvironment(Config.TRACE_ANNOTATIONS, null);
if (configString == null) {
additionalTraceAnnotations =
Collections.unmodifiableSet(Sets.<String>newHashSet(DEFAULT_ANNOTATIONS));

View File

@ -7,6 +7,7 @@ import com.google.auto.service.AutoService;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.api.Config;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@ -29,7 +30,6 @@ import net.bytebuddy.matcher.ElementMatcher;
@Slf4j
@AutoService(Instrumenter.class)
public class TraceConfigInstrumentation implements Instrumenter {
private static final String CONFIG_NAME = "dd.trace.methods";
static final String PACKAGE_CLASS_NAME_REGEX = "[\\w.\\$]+";
private static final String METHOD_LIST_REGEX = "\\s*(?:\\w+\\s*,)*\\s*(?:\\w+\\s*,?)\\s*";
@ -47,7 +47,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
private final Map<String, Set<String>> classMethodsToTrace;
public TraceConfigInstrumentation() {
final String configString = Default.getPropOrEnv(CONFIG_NAME);
final String configString = Config.getSettingFromEnvironment(Config.TRACE_METHODS, null);
if (configString == null || configString.trim().isEmpty()) {
classMethodsToTrace = Collections.emptyMap();

View File

@ -5,7 +5,7 @@ import dd.test.trace.annotation.SayTracedHello
import java.util.concurrent.Callable
import static TraceAnnotationsInstrumentation.DEFAULT_ANNOTATIONS
import static datadog.trace.agent.test.TestUtils.withSystemProperty
import static datadog.trace.agent.test.utils.TraceUtils.withSystemProperty
class ConfiguredTraceAnnotationsTest extends AgentTestRunner {

View File

@ -3,7 +3,7 @@ import datadog.trace.instrumentation.trace_annotation.TraceConfigInstrumentation
import java.util.concurrent.Callable
import static datadog.trace.agent.test.TestUtils.withSystemProperty
import static datadog.trace.agent.test.utils.TraceUtils.withSystemProperty
class TraceConfigTest extends AgentTestRunner {

View File

@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.netty.channel.AbstractChannel
@ -15,8 +15,8 @@ import spock.lang.Shared
import java.util.concurrent.CompletableFuture
import static datadog.trace.agent.test.TestUtils.runUnderTrace
import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
class VertxHttpClientTest extends AgentTestRunner {
@ -51,7 +51,7 @@ class VertxHttpClientTest extends AgentTestRunner {
def messageFuture = new CompletableFuture<String>()
httpClient.getNow(server.address.port, server.address.host, "/" + route, { response ->
responseFuture.complete(response)
response.bodyHandler({buffer ->
response.bodyHandler({ buffer ->
messageFuture.complete(buffer.toString())
})
})
@ -102,7 +102,7 @@ class VertxHttpClientTest extends AgentTestRunner {
def "test connection failure"() {
setup:
def invalidPort = TestUtils.randomOpenPort()
def invalidPort = PortUtils.randomOpenPort()
def errorFuture = new CompletableFuture<Throwable>()

View File

@ -1,6 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags
import io.netty.handler.codec.http.HttpResponseStatus
@ -21,7 +21,7 @@ class VertxServerTest extends AgentTestRunner {
Vertx server
def setupSpec() {
port = TestUtils.randomOpenPort()
port = PortUtils.randomOpenPort()
server = VertxWebTestServer.start(port)
}

View File

@ -6,6 +6,7 @@ import com.google.common.collect.Sets;
import datadog.opentracing.DDSpan;
import datadog.opentracing.DDTracer;
import datadog.trace.agent.test.asserts.ListWriterAssert;
import datadog.trace.agent.test.utils.GlobalTracerUtils;
import datadog.trace.agent.tooling.AgentInstaller;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.api.GlobalTracer;
@ -88,7 +89,7 @@ public abstract class AgentTestRunner extends Specification {
}
};
TEST_TRACER = new DDTracer(TEST_WRITER);
TestUtils.registerOrReplaceGlobalTracer((Tracer) TEST_TRACER);
GlobalTracerUtils.registerOrReplaceGlobalTracer((Tracer) TEST_TRACER);
GlobalTracer.registerIfAbsent((datadog.trace.api.Tracer) TEST_TRACER);
}

View File

@ -1,6 +1,7 @@
package datadog.trace.agent.test;
import com.google.common.reflect.ClassPath;
import datadog.trace.agent.test.utils.ClasspathUtils;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
@ -148,14 +149,14 @@ public class SpockRunner extends Sputnik {
private static File createBootstrapJar() throws IOException {
final Set<String> bootstrapClasses = new HashSet<>();
for (final ClassPath.ClassInfo info : TestUtils.getTestClasspath().getAllClasses()) {
for (final ClassPath.ClassInfo info : ClasspathUtils.getTestClasspath().getAllClasses()) {
// if info starts with bootstrap prefix: add to bootstrap jar
if (isBootstrapClass(info.getName())) {
bootstrapClasses.add(info.getResourceName());
}
}
return new File(
TestUtils.createJarWithClasses(
ClasspathUtils.createJarWithClasses(
AgentTestRunner.class.getClassLoader(), bootstrapClasses.toArray(new String[0]))
.getFile());
}

View File

@ -1,8 +1,8 @@
package datadog.trace.agent.test.server.http
import datadog.opentracing.DDSpan
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.asserts.ListWriterAssert
import datadog.trace.agent.test.utils.PortUtils
import io.opentracing.SpanContext
import io.opentracing.Tracer
import io.opentracing.propagation.Format
@ -45,7 +45,7 @@ class TestHttpServer implements AutoCloseable {
private final AtomicReference<HandlerApi.RequestApi> last = new AtomicReference<>()
private TestHttpServer() {
int port = TestUtils.randomOpenPort()
int port = PortUtils.randomOpenPort()
internalServer = new Server(port)
internalServer.stopAtShutdown = true
address = new URI("http://localhost:$port")

View File

@ -1,114 +1,29 @@
package datadog.trace.agent.test;
package datadog.trace.agent.test.utils;
import static com.google.common.base.StandardSystemProperty.JAVA_CLASS_PATH;
import static com.google.common.base.StandardSystemProperty.PATH_SEPARATOR;
import static io.opentracing.log.Fields.ERROR_OBJECT;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.reflect.ClassPath;
import datadog.trace.agent.test.AgentTestRunner;
import datadog.trace.agent.tooling.Utils;
import datadog.trace.context.TraceScope;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collections;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
public class TestUtils {
public class ClasspathUtils {
private static final ClassPath testClasspath = computeTestClasspath();
public static void registerOrReplaceGlobalTracer(final Tracer tracer) {
try {
GlobalTracer.register(tracer);
} catch (final Exception e) {
// Force it anyway using reflection
Field field = null;
try {
field = GlobalTracer.class.getDeclaredField("tracer");
field.setAccessible(true);
field.set(null, tracer);
} catch (final Exception e2) {
throw new IllegalStateException(e2);
} finally {
if (null != field) {
field.setAccessible(false);
}
}
}
if (!GlobalTracer.isRegistered()) {
throw new RuntimeException("Unable to register the global tracer.");
}
}
/** Get the tracer implementation out of the GlobalTracer */
public static Tracer getUnderlyingGlobalTracer() {
Field field = null;
try {
field = GlobalTracer.class.getDeclaredField("tracer");
field.setAccessible(true);
return (Tracer) field.get(GlobalTracer.get());
} catch (final Exception e2) {
throw new IllegalStateException(e2);
} finally {
if (null != field) {
field.setAccessible(false);
}
}
}
public static <T extends Object> Object withSystemProperty(
final String name, final String value, final Callable<T> r) {
if (value == null) {
System.clearProperty(name);
} else {
System.setProperty(name, value);
}
try {
return r.call();
} catch (final Exception e) {
throw new IllegalStateException(e);
} finally {
System.clearProperty(name);
}
}
public static <T extends Object> Object runUnderTrace(
final String rootOperationName, final Callable<T> r) throws Exception {
final Scope scope = GlobalTracer.get().buildSpan(rootOperationName).startActive(true);
((TraceScope) scope).setAsyncPropagation(true);
try {
return r.call();
} catch (final Exception e) {
final Span span = scope.span();
Tags.ERROR.set(span, true);
span.log(Collections.singletonMap(ERROR_OBJECT, e));
throw e;
} finally {
((TraceScope) scope).setAsyncPropagation(false);
scope.close();
}
}
public static byte[] convertToByteArray(final InputStream resource) throws IOException {
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int bytesRead;
@ -203,20 +118,6 @@ public class TestUtils {
jarOutputStream.closeEntry();
}
/** Open up a random, reusable port. */
public static int randomOpenPort() {
final ServerSocket socket;
try {
socket = new ServerSocket(0);
socket.setReuseAddress(true);
socket.close();
return socket.getLocalPort();
} catch (final IOException ioe) {
ioe.printStackTrace();
return -1;
}
}
public static ClassPath getTestClasspath() {
return testClasspath;
}

View File

@ -0,0 +1,47 @@
package datadog.trace.agent.test.utils;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import java.lang.reflect.Field;
public class GlobalTracerUtils {
public static void registerOrReplaceGlobalTracer(final Tracer tracer) {
try {
GlobalTracer.register(tracer);
} catch (final Exception e) {
// Force it anyway using reflection
Field field = null;
try {
field = GlobalTracer.class.getDeclaredField("tracer");
field.setAccessible(true);
field.set(null, tracer);
} catch (final Exception e2) {
throw new IllegalStateException(e2);
} finally {
if (null != field) {
field.setAccessible(false);
}
}
}
if (!GlobalTracer.isRegistered()) {
throw new RuntimeException("Unable to register the global tracer.");
}
}
/** Get the tracer implementation out of the GlobalTracer */
public static Tracer getUnderlyingGlobalTracer() {
Field field = null;
try {
field = GlobalTracer.class.getDeclaredField("tracer");
field.setAccessible(true);
return (Tracer) field.get(GlobalTracer.get());
} catch (final Exception e2) {
throw new IllegalStateException(e2);
} finally {
if (null != field) {
field.setAccessible(false);
}
}
}
}

View File

@ -0,0 +1,21 @@
package datadog.trace.agent.test.utils;
import java.io.IOException;
import java.net.ServerSocket;
public class PortUtils {
/** Open up a random, reusable port. */
public static int randomOpenPort() {
final ServerSocket socket;
try {
socket = new ServerSocket(0);
socket.setReuseAddress(true);
socket.close();
return socket.getLocalPort();
} catch (final IOException ioe) {
ioe.printStackTrace();
return -1;
}
}
}

View File

@ -0,0 +1,79 @@
package datadog.trace.agent.test.utils
import datadog.trace.api.Config
import datadog.trace.context.TraceScope
import io.opentracing.Scope
import io.opentracing.Span
import io.opentracing.tag.Tags
import io.opentracing.util.GlobalTracer
import lombok.SneakyThrows
import java.lang.reflect.Field
import java.lang.reflect.Modifier
import java.util.concurrent.Callable
import static io.opentracing.log.Fields.ERROR_OBJECT
class TraceUtils {
@SneakyThrows
static <T extends Object> Object runUnderTrace(final String rootOperationName, final Callable<T> r) {
final Scope scope = GlobalTracer.get().buildSpan(rootOperationName).startActive(true)
((TraceScope) scope).setAsyncPropagation(true)
try {
return r.call()
} catch (final Exception e) {
final Span span = scope.span()
Tags.ERROR.set(span, true)
span.log(Collections.singletonMap(ERROR_OBJECT, e))
throw e
} finally {
((TraceScope) scope).setAsyncPropagation(false)
scope.close()
}
}
// TODO: ideally all users of this should switch to using Config object (and withConfigOverride) instead.
@SneakyThrows
static <T extends Object> Object withSystemProperty(final String name, final String value, final Callable<T> r) {
if (value == null) {
System.clearProperty(name)
} else {
System.setProperty(name, value)
}
try {
return r.call()
} finally {
System.clearProperty(name)
}
}
@SneakyThrows
static <T extends Object> Object withConfigOverride(final String name, final String value, final Callable<T> r) {
def existingConfig = Config.get() // We can't reference INSTANCE directly or the reflection below will fail.
Properties properties = new Properties()
properties.put(name, value)
setFinalStatic(Config.getDeclaredField("INSTANCE"), new Config(properties, existingConfig))
try {
return r.call()
} finally {
setFinalStatic(Config.getDeclaredField("INSTANCE"), existingConfig)
}
}
private static void setFinalStatic(final Field field, final Object newValue) throws Exception {
setFinal(field, null, newValue)
}
private static void setFinal(final Field field, final Object instance, final Object newValue) throws Exception {
field.setAccessible(true)
final Field modifiersField = Field.getDeclaredField("modifiers")
modifiersField.setAccessible(true)
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL)
field.set(instance, newValue)
}
}

View File

@ -1,7 +1,8 @@
import com.google.common.reflect.ClassPath
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.SpockRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.ClasspathUtils
import datadog.trace.agent.test.utils.GlobalTracerUtils
import datadog.trace.agent.tooling.Constants
import io.opentracing.Span
import io.opentracing.Tracer
@ -35,7 +36,7 @@ class AgentTestRunnerTest extends AgentTestRunner {
def "classpath setup"() {
setup:
final List<String> bootstrapClassesIncorrectlyLoaded = []
for (ClassPath.ClassInfo info : TestUtils.getTestClasspath().getAllClasses()) {
for (ClassPath.ClassInfo info : ClasspathUtils.getTestClasspath().getAllClasses()) {
for (int i = 0; i < Constants.BOOTSTRAP_PACKAGE_PREFIXES.length; ++i) {
if (info.getName().startsWith(Constants.BOOTSTRAP_PACKAGE_PREFIXES[i])) {
Class<?> bootstrapClass = Class.forName(info.getName())
@ -52,9 +53,9 @@ class AgentTestRunnerTest extends AgentTestRunner {
sharedSpanClass.getClassLoader() == BOOTSTRAP_CLASSLOADER
Tracer.getClassLoader() == BOOTSTRAP_CLASSLOADER
!AGENT_INSTALLED_IN_CLINIT
getTestTracer() == TestUtils.getUnderlyingGlobalTracer()
getTestTracer() == GlobalTracerUtils.getUnderlyingGlobalTracer()
getAgentTransformer() != null
TestUtils.getUnderlyingGlobalTracer() == datadog.trace.api.GlobalTracer.get()
GlobalTracerUtils.getUnderlyingGlobalTracer() == datadog.trace.api.GlobalTracer.get()
bootstrapClassesIncorrectlyLoaded == []
}

View File

@ -1,7 +1,7 @@
package context
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.ClasspathUtils
import datadog.trace.api.Config
import datadog.trace.util.gc.GCUtils
import net.bytebuddy.agent.ByteBuddyAgent
@ -128,8 +128,8 @@ class FieldBackedProviderTest extends AgentTestRunner {
def "context classes are redefine safe"() {
when:
ByteBuddyAgent.getInstrumentation().redefineClasses(new ClassDefinition(KeyClass, TestUtils.convertToByteArray(KeyClass)))
ByteBuddyAgent.getInstrumentation().redefineClasses(new ClassDefinition(UntransformableKeyClass, TestUtils.convertToByteArray(UntransformableKeyClass)))
ByteBuddyAgent.getInstrumentation().redefineClasses(new ClassDefinition(KeyClass, ClasspathUtils.convertToByteArray(KeyClass)))
ByteBuddyAgent.getInstrumentation().redefineClasses(new ClassDefinition(UntransformableKeyClass, ClasspathUtils.convertToByteArray(UntransformableKeyClass)))
then:
new KeyClass().isInstrumented()

View File

@ -1,7 +1,7 @@
package muzzle
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.ClasspathUtils
import datadog.trace.agent.tooling.muzzle.Reference
import datadog.trace.agent.tooling.muzzle.Reference.Source
import datadog.trace.agent.tooling.muzzle.ReferenceCreator
@ -24,14 +24,14 @@ import static muzzle.TestClasses.MethodBodyAdvice
class ReferenceMatcherTest extends AgentTestRunner {
@Shared
ClassLoader safeClasspath = new URLClassLoader([TestUtils.createJarWithClasses(MethodBodyAdvice.A,
ClassLoader safeClasspath = new URLClassLoader([ClasspathUtils.createJarWithClasses(MethodBodyAdvice.A,
MethodBodyAdvice.B,
MethodBodyAdvice.SomeInterface,
MethodBodyAdvice.SomeImplementation)] as URL[],
(ClassLoader) null)
@Shared
ClassLoader unsafeClasspath = new URLClassLoader([TestUtils.createJarWithClasses(MethodBodyAdvice.A,
ClassLoader unsafeClasspath = new URLClassLoader([ClasspathUtils.createJarWithClasses(MethodBodyAdvice.A,
MethodBodyAdvice.SomeInterface,
MethodBodyAdvice.SomeImplementation)] as URL[],
(ClassLoader) null)
@ -68,7 +68,7 @@ class ReferenceMatcherTest extends AgentTestRunner {
def "muzzle type pool caches"() {
setup:
ClassLoader cl = new CountingClassLoader(
[TestUtils.createJarWithClasses(MethodBodyAdvice.A,
[ClasspathUtils.createJarWithClasses(MethodBodyAdvice.A,
MethodBodyAdvice.B,
MethodBodyAdvice.SomeInterface,
MethodBodyAdvice.SomeImplementation)] as URL[],

View File

@ -5,8 +5,7 @@ minimumInstructionCoverage = 0.5
excludedClassesConverage += [
'datadog.trace.agent.test.asserts.*Assert',
'datadog.trace.agent.test.AgentTestRunner.ErrorCountingListener',
'datadog.trace.agent.test.OkHttpUtils',
'datadog.trace.agent.test.TestUtils',
'datadog.trace.agent.test.utils.*',
// Avoid applying jacoco instrumentation to classes instrumented by tested agent
'context.ContextTestInstrumentation**',
]

View File

@ -40,7 +40,10 @@ public class Config {
public static final String GLOBAL_TAGS = "trace.global.tags";
public static final String SPAN_TAGS = "trace.span.tags";
public static final String JMX_TAGS = "trace.jmx.tags";
public static final String TRACE_ANNOTATIONS = "trace.annotations";
public static final String TRACE_METHODS = "trace.methods";
public static final String HEADER_TAGS = "trace.header.tags";
public static final String HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN = "trace.http.client.split-by-domain";
public static final String PARTIAL_FLUSH_MIN_SPANS = "trace.partial.flush.min.spans";
public static final String RUNTIME_CONTEXT_FIELD_INJECTION =
"trace.runtime.context.field.injection";
@ -71,6 +74,7 @@ public class Config {
private static final boolean DEFAULT_PRIORITY_SAMPLING_ENABLED = true;
private static final boolean DEFAULT_TRACE_RESOLVER_ENABLED = true;
private static final boolean DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN = false;
private static final int DEFAULT_MAX_TRACE_SIZE_BEFORE_PARTIAL_FLUSH = 0;
private static final boolean DEFAULT_JMX_FETCH_ENABLED = false;
@ -95,6 +99,7 @@ public class Config {
private final Map<String, String> spanTags;
private final Map<String, String> jmxTags;
@Getter private final Map<String, String> headerTags;
@Getter private final boolean httpClientSplitByDomain;
@Getter private final Integer partialFlushMinSpans;
@Getter private final boolean runtimeContextFieldInjection;
@Getter private final boolean jmxFetchEnabled;
@ -129,6 +134,10 @@ public class Config {
jmxTags = getMapSettingFromEnvironment(JMX_TAGS, null);
headerTags = getMapSettingFromEnvironment(HEADER_TAGS, null);
httpClientSplitByDomain =
getBooleanSettingFromEnvironment(
HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN);
partialFlushMinSpans =
getIntegerSettingFromEnvironment(
PARTIAL_FLUSH_MIN_SPANS, DEFAULT_MAX_TRACE_SIZE_BEFORE_PARTIAL_FLUSH);
@ -177,6 +186,10 @@ public class Config {
jmxTags = getPropertyMapValue(properties, JMX_TAGS, parent.jmxTags);
headerTags = getPropertyMapValue(properties, HEADER_TAGS, parent.headerTags);
httpClientSplitByDomain =
getPropertyBooleanValue(
properties, HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, parent.httpClientSplitByDomain);
partialFlushMinSpans =
getPropertyIntegerValue(properties, PARTIAL_FLUSH_MIN_SPANS, parent.partialFlushMinSpans);
@ -243,7 +256,16 @@ public class Config {
return Collections.unmodifiableMap(result);
}
private static String getSettingFromEnvironment(final String name, final String defaultValue) {
/**
* Helper method that takes the name, adds a "dd." prefix then checks for System Properties of
* that name. If none found, the name is converted to an Environment Variable and used to check
* the env. If setting not configured in either location, defaultValue is returned.
*
* @param name
* @param defaultValue
* @return
*/
public static String getSettingFromEnvironment(final String name, final String defaultValue) {
final String completeName = PREFIX + name;
final String value =
System.getProperties()
@ -261,7 +283,14 @@ public class Config {
return parseList(getSettingFromEnvironment(name, defaultValue));
}
private static Boolean getBooleanSettingFromEnvironment(
/**
* Calls {@link #getSettingFromEnvironment(String, String)} and converts the result to a Boolean.
*
* @param name
* @param defaultValue
* @return
*/
public static Boolean getBooleanSettingFromEnvironment(
final String name, final Boolean defaultValue) {
final String value = getSettingFromEnvironment(name, null);
return value == null ? defaultValue : Boolean.valueOf(value);

View File

@ -5,7 +5,33 @@ import org.junit.contrib.java.lang.system.EnvironmentVariables
import org.junit.contrib.java.lang.system.RestoreSystemProperties
import spock.lang.Specification
import static datadog.trace.api.Config.*
import static datadog.trace.api.Config.AGENT_HOST
import static datadog.trace.api.Config.AGENT_PORT_LEGACY
import static datadog.trace.api.Config.DEFAULT_JMX_FETCH_STATSD_PORT
import static datadog.trace.api.Config.GLOBAL_TAGS
import static datadog.trace.api.Config.HEADER_TAGS
import static datadog.trace.api.Config.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN
import static datadog.trace.api.Config.JMX_FETCH_CHECK_PERIOD
import static datadog.trace.api.Config.JMX_FETCH_ENABLED
import static datadog.trace.api.Config.JMX_FETCH_METRICS_CONFIGS
import static datadog.trace.api.Config.JMX_FETCH_REFRESH_BEANS_PERIOD
import static datadog.trace.api.Config.JMX_FETCH_STATSD_HOST
import static datadog.trace.api.Config.JMX_FETCH_STATSD_PORT
import static datadog.trace.api.Config.JMX_TAGS
import static datadog.trace.api.Config.LANGUAGE_TAG_KEY
import static datadog.trace.api.Config.LANGUAGE_TAG_VALUE
import static datadog.trace.api.Config.PARTIAL_FLUSH_MIN_SPANS
import static datadog.trace.api.Config.PREFIX
import static datadog.trace.api.Config.PRIORITY_SAMPLING
import static datadog.trace.api.Config.RUNTIME_CONTEXT_FIELD_INJECTION
import static datadog.trace.api.Config.RUNTIME_ID_TAG
import static datadog.trace.api.Config.SERVICE
import static datadog.trace.api.Config.SERVICE_MAPPING
import static datadog.trace.api.Config.SERVICE_NAME
import static datadog.trace.api.Config.SPAN_TAGS
import static datadog.trace.api.Config.TRACE_AGENT_PORT
import static datadog.trace.api.Config.TRACE_RESOLVER_ENABLED
import static datadog.trace.api.Config.WRITER_TYPE
class ConfigTest extends Specification {
@Rule
@ -37,6 +63,7 @@ class ConfigTest extends Specification {
config.mergedSpanTags == [:]
config.mergedJmxTags == [(RUNTIME_ID_TAG): config.getRuntimeId(), (SERVICE): config.serviceName, (LANGUAGE_TAG_KEY): LANGUAGE_TAG_VALUE]
config.headerTags == [:]
config.httpClientSplitByDomain == false
config.partialFlushMinSpans == 0
config.runtimeContextFieldInjection == true
config.jmxFetchEnabled == false
@ -62,6 +89,7 @@ class ConfigTest extends Specification {
System.setProperty(PREFIX + SPAN_TAGS, "c:3")
System.setProperty(PREFIX + JMX_TAGS, "d:4")
System.setProperty(PREFIX + HEADER_TAGS, "e:5")
System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
System.setProperty(PREFIX + PARTIAL_FLUSH_MIN_SPANS, "15")
System.setProperty(PREFIX + RUNTIME_CONTEXT_FIELD_INJECTION, "false")
System.setProperty(PREFIX + JMX_FETCH_ENABLED, "true")
@ -85,6 +113,7 @@ class ConfigTest extends Specification {
config.mergedSpanTags == [b: "2", c: "3"]
config.mergedJmxTags == [b: "2", d: "4", (RUNTIME_ID_TAG): config.getRuntimeId(), (SERVICE): config.serviceName, (LANGUAGE_TAG_KEY): LANGUAGE_TAG_VALUE]
config.headerTags == [e: "5"]
config.httpClientSplitByDomain == true
config.partialFlushMinSpans == 15
config.runtimeContextFieldInjection == false
config.jmxFetchEnabled == true
@ -187,6 +216,7 @@ class ConfigTest extends Specification {
properties.setProperty(SPAN_TAGS, "c:3")
properties.setProperty(JMX_TAGS, "d:4")
properties.setProperty(HEADER_TAGS, "e:5")
properties.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
properties.setProperty(PARTIAL_FLUSH_MIN_SPANS, "15")
properties.setProperty(JMX_FETCH_METRICS_CONFIGS, "/foo.yaml,/bar.yaml")
properties.setProperty(JMX_FETCH_CHECK_PERIOD, "100")
@ -208,6 +238,7 @@ class ConfigTest extends Specification {
config.mergedSpanTags == [b: "2", c: "3"]
config.mergedJmxTags == [b: "2", d: "4", (RUNTIME_ID_TAG): config.getRuntimeId(), (SERVICE): config.serviceName, (LANGUAGE_TAG_KEY): LANGUAGE_TAG_VALUE]
config.headerTags == [e: "5"]
config.httpClientSplitByDomain == true
config.partialFlushMinSpans == 15
config.jmxFetchMetricsConfigs == ["/foo.yaml", "/bar.yaml"]
config.jmxFetchCheckPeriod == 100