From 8209a8830c0d2f82c45036f5082c57660abe2061 Mon Sep 17 00:00:00 2001 From: Nikolay Martynov Date: Thu, 20 Feb 2020 07:20:08 -0500 Subject: [PATCH] Determine agent URL version on first upload call This should remove http request from critical path during app load --- .../common/writer/ddagent/DDAgentApi.java | 40 ++++++++++--------- .../trace/api/writer/DDAgentApiTest.groovy | 18 ++++++--- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java b/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java index a0a0f7ad02..ab1ab439dd 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java @@ -60,30 +60,18 @@ public class DDAgentApi { Types.newParameterizedType(Map.class, String.class, Double.class))); private static final MediaType MSGPACK = MediaType.get("application/msgpack"); + private final String host; + private final int port; + private final String unixDomainSocketPath; private final OkHttpClient httpClient; - private final HttpUrl tracesUrl; + private HttpUrl tracesUrl; public DDAgentApi(final String host, final int port, final String unixDomainSocketPath) { - this( - host, - port, - endpointAvailable(getUrl(host, port, TRACES_ENDPOINT_V4), unixDomainSocketPath, true), - unixDomainSocketPath); - } + this.host = host; + this.port = port; + this.unixDomainSocketPath = unixDomainSocketPath; - DDAgentApi( - final String host, - final int port, - final boolean v4EndpointsAvailable, - final String unixDomainSocketPath) { httpClient = buildHttpClient(unixDomainSocketPath); - - if (v4EndpointsAvailable) { - tracesUrl = getUrl(host, port, TRACES_ENDPOINT_V4); - } else { - log.debug("API v0.4 endpoints not available. Downgrading to v0.3"); - tracesUrl = getUrl(host, port, TRACES_ENDPOINT_V3); - } } public void addResponseListener(final DDAgentResponseListener listener) { @@ -128,6 +116,10 @@ public class DDAgentApi { Response sendSerializedTraces( final int representativeCount, final Integer sizeInBytes, final List traces) { + if (tracesUrl == null) { + detectEndpoint(); + } + try { final RequestBody body = new RequestBody() { @@ -298,6 +290,16 @@ public class DDAgentApi { } } + private synchronized void detectEndpoint() { + final HttpUrl v4Url = getUrl(host, port, TRACES_ENDPOINT_V4); + if (endpointAvailable(v4Url, unixDomainSocketPath, true)) { + tracesUrl = v4Url; + } else { + log.debug("API v0.4 endpoints not available. Downgrading to v0.3"); + tracesUrl = getUrl(host, port, TRACES_ENDPOINT_V3); + } + } + @Override public String toString() { return "DDApi { tracesUrl=" + tracesUrl + " }"; diff --git a/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/DDAgentApiTest.groovy b/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/DDAgentApiTest.groovy index 6e6a0fb5e6..e5737d0460 100644 --- a/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/DDAgentApiTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/DDAgentApiTest.groovy @@ -34,10 +34,10 @@ class DDAgentApiTest extends DDSpecification { def client = new DDAgentApi("localhost", agent.address.port, null) expect: - client.tracesUrl.toString() == "http://localhost:${agent.address.port}/v0.4/traces" def response = client.sendTraces([]) response.success() response.status() == 200 + agent.getLastRequest().path == "/v0.4/traces" cleanup: agent.close() @@ -50,16 +50,19 @@ class DDAgentApiTest extends DDSpecification { put("v0.4/traces") { response.status(404).send() } + + put("v0.3/traces") { + response.status(404).send() + } } } def client = new DDAgentApi("localhost", agent.address.port, null) expect: - client.tracesUrl.toString() == "http://localhost:${agent.address.port}/v0.3/traces" - def response = client.sendTraces([]) !response.success() response.status() == 404 + agent.getLastRequest().path == "/v0.3/traces" cleanup: agent.close() @@ -77,7 +80,6 @@ class DDAgentApiTest extends DDSpecification { def client = new DDAgentApi("localhost", agent.address.port, null) expect: - client.tracesUrl.toString() == "http://localhost:${agent.address.port}/v0.4/traces" client.sendTraces(traces).success() agent.lastRequest.contentType == "application/msgpack" agent.lastRequest.headers.get("Datadog-Meta-Lang") == "java" @@ -166,8 +168,8 @@ class DDAgentApiTest extends DDSpecification { def client = new DDAgentApi("localhost", v3Agent.address.port, null) expect: - client.tracesUrl.toString() == "http://localhost:${v3Agent.address.port}/v0.3/traces" client.sendTraces([]).success() + v3Agent.getLastRequest().path == "/v0.3/traces" cleanup: v3Agent.close() @@ -191,9 +193,13 @@ class DDAgentApiTest extends DDSpecification { } def port = badPort ? 999 : agent.address.port def client = new DDAgentApi("localhost", port, null) + def result = client.sendTraces([]) expect: - client.tracesUrl.toString() == "http://localhost:${port}/$endpointVersion/traces" + result.success() == !badPort // Expect success of port is ok + if (!badPort) { + assert agent.getLastRequest().path == "/$endpointVersion/traces" + } cleanup: agent.close()