Skip to content

Commit 0a73eac

Browse files
authored
Backpropagate container tags hash coming from the info endpoint (#9156)
1 parent aa3cbe8 commit 0a73eac

File tree

4 files changed

+55
-6
lines changed

4 files changed

+55
-6
lines changed

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datadog.communication.ddagent;
22

3+
import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_ID;
4+
import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_TAGS_HASH;
35
import static datadog.communication.serialization.msgpack.MsgPackWriter.FIXARRAY;
46
import static java.util.Collections.emptySet;
57
import static java.util.Collections.singletonList;
@@ -8,6 +10,7 @@
810
import com.squareup.moshi.JsonAdapter;
911
import com.squareup.moshi.Moshi;
1012
import com.squareup.moshi.Types;
13+
import datadog.common.container.ContainerInfo;
1114
import datadog.communication.http.OkHttpUtils;
1215
import datadog.communication.monitor.DDAgentStatsDClientManager;
1316
import datadog.communication.monitor.Monitoring;
@@ -157,11 +160,15 @@ private void doDiscovery() {
157160
// 3. fallback if the endpoint couldn't be found or the response couldn't be parsed
158161
try (Recording recording = discoveryTimer.start()) {
159162
boolean fallback = true;
160-
try (Response response =
161-
client
162-
.newCall(new Request.Builder().url(agentBaseUrl.resolve("info").url()).build())
163-
.execute()) {
163+
final Request.Builder requestBuilder =
164+
new Request.Builder().url(agentBaseUrl.resolve("info").url());
165+
final String containerId = ContainerInfo.get().getContainerId();
166+
if (containerId != null) {
167+
requestBuilder.header(DATADOG_CONTAINER_ID, containerId);
168+
}
169+
try (Response response = client.newCall(requestBuilder.build()).execute()) {
164170
if (response.isSuccessful()) {
171+
processInfoResponseHeaders(response);
165172
fallback = !processInfoResponse(response.body().string());
166173
}
167174
} catch (Throwable error) {
@@ -222,6 +229,10 @@ private String probeTracesEndpoint(String[] endpoints) {
222229
return V3_ENDPOINT;
223230
}
224231

232+
private void processInfoResponseHeaders(Response response) {
233+
ContainerInfo.get().setContainerTagsHash(response.header(DATADOG_CONTAINER_TAGS_HASH));
234+
}
235+
225236
@SuppressWarnings("unchecked")
226237
private boolean processInfoResponse(String response) {
227238
try {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ public final class OkHttpUtils {
4343
private static final String DATADOG_META_LANG_INTERPRETER = "Datadog-Meta-Lang-Interpreter";
4444
private static final String DATADOG_META_LANG_INTERPRETER_VENDOR =
4545
"Datadog-Meta-Lang-Interpreter-Vendor";
46-
private static final String DATADOG_CONTAINER_ID = "Datadog-Container-ID";
46+
public static final String DATADOG_CONTAINER_ID = "Datadog-Container-ID";
4747
private static final String DATADOG_ENTITY_ID = "Datadog-Entity-ID";
48+
public static final String DATADOG_CONTAINER_TAGS_HASH = "Datadog-Container-Tags-Hash";
4849

4950
private static final String DD_API_KEY = "DD-API-KEY";
5051

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package datadog.communication.ddagent
22

3+
import datadog.common.container.ContainerInfo
34
import datadog.communication.monitor.Monitoring
45
import datadog.trace.test.util.DDSpecification
56
import datadog.trace.util.Strings
67
import okhttp3.Call
8+
import okhttp3.Headers
79
import okhttp3.HttpUrl
810
import okhttp3.MediaType
911
import okhttp3.OkHttpClient
@@ -19,6 +21,8 @@ import java.nio.file.Paths
1921
import static datadog.communication.ddagent.DDAgentFeaturesDiscovery.V01_DATASTREAMS_ENDPOINT
2022
import static datadog.communication.ddagent.DDAgentFeaturesDiscovery.V6_METRICS_ENDPOINT
2123
import static datadog.communication.ddagent.DDAgentFeaturesDiscovery.V7_CONFIG_ENDPOINT
24+
import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_ID
25+
import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_TAGS_HASH
2226

2327
class DDAgentFeaturesDiscoveryTest extends DDSpecification {
2428

@@ -466,13 +470,37 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification {
466470
)
467471
}
468472

469-
def infoResponse(Request request, String json) {
473+
def "should send container id as header on the info request and parse the hash in the response"() {
474+
setup:
475+
OkHttpClient client = Mock(OkHttpClient)
476+
DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true)
477+
def oldContainerId = ContainerInfo.get().getContainerId()
478+
def oldContainerTagsHash = ContainerInfo.get().getContainerTagsHash()
479+
ContainerInfo.get().setContainerId("test")
480+
481+
when: "/info requested"
482+
features.discover()
483+
484+
then:
485+
1 * client.newCall(_) >> { Request request ->
486+
assert request.header(DATADOG_CONTAINER_ID) == "test"
487+
infoResponse(request, INFO_RESPONSE, Headers.of(DATADOG_CONTAINER_TAGS_HASH, "test-hash"))
488+
}
489+
and:
490+
assert ContainerInfo.get().getContainerTagsHash() == "test-hash"
491+
cleanup:
492+
ContainerInfo.get().setContainerId(oldContainerId)
493+
ContainerInfo.get().setContainerTagsHash(oldContainerTagsHash)
494+
}
495+
496+
def infoResponse(Request request, String json, Headers headers = new Headers.Builder().build()) {
470497
return Mock(Call) {
471498
it.execute() >> new Response.Builder()
472499
.code(200)
473500
.request(request)
474501
.protocol(Protocol.HTTP_1_1)
475502
.message("")
503+
.headers(headers)
476504
.body(ResponseBody.create(MediaType.get("application/json"), json))
477505
.build()
478506
}

utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public class ContainerInfo {
5454
private static final String ENTITY_ID;
5555

5656
public String containerId;
57+
public String containerTagsHash;
5758
public String podId;
5859
public List<CGroupInfo> cGroups = new ArrayList<>();
5960

@@ -65,6 +66,14 @@ public void setContainerId(String containerId) {
6566
this.containerId = containerId;
6667
}
6768

69+
public String getContainerTagsHash() {
70+
return containerTagsHash;
71+
}
72+
73+
public void setContainerTagsHash(String containerTagsHash) {
74+
this.containerTagsHash = containerTagsHash;
75+
}
76+
6877
public String getPodId() {
6978
return podId;
7079
}

0 commit comments

Comments
 (0)