diff --git a/include/datadog/telemetry/telemetry.h b/include/datadog/telemetry/telemetry.h index 9f2b44923..01574f888 100644 --- a/include/datadog/telemetry/telemetry.h +++ b/include/datadog/telemetry/telemetry.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,14 @@ void init(FinalizedConfiguration configuration, tracing::HTTPClient::URL agent_url, tracing::Clock clock = tracing::default_clock); +void init(FinalizedConfiguration configuration, + tracing::TracerSignature tracer_signature, + std::shared_ptr logger, + std::shared_ptr client, + std::shared_ptr event_scheduler, + tracing::HTTPClient::URL agent_url, + tracing::Clock clock = tracing::default_clock); + /// Sends configuration changes. /// /// This function is responsible for sending reported configuration changes diff --git a/src/datadog/telemetry/telemetry.cpp b/src/datadog/telemetry/telemetry.cpp index 5e645b1c3..95a4433a4 100644 --- a/src/datadog/telemetry/telemetry.cpp +++ b/src/datadog/telemetry/telemetry.cpp @@ -27,6 +27,7 @@ using TelemetryProxy = std::variant; /// NOTE(@dmehala): Here to facilitate Meyer's singleton construction. struct Ctor_param final { FinalizedConfiguration configuration; + tracing::TracerSignature tracer_signature; std::shared_ptr logger; std::shared_ptr client; std::shared_ptr scheduler; @@ -36,8 +37,9 @@ struct Ctor_param final { TelemetryProxy make_telemetry(const Ctor_param& init) { if (!init.configuration.enabled) return NoopTelemetry{}; - return Telemetry{init.configuration, init.logger, init.client, - init.scheduler, init.agent_url, init.clock}; + return Telemetry{init.configuration, init.tracer_signature, init.logger, + init.client, init.scheduler, init.agent_url, + init.clock}; } TelemetryProxy& instance( @@ -51,8 +53,20 @@ void init(FinalizedConfiguration configuration, std::shared_ptr client, std::shared_ptr event_scheduler, tracing::HTTPClient::URL agent_url, tracing::Clock clock) { - instance(Ctor_param{configuration, logger, client, event_scheduler, agent_url, - clock}); + instance(Ctor_param{configuration, + tracing::TracerSignature(tracing::RuntimeID::generate(), + tracing::get_process_name(), ""), + logger, client, event_scheduler, agent_url, clock}); +} + +void init(FinalizedConfiguration configuration, + tracing::TracerSignature tracer_signature, + std::shared_ptr logger, + std::shared_ptr client, + std::shared_ptr event_scheduler, + tracing::HTTPClient::URL agent_url, tracing::Clock clock) { + instance(Ctor_param{configuration, tracer_signature, logger, client, + event_scheduler, agent_url, clock}); } void send_configuration_change() { diff --git a/src/datadog/telemetry/telemetry_impl.cpp b/src/datadog/telemetry/telemetry_impl.cpp index f789ca282..85a30ecc3 100644 --- a/src/datadog/telemetry/telemetry_impl.cpp +++ b/src/datadog/telemetry/telemetry_impl.cpp @@ -195,6 +195,7 @@ nlohmann::json encode_distributions( } // namespace Telemetry::Telemetry(FinalizedConfiguration config, + TracerSignature tracer_signature, std::shared_ptr logger, std::shared_ptr client, std::shared_ptr event_scheduler, @@ -202,8 +203,7 @@ Telemetry::Telemetry(FinalizedConfiguration config, : config_(std::move(config)), logger_(std::move(logger)), telemetry_endpoint_(make_telemetry_endpoint(agent_url)), - tracer_signature_(tracing::RuntimeID::generate(), - tracing::get_process_name(), ""), + tracer_signature_(tracer_signature), http_client_(client), clock_(std::move(clock)), scheduler_(event_scheduler), diff --git a/src/datadog/telemetry/telemetry_impl.h b/src/datadog/telemetry/telemetry_impl.h index ec6ded039..7c92db3bd 100644 --- a/src/datadog/telemetry/telemetry_impl.h +++ b/src/datadog/telemetry/telemetry_impl.h @@ -76,6 +76,7 @@ class Telemetry final { /// @param logger User logger instance. /// @param metrics A vector user metrics to report. Telemetry(FinalizedConfiguration configuration, + tracing::TracerSignature tracer_signature, std::shared_ptr logger, std::shared_ptr client, std::shared_ptr event_scheduler, diff --git a/src/datadog/tracer.cpp b/src/datadog/tracer.cpp index e0f34a1e3..8849c0821 100644 --- a/src/datadog/tracer.cpp +++ b/src/datadog/tracer.cpp @@ -59,7 +59,7 @@ Tracer::Tracer(const FinalizedTracerConfig& config, baggage_opts_(config.baggage_opts), baggage_injection_enabled_(false), baggage_extraction_enabled_(false) { - telemetry::init(config.telemetry, logger_, config.http_client, + telemetry::init(config.telemetry, signature_, logger_, config.http_client, config.event_scheduler, config.agent_url); if (config.report_hostname) { hostname_ = get_hostname(); diff --git a/src/datadog/tracer_config.cpp b/src/datadog/tracer_config.cpp index 629cd130e..fb8ac2474 100644 --- a/src/datadog/tracer_config.cpp +++ b/src/datadog/tracer_config.cpp @@ -371,15 +371,15 @@ Expected finalize_config(const TracerConfig &user_config, // Baggage std::tie(origin, final_config.baggage_opts.max_items) = pick(env_config->baggage_max_items, user_config.baggage_max_items, 64); - final_config.metadata[ConfigName::TRACE_BAGGAGE_MAX_ITEMS] = - ConfigMetadata(ConfigName::TRACE_BAGGAGE_MAX_ITEMS, - to_string(final_config.baggage_opts.max_items), origin); + final_config.metadata[ConfigName::TRACE_BAGGAGE_MAX_ITEMS] = ConfigMetadata( + ConfigName::TRACE_BAGGAGE_MAX_ITEMS, + std::to_string(final_config.baggage_opts.max_items), origin); std::tie(origin, final_config.baggage_opts.max_bytes) = pick(env_config->baggage_max_bytes, user_config.baggage_max_bytes, 8192); - final_config.metadata[ConfigName::TRACE_BAGGAGE_MAX_BYTES] = - ConfigMetadata(ConfigName::TRACE_BAGGAGE_MAX_BYTES, - to_string(final_config.baggage_opts.max_bytes), origin); + final_config.metadata[ConfigName::TRACE_BAGGAGE_MAX_BYTES] = ConfigMetadata( + ConfigName::TRACE_BAGGAGE_MAX_BYTES, + std::to_string(final_config.baggage_opts.max_bytes), origin); if (final_config.baggage_opts.max_items <= 0 || final_config.baggage_opts.max_bytes < 3) { diff --git a/test/telemetry/test_telemetry.cpp b/test/telemetry/test_telemetry.cpp index 383be17fe..31ffc9cbf 100644 --- a/test/telemetry/test_telemetry.cpp +++ b/test/telemetry/test_telemetry.cpp @@ -98,7 +98,12 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { SECTION("ctor send app-started message") { SECTION("Without a defined integration") { - Telemetry telemetry{*finalize_config(), logger, client, scheduler, *url}; + Telemetry telemetry{*finalize_config(), + tracer_signature, + logger, + client, + scheduler, + *url}; /// By default the integration is `datadog` with the tracer version. /// TODO: remove the default because these datadog are already part of the /// request header. @@ -118,7 +123,11 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { Configuration cfg; cfg.integration_name = "nginx"; cfg.integration_version = "1.25.2"; - Telemetry telemetry2{*finalize_config(cfg), logger, client, scheduler, + Telemetry telemetry2{*finalize_config(cfg), + tracer_signature, + logger, + client, + scheduler, *url}; auto app_started = nlohmann::json::parse(client->request_body); @@ -144,7 +153,12 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { ddtest::EnvGuard install_time_env("DD_INSTRUMENTATION_INSTALL_TIME", "1703188212"); - Telemetry telemetry4{*finalize_config(), logger, client, scheduler, *url}; + Telemetry telemetry4{*finalize_config(), + tracer_signature, + logger, + client, + scheduler, + *url}; auto app_started = nlohmann::json::parse(client->request_body); REQUIRE(is_valid_telemetry_payload(app_started) == true); @@ -186,7 +200,11 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { Configuration cfg; cfg.products.emplace_back(std::move(product)); - Telemetry telemetry3{*finalize_config(cfg), logger, client, scheduler, + Telemetry telemetry3{*finalize_config(cfg), + tracer_signature, + logger, + client, + scheduler, *url}; auto app_started = nlohmann::json::parse(client->request_body); @@ -290,7 +308,12 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry lifecycle") { SECTION("dtor send app-closing message") { { - Telemetry telemetry{*finalize_config(), logger, client, scheduler, *url}; + Telemetry telemetry{*finalize_config(), + tracer_signature, + logger, + client, + scheduler, + *url}; client->clear(); } @@ -322,8 +345,13 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry API") { auto url = HTTPClient::URL::parse("http://localhost:8000"); - Telemetry telemetry{*finalize_config(), logger, client, - scheduler, *url, clock}; + Telemetry telemetry{*finalize_config(), + tracer_signature, + logger, + client, + scheduler, + *url, + clock}; SECTION("generates a heartbeat message") { client->clear(); @@ -624,8 +652,13 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry API") { const Rate rps{"request", "rate-test", true}; const Counter my_counter{"my_counter", "counter-test", true}; { - Telemetry tmp_telemetry{*finalize_config(), logger, client, - scheduler, *url, clock}; + Telemetry tmp_telemetry{*finalize_config(), + tracer_signature, + logger, + client, + scheduler, + *url, + clock}; tmp_telemetry.increment_counter(my_counter); // = 1 tmp_telemetry.add_datapoint(response_time, 128); tmp_telemetry.set_rate(rps, 1000); @@ -772,8 +805,13 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry API") { SECTION("dtor sends logs in `app-closing` message") { { - Telemetry tmp_telemetry{*finalize_config(), logger, client, - scheduler, *url, clock}; + Telemetry tmp_telemetry{*finalize_config(), + tracer_signature, + logger, + client, + scheduler, + *url, + clock}; tmp_telemetry.log_warning("Be careful!"); client->clear(); } @@ -819,7 +857,8 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry configuration") { auto final_cfg = finalize_config(cfg); REQUIRE(final_cfg); - Telemetry telemetry(*final_cfg, logger, client, scheduler, *url); + Telemetry telemetry(*final_cfg, tracer_signature, logger, client, scheduler, + *url); CHECK(scheduler->metrics_callback == nullptr); CHECK(scheduler->metrics_interval == nullopt); } @@ -832,7 +871,8 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry configuration") { auto final_cfg = finalize_config(cfg); REQUIRE(final_cfg); - Telemetry telemetry(*final_cfg, logger, client, scheduler, *url); + Telemetry telemetry(*final_cfg, tracer_signature, logger, client, scheduler, + *url); CHECK(scheduler->metrics_callback != nullptr); CHECK(scheduler->metrics_interval == 500ms); @@ -849,7 +889,8 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry configuration") { auto final_cfg = finalize_config(cfg); REQUIRE(final_cfg); - Telemetry telemetry(*final_cfg, logger, client, scheduler, *url); + Telemetry telemetry(*final_cfg, tracer_signature, logger, client, scheduler, + *url); telemetry.log_error("error"); // NOTE(@dmehala): logs are sent with an heartbeat.