Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions include/datadog/telemetry/telemetry.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <datadog/logger.h>
#include <datadog/telemetry/configuration.h>
#include <datadog/telemetry/metrics.h>
#include <datadog/tracer_signature.h>

#include <memory>
#include <vector>
Expand Down Expand Up @@ -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<tracing::Logger> logger,
std::shared_ptr<tracing::HTTPClient> client,
std::shared_ptr<tracing::EventScheduler> 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
Expand Down
22 changes: 18 additions & 4 deletions src/datadog/telemetry/telemetry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ using TelemetryProxy = std::variant<NoopTelemetry, Telemetry>;
/// NOTE(@dmehala): Here to facilitate Meyer's singleton construction.
struct Ctor_param final {
FinalizedConfiguration configuration;
tracing::TracerSignature tracer_signature;
std::shared_ptr<tracing::Logger> logger;
std::shared_ptr<tracing::HTTPClient> client;
std::shared_ptr<tracing::EventScheduler> scheduler;
Expand All @@ -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(
Expand All @@ -51,8 +53,20 @@ void init(FinalizedConfiguration configuration,
std::shared_ptr<tracing::HTTPClient> client,
std::shared_ptr<tracing::EventScheduler> 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<tracing::Logger> logger,
std::shared_ptr<tracing::HTTPClient> client,
std::shared_ptr<tracing::EventScheduler> 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() {
Expand Down
4 changes: 2 additions & 2 deletions src/datadog/telemetry/telemetry_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,15 +195,15 @@ nlohmann::json encode_distributions(
} // namespace

Telemetry::Telemetry(FinalizedConfiguration config,
TracerSignature tracer_signature,
std::shared_ptr<tracing::Logger> logger,
std::shared_ptr<tracing::HTTPClient> client,
std::shared_ptr<tracing::EventScheduler> event_scheduler,
HTTPClient::URL agent_url, Clock clock)
: 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),
Expand Down
1 change: 1 addition & 0 deletions src/datadog/telemetry/telemetry_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<tracing::Logger> logger,
std::shared_ptr<tracing::HTTPClient> client,
std::shared_ptr<tracing::EventScheduler> event_scheduler,
Expand Down
2 changes: 1 addition & 1 deletion src/datadog/tracer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
12 changes: 6 additions & 6 deletions src/datadog/tracer_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -371,15 +371,15 @@ Expected<FinalizedTracerConfig> 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) {
Expand Down
69 changes: 55 additions & 14 deletions test/telemetry/test_telemetry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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);
}
Expand All @@ -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);

Expand All @@ -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.
Expand Down