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 d0a52260..8efe47f4 100644 --- a/test/test_tracer.cpp +++ b/test/test_tracer.cpp @@ -18,6 +18,11 @@ #include #include #include +#if defined(__linux__) || defined(__unix__) +#include +#include +#include +#endif #include #include @@ -2037,6 +2042,51 @@ 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; + } + } + + closedir(dir); + 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 TEST_TRACER("_dd.p.ksr is NOT set when overriding the sampling decision") { const auto collector = std::make_shared();