From 5d0fc4130bedf261e6c90c648c1a33282cf49372 Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Thu, 16 Oct 2025 17:46:05 +0200 Subject: [PATCH 1/4] feat: support process discovery v2 schema --- src/datadog/tracer.cpp | 11 ++++++-- test/test_tracer.cpp | 57 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/datadog/tracer.cpp b/src/datadog/tracer.cpp index 234d2d24..8015ed72 100644 --- a/src/datadog/tracer.cpp +++ b/src/datadog/tracer.cpp @@ -143,20 +143,27 @@ void Tracer::store_config() { auto defaults = config_manager_->span_defaults(); + std::string container_id = ""; + if (auto maybe_container_id = container::get_id()) { + container_id = maybe_container_id->value; + } + std::string buffer; buffer.reserve(1024); // clang-format off msgpack::pack_map( buffer, - "schema_version", [&](auto& buffer) { msgpack::pack_integer(buffer, std::uint64_t(1)); return Expected{}; }, + "schema_version", [&](auto& buffer) { msgpack::pack_integer(buffer, std::uint64_t(2)); return Expected{}; }, "runtime_id", [&](auto& buffer) { return msgpack::pack_string(buffer, runtime_id_.string()); }, "tracer_version", [&](auto& buffer) { return msgpack::pack_string(buffer, signature_.library_version); }, "tracer_language", [&](auto& buffer) { return msgpack::pack_string(buffer, signature_.library_language); }, "hostname", [&](auto& buffer) { return msgpack::pack_string(buffer, hostname_.value_or("")); }, "service_name", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->service); }, "service_env", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->environment); }, - "service_version", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->version); } + "service_version", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->version); }, + "process_tags", [&](auto& buffer) { return msgpack::pack_string(buffer, ""); }, + "container_id", [&](auto& buffer) { return msgpack::pack_string(buffer, container_id); } ); // clang-format on diff --git a/test/test_tracer.cpp b/test/test_tracer.cpp index d5ff0cc2..3d4ca29b 100644 --- a/test/test_tracer.cpp +++ b/test/test_tracer.cpp @@ -18,6 +18,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -1844,7 +1848,9 @@ TEST_TRACER("APM tracing disabled") { auto finalized_config = finalize_config(config, clock); REQUIRE(finalized_config); Tracer tracer{*finalized_config}; - { auto root1 = tracer.create_span(); } + { + auto root1 = tracer.create_span(); + } REQUIRE(collector->chunks.size() == 1); REQUIRE(collector->chunks.front().size() == 1); @@ -1923,7 +1929,9 @@ TEST_TRACER("APM tracing disabled") { // When APM Tracing is disabled, we allow one trace per second for service // liveness. To ensure consistency, consume the limiter slot. - { tracer.create_span(); } + { + tracer.create_span(); + } collector->chunks.clear(); // Case 1: extracted context with priority, but no `_dd.p.ts` → depends if @@ -2034,3 +2042,48 @@ TEST_TRACER("APM tracing disabled") { } } } + +#if defined(__linux__) || defined(__unix__) +TEST_TRACER("process discovery") { + auto find_memfd = []() -> std::optional { + DIR* dir = opendir("/proc/self/fd"); + if (dir == nullptr) return nullopt; + + char path[PATH_MAX]; + char target[PATH_MAX]; + + for (struct dirent* entry = readdir(dir); entry != nullptr; + entry = readdir(dir)) { + if (entry->d_type != DT_LNK) continue; + + snprintf(path, sizeof(path), "/proc/self/fd/%s", entry->d_name); + auto len = readlink(path, target, sizeof(target) - 1); + if (len == -1) continue; + target[len] = '\0'; + + if (starts_with(target, "/memfd:datadog-tracer-info-")) { + closedir(dir); + return path; + } + } + + return nullopt; + }; + + TracerConfig cfg; + auto finalized_config = finalize_config(cfg); + REQUIRE(finalized_config); + + { + Tracer tracer{*finalized_config}; + + auto fd = find_memfd(); + CHECK(fd); + + // TODO: Read content + } + + auto fd = find_memfd(); + CHECK(!fd); +} +#endif From 7270c5a6774fbfdfe225a4f9219fe4b8018ee707 Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Thu, 23 Oct 2025 07:22:46 -0400 Subject: [PATCH 2/4] fix: format --- test/test_tracer.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/test/test_tracer.cpp b/test/test_tracer.cpp index 12679a46..5e0596a1 100644 --- a/test/test_tracer.cpp +++ b/test/test_tracer.cpp @@ -1850,9 +1850,7 @@ TEST_TRACER("APM tracing disabled") { auto finalized_config = finalize_config(config, clock); REQUIRE(finalized_config); Tracer tracer{*finalized_config}; - { - auto root1 = tracer.create_span(); - } + { auto root1 = tracer.create_span(); } REQUIRE(collector->chunks.size() == 1); REQUIRE(collector->chunks.front().size() == 1); @@ -1931,9 +1929,7 @@ TEST_TRACER("APM tracing disabled") { // When APM Tracing is disabled, we allow one trace per second for service // liveness. To ensure consistency, consume the limiter slot. - { - tracer.create_span(); - } + { tracer.create_span(); } collector->chunks.clear(); // Case 1: extracted context with priority, but no `_dd.p.ts` → depends if From f8d62018e199939f31ac28f0d41ccf4c05597930 Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Thu, 23 Oct 2025 07:56:57 -0400 Subject: [PATCH 3/4] fix: windows compilation --- test/test_tracer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_tracer.cpp b/test/test_tracer.cpp index 5e0596a1..3b8d0c19 100644 --- a/test/test_tracer.cpp +++ b/test/test_tracer.cpp @@ -18,10 +18,11 @@ #include #include #include +#if defined(__linux__) || defined(__unix__) #include -#include #include #include +#endif #include #include From bd56e0736ef9bbb853c4ec8d0cb2ceb432ebe12c Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Tue, 11 Nov 2025 15:56:42 -0400 Subject: [PATCH 4/4] Apply suggestions from code review --- test/test_tracer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_tracer.cpp b/test/test_tracer.cpp index 3b8d0c19..8efe47f4 100644 --- a/test/test_tracer.cpp +++ b/test/test_tracer.cpp @@ -2066,6 +2066,7 @@ TEST_TRACER("process discovery") { } } + closedir(dir); return nullopt; };