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/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/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/remote_config/remote_config.cpp b/src/datadog/remote_config/remote_config.cpp index 4758781f..b4867234 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 ConfigKeyMetadata final { + 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_metadata = parse_config_path(config_path); + if (!config_key_metadata) { 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_metadata->product; + const auto& config_metadata = targets.at("/signed/targets"_json_pointer).at(config_path); @@ -231,38 +240,27 @@ 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"); + 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_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; + + 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; } } 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..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)), @@ -88,10 +92,10 @@ std::string Tracer::config() const { 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()}, }); diff --git a/test/remote_config/test_remote_config.cpp b/test/remote_config/test_remote_config.cpp index 48d90c80..364275ad 100644 --- a/test/remote_config/test_remote_config.cpp +++ b/test/remote_config/test_remote_config.cpp @@ -190,75 +190,10 @@ 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": - "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L3NlcnZpY2VfbmFtZSI6IHsKICAgICAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTc3NzY4YjIwYjdjN2Y4NDQ5MzVjYWU2OWM1YzVlZDg4ZWFhZTIzNGUwMTgyYTc4MzU5OTczMzllNTUyNGJjIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsZW5ndGgiOiAzNzQKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9", - "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": - "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfd3JvbmdfdGFyZ2V0L2Vudl9uYW1lIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogImExNzc3NjhiMjBiN2M3Zjg0NDkzNWNhZTY5YzVjNWVkODhlYWFlMjM0ZTAxODJhNzgzNTk5NzMzOWU1NTI0YmMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NAogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAidmVyc2lvbiI6IDY2MjA0MzIwCiAgICB9Cn0=", - "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"({ - "targets": "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfdXBkYXRlL2xpYl91cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiYTE3Nzc2OGIyMGI3YzdmODQ0OTM1Y2FlNjljNWM1ZWQ4OGVhYWUyMzRlMDE4MmE3ODM1OTk3MzM5ZTU1MjRiYyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXBsb3llZS9BR0VOVF9UQVNLL3Rlc3RfcmNfdXBkYXRlL2ZsYXJlX3Rhc2siOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiNDE5NGNlNmY3MTEzOTU5NDZiZTgzN2JmNWViYTk0ODkxYjdiZGU3OTg5MTFlZDVlZmZmNjU5OWQyMWFiOTY5NiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXBsb3llZS9BR0VOVF9DT05GSUcvdGVzdF9yY191cGRhdGUvZmxhcmVfY29uZiI6IHsKICAgICAgICAgICAgICAgICJoYXNoZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDc4YWU3MzZhM2ZjNDU1YjcyMzFkYWY5OTQ1ZjhkZjcwNGYxNzI1YjUwZGRlNDZkMGNiY2RjM2YwZTExZDQxIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsZW5ndGgiOiAzNzQKICAgICAgICAgICAgfQogICAgIAogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9", + "targets": "ewogICAgInNpZ25lZCI6IHsKICAgICAgICAiY3VzdG9tIjogewogICAgICAgICAgICAiYWdlbnRfcmVmcmVzaF9pbnRlcnZhbCI6IDUsCiAgICAgICAgICAgICJvcGFxdWVfYmFja2VuZF9zdGF0ZSI6ICJleUoyWlhKemFXOXVJam95TENKemRHRjBaU0k2ZXlKbWFXeGxYMmhoYzJobGN5STZleUprWVhSaFpHOW5MekV3TURBeE1qVTROREF2UVZCTlgxUlNRVU5KVGtjdk9ESTNaV0ZqWmpoa1ltTXpZV0l4TkRNMFpETXlNV05pT0RGa1ptSm1OMkZtWlRZMU5HRTBZall4TVRGalpqRTJOakJpTnpGalkyWTRPVGM0TVRrek9DOHlPVEE0Tm1Ka1ltVTFNRFpsTmpoaU5UQm1NekExTlRneU0yRXpaR0UxWTJVd05USTRaakUyTkRCa05USmpaamc0TmpFNE1UWmhZV0U1Wm1ObFlXWTBJanBiSW05WVpESnBlVU16ZUM5b1JXc3hlWFZoWTFoR04xbHFjWEpwVGs5QldVdHVaekZ0V0UwMU5WWktUSGM5SWwxOWZYMD0iCiAgICAgICAgfSwKICAgICAgICAic3BlY192ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAidGFyZ2V0cyI6IHsKICAgICAgICAgICAgImVtcGxveWVlL0FQTV9UUkFDSU5HL3Rlc3RfcmNfdXBkYXRlL2xpYl91cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAiaGFzaGVzIjogewogICAgICAgICAgICAgICAgICAgICJzaGEyNTYiOiAiYTE3Nzc2OGIyMGI3YzdmODQ0OTM1Y2FlNjljNWM1ZWQ4OGVhYWUyMzRlMDE4MmE3ODM1OTk3MzM5ZTU1MjRiYyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGVuZ3RoIjogMzc0LAoJCQkJImN1c3RvbSI6IHsgInYiOiAxMjQgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wbG95ZWUvQUdFTlRfVEFTSy90ZXN0X3JjX3VwZGF0ZS9mbGFyZV90YXNrIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogIjQxOTRjZTZmNzExMzk1OTQ2YmU4MzdiZjVlYmE5NDg5MWI3YmRlNzk4OTExZWQ1ZWZmZjY1OTlkMjFhYjk2OTYiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTI1IH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImVtcGxveWVlL0FHRU5UX0NPTkZJRy90ZXN0X3JjX3VwZGF0ZS9mbGFyZV9jb25mIjogewogICAgICAgICAgICAgICAgImhhc2hlcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hhMjU2IjogIjJkNzhhZTczNmEzZmM0NTViNzIzMWRhZjk5NDVmOGRmNzA0ZjE3MjViNTBkZGU0NmQwY2JjZGMzZjBlMTFkNDEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxlbmd0aCI6IDM3NCwKCQkJCSJjdXN0b20iOiB7ICJ2IjogMTI1IH0KICAgICAgICAgICAgfQogICAgIAogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiA2NjIwNDMyMAogICAgfQp9Cg==", "client_configs": [ "employee/APM_TRACING/test_rc_update/lib_update", "employee/AGENT_TASK/test_rc_update/flare_task", @@ -348,7 +283,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", 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);