Skip to content

Commit 4655032

Browse files
Create shared DD intake HTTP client (#9660)
1 parent 3745413 commit 4655032

File tree

23 files changed

+115
-56
lines changed

23 files changed

+115
-56
lines changed

communication/src/main/java/datadog/communication/BackendApiFactory.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
import datadog.communication.ddagent.DDAgentFeaturesDiscovery;
44
import datadog.communication.ddagent.SharedCommunicationObjects;
55
import datadog.communication.http.HttpRetryPolicy;
6-
import datadog.communication.http.OkHttpUtils;
76
import datadog.trace.api.Config;
87
import datadog.trace.api.intake.Intake;
98
import datadog.trace.util.throwable.FatalAgentMisconfigurationError;
109
import javax.annotation.Nullable;
1110
import okhttp3.HttpUrl;
12-
import okhttp3.OkHttpClient;
1311
import org.slf4j.Logger;
1412
import org.slf4j.LoggerFactory;
1513

@@ -36,10 +34,13 @@ public BackendApiFactory(Config config, SharedCommunicationObjects sharedCommuni
3634
"Agentless mode is enabled and api key is not set. Please set application key");
3735
}
3836
String traceId = config.getIdGenerationStrategy().generateTraceId().toString();
39-
OkHttpClient httpClient =
40-
OkHttpUtils.buildHttpClient(
41-
agentlessUrl, config.getCiVisibilityBackendApiTimeoutMillis());
42-
return new IntakeApi(agentlessUrl, apiKey, traceId, retryPolicyFactory, httpClient, true);
37+
return new IntakeApi(
38+
agentlessUrl,
39+
apiKey,
40+
traceId,
41+
retryPolicyFactory,
42+
sharedCommunicationObjects.getIntakeHttpClient(),
43+
true);
4344
}
4445

4546
DDAgentFeaturesDiscovery featuresDiscovery =
@@ -55,7 +56,7 @@ public BackendApiFactory(Config config, SharedCommunicationObjects sharedCommuni
5556
evpProxyUrl,
5657
subdomain,
5758
retryPolicyFactory,
58-
sharedCommunicationObjects.okHttpClient,
59+
sharedCommunicationObjects.agentHttpClient,
5960
true);
6061
}
6162

communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,20 @@ public class SharedCommunicationObjects {
2727
private final List<Runnable> pausedComponents = new ArrayList<>();
2828
private volatile boolean paused;
2929

30-
public OkHttpClient okHttpClient;
30+
/**
31+
* HTTP client for making requests to Datadog agent. Depending on configuration, this client may
32+
* use regular HTTP, UDS or named pipe.
33+
*/
34+
public OkHttpClient agentHttpClient;
35+
36+
/**
37+
* HTTP client for making requests directly to Datadog backend. Unlike {@link #agentHttpClient},
38+
* this client is not configured to use UDS or named pipe.
39+
*/
40+
private volatile OkHttpClient intakeHttpClient;
41+
42+
public long httpClientTimeout;
43+
public boolean forceClearTextHttpForIntakeClient;
3144
public HttpUrl agentUrl;
3245
public Monitoring monitoring;
3346
private volatile DDAgentFeaturesDiscovery featuresDiscovery;
@@ -45,18 +58,27 @@ public void createRemaining(Config config) {
4558
if (monitoring == null) {
4659
monitoring = Monitoring.DISABLED;
4760
}
61+
62+
httpClientTimeout =
63+
config.isCiVisibilityEnabled()
64+
? config.getCiVisibilityBackendApiTimeoutMillis()
65+
: TimeUnit.SECONDS.toMillis(config.getAgentTimeout());
66+
67+
forceClearTextHttpForIntakeClient = config.isForceClearTextHttpForIntakeClient();
68+
4869
if (agentUrl == null) {
4970
agentUrl = parseAgentUrl(config);
5071
if (agentUrl == null) {
5172
throw new IllegalArgumentException("Bad agent URL: " + config.getAgentUrl());
5273
}
5374
}
54-
if (okHttpClient == null) {
75+
76+
if (agentHttpClient == null) {
5577
String unixDomainSocket = SocketUtils.discoverApmSocket(config);
5678
String namedPipe = config.getAgentNamedPipe();
57-
okHttpClient =
79+
agentHttpClient =
5880
OkHttpUtils.buildHttpClient(
59-
agentUrl, unixDomainSocket, namedPipe, getHttpClientTimeout(config));
81+
OkHttpUtils.isPlainHttp(agentUrl), unixDomainSocket, namedPipe, httpClientTimeout);
6082
}
6183
}
6284

@@ -103,14 +125,6 @@ private static HttpUrl parseAgentUrl(Config config) {
103125
return HttpUrl.parse(agentUrl);
104126
}
105127

106-
private static long getHttpClientTimeout(Config config) {
107-
if (!config.isCiVisibilityEnabled()) {
108-
return TimeUnit.SECONDS.toMillis(config.getAgentTimeout());
109-
} else {
110-
return config.getCiVisibilityBackendApiTimeoutMillis();
111-
}
112-
}
113-
114128
public ConfigurationPoller configurationPoller(Config config) {
115129
if (configurationPoller == null && config.isRemoteConfigEnabled()) {
116130
configurationPoller = createPoller(config);
@@ -130,7 +144,7 @@ private ConfigurationPoller createPoller(Config config) {
130144
configUrlSupplier = new RetryConfigUrlSupplier(this, config);
131145
}
132146
return new DefaultConfigurationPoller(
133-
config, TRACER_VERSION, containerId, entityId, configUrlSupplier, okHttpClient);
147+
config, TRACER_VERSION, containerId, entityId, configUrlSupplier, agentHttpClient);
134148
}
135149

136150
// for testing
@@ -146,7 +160,7 @@ public DDAgentFeaturesDiscovery featuresDiscovery(Config config) {
146160
createRemaining(config);
147161
ret =
148162
new DDAgentFeaturesDiscovery(
149-
okHttpClient,
163+
agentHttpClient,
150164
monitoring,
151165
agentUrl,
152166
config.isTraceAgentV05Enabled(),
@@ -209,4 +223,20 @@ public String get() {
209223
return this.configUrl;
210224
}
211225
}
226+
227+
public OkHttpClient getIntakeHttpClient() {
228+
OkHttpClient client = this.intakeHttpClient;
229+
if (client != null) {
230+
return client;
231+
}
232+
233+
synchronized (this) {
234+
if (this.intakeHttpClient == null) {
235+
this.intakeHttpClient =
236+
OkHttpUtils.buildHttpClient(
237+
forceClearTextHttpForIntakeClient, null, null, httpClientTimeout);
238+
}
239+
return this.intakeHttpClient;
240+
}
241+
}
212242
}

communication/src/main/java/datadog/communication/http/OkHttpUtils.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,19 @@ public final class OkHttpUtils {
5858
SystemProperties.getOrDefault("java.vm.vendor", "unknown");
5959

6060
public static OkHttpClient buildHttpClient(final HttpUrl url, final long timeoutMillis) {
61-
return buildHttpClient(url, null, null, timeoutMillis);
61+
return buildHttpClient(isPlainHttp(url), null, null, timeoutMillis);
6262
}
6363

6464
public static OkHttpClient buildHttpClient(
65-
final HttpUrl url,
65+
final boolean isHttp,
6666
final String unixDomainSocketPath,
6767
final String namedPipe,
6868
final long timeoutMillis) {
6969
return buildHttpClient(
7070
unixDomainSocketPath,
7171
namedPipe,
7272
null,
73-
url,
73+
isHttp,
7474
null,
7575
null,
7676
null,
@@ -95,7 +95,7 @@ public static OkHttpClient buildHttpClient(
9595
discoverApmSocket(config),
9696
config.getAgentNamedPipe(),
9797
dispatcher,
98-
url,
98+
isPlainHttp(url),
9999
retryOnConnectionFailure,
100100
maxRunningRequests,
101101
proxyHost,
@@ -111,7 +111,7 @@ private static OkHttpClient buildHttpClient(
111111
final String unixDomainSocketPath,
112112
final String namedPipe,
113113
final Dispatcher dispatcher,
114-
final HttpUrl url,
114+
final boolean isHttp,
115115
final Boolean retryOnConnectionFailure,
116116
final Integer maxRunningRequests,
117117
final String proxyHost,
@@ -151,7 +151,6 @@ private static OkHttpClient buildHttpClient(
151151
log.debug("Using NamedPipe as http transport");
152152
}
153153

154-
boolean isHttp = url != null && "http".equals(url.scheme());
155154
if (isHttp) {
156155
// force clear text when using http to avoid failures for JVMs without TLS
157156
builder.connectionSpecs(Collections.singletonList(ConnectionSpec.CLEARTEXT));
@@ -393,4 +392,8 @@ private static void closeQuietly(Response response) {
393392
// ignore
394393
}
395394
}
395+
396+
public static boolean isPlainHttp(final HttpUrl url) {
397+
return url != null && "http".equalsIgnoreCase(url.scheme());
398+
}
396399
}

communication/src/test/groovy/datadog/communication/ddagent/SharedCommunicationsObjectsSpecification.groovy

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class SharedCommunicationsObjectsSpecification extends DDSpecification {
2424
1 * config.agentTimeout >> 1
2525
1 * config.agentUnixDomainSocket >> null
2626
sco.agentUrl as String == 'http://example.com/'
27-
sco.okHttpClient != null
27+
sco.agentHttpClient != null
2828
sco.monitoring.is(Monitoring.DISABLED)
2929

3030
when:
@@ -78,17 +78,20 @@ class SharedCommunicationsObjectsSpecification extends DDSpecification {
7878
DDAgentFeaturesDiscovery agentFeaturesDiscovery = Mock()
7979

8080
sco.agentUrl = url
81-
sco.okHttpClient = okHttpClient
81+
sco.agentHttpClient = okHttpClient
8282
sco.monitoring = monitoring
8383
sco.featuresDiscovery = agentFeaturesDiscovery
8484

8585
when:
8686
sco.createRemaining(config)
8787

8888
then:
89+
1 * config.isCiVisibilityEnabled()
90+
1 * config.getAgentTimeout()
91+
1 * config.isForceClearTextHttpForIntakeClient()
8992
0 * _
9093
sco.agentUrl.is(url)
91-
sco.okHttpClient.is(okHttpClient)
94+
sco.agentHttpClient.is(okHttpClient)
9295
sco.monitoring.is(monitoring)
9396
sco.featuresDiscovery.is(agentFeaturesDiscovery)
9497
}
@@ -124,4 +127,12 @@ class SharedCommunicationsObjectsSpecification extends DDSpecification {
124127
1 * config.agentUnixDomainSocket >> null
125128
sco.agentUrl as String == 'http://[2600:1f18:19c0:bd07:d55b::17]:8126/'
126129
}
130+
131+
void 'creates intake http client'() {
132+
when:
133+
def client = sco.getIntakeHttpClient()
134+
135+
then:
136+
client != null
137+
}
127138
}

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ private static CiEnvironment buildCiEnvironment(Config config, SharedCommunicati
153153
CiEnvironment remoteEnvironment =
154154
new CiEnvironmentImpl(
155155
getRemoteEnvironment(
156-
remoteEnvVarsProviderUrl, remoteEnvVarsProviderKey, sco.okHttpClient));
156+
remoteEnvVarsProviderUrl, remoteEnvVarsProviderKey, sco.agentHttpClient));
157157
return new CompositeCiEnvironment(remoteEnvironment, localEnvironment);
158158
} else {
159159
return localEnvironment;

dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ public void setUp() throws URISyntaxException {
7070
ss = gw.getSubscriptionService(RequestContextSlot.APPSEC);
7171
SharedCommunicationObjects sharedCommunicationObjects = new SharedCommunicationObjects();
7272
sharedCommunicationObjects.monitoring = Monitoring.DISABLED;
73-
sharedCommunicationObjects.okHttpClient = new StubOkHttpClient();
73+
sharedCommunicationObjects.agentHttpClient = new StubOkHttpClient();
7474
sharedCommunicationObjects.setFeaturesDiscovery(
75-
new StubDDAgentFeaturesDiscovery(sharedCommunicationObjects.okHttpClient));
75+
new StubDDAgentFeaturesDiscovery(sharedCommunicationObjects.agentHttpClient));
7676

7777
AppSecSystem.start(ss, sharedCommunicationObjects);
7878
uri = new URIDefaultDataAdapter(new URI("http://localhost:8080/test"));

dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/AppSecSystemSpecification.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class AppSecSystemSpecification extends DDSpecification {
182182
poller
183183
}
184184
}
185-
sco.okHttpClient = Stub(OkHttpClient)
185+
sco.agentHttpClient = Stub(OkHttpClient)
186186
sco.monitoring = Mock(Monitoring)
187187
sco.featuresDiscovery = Stub(DDAgentFeaturesDiscovery)
188188
sco

dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ abstract class InstrumentationSpecification extends DDSpecification implements A
371371

372372
// emit traces to the APM Test-Agent for Cross-Tracer Testing Trace Checks
373373
HttpUrl agentUrl = HttpUrl.get("http://" + agentHost + ":" + DEFAULT_TRACE_AGENT_PORT)
374-
OkHttpClient client = buildHttpClient(agentUrl, null, null, TimeUnit.SECONDS.toMillis(DEFAULT_AGENT_TIMEOUT))
374+
OkHttpClient client = buildHttpClient(true, null, null, TimeUnit.SECONDS.toMillis(DEFAULT_AGENT_TIMEOUT))
375375
DDAgentFeaturesDiscovery featureDiscovery = new DDAgentFeaturesDiscovery(client, Monitoring.DISABLED, agentUrl, Config.get().isTraceAgentV05Enabled(), Config.get().isTracerMetricsEnabled())
376376
TEST_AGENT_API = new DDAgentApi(client, agentUrl, featureDiscovery, Monitoring.DISABLED, Config.get().isTracerMetricsEnabled())
377377
TEST_AGENT_WRITER = DDAgentWriter.builder().agentApi(TEST_AGENT_API).build()

dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public final class TracerConfig {
2626
public static final String AGENT_UNIX_DOMAIN_SOCKET = "trace.agent.unix.domain.socket";
2727
public static final String AGENT_NAMED_PIPE = "trace.pipe.name";
2828
public static final String AGENT_TIMEOUT = "trace.agent.timeout";
29+
public static final String FORCE_CLEAR_TEXT_HTTP_FOR_INTAKE_CLIENT =
30+
"force.clear.text.http.for.intake.client";
2931
public static final String PROXY_NO_PROXY = "proxy.no_proxy";
3032
public static final String TRACE_AGENT_PATH = "trace.agent.path";
3133
public static final String TRACE_AGENT_ARGS = "trace.agent.args";

dd-trace-core/src/main/java/datadog/trace/common/metrics/ConflatingMetricsAggregator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public ConflatingMetricsAggregator(
113113
sharedCommunicationObjects.featuresDiscovery(config),
114114
healthMetrics,
115115
new OkHttpSink(
116-
sharedCommunicationObjects.okHttpClient,
116+
sharedCommunicationObjects.agentHttpClient,
117117
sharedCommunicationObjects.agentUrl.toString(),
118118
V6_METRICS_ENDPOINT,
119119
config.isTracerMetricsBufferingEnabled(),

0 commit comments

Comments
 (0)