Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package datadog.communication.ddagent;

import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_ID;
import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_TAGS_HASH;
import static datadog.communication.serialization.msgpack.MsgPackWriter.FIXARRAY;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
Expand All @@ -8,6 +10,7 @@
import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.Moshi;
import com.squareup.moshi.Types;
import datadog.common.container.ContainerInfo;
import datadog.communication.http.OkHttpUtils;
import datadog.communication.monitor.DDAgentStatsDClientManager;
import datadog.communication.monitor.Monitoring;
Expand Down Expand Up @@ -157,11 +160,15 @@ private void doDiscovery() {
// 3. fallback if the endpoint couldn't be found or the response couldn't be parsed
try (Recording recording = discoveryTimer.start()) {
boolean fallback = true;
try (Response response =
client
.newCall(new Request.Builder().url(agentBaseUrl.resolve("info").url()).build())
.execute()) {
final Request.Builder requestBuilder =
new Request.Builder().url(agentBaseUrl.resolve("info").url());
final String containerId = ContainerInfo.get().getContainerId();
if (containerId != null) {
requestBuilder.header(DATADOG_CONTAINER_ID, containerId);
}
try (Response response = client.newCall(requestBuilder.build()).execute()) {
if (response.isSuccessful()) {
processInfoResponseHeaders(response);
fallback = !processInfoResponse(response.body().string());
}
} catch (Throwable error) {
Expand Down Expand Up @@ -222,6 +229,10 @@ private String probeTracesEndpoint(String[] endpoints) {
return V3_ENDPOINT;
}

private void processInfoResponseHeaders(Response response) {
ContainerInfo.get().setContainerTagsHash(response.header(DATADOG_CONTAINER_TAGS_HASH));
}

@SuppressWarnings("unchecked")
private boolean processInfoResponse(String response) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ public final class OkHttpUtils {
private static final String DATADOG_META_LANG_INTERPRETER = "Datadog-Meta-Lang-Interpreter";
private static final String DATADOG_META_LANG_INTERPRETER_VENDOR =
"Datadog-Meta-Lang-Interpreter-Vendor";
private static final String DATADOG_CONTAINER_ID = "Datadog-Container-ID";
public static final String DATADOG_CONTAINER_ID = "Datadog-Container-ID";
private static final String DATADOG_ENTITY_ID = "Datadog-Entity-ID";
public static final String DATADOG_CONTAINER_TAGS_HASH = "Datadog-Container-Tags-Hash";

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package datadog.communication.ddagent

import datadog.common.container.ContainerInfo
import datadog.communication.monitor.Monitoring
import datadog.trace.test.util.DDSpecification
import datadog.trace.util.Strings
import okhttp3.Call
import okhttp3.Headers
import okhttp3.HttpUrl
import okhttp3.MediaType
import okhttp3.OkHttpClient
Expand All @@ -19,6 +21,8 @@ import java.nio.file.Paths
import static datadog.communication.ddagent.DDAgentFeaturesDiscovery.V01_DATASTREAMS_ENDPOINT
import static datadog.communication.ddagent.DDAgentFeaturesDiscovery.V6_METRICS_ENDPOINT
import static datadog.communication.ddagent.DDAgentFeaturesDiscovery.V7_CONFIG_ENDPOINT
import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_ID
import static datadog.communication.http.OkHttpUtils.DATADOG_CONTAINER_TAGS_HASH

class DDAgentFeaturesDiscoveryTest extends DDSpecification {

Expand Down Expand Up @@ -466,13 +470,37 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification {
)
}

def infoResponse(Request request, String json) {
def "should send container id as header on the info request and parse the hash in the response"() {
setup:
OkHttpClient client = Mock(OkHttpClient)
DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true)
def oldContainerId = ContainerInfo.get().getContainerId()
def oldContainerTagsHash = ContainerInfo.get().getContainerTagsHash()
ContainerInfo.get().setContainerId("test")

when: "/info requested"
features.discover()

then:
1 * client.newCall(_) >> { Request request ->
assert request.header(DATADOG_CONTAINER_ID) == "test"
infoResponse(request, INFO_RESPONSE, Headers.of(DATADOG_CONTAINER_TAGS_HASH, "test-hash"))
}
and:
assert ContainerInfo.get().getContainerTagsHash() == "test-hash"
cleanup:
ContainerInfo.get().setContainerId(oldContainerId)
ContainerInfo.get().setContainerTagsHash(oldContainerTagsHash)
}

def infoResponse(Request request, String json, Headers headers = new Headers.Builder().build()) {
return Mock(Call) {
it.execute() >> new Response.Builder()
.code(200)
.request(request)
.protocol(Protocol.HTTP_1_1)
.message("")
.headers(headers)
.body(ResponseBody.create(MediaType.get("application/json"), json))
.build()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public class ContainerInfo {
private static final String ENTITY_ID;

public String containerId;
public String containerTagsHash;
public String podId;
public List<CGroupInfo> cGroups = new ArrayList<>();

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

public String getContainerTagsHash() {
return containerTagsHash;
}

public void setContainerTagsHash(String containerTagsHash) {
this.containerTagsHash = containerTagsHash;
}

public String getPodId() {
return podId;
}
Expand Down