Skip to content

Commit 5d0fc41

Browse files
committed
feat: support process discovery v2 schema
1 parent 286d0e3 commit 5d0fc41

File tree

2 files changed

+64
-4
lines changed

2 files changed

+64
-4
lines changed

src/datadog/tracer.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,20 +143,27 @@ void Tracer::store_config() {
143143

144144
auto defaults = config_manager_->span_defaults();
145145

146+
std::string container_id = "";
147+
if (auto maybe_container_id = container::get_id()) {
148+
container_id = maybe_container_id->value;
149+
}
150+
146151
std::string buffer;
147152
buffer.reserve(1024);
148153

149154
// clang-format off
150155
msgpack::pack_map(
151156
buffer,
152-
"schema_version", [&](auto& buffer) { msgpack::pack_integer(buffer, std::uint64_t(1)); return Expected<void>{}; },
157+
"schema_version", [&](auto& buffer) { msgpack::pack_integer(buffer, std::uint64_t(2)); return Expected<void>{}; },
153158
"runtime_id", [&](auto& buffer) { return msgpack::pack_string(buffer, runtime_id_.string()); },
154159
"tracer_version", [&](auto& buffer) { return msgpack::pack_string(buffer, signature_.library_version); },
155160
"tracer_language", [&](auto& buffer) { return msgpack::pack_string(buffer, signature_.library_language); },
156161
"hostname", [&](auto& buffer) { return msgpack::pack_string(buffer, hostname_.value_or("")); },
157162
"service_name", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->service); },
158163
"service_env", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->environment); },
159-
"service_version", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->version); }
164+
"service_version", [&](auto& buffer) { return msgpack::pack_string(buffer, defaults->version); },
165+
"process_tags", [&](auto& buffer) { return msgpack::pack_string(buffer, ""); },
166+
"container_id", [&](auto& buffer) { return msgpack::pack_string(buffer, container_id); }
160167
);
161168
// clang-format on
162169

test/test_tracer.cpp

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
#include <datadog/tracer.h>
1919
#include <datadog/tracer_config.h>
2020
#include <datadog/w3c_propagation.h>
21+
#include <dirent.h>
22+
#include <stdio.h>
23+
#include <sys/types.h>
24+
#include <unistd.h>
2125

2226
#include <chrono>
2327
#include <ctime>
@@ -1844,7 +1848,9 @@ TEST_TRACER("APM tracing disabled") {
18441848
auto finalized_config = finalize_config(config, clock);
18451849
REQUIRE(finalized_config);
18461850
Tracer tracer{*finalized_config};
1847-
{ auto root1 = tracer.create_span(); }
1851+
{
1852+
auto root1 = tracer.create_span();
1853+
}
18481854
REQUIRE(collector->chunks.size() == 1);
18491855
REQUIRE(collector->chunks.front().size() == 1);
18501856

@@ -1923,7 +1929,9 @@ TEST_TRACER("APM tracing disabled") {
19231929

19241930
// When APM Tracing is disabled, we allow one trace per second for service
19251931
// liveness. To ensure consistency, consume the limiter slot.
1926-
{ tracer.create_span(); }
1932+
{
1933+
tracer.create_span();
1934+
}
19271935
collector->chunks.clear();
19281936

19291937
// Case 1: extracted context with priority, but no `_dd.p.ts` → depends if
@@ -2034,3 +2042,48 @@ TEST_TRACER("APM tracing disabled") {
20342042
}
20352043
}
20362044
}
2045+
2046+
#if defined(__linux__) || defined(__unix__)
2047+
TEST_TRACER("process discovery") {
2048+
auto find_memfd = []() -> std::optional<std::string> {
2049+
DIR* dir = opendir("/proc/self/fd");
2050+
if (dir == nullptr) return nullopt;
2051+
2052+
char path[PATH_MAX];
2053+
char target[PATH_MAX];
2054+
2055+
for (struct dirent* entry = readdir(dir); entry != nullptr;
2056+
entry = readdir(dir)) {
2057+
if (entry->d_type != DT_LNK) continue;
2058+
2059+
snprintf(path, sizeof(path), "/proc/self/fd/%s", entry->d_name);
2060+
auto len = readlink(path, target, sizeof(target) - 1);
2061+
if (len == -1) continue;
2062+
target[len] = '\0';
2063+
2064+
if (starts_with(target, "/memfd:datadog-tracer-info-")) {
2065+
closedir(dir);
2066+
return path;
2067+
}
2068+
}
2069+
2070+
return nullopt;
2071+
};
2072+
2073+
TracerConfig cfg;
2074+
auto finalized_config = finalize_config(cfg);
2075+
REQUIRE(finalized_config);
2076+
2077+
{
2078+
Tracer tracer{*finalized_config};
2079+
2080+
auto fd = find_memfd();
2081+
CHECK(fd);
2082+
2083+
// TODO: Read content
2084+
}
2085+
2086+
auto fd = find_memfd();
2087+
CHECK(!fd);
2088+
}
2089+
#endif

0 commit comments

Comments
 (0)