Skip to content

Commit 5013321

Browse files
authored
[part 2] refactor!(telemetry): move telemetry logic from DatadogAgent (#194)
1 parent 67ab91f commit 5013321

20 files changed

+433
-322
lines changed

include/datadog/datadog_agent_config.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ struct DatadogAgentConfig {
6666
// How often, in seconds, to query the Datadog Agent for remote configuration
6767
// updates.
6868
Optional<double> remote_configuration_poll_interval_seconds;
69-
70-
static Expected<HTTPClient::URL> parse(StringView);
7169
};
7270

7371
class FinalizedDatadogAgentConfig {

include/datadog/telemetry/telemetry.h

Lines changed: 98 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
#pragma once
22

3+
#include <datadog/clock.h>
4+
#include <datadog/config.h>
5+
#include <datadog/event_scheduler.h>
6+
#include <datadog/http_client.h>
37
#include <datadog/logger.h>
48
#include <datadog/telemetry/configuration.h>
59
#include <datadog/telemetry/metrics.h>
10+
#include <datadog/tracer_signature.h>
611

712
#include <memory>
13+
#include <unordered_map>
814
#include <vector>
915

1016
namespace datadog {
1117

1218
namespace tracing {
13-
class DatadogAgent;
1419
class TracerTelemetry;
1520
} // namespace tracing
1621

@@ -21,13 +26,74 @@ namespace telemetry {
2126
///
2227
/// IMPORTANT: This is intended for use only by Datadog Engineers.
2328
class Telemetry final {
29+
// This structure contains all the metrics that are exposed by tracer
30+
// telemetry.
31+
struct {
32+
struct {
33+
telemetry::CounterMetric spans_created = {
34+
"spans_created", "tracers", {}, true};
35+
telemetry::CounterMetric spans_finished = {
36+
"spans_finished", "tracers", {}, true};
37+
38+
telemetry::CounterMetric trace_segments_created_new = {
39+
"trace_segments_created", "tracers", {"new_continued:new"}, true};
40+
telemetry::CounterMetric trace_segments_created_continued = {
41+
"trace_segments_created",
42+
"tracers",
43+
{"new_continued:continued"},
44+
true};
45+
telemetry::CounterMetric trace_segments_closed = {
46+
"trace_segments_closed", "tracers", {}, true};
47+
telemetry::CounterMetric baggage_items_exceeded = {
48+
"context_header.truncated",
49+
"tracers",
50+
{{"truncation_reason:baggage_item_count_exceeded"}},
51+
true,
52+
};
53+
telemetry::CounterMetric baggage_bytes_exceeded = {
54+
"context_header.truncated",
55+
"tracers",
56+
{{"truncation_reason:baggage_byte_count_exceeded"}},
57+
true,
58+
};
59+
} tracer;
60+
struct {
61+
telemetry::CounterMetric requests = {
62+
"trace_api.requests", "tracers", {}, true};
63+
64+
telemetry::CounterMetric responses_1xx = {
65+
"trace_api.responses", "tracers", {"status_code:1xx"}, true};
66+
telemetry::CounterMetric responses_2xx = {
67+
"trace_api.responses", "tracers", {"status_code:2xx"}, true};
68+
telemetry::CounterMetric responses_3xx = {
69+
"trace_api.responses", "tracers", {"status_code:3xx"}, true};
70+
telemetry::CounterMetric responses_4xx = {
71+
"trace_api.responses", "tracers", {"status_code:4xx"}, true};
72+
telemetry::CounterMetric responses_5xx = {
73+
"trace_api.responses", "tracers", {"status_code:5xx"}, true};
74+
75+
telemetry::CounterMetric errors_timeout = {
76+
"trace_api.errors", "tracers", {"type:timeout"}, true};
77+
telemetry::CounterMetric errors_network = {
78+
"trace_api.errors", "tracers", {"type:network"}, true};
79+
telemetry::CounterMetric errors_status_code = {
80+
"trace_api.errors", "tracers", {"type:status_code"}, true};
81+
82+
} trace_api;
83+
} metrics_;
84+
2485
/// Configuration object containing the validated settings for telemetry
2586
FinalizedConfiguration config_;
2687
/// Shared pointer to the user logger instance.
2788
std::shared_ptr<tracing::Logger> logger_;
28-
/// TODO(@dmehala): Legacy dependency.
29-
std::shared_ptr<tracing::DatadogAgent> datadog_agent_;
3089
std::shared_ptr<tracing::TracerTelemetry> tracer_telemetry_;
90+
std::vector<tracing::EventScheduler::Cancel> tasks_;
91+
tracing::HTTPClient::ResponseHandler telemetry_on_response_;
92+
tracing::HTTPClient::ErrorHandler telemetry_on_error_;
93+
tracing::HTTPClient::URL telemetry_endpoint_;
94+
tracing::TracerSignature tracer_signature_;
95+
std::shared_ptr<tracing::HTTPClient> http_client_;
96+
tracing::Clock clock_;
3197

3298
public:
3399
/// Constructor for the Telemetry class
@@ -37,9 +103,20 @@ class Telemetry final {
37103
/// @param metrics A vector user metrics to report.
38104
Telemetry(FinalizedConfiguration configuration,
39105
std::shared_ptr<tracing::Logger> logger,
40-
std::vector<std::shared_ptr<Metric>> metrics);
106+
std::shared_ptr<tracing::HTTPClient> client,
107+
std::vector<std::shared_ptr<Metric>> metrics,
108+
tracing::EventScheduler& scheduler,
109+
tracing::HTTPClient::URL agent_url,
110+
tracing::Clock clock = tracing::default_clock);
111+
112+
/// Destructor
113+
///
114+
/// Send last metrics snapshot and `app-closing` event.
115+
~Telemetry();
41116

42-
~Telemetry() = default;
117+
// Provides access to the telemetry metrics for updating the values.
118+
// This value should not be stored.
119+
inline auto& metrics() { return metrics_; }
43120

44121
/// Capture and report internal error message to Datadog.
45122
///
@@ -50,6 +127,22 @@ class Telemetry final {
50127
///
51128
/// @param message The warning message to log.
52129
void log_warning(std::string message);
130+
131+
void send_app_started(
132+
const std::unordered_map<tracing::ConfigName, tracing::ConfigMetadata>&
133+
config_metadata);
134+
135+
void send_configuration_change();
136+
137+
void capture_configuration_change(
138+
const std::vector<tracing::ConfigMetadata>& new_configuration);
139+
140+
void send_app_closing();
141+
142+
private:
143+
void send_telemetry(tracing::StringView request_type, std::string payload);
144+
145+
void send_heartbeat_and_telemetry();
53146
};
54147

55148
} // namespace telemetry

include/datadog/trace_segment.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
#include "sampling_priority.h"
4141

4242
namespace datadog {
43+
namespace telemetry {
44+
class Telemetry;
45+
}
4346
namespace tracing {
4447

4548
class Collector;
@@ -52,14 +55,13 @@ struct SpanDefaults;
5255
class SpanSampler;
5356
class TraceSampler;
5457
class ConfigManager;
55-
class TracerTelemetry;
5658

5759
class TraceSegment {
5860
mutable std::mutex mutex_;
5961

6062
std::shared_ptr<Logger> logger_;
6163
std::shared_ptr<Collector> collector_;
62-
std::shared_ptr<TracerTelemetry> tracer_telemetry_;
64+
std::shared_ptr<telemetry::Telemetry> telemetry_;
6365
std::shared_ptr<TraceSampler> trace_sampler_;
6466
std::shared_ptr<SpanSampler> span_sampler_;
6567

@@ -82,7 +84,7 @@ class TraceSegment {
8284
public:
8385
TraceSegment(const std::shared_ptr<Logger>& logger,
8486
const std::shared_ptr<Collector>& collector,
85-
const std::shared_ptr<TracerTelemetry>& tracer_telemetry,
87+
const std::shared_ptr<telemetry::Telemetry>& telemetry,
8688
const std::shared_ptr<TraceSampler>& trace_sampler,
8789
const std::shared_ptr<SpanSampler>& span_sampler,
8890
const std::shared_ptr<const SpanDefaults>& defaults,

include/datadog/tracer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
// obtained from a `TracerConfig` via the `finalize_config` function. See
1111
// `tracer_config.h`.
1212

13+
#include <datadog/telemetry/telemetry.h>
14+
1315
#include <cstddef>
1416
#include <memory>
1517

@@ -39,7 +41,7 @@ class Tracer {
3941
std::shared_ptr<Logger> logger_;
4042
RuntimeID runtime_id_;
4143
TracerSignature signature_;
42-
std::shared_ptr<TracerTelemetry> tracer_telemetry_;
44+
std::shared_ptr<telemetry::Telemetry> telemetry_;
4345
std::shared_ptr<ConfigManager> config_manager_;
4446
std::shared_ptr<Collector> collector_;
4547
std::shared_ptr<SpanSampler> span_sampler_;

include/datadog/tracer_config.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,18 @@ struct TracerConfig {
156156
// programmatic value in Datadog's Active Configuration, whereas it is
157157
// actually the default value for the integration.
158158
Optional<bool> report_service_as_default;
159+
159160
/// The maximum number of baggage items that can be stored or propagated.
160161
Optional<std::size_t> baggage_max_items;
162+
161163
/// The maximum amount of bytes allowed to be written during tracing context
162164
/// injection.
163165
Optional<std::size_t> baggage_max_bytes;
166+
167+
/// The event scheduler used for scheduling recurring tasks.
168+
/// By default, it uses `ThreadedEventScheduler`, which runs tasks on a
169+
/// separate thread.
170+
std::shared_ptr<EventScheduler> event_scheduler;
164171
};
165172

166173
// `FinalizedTracerConfig` contains `Tracer` implementation details derived from
@@ -197,6 +204,9 @@ class FinalizedTracerConfig final {
197204
bool report_traces;
198205
std::unordered_map<ConfigName, ConfigMetadata> metadata;
199206
Baggage::Options baggage_opts;
207+
HTTPClient::URL agent_url;
208+
std::shared_ptr<EventScheduler> event_scheduler;
209+
std::shared_ptr<HTTPClient> http_client;
200210
};
201211

202212
// Return a `FinalizedTracerConfig` from the specified `config` and from any

src/datadog/config_manager.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,9 @@ ConfigManager::Update parse_dynamic_config(const nlohmann::json& j) {
123123

124124
namespace rc = datadog::remote_config;
125125

126-
ConfigManager::ConfigManager(const FinalizedTracerConfig& config,
127-
const std::shared_ptr<TracerTelemetry>& telemetry)
126+
ConfigManager::ConfigManager(
127+
const FinalizedTracerConfig& config,
128+
const std::shared_ptr<telemetry::Telemetry>& telemetry)
128129
: clock_(config.clock),
129130
default_metadata_(config.metadata),
130131
trace_sampler_(

src/datadog/config_manager.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
#include <datadog/optional.h>
1010
#include <datadog/remote_config/listener.h>
1111
#include <datadog/span_defaults.h>
12+
#include <datadog/telemetry/telemetry.h>
1213
#include <datadog/tracer_config.h>
1314

1415
#include <mutex>
1516

1617
#include "json.hpp"
17-
#include "tracer_telemetry.h"
1818

1919
namespace datadog {
2020
namespace tracing {
@@ -76,7 +76,7 @@ class ConfigManager : public remote_config::Listener {
7676
DynamicConfig<std::shared_ptr<const SpanDefaults>> span_defaults_;
7777
DynamicConfig<bool> report_traces_;
7878

79-
std::shared_ptr<TracerTelemetry> telemetry_;
79+
std::shared_ptr<telemetry::Telemetry> telemetry_;
8080

8181
private:
8282
template <typename T>
@@ -85,7 +85,7 @@ class ConfigManager : public remote_config::Listener {
8585

8686
public:
8787
ConfigManager(const FinalizedTracerConfig& config,
88-
const std::shared_ptr<TracerTelemetry>& telemetry);
88+
const std::shared_ptr<telemetry::Telemetry>& telemetry);
8989
~ConfigManager() override{};
9090

9191
remote_config::Products get_products() override;

0 commit comments

Comments
 (0)