From 6ad367fe148a56ab0756e99f62550fbf1ff27466 Mon Sep 17 00:00:00 2001 From: Gustavo Lopes Date: Tue, 6 Aug 2024 18:41:34 +0100 Subject: [PATCH 1/3] fix(remote_config): fix ConfigState in RC requests id and version are not taken from the config body (which doesn't have to be json, and even less has to have specific fields). See https://github.com/DataDog/dd-trace-java/blob/dddda34e07973024fcf7457692ce1c3f892f2ef2/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/state/ProductState.java#L209-L210 --- src/datadog/remote_config/remote_config.cpp | 82 ++++++++++++--------- test/remote_config/test_remote_config.cpp | 8 +- 2 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/datadog/remote_config/remote_config.cpp b/src/datadog/remote_config/remote_config.cpp index 4758781f..751977e4 100644 --- a/src/datadog/remote_config/remote_config.cpp +++ b/src/datadog/remote_config/remote_config.cpp @@ -30,9 +30,14 @@ constexpr std::array capabilities_byte_array( return res; } -Optional parse_config_path(StringView config_path) { +struct ConfigKeyData { + product::Flag product; + StringView config_id; +}; + +Optional parse_config_path(StringView config_path) { static const std::regex path_reg( - "^(datadog/\\d+|employee)/([^/]+)/[^/]+/[^/]+$"); + "^(datadog/\\d+|employee)/([^/]+)/([^/]+)/[^/]+$"); std::cmatch match; if (!std::regex_match(config_path.data(), @@ -42,12 +47,14 @@ Optional parse_config_path(StringView config_path) { } assert(match.ready()); - assert(match.size() == 3); + assert(match.size() == 4); StringView product_sv(config_path.data() + match.position(2), std::size_t(match.length(2))); + StringView config_id_sv{config_path.data() + match.position(3), + static_cast(match.length(3))}; - return parse_product(product_sv); + return {{parse_product(product_sv), config_id_sv}}; } } // namespace @@ -199,8 +206,8 @@ void Manager::process_response(const nlohmann::json& json) { auto config_path = client_config.get(); visited_config.emplace(config_path); - const auto product = parse_config_path(config_path); - if (!product) { + const auto config_key_data = parse_config_path(config_path); + if (!config_key_data) { std::string reason{config_path}; reason += " is an invalid configuration path"; @@ -208,6 +215,8 @@ void Manager::process_response(const nlohmann::json& json) { return; } + const auto product = config_key_data->product; + const auto& config_metadata = targets.at("/signed/targets"_json_pointer).at(config_path); @@ -231,41 +240,48 @@ void Manager::process_response(const nlohmann::json& json) { return; } - auto decoded_config = - base64_decode(target_it.value().at("raw").get()); - - const auto config_json = nlohmann::json::parse(decoded_config); + auto raw_data = target_it->at("raw").get(); + auto decoded_config = base64_decode(raw_data); Configuration new_config; - new_config.id = config_json.at("id"); + auto&& config_id = config_key_data->config_id; + new_config.id = std::string{config_id.data(), config_id.size()}; new_config.path = std::string{config_path}; new_config.hash = config_metadata.at("/hashes/sha256"_json_pointer); new_config.content = std::move(decoded_config); - new_config.version = config_json.at("revision"); - new_config.product = *product; - - const auto& targeted_service = config_json.at("service_target"); - if (targeted_service.at("service").get() != - tracer_signature_.default_service || - targeted_service.at("env").get() != - tracer_signature_.default_environment) { - new_config.state = Configuration::State::error; - new_config.error_message = "Wrong service targeted"; - } else { - for (const auto& listener : listeners_per_product_[*product]) { - // Q: Two listeners on the same product. What should be the behaviour - // if one of the listeners report an error? - // R(@dmehala): Unspecified. For now, the config is marked with an - // error. - if (auto error_msg = listener->on_update(new_config)) { - new_config.state = Configuration::State::error; - new_config.error_message = std::move(*error_msg); - } else { - new_config.state = Configuration::State::acknowledged; - } + new_config.version = config_metadata.at("/custom/v"_json_pointer); + new_config.product = product; + + // TODO: should be moved to the listener + if (product == product::Flag::APM_TRACING) { + const auto config_json = nlohmann::json::parse(new_config.content); + new_config.version = config_json.at("revision"); + + const auto& targeted_service = config_json.at("service_target"); + if (targeted_service.at("service").get() != + tracer_signature_.default_service || + targeted_service.at("env").get() != + tracer_signature_.default_environment) { + new_config.state = Configuration::State::error; + new_config.error_message = "Wrong service targeted"; + goto skip_listeners; + } + } + + for (const auto& listener : listeners_per_product_[product]) { + // Q: Two listeners on the same product. What should be the behaviour + // if one of the listeners report an error? + // R(@dmehala): Unspecified. For now, the config is marked with an + // error. + if (auto error_msg = listener->on_update(new_config)) { + new_config.state = Configuration::State::error; + new_config.error_message = std::move(*error_msg); + } else { + new_config.state = Configuration::State::acknowledged; } } + skip_listeners: applied_config_[std::string{config_path}] = new_config; } diff --git a/test/remote_config/test_remote_config.cpp b/test/remote_config/test_remote_config.cpp index 48d90c80..321d35d2 100644 --- a/test/remote_config/test_remote_config.cpp +++ b/test/remote_config/test_remote_config.cpp @@ -197,7 +197,7 @@ REMOTE_CONFIG_TEST("response processing") { // "service_target": { "service": "not-testsvc", "env": "test" } R"({ "targets": - "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L3NlcnZpY2VfbmFtZSI6IHsKICAgICAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTc3NzY4YjIwYjdjN2Y4NDQ5MzVjYWU2OWM1YzVlZDg4ZWFhZTIzNGUwMTgyYTc4MzU5OTczMzllNTUyNGJjIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsZW5ndGgiOiAzNzQKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9", + "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L3NlcnZpY2VfbmFtZSI6IHsKICAgICAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTc3NzY4YjIwYjdjN2Y4NDQ5MzVjYWU2OWM1YzVlZDg4ZWFhZTIzNGUwMTgyYTc4MzU5OTczMzllNTUyNGJjIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsZW5ndGgiOiAzNzQsCgkJCQkiY3VzdG9tIjogeyAidiI6IDEyMyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJ2ZXJzaW9uIjogNjYyMDQzMjAKICAgIH0KfQo=", "client_configs": ["employee/APM_TRACING/test_rc_wrong_target/service_name"], "target_files": [ { @@ -210,7 +210,7 @@ REMOTE_CONFIG_TEST("response processing") { // "service_target": { "service": "testsvc", "env": "dev" } R"({ "targets": - "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L2Vudl9uYW1lIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogImExNzc3NjhiMjBiN2M3Zjg0NDkzNWNhZTY5YzVjNWVkODhlYWFlMjM0ZTAxODJhNzgzNTk5NzMzOWU1NTI0YmMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NAogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAidmVyc2lvbiI6IDY2MjA0MzIwCiAgICB9Cn0=", + "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L2Vudl9uYW1lIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogImExNzc3NjhiMjBiN2M3Zjg0NDkzNWNhZTY5YzVjNWVkODhlYWFlMjM0ZTAxODJhNzgzNTk5NzMzOWU1NTI0YmMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTI0IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9Cg==", "client_configs": ["employee/APM_TRACING/test_rc_wrong_target/env_name"], "target_files": [ { @@ -258,7 +258,7 @@ REMOTE_CONFIG_TEST("response processing") { SECTION("update dispatch") { // Verify configuration updates are dispatched to the correct listener std::string_view rc_response = R"({ - "targets": "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfdXBkYXRlL2xpYl91cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiYTE3Nzc2OGIyMGI3YzdmODQ0OTM1Y2FlNjljNWM1ZWQ4OGVhYWUyMzRlMDE4MmE3ODM1OTk3MzM5ZTU1MjRiYyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXBsb3llZS9BR0VOVF9UQVNLL3Rlc3RfcmNfdXBkYXRlL2ZsYXJlX3Rhc2siOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiNDE5NGNlNmY3MTEzOTU5NDZiZTgzN2JmNWViYTk0ODkxYjdiZGU3OTg5MTFlZDVlZmZmNjU5OWQyMWFiOTY5NiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXBsb3llZS9BR0VOVF9DT05GSUcvdGVzdF9yY191cGRhdGUvZmxhcmVfY29uZiI6IHsKICAgICAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDc4YWU3MzZhM2ZjNDU1YjcyMzFkYWY5OTQ1ZjhkZjcwNGYxNzI1YjUwZGRlNDZkMGNiY2RjM2YwZTExZDQxIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsZW5ndGgiOiAzNzQKICAgICAgICAgICAgfQogICAgIAogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9", + "targets": "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfdXBkYXRlL2xpYl91cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiYTE3Nzc2OGIyMGI3YzdmODQ0OTM1Y2FlNjljNWM1ZWQ4OGVhYWUyMzRlMDE4MmE3ODM1OTk3MzM5ZTU1MjRiYyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0LAoJCQkJImN1c3RvbSI6IHsgInYiOiAxMjQgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wbG95ZWUvQUdFTlRfVEFTSy90ZXN0X3JjX3VwZGF0ZS9mbGFyZV90YXNrIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogIjQxOTRjZTZmNzExMzk1OTQ2YmU4MzdiZjVlYmE5NDg5MWI3YmRlNzk4OTExZWQ1ZWZmZjY1OTlkMjFhYjk2OTYiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTI1IH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImVtcGxveWVlL0FHRU5UX0NPTkZJRy90ZXN0X3JjX3VwZGF0ZS9mbGFyZV9jb25mIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogIjJkNzhhZTczNmEzZmM0NTViNzIzMWRhZjk5NDVmOGRmNzA0ZjE3MjViNTBkZGU0NmQwY2JjZGMzZjBlMTFkNDEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTI1IH0KICAgICAgICAgICAgfQogICAgIAogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9Cg==", "client_configs": [ "employee/APM_TRACING/test_rc_update/lib_update", "employee/AGENT_TASK/test_rc_update/flare_task", @@ -348,7 +348,7 @@ REMOTE_CONFIG_TEST("response processing") { SECTION("new version of a config calls listeners") { std::string_view new_rc_response = R"({ - "targets": "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfdXBkYXRlL2xpYl91cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiM2I5NDIxY2FhYTVkNzUzMTg0NWY3YzMwN2FkN2M2MTU1ZDgxOTVkMjcwOTEzMzY0OTI2YzlmNjQxZTkyNDE0NyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXBsb3llZS9BR0VOVF9UQVNLL3Rlc3RfcmNfdXBkYXRlL2ZsYXJlX3Rhc2siOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiNTY3NzQ4MWE4YzIxZDZjNzQwODI5ZmQxMDYxMDBmNDZmN2M1MWY1MjY1YjBiYTU0MGJjMTk4YmQ4MzM5Zjg3MiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXBsb3llZS9BR0VOVF9DT05GSUcvdGVzdF9yY191cGRhdGUvZmxhcmVfY29uZiI6IHsKICAgICAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjhlYzhkOWIxMWE4Y2Q1OGM4Y2E1ZTE0MjVkNjE2M2RiOTQ3ZWFhMzVmNzM4NTYxYzQ4NmUxNDRlOTRmYzUyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsZW5ndGgiOiAzNzQKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9", + "targets": "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfdXBkYXRlL2xpYl91cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiM2I5NDIxY2FhYTVkNzUzMTg0NWY3YzMwN2FkN2M2MTU1ZDgxOTVkMjcwOTEzMzY0OTI2YzlmNjQxZTkyNDE0NyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0LAoJCQkJImN1c3RvbSI6IHsgInYiOiAxNjAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wbG95ZWUvQUdFTlRfVEFTSy90ZXN0X3JjX3VwZGF0ZS9mbGFyZV90YXNrIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogIjU2Nzc0ODFhOGMyMWQ2Yzc0MDgyOWZkMTA2MTAwZjQ2ZjdjNTFmNTI2NWIwYmE1NDBiYzE5OGJkODMzOWY4NzIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTYxIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImVtcGxveWVlL0FHRU5UX0NPTkZJRy90ZXN0X3JjX3VwZGF0ZS9mbGFyZV9jb25mIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogImU2OGVjOGQ5YjExYThjZDU4YzhjYTVlMTQyNWQ2MTYzZGI5NDdlYWEzNWY3Mzg1NjFjNDg2ZTE0NGU5NGZjNTIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTYyIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9Cg==", "client_configs": [ "employee/APM_TRACING/test_rc_update/lib_update", "employee/AGENT_TASK/test_rc_update/flare_task", From 7d94f4ac86a65d4491d9515232752c1e3842f0aa Mon Sep 17 00:00:00 2001 From: Gustavo Lopes Date: Wed, 21 Aug 2024 14:31:21 +0100 Subject: [PATCH 2/3] Fix json dump of configuration --- include/datadog/null_collector.h | 4 ++-- src/datadog/datadog_agent.cpp | 4 ++-- src/datadog/span_sampler.cpp | 5 ++--- src/datadog/tracer.cpp | 10 +++++++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/include/datadog/null_collector.h b/include/datadog/null_collector.h index 953299b5..f26b33fb 100644 --- a/include/datadog/null_collector.h +++ b/include/datadog/null_collector.h @@ -19,8 +19,8 @@ class NullCollector : public Collector { std::string config() const override { // clang-format off return R"({ - {"type", "datadog::tracing::NullCollector"}, - {"config", {}} + "type": "datadog::tracing::NullCollector", + "config": {} })"; // clang-format on }; diff --git a/src/datadog/datadog_agent.cpp b/src/datadog/datadog_agent.cpp index f841d172..b03a16d4 100644 --- a/src/datadog/datadog_agent.cpp +++ b/src/datadog/datadog_agent.cpp @@ -254,8 +254,8 @@ std::string DatadogAgent::config() const { {"flush_interval_milliseconds", std::chrono::duration_cast(flush_interval_).count() }, {"request_timeout_milliseconds", std::chrono::duration_cast(request_timeout_).count() }, {"shutdown_timeout_milliseconds", std::chrono::duration_cast(shutdown_timeout_).count() }, - {"http_client", http_client_->config()}, - {"event_scheduler", event_scheduler_->config()}, + {"http_client", nlohmann::json::parse(http_client_->config())}, + {"event_scheduler", nlohmann::json::parse(event_scheduler_->config())}, })}, }).dump(); // clang-format on diff --git a/src/datadog/span_sampler.cpp b/src/datadog/span_sampler.cpp index 2c5db2ee..734053c0 100644 --- a/src/datadog/span_sampler.cpp +++ b/src/datadog/span_sampler.cpp @@ -73,9 +73,8 @@ nlohmann::json SpanSampler::config_json() const { } return nlohmann::json::object({ - {"rules", rules}, - }) - .dump(); + {"rules", rules}, + }); } } // namespace tracing diff --git a/src/datadog/tracer.cpp b/src/datadog/tracer.cpp index 84c3060a..e342a9da 100644 --- a/src/datadog/tracer.cpp +++ b/src/datadog/tracer.cpp @@ -83,15 +83,19 @@ Tracer::Tracer(const FinalizedTracerConfig& config, } } +void to_json(nlohmann::json& j, const PropagationStyle& style) { + j = to_string_view(style); +} + std::string Tracer::config() const { // clang-format off auto config = nlohmann::json::object({ {"version", tracer_version_string}, {"runtime_id", runtime_id_.string()}, - {"collector", collector_->config()}, + {"collector", nlohmann::json::parse(collector_->config())}, {"span_sampler", span_sampler_->config_json()}, - {"injection_styles", join_propagation_styles(injection_styles_)}, - {"extraction_styles", join_propagation_styles(extraction_styles_)}, + {"injection_styles", injection_styles_}, + {"extraction_styles", extraction_styles_}, {"tags_header_size", tags_header_max_size_}, {"environment_variables", environment::to_json()}, }); From 1621fdb189069da4962b29328a036ba34a26c21d Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Tue, 27 Aug 2024 10:59:41 +0200 Subject: [PATCH 3/3] move logic to config_manager --- src/datadog/config_manager.cpp | 15 +++++ src/datadog/config_manager.h | 2 + src/datadog/remote_config/remote_config.cpp | 30 ++-------- src/datadog/tracer.cpp | 12 ++-- test/remote_config/test_remote_config.cpp | 65 --------------------- test/test_config_manager.cpp | 21 ++++++- test/test_datadog_agent.cpp | 3 +- 7 files changed, 51 insertions(+), 97 deletions(-) diff --git a/src/datadog/config_manager.cpp b/src/datadog/config_manager.cpp index 2609739b..ee2af2e5 100644 --- a/src/datadog/config_manager.cpp +++ b/src/datadog/config_manager.cpp @@ -109,6 +109,7 @@ ConfigManager::Update parse_dynamic_config(const nlohmann::json& j) { namespace rc = datadog::remote_config; ConfigManager::ConfigManager(const FinalizedTracerConfig& config, + const TracerSignature& tracer_signature, const std::shared_ptr& telemetry) : clock_(config.clock), default_metadata_(config.metadata), @@ -117,6 +118,7 @@ ConfigManager::ConfigManager(const FinalizedTracerConfig& config, rules_(config.trace_sampler.rules), span_defaults_(std::make_shared(config.defaults)), report_traces_(config.report_traces), + tracer_signature_(tracer_signature), telemetry_(telemetry) {} rc::Products ConfigManager::get_products() { return rc::product::APM_TRACING; } @@ -128,7 +130,20 @@ rc::Capabilities ConfigManager::get_capabilities() { } Optional ConfigManager::on_update(const Configuration& config) { + if (config.product != rc::product::Flag::APM_TRACING) { + return nullopt; + } + const auto config_json = nlohmann::json::parse(config.content); + + const auto& targeted_service = config_json.at("service_target"); + if (targeted_service.at("service").get() != + tracer_signature_.default_service || + targeted_service.at("env").get() != + tracer_signature_.default_environment) { + return "Wrong service targeted"; + } + auto config_update = parse_dynamic_config(config_json.at("lib_config")); auto config_metadata = apply_update(config_update); diff --git a/src/datadog/config_manager.h b/src/datadog/config_manager.h index 280fb971..e6c4cabf 100644 --- a/src/datadog/config_manager.h +++ b/src/datadog/config_manager.h @@ -76,6 +76,7 @@ class ConfigManager : public remote_config::Listener { DynamicConfig> span_defaults_; DynamicConfig report_traces_; + const TracerSignature& tracer_signature_; std::shared_ptr telemetry_; private: @@ -85,6 +86,7 @@ class ConfigManager : public remote_config::Listener { public: ConfigManager(const FinalizedTracerConfig& config, + const TracerSignature& signature, const std::shared_ptr& telemetry); ~ConfigManager() override{}; diff --git a/src/datadog/remote_config/remote_config.cpp b/src/datadog/remote_config/remote_config.cpp index 751977e4..b4867234 100644 --- a/src/datadog/remote_config/remote_config.cpp +++ b/src/datadog/remote_config/remote_config.cpp @@ -30,12 +30,12 @@ constexpr std::array capabilities_byte_array( return res; } -struct ConfigKeyData { +struct ConfigKeyMetadata final { product::Flag product; StringView config_id; }; -Optional parse_config_path(StringView config_path) { +Optional parse_config_path(StringView config_path) { static const std::regex path_reg( "^(datadog/\\d+|employee)/([^/]+)/([^/]+)/[^/]+$"); @@ -206,8 +206,8 @@ void Manager::process_response(const nlohmann::json& json) { auto config_path = client_config.get(); visited_config.emplace(config_path); - const auto config_key_data = parse_config_path(config_path); - if (!config_key_data) { + const auto config_key_metadata = parse_config_path(config_path); + if (!config_key_metadata) { std::string reason{config_path}; reason += " is an invalid configuration path"; @@ -215,7 +215,7 @@ void Manager::process_response(const nlohmann::json& json) { return; } - const auto product = config_key_data->product; + const auto product = config_key_metadata->product; const auto& config_metadata = targets.at("/signed/targets"_json_pointer).at(config_path); @@ -244,30 +244,13 @@ void Manager::process_response(const nlohmann::json& json) { auto decoded_config = base64_decode(raw_data); Configuration new_config; - auto&& config_id = config_key_data->config_id; - new_config.id = std::string{config_id.data(), config_id.size()}; + new_config.id = std::string{config_key_metadata->config_id}; new_config.path = std::string{config_path}; new_config.hash = config_metadata.at("/hashes/sha256"_json_pointer); new_config.content = std::move(decoded_config); new_config.version = config_metadata.at("/custom/v"_json_pointer); new_config.product = product; - // TODO: should be moved to the listener - if (product == product::Flag::APM_TRACING) { - const auto config_json = nlohmann::json::parse(new_config.content); - new_config.version = config_json.at("revision"); - - const auto& targeted_service = config_json.at("service_target"); - if (targeted_service.at("service").get() != - tracer_signature_.default_service || - targeted_service.at("env").get() != - tracer_signature_.default_environment) { - new_config.state = Configuration::State::error; - new_config.error_message = "Wrong service targeted"; - goto skip_listeners; - } - } - for (const auto& listener : listeners_per_product_[product]) { // Q: Two listeners on the same product. What should be the behaviour // if one of the listeners report an error? @@ -281,7 +264,6 @@ void Manager::process_response(const nlohmann::json& json) { } } - skip_listeners: applied_config_[std::string{config_path}] = new_config; } diff --git a/src/datadog/tracer.cpp b/src/datadog/tracer.cpp index e342a9da..a128da6a 100644 --- a/src/datadog/tracer.cpp +++ b/src/datadog/tracer.cpp @@ -30,6 +30,10 @@ namespace datadog { namespace tracing { +void to_json(nlohmann::json& j, const PropagationStyle& style) { + j = to_string_view(style); +} + Tracer::Tracer(const FinalizedTracerConfig& config) : Tracer(config, default_id_generator(config.generate_128bit_trace_ids)) {} @@ -43,8 +47,8 @@ Tracer::Tracer(const FinalizedTracerConfig& config, tracer_telemetry_(std::make_shared( config.report_telemetry, config.clock, logger_, signature_, config.integration_name, config.integration_version)), - config_manager_( - std::make_shared(config, tracer_telemetry_)), + config_manager_(std::make_shared(config, signature_, + tracer_telemetry_)), collector_(/* see constructor body */), span_sampler_( std::make_shared(config.span_sampler, config.clock)), @@ -83,10 +87,6 @@ Tracer::Tracer(const FinalizedTracerConfig& config, } } -void to_json(nlohmann::json& j, const PropagationStyle& style) { - j = to_string_view(style); -} - std::string Tracer::config() const { // clang-format off auto config = nlohmann::json::object({ diff --git a/test/remote_config/test_remote_config.cpp b/test/remote_config/test_remote_config.cpp index 321d35d2..364275ad 100644 --- a/test/remote_config/test_remote_config.cpp +++ b/test/remote_config/test_remote_config.cpp @@ -190,71 +190,6 @@ REMOTE_CONFIG_TEST("response processing") { CHECK(payload.contains("/client/state/error"_json_pointer) == true); } - SECTION( - "configuration updates targetting the wrong tracer reports an error") { - // clang-format off - auto test_case = GENERATE(values({ - // "service_target": { "service": "not-testsvc", "env": "test" } - R"({ - "targets": - "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L3NlcnZpY2VfbmFtZSI6IHsKICAgICAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTc3NzY4YjIwYjdjN2Y4NDQ5MzVjYWU2OWM1YzVlZDg4ZWFhZTIzNGUwMTgyYTc4MzU5OTczMzllNTUyNGJjIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsZW5ndGgiOiAzNzQsCgkJCQkiY3VzdG9tIjogeyAidiI6IDEyMyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJ2ZXJzaW9uIjogNjYyMDQzMjAKICAgIH0KfQo=", - "client_configs": ["employee/APM_TRACING/test_rc_wrong_target/service_name"], - "target_files": [ - { - "path": "employee/APM_TRACING/test_rc_wrong_target/service_name", - "raw": - "eyAiaWQiOiAiODI3ZWFjZjhkYmMzYWIxNDM0ZDMyMWNiODFkZmJmN2FmZTY1NGE0YjYxMTFjZjE2NjBiNzFjY2Y4OTc4MTkzOCIsICJyZXZpc2lvbiI6IDE2OTgxNjcxMjYwNjQsICJzY2hlbWFfdmVyc2lvbiI6ICJ2MS4wLjAiLCAiYWN0aW9uIjogImVuYWJsZSIsICJsaWJfY29uZmlnIjogeyAibGlicmFyeV9sYW5ndWFnZSI6ICJhbGwiLCAibGlicmFyeV92ZXJzaW9uIjogImxhdGVzdCIsICJzZXJ2aWNlX25hbWUiOiAidGVzdHN2YyIsICJlbnYiOiAidGVzdCIsICJ0cmFjaW5nX2VuYWJsZWQiOiB0cnVlLCAidHJhY2luZ19zYW1wbGluZ19yYXRlIjogMC42IH0sICJzZXJ2aWNlX3RhcmdldCI6IHsgInNlcnZpY2UiOiAibm90LXRlc3RzdmMiLCAiZW52IjogInRlc3QiIH0gfQ==" - } - ] - })", - // "service_target": { "service": "testsvc", "env": "dev" } - R"({ - "targets": - "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L2Vudl9uYW1lIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogImExNzc3NjhiMjBiN2M3Zjg0NDkzNWNhZTY5YzVjNWVkODhlYWFlMjM0ZTAxODJhNzgzNTk5NzMzOWU1NTI0YmMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTI0IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9Cg==", - "client_configs": ["employee/APM_TRACING/test_rc_wrong_target/env_name"], - "target_files": [ - { - "path": "employee/APM_TRACING/test_rc_wrong_target/env_name", - "raw": - "eyAiaWQiOiAiODI3ZWFjZjhkYmMzYWIxNDM0ZDMyMWNiODFkZmJmN2FmZTY1NGE0YjYxMTFjZjE2NjBiNzFjY2Y4OTc4MTkzOCIsICJyZXZpc2lvbiI6IDE2OTgxNjcxMjYwNjQsICJzY2hlbWFfdmVyc2lvbiI6ICJ2MS4wLjAiLCAiYWN0aW9uIjogImVuYWJsZSIsICJsaWJfY29uZmlnIjogeyAibGlicmFyeV9sYW5ndWFnZSI6ICJhbGwiLCAibGlicmFyeV92ZXJzaW9uIjogImxhdGVzdCIsICJzZXJ2aWNlX25hbWUiOiAidGVzdHN2YyIsICJlbnYiOiAidGVzdCIsICJ0cmFjaW5nX2VuYWJsZWQiOiB0cnVlLCAidHJhY2luZ19zYW1wbGluZ19yYXRlIjogMC42IH0sICJzZXJ2aWNlX3RhcmdldCI6IHsgInNlcnZpY2UiOiAidGVzdHN2YyIsICJlbnYiOiAiZGV2IiB9IH0=" - } - ] - })" - })); - // clang-format on - - CAPTURE(test_case); - - const auto response_json = - nlohmann::json::parse(/* input = */ test_case, - /* parser_callback = */ nullptr, - /* allow_exceptions = */ false); - - REQUIRE(!response_json.is_discarded()); - - auto tracing_listener = std::make_shared(); - tracing_listener->products = rc::product::APM_TRACING; - - rc::Manager rc(tracer_signature, {tracing_listener}, logger); - rc.process_response(response_json); - - CHECK(tracing_listener->count_on_update == 0); - CHECK(tracing_listener->count_on_revert == 0); - CHECK(tracing_listener->count_on_post_process == 1); - - // Verify next request set the config status - const auto payload = rc.make_request_payload(); - REQUIRE(payload.contains("/client/state/config_states"_json_pointer) == - true); - - constexpr auto error_state = 3; - const auto& config_states = - payload.at("/client/state/config_states"_json_pointer); - REQUIRE(config_states.size() == 1); - CHECK(config_states[0]["product"] == "APM_TRACING"); - CHECK(config_states[0]["apply_state"] == error_state); - } - SECTION("update dispatch") { // Verify configuration updates are dispatched to the correct listener std::string_view rc_response = R"({ diff --git a/test/test_config_manager.cpp b/test/test_config_manager.cpp index aa2f9f5c..ab0c2b4e 100644 --- a/test/test_config_manager.cpp +++ b/test/test_config_manager.cpp @@ -29,7 +29,8 @@ CONFIG_MANAGER_TEST("remote configuration handling") { auto tracer_telemetry = std::make_shared( false, default_clock, nullptr, tracer_signature, "", ""); - ConfigManager config_manager(*finalize_config(config), tracer_telemetry); + ConfigManager config_manager(*finalize_config(config), tracer_signature, + tracer_telemetry); rc::Listener::Configuration config_update{/* id = */ "id", /* path = */ "", @@ -37,6 +38,24 @@ CONFIG_MANAGER_TEST("remote configuration handling") { /* version = */ 1, rc::product::Flag::APM_TRACING}; + SECTION( + "configuration updates targetting the wrong tracer reports an error") { + // clang-format off + auto test_case = GENERATE(values({ + R"({ "service_target": { "service": "not-testsvc", "env": "test" } })", + R"({ "service_target": { "service": "testsvc", "env": "not-test" } })" + })); + // clang-format on + + CAPTURE(test_case); + + config_update.content = test_case; + + // TODO: targetting wrong procut -> error + const auto err = config_manager.on_update(config_update); + CHECK(err); + } + SECTION("handling of `tracing_sampling_rate`") { // SECTION("invalid value") { // config_update.content = R"({ diff --git a/test/test_datadog_agent.cpp b/test/test_datadog_agent.cpp index c1bd4d7a..da3d489e 100644 --- a/test/test_datadog_agent.cpp +++ b/test/test_datadog_agent.cpp @@ -200,7 +200,8 @@ TEST_CASE("Remote Configuration", "[datadog_agent]") { finalized->report_telemetry, finalized->clock, finalized->logger, signature, "", ""); - auto config_manager = std::make_shared(*finalized, telemetry); + auto config_manager = + std::make_shared(*finalized, signature, telemetry); const auto& agent_config = std::get(finalized->collector);