Skip to content

Commit

Permalink
Add Datadog-Entity-Id header (#6559)
Browse files Browse the repository at this point in the history
  • Loading branch information
ygree committed Jan 29, 2024
1 parent d1965ab commit 0f8b948
Show file tree
Hide file tree
Showing 14 changed files with 238 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public ConfigurationPoller configurationPoller(Config config) {

private ConfigurationPoller createPoller(Config config) {
String containerId = ContainerInfo.get().getContainerId();
String entityId = ContainerInfo.getEntityId();
Supplier<String> configUrlSupplier;
String remoteConfigUrl = config.getFinalRemoteConfigUrl();
if (remoteConfigUrl != null) {
Expand All @@ -69,7 +70,7 @@ private ConfigurationPoller createPoller(Config config) {
configUrlSupplier = new RetryConfigUrlSupplier(this, config);
}
return new ConfigurationPoller(
config, TRACER_VERSION, containerId, configUrlSupplier, okHttpClient);
config, TRACER_VERSION, containerId, entityId, configUrlSupplier, okHttpClient);
}

// for testing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public final class OkHttpUtils {
private static final String DATADOG_META_LANG_INTERPRETER_VENDOR =
"Datadog-Meta-Lang-Interpreter-Vendor";
private static final String DATADOG_CONTAINER_ID = "Datadog-Container-ID";
private static final String DATADOG_ENTITY_ID = "Datadog-Entity-ID";

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

Expand Down Expand Up @@ -183,9 +184,13 @@ public static Request.Builder prepareRequest(final HttpUrl url, Map<String, Stri
.addHeader(DATADOG_META_LANG_INTERPRETER_VENDOR, JAVA_VM_VENDOR);

final String containerId = ContainerInfo.get().getContainerId();
final String entityId = ContainerInfo.getEntityId();
if (containerId != null) {
builder.addHeader(DATADOG_CONTAINER_ID, containerId);
}
if (entityId != null) {
builder.addHeader(DATADOG_ENTITY_ID, entityId);
}

for (Map.Entry<String, String> e : headers.entrySet()) {
builder.addHeader(e.getKey(), e.getValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,14 @@ public String getFileName() {
private static final int MINUTES_BETWEEN_ERROR_LOG = 5;
private static final MediaType APPLICATION_JSON = MediaType.parse("application/json");
private static final String HEADER_DD_CONTAINER_ID = "Datadog-Container-ID";
private static final String HEADER_DD_ENTITY_ID = "Datadog-Entity-ID";
static final String HEADER_DD_API_KEY = "DD-API-KEY";
static final int MAX_RUNNING_REQUESTS = 10;
static final int MAX_ENQUEUED_REQUESTS = 20;
static final int TERMINATION_TIMEOUT = 5;

private final String containerId;
private final String entityId;
private final ExecutorService okHttpExecutorService;
private final OkHttpClient client;
private final HttpUrl urlBase;
Expand All @@ -82,12 +84,21 @@ public BatchUploader(Config config, String endpoint) {
}

BatchUploader(Config config, String endpoint, RatelimitedLogger ratelimitedLogger) {
this(config, endpoint, ratelimitedLogger, ContainerInfo.get().containerId);
this(
config,
endpoint,
ratelimitedLogger,
ContainerInfo.get().containerId,
ContainerInfo.getEntityId());
}

// Visible for testing
BatchUploader(
Config config, String endpoint, RatelimitedLogger ratelimitedLogger, String containerId) {
Config config,
String endpoint,
RatelimitedLogger ratelimitedLogger,
String containerId,
String entityId) {
instrumentTheWorld = config.isDebuggerInstrumentTheWorld();
if (endpoint == null || endpoint.length() == 0) {
throw new IllegalArgumentException("Endpoint url is empty");
Expand All @@ -107,6 +118,7 @@ public BatchUploader(Config config, String endpoint) {
new SynchronousQueue<>(),
new AgentThreadFactory(DEBUGGER_HTTP_DISPATCHER));
this.containerId = containerId;
this.entityId = entityId;
Duration requestTimeout = Duration.ofSeconds(config.getDebuggerUploadTimeout());
client =
OkHttpUtils.buildHttpClient(
Expand Down Expand Up @@ -217,6 +229,9 @@ private void buildAndSendRequest(RequestBody body, int contentLength, String tag
if (containerId != null) {
requestBuilder.addHeader(HEADER_DD_CONTAINER_ID, containerId);
}
if (entityId != null) {
requestBuilder.addHeader(HEADER_DD_ENTITY_ID, entityId);
}
Request request = requestBuilder.build();
log.debug("Sending request: {} CT: {}", request, request.body().contentType());
client.newCall(request).enqueue(responseCallback);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ public void testNoContainerId() throws InterruptedException {
// we don't explicitly specify a container ID
server.enqueue(RESPONSE_200);
BatchUploader uploaderWithNoContainerId =
new BatchUploader(config, url.toString(), ratelimitedLogger, null);
new BatchUploader(config, url.toString(), ratelimitedLogger, null, null);

uploaderWithNoContainerId.upload(SNAPSHOT_BUFFER);
uploaderWithNoContainerId.shutdown();
Expand All @@ -221,12 +221,14 @@ public void testContainerIdHeader() throws InterruptedException {
server.enqueue(RESPONSE_200);

BatchUploader uploaderWithContainerId =
new BatchUploader(config, url.toString(), ratelimitedLogger, "testContainerId");
new BatchUploader(
config, url.toString(), ratelimitedLogger, "testContainerId", "testEntityId");
uploaderWithContainerId.upload(SNAPSHOT_BUFFER);
uploaderWithContainerId.shutdown();

RecordedRequest request = server.takeRequest(100, TimeUnit.MILLISECONDS);
assertEquals("testContainerId", request.getHeader("Datadog-Container-ID"));
assertEquals("testEntityId", request.getHeader("Datadog-Entity-ID"));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public class ConfigurationPoller
private final Config config;
private final String tracerVersion;
private final String containerId;
private final String entityId;
private final OkHttpClient httpClient;
private final RatelimitedLogger ratelimitedLogger;
private final Supplier<String> urlSupplier;
Expand All @@ -85,12 +86,14 @@ public ConfigurationPoller(
Config config,
String tracerVersion,
String containerId,
String entityId,
Supplier<String> urlSupplier,
OkHttpClient client) {
this(
config,
tracerVersion,
containerId,
entityId,
urlSupplier,
client,
new AgentTaskScheduler(AgentThreadFactory.AgentThread.REMOTE_CONFIG));
Expand All @@ -101,12 +104,14 @@ public ConfigurationPoller(
Config config,
String tracerVersion,
String containerId,
String entityId,
Supplier<String> urlSupplier,
OkHttpClient httpClient,
AgentTaskScheduler taskScheduler) {
this.config = config;
this.tracerVersion = tracerVersion;
this.containerId = containerId;
this.entityId = entityId;
this.urlSupplier = urlSupplier;
this.keyId = config.getRemoteConfigTargetsKeyId();
String keyStr = config.getRemoteConfigTargetsKey();
Expand Down Expand Up @@ -253,7 +258,7 @@ private boolean initialize() {
.build();
this.responseFactory = new RemoteConfigResponse.Factory(moshi);
this.requestFactory =
new PollerRequestFactory(config, tracerVersion, containerId, url, moshi);
new PollerRequestFactory(config, tracerVersion, containerId, entityId, url, moshi);
} catch (Exception e) {
// We can't recover from this, so we'll not try to initialize again.
fatalOnInitialization = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
public class PollerRequestFactory {
private static final String HEADER_DD_API_KEY = "DD-API-KEY";
private static final String HEADER_CONTAINER_ID = "Datadog-Container-ID";
private static final String HEADER_ENTITY_ID = "Datadog-Entity-ID";

private static final Logger log = LoggerFactory.getLogger(PollerRequestFactory.class);

Expand All @@ -37,11 +38,17 @@ public class PollerRequestFactory {
private final String hostName;
private final String tracerVersion;
private final String containerId;
private final String entityId;
private final Moshi moshi;
final HttpUrl url;

public PollerRequestFactory(
Config config, String tracerVersion, String containerId, String url, Moshi moshi) {
Config config,
String tracerVersion,
String containerId,
String entityId,
String url,
Moshi moshi) {
this.runtimeId = getRuntimeId(config);
this.serviceName = TagsHelper.sanitize(config.getServiceName());
this.apiKey = config.getApiKey();
Expand All @@ -51,6 +58,7 @@ public PollerRequestFactory(
// Semantic Versioning requires build separated with `+`
this.tracerVersion = tracerVersion.replace('~', '+');
this.containerId = containerId;
this.entityId = entityId;
this.url = parseUrl(url);
this.moshi = moshi;
}
Expand Down Expand Up @@ -88,9 +96,12 @@ public Request newConfigurationRequest(
if (this.apiKey != null) {
requestBuilder.addHeader(HEADER_DD_API_KEY, this.apiKey);
}
if (containerId != null && !containerId.isEmpty()) {
if (containerId != null) {
requestBuilder.addHeader(HEADER_CONTAINER_ID, containerId);
}
if (entityId != null) {
requestBuilder.addHeader(HEADER_ENTITY_ID, entityId);
}
return requestBuilder.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ class ConfigurationPollerSpecification extends DDSpecification {
Config.get(),
'0.0.0',
'',
'',
{ -> configUrlSupplier.get() } as Supplier<String>,
okHttpClient,
scheduler,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class PollerRequestFactoryTest extends DDSpecification {

static final String TRACER_VERSION = "v1.2.3"
static final String CONTAINER_ID = "456"
static final String ENTITY_ID = "32423"
static final String INVALID_REMOTE_CONFIG_URL = "https://invalid.example.com/"

void 'remote config request fields been sanitized'() {
Expand All @@ -18,7 +19,7 @@ class PollerRequestFactoryTest extends DDSpecification {
System.setProperty("dd.tags", "version:1.0.0-SNAPSHOT")
System.setProperty("dd.trace.global.tags", Tags.GIT_REPOSITORY_URL+":https://github.com/DataDog/dd-trace-java,"+Tags.GIT_COMMIT_SHA + ":1234")
rebuildConfig()
PollerRequestFactory factory = new PollerRequestFactory(Config.get(), TRACER_VERSION, CONTAINER_ID, INVALID_REMOTE_CONFIG_URL, null)
PollerRequestFactory factory = new PollerRequestFactory(Config.get(), TRACER_VERSION, CONTAINER_ID, ENTITY_ID, INVALID_REMOTE_CONFIG_URL, null)

when:
RemoteConfigRequest request = factory.buildRemoteConfigRequest( Collections.singletonList("ASM"), null, null, 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class Rcte1TestVectorsSpecification extends DDSpecification {
Config.get(),
'0.0.0',
'containerid',
'entityid',
{ -> URL.toString() },
okHttpClient,
scheduler
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ public Request.Builder httpRequest() {
if (containerId != null) {
builder.addHeader("Datadog-Container-ID", containerId);
}
final String entityId = ContainerInfo.getEntityId();
if (entityId != null) {
builder.addHeader("Datadog-Entity-ID", entityId);
}

if (debug) {
builder.addHeader("DD-Telemetry-Debug-Enabled", "true");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,22 @@ class TestTelemetryRouter extends TelemetryRouter {

RequestAssertions headers(RequestType requestType) {
assert this.request.method() == 'POST'
assert this.request.headers().names() == [
assert this.request.headers().names().containsAll([
'Content-Type',
'Content-Length',
'DD-Client-Library-Language',
'DD-Client-Library-Version',
'DD-Telemetry-API-Version',
'DD-Telemetry-Request-Type'
] as Set
])
assert this.request.header('Content-Type') == 'application/json; charset=utf-8'
assert this.request.header('Content-Length').toInteger() > 0
assert this.request.header('DD-Client-Library-Language') == 'jvm'
assert this.request.header('DD-Client-Library-Version') == TracerVersion.TRACER_VERSION
assert this.request.header('DD-Telemetry-API-Version') == 'v2'
assert this.request.header('DD-Telemetry-Request-Type') == requestType.toString()
def entityId = this.request.header('Datadog-Entity-ID')
assert entityId == null || entityId.startsWith("in-") || entityId.startsWith("cin-")
return this
}

Expand Down
Loading

0 comments on commit 0f8b948

Please sign in to comment.