From 8cfd5f126a6e7cba340d657e8da48528f5645638 Mon Sep 17 00:00:00 2001 From: Flavien Darche Date: Wed, 2 Sep 2026 10:43:35 +0200 Subject: [PATCH 1/2] fix(telemetry): nest product errors in app-started payload --- src/datadog/telemetry/telemetry_impl.cpp | 19 +++++++---------- test/telemetry/test_telemetry.cpp | 27 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/datadog/telemetry/telemetry_impl.cpp b/src/datadog/telemetry/telemetry_impl.cpp index b76738f76..33159ea33 100644 --- a/src/datadog/telemetry/telemetry_impl.cpp +++ b/src/datadog/telemetry/telemetry_impl.cpp @@ -617,27 +617,24 @@ std::string Telemetry::app_started_payload() { /// is no need to declare it. if (product.name == Product::Name::tracing) continue; - auto p = nlohmann::json{ - {to_string(product.name), - nlohmann::json{ - {"version", product.version}, - {"enabled", product.enabled}, - }}, + auto product_details = nlohmann::json{ + {"version", product.version}, + {"enabled", product.enabled}, }; if (product.error_code || product.error_message) { - auto p_error = nlohmann::json{}; + auto product_error = nlohmann::json{}; if (product.error_code) { - p_error.emplace("code", *product.error_code); + product_error.emplace("code", *product.error_code); } if (product.error_message) { - p_error.emplace("message", *product.error_message); + product_error.emplace("message", *product.error_message); } - p.emplace("error", std::move(p_error)); + product_details.emplace("error", std::move(product_error)); } - product_json.emplace(std::move(p)); + product_json.emplace(to_string(product.name), std::move(product_details)); } auto app_started_msg = nlohmann::json{ diff --git a/test/telemetry/test_telemetry.cpp b/test/telemetry/test_telemetry.cpp index 9119892c7..d8c9fed31 100644 --- a/test/telemetry/test_telemetry.cpp +++ b/test/telemetry/test_telemetry.cpp @@ -329,6 +329,33 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { } } } + + SECTION("With AppSec product state") { + client->clear(); + + Configuration cfg; + cfg.products.emplace_back(Product{Product::Name::appsec, + false, + "1.2.3", + 12, + "Error initializing WAF", + {}}); + + auto telemetry = + Telemetry::create(*finalize_config(cfg), tracer_signature, logger, + client, scheduler, *url); + + const auto message_batch = nlohmann::json::parse(client->request_body); + const auto& appsec = + message_batch["payload"][0]["payload"]["products"]["appsec"]; + + CHECK(appsec == + nlohmann::json{ + {"version", "1.2.3"}, + {"enabled", false}, + {"error", + {{"code", 12}, {"message", "Error initializing WAF"}}}}); + } } SECTION("dtor send app-closing message") { From 9c613496604e232e016825243d78780bc75396e9 Mon Sep 17 00:00:00 2001 From: Flavien Darche Date: Thu, 3 Sep 2026 17:42:09 +0200 Subject: [PATCH 2/2] test(telemetry): tighten product payload assertions --- test/telemetry/test_telemetry.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/telemetry/test_telemetry.cpp b/test/telemetry/test_telemetry.cpp index d8c9fed31..34525e10c 100644 --- a/test/telemetry/test_telemetry.cpp +++ b/test/telemetry/test_telemetry.cpp @@ -330,7 +330,7 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { } } - SECTION("With AppSec product state") { + SECTION("Product error is nested under the product name") { client->clear(); Configuration cfg; @@ -346,8 +346,11 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { client, scheduler, *url); const auto message_batch = nlohmann::json::parse(client->request_body); - const auto& appsec = - message_batch["payload"][0]["payload"]["products"]["appsec"]; + const auto& appsec = message_batch.at("payload") + .at(0) + .at("payload") + .at("products") + .at("appsec"); CHECK(appsec == nlohmann::json{