Skip to content

Commit e7120b3

Browse files
authored
feat: support process discovery v2 schema (#251)
1 parent fbcc2d9 commit e7120b3

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
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: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#include <datadog/tracer.h>
1919
#include <datadog/tracer_config.h>
2020
#include <datadog/w3c_propagation.h>
21+
#if defined(__linux__) || defined(__unix__)
22+
#include <dirent.h>
23+
#include <sys/types.h>
24+
#include <unistd.h>
25+
#endif
2126

2227
#include <chrono>
2328
#include <ctime>
@@ -2037,6 +2042,51 @@ TEST_TRACER("APM tracing disabled") {
20372042
}
20382043
}
20392044

2045+
#if defined(__linux__) || defined(__unix__)
2046+
TEST_TRACER("process discovery") {
2047+
auto find_memfd = []() -> std::optional<std::string> {
2048+
DIR* dir = opendir("/proc/self/fd");
2049+
if (dir == nullptr) return nullopt;
2050+
2051+
char path[PATH_MAX];
2052+
char target[PATH_MAX];
2053+
2054+
for (struct dirent* entry = readdir(dir); entry != nullptr;
2055+
entry = readdir(dir)) {
2056+
if (entry->d_type != DT_LNK) continue;
2057+
2058+
snprintf(path, sizeof(path), "/proc/self/fd/%s", entry->d_name);
2059+
auto len = readlink(path, target, sizeof(target) - 1);
2060+
if (len == -1) continue;
2061+
target[len] = '\0';
2062+
2063+
if (starts_with(target, "/memfd:datadog-tracer-info-")) {
2064+
closedir(dir);
2065+
return path;
2066+
}
2067+
}
2068+
2069+
closedir(dir);
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
20402090
TEST_TRACER("_dd.p.ksr is NOT set when overriding the sampling decision") {
20412091
const auto collector = std::make_shared<MockCollector>();
20422092

0 commit comments

Comments
 (0)