Skip to content

Commit eabb290

Browse files
Create shared DD intake HTTP client
1 parent 713a41a commit eabb290

22 files changed

Lines changed: 93 additions & 55 deletions

File tree

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(config),
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: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,24 @@ 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+
3136
public HttpUrl agentUrl;
3237
public Monitoring monitoring;
3338
private volatile DDAgentFeaturesDiscovery featuresDiscovery;
3439
private ConfigurationPoller configurationPoller;
3540

41+
/**
42+
* HTTP client for making requests directly to Datadog backend. Unlike {@link #agentHttpClient},
43+
* this client is not configured to use UDS or named pipe, and will not force the use of
44+
* clear-text HTTP.
45+
*/
46+
private volatile OkHttpClient intakeHttpClient;
47+
3648
public SharedCommunicationObjects() {
3749
this(false);
3850
}
@@ -51,12 +63,15 @@ public void createRemaining(Config config) {
5163
throw new IllegalArgumentException("Bad agent URL: " + config.getAgentUrl());
5264
}
5365
}
54-
if (okHttpClient == null) {
66+
if (agentHttpClient == null) {
5567
String unixDomainSocket = SocketUtils.discoverApmSocket(config);
5668
String namedPipe = config.getAgentNamedPipe();
57-
okHttpClient =
69+
agentHttpClient =
5870
OkHttpUtils.buildHttpClient(
59-
agentUrl, unixDomainSocket, namedPipe, getHttpClientTimeout(config));
71+
agentUrl != null && "http".equals(agentUrl.scheme()),
72+
unixDomainSocket,
73+
namedPipe,
74+
getHttpClientTimeout(config));
6075
}
6176
}
6277

@@ -130,7 +145,7 @@ private ConfigurationPoller createPoller(Config config) {
130145
configUrlSupplier = new RetryConfigUrlSupplier(this, config);
131146
}
132147
return new DefaultConfigurationPoller(
133-
config, TRACER_VERSION, containerId, entityId, configUrlSupplier, okHttpClient);
148+
config, TRACER_VERSION, containerId, entityId, configUrlSupplier, agentHttpClient);
134149
}
135150

136151
// for testing
@@ -146,7 +161,7 @@ public DDAgentFeaturesDiscovery featuresDiscovery(Config config) {
146161
createRemaining(config);
147162
ret =
148163
new DDAgentFeaturesDiscovery(
149-
okHttpClient,
164+
agentHttpClient,
150165
monitoring,
151166
agentUrl,
152167
config.isTraceAgentV05Enabled(),
@@ -209,4 +224,19 @@ public String get() {
209224
return this.configUrl;
210225
}
211226
}
227+
228+
public OkHttpClient getIntakeHttpClient(Config config) {
229+
OkHttpClient intakeHttpClient = this.intakeHttpClient;
230+
if (intakeHttpClient != null) {
231+
return intakeHttpClient;
232+
}
233+
234+
synchronized (this) {
235+
if (this.intakeHttpClient == null) {
236+
this.intakeHttpClient =
237+
OkHttpUtils.buildHttpClient(false, null, null, getHttpClientTimeout(config));
238+
}
239+
return this.intakeHttpClient;
240+
}
241+
}
212242
}

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

Lines changed: 5 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(url != null && "http".equals(url.scheme()), 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+
url != null && "http".equals(url.scheme()),
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));

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

Lines changed: 3 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,7 +78,7 @@ 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

@@ -88,7 +88,7 @@ class SharedCommunicationsObjectsSpecification extends DDSpecification {
8888
then:
8989
0 * _
9090
sco.agentUrl.is(url)
91-
sco.okHttpClient.is(okHttpClient)
91+
sco.agentHttpClient.is(okHttpClient)
9292
sco.monitoring.is(monitoring)
9393
sco.featuresDiscovery.is(agentFeaturesDiscovery)
9494
}

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-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(),

dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public DDAgentWriter build() {
138138
final HttpUrl agentUrl = HttpUrl.get("http://" + agentHost + ":" + traceAgentPort);
139139
final OkHttpClient client =
140140
null == featureDiscovery || null == agentApi
141-
? buildHttpClient(agentUrl, unixDomainSocket, namedPipe, timeoutMillis)
141+
? buildHttpClient(true, unixDomainSocket, namedPipe, timeoutMillis)
142142
: null;
143143
if (null == featureDiscovery) {
144144
featureDiscovery =

0 commit comments

Comments
 (0)