Skip to content

Commit b79a04f

Browse files
author
Ganesh Jangir
authored
feat(telemetry): allow debug mode for the telemetry client (#1001)
* feat(telemetry): allow debug mode for the telemetry client * Fixed the typo in `telemetry_hearbeat_interval` to `telemetry_heartbeat_interval` across multiple files. * Added `debug_enabled` flag to the telemetry configuration. * Updated request builder to conditionally include the debug header based on the new flag.
1 parent dad9a63 commit b79a04f

File tree

11 files changed

+67
-30
lines changed

11 files changed

+67
-30
lines changed

data-pipeline-ffi/src/trace_exporter.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ pub struct TelemetryClientConfig<'a> {
4141
/// a single instrumented app should share the same runtime_id)
4242
/// - Be associated with traces to allow correlation between traces and telemetry data
4343
pub runtime_id: CharSlice<'a>,
44+
45+
/// Whether to enable debug mode for telemetry.
46+
/// When enabled, sets the DD-Telemetry-Debug-Enabled header to true.
47+
/// Defaults to false.
48+
pub debug_enabled: bool,
4449
}
4550

4651
/// The TraceExporterConfig object will hold the configuration properties for the TraceExporter.
@@ -244,6 +249,7 @@ pub unsafe extern "C" fn ddog_trace_exporter_config_enable_telemetry(
244249
Ok(s) => Some(s),
245250
Err(e) => return Some(e),
246251
},
252+
debug_enabled: telemetry_cfg.debug_enabled,
247253
})
248254
} else {
249255
config.telemetry_cfg = Some(TelemetryConfig::default());
@@ -596,6 +602,7 @@ mod tests {
596602
Some(&TelemetryClientConfig {
597603
interval: 1000,
598604
runtime_id: CharSlice::from("id"),
605+
debug_enabled: false,
599606
}),
600607
);
601608
assert_eq!(error.as_ref().unwrap().code, ErrorCode::InvalidArgument);
@@ -613,6 +620,7 @@ mod tests {
613620
Some(&TelemetryClientConfig {
614621
interval: 1000,
615622
runtime_id: CharSlice::from("foo"),
623+
debug_enabled: true,
616624
}),
617625
);
618626
assert!(error.is_none());
@@ -627,6 +635,7 @@ mod tests {
627635
.unwrap(),
628636
"foo"
629637
);
638+
assert!(cfg.telemetry_cfg.as_ref().unwrap().debug_enabled);
630639
}
631640
}
632641

@@ -735,7 +744,7 @@ mod tests {
735744
r#"{
736745
"rate_by_service": {
737746
"service:foo,env:staging": 1.0,
738-
"service:,env:": 0.8
747+
"service:,env:": 0.8
739748
}
740749
}"#,
741750
);
@@ -780,7 +789,7 @@ mod tests {
780789
r#"{
781790
"rate_by_service": {
782791
"service:foo,env:staging": 1.0,
783-
"service:,env:": 0.8
792+
"service:,env:": 0.8
784793
}
785794
}"#,
786795
);
@@ -796,10 +805,10 @@ mod tests {
796805
// (.NET) ping the agent with the aforementioned data type.
797806
unsafe {
798807
let server = MockServer::start();
799-
let response_body = r#"{
808+
let response_body = r#"{
800809
"rate_by_service": {
801810
"service:foo,env:staging": 1.0,
802-
"service:,env:": 0.8
811+
"service:,env:": 0.8
803812
}
804813
}"#;
805814

@@ -859,10 +868,10 @@ mod tests {
859868
fn exporter_send_telemetry_test() {
860869
unsafe {
861870
let server = MockServer::start();
862-
let response_body = r#"{
871+
let response_body = r#"{
863872
"rate_by_service": {
864873
"service:foo,env:staging": 1.0,
865-
"service:,env:": 0.8
874+
"service:,env:": 0.8
866875
}
867876
}"#;
868877
let mock_traces = server.mock(|when, then| {
@@ -897,6 +906,7 @@ mod tests {
897906
telemetry_cfg: Some(TelemetryConfig {
898907
heartbeat: 50,
899908
runtime_id: Some("foo".to_string()),
909+
debug_enabled: true,
900910
}),
901911
};
902912

data-pipeline/src/telemetry/mod.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ impl TelemetryClientBuilder {
6565
}
6666

6767
/// Sets the heartbeat notification interval in millis.
68-
pub fn set_hearbeat(mut self, interval: u64) -> Self {
68+
pub fn set_heartbeat(mut self, interval: u64) -> Self {
6969
if interval > 0 {
70-
self.config.telemetry_hearbeat_interval = Duration::from_millis(interval);
70+
self.config.telemetry_heartbeat_interval = Duration::from_millis(interval);
7171
}
7272
self
7373
}
@@ -78,6 +78,12 @@ impl TelemetryClientBuilder {
7878
self
7979
}
8080

81+
/// Sets the debug enabled flag for the telemetry client.
82+
pub fn set_debug_enabled(mut self, debug: bool) -> Self {
83+
self.config.debug_enabled = debug;
84+
self
85+
}
86+
8187
/// Builds the telemetry client.
8288
pub async fn build(self) -> Result<TelemetryClient, TelemetryError> {
8389
#[allow(clippy::unwrap_used)]
@@ -276,7 +282,8 @@ mod tests {
276282
.set_language_version("test_language_version")
277283
.set_tracer_version("test_tracer_version")
278284
.set_url(url)
279-
.set_hearbeat(100)
285+
.set_heartbeat(100)
286+
.set_debug_enabled(true)
280287
.build()
281288
.await
282289
.unwrap()
@@ -290,18 +297,20 @@ mod tests {
290297
.set_language_version("test_language_version")
291298
.set_tracer_version("test_tracer_version")
292299
.set_url("http://localhost")
293-
.set_hearbeat(30);
300+
.set_debug_enabled(true)
301+
.set_heartbeat(30);
294302

295303
assert_eq!(&builder.service_name.unwrap(), "test_service");
296304
assert_eq!(&builder.language.unwrap(), "test_language");
297305
assert_eq!(&builder.language_version.unwrap(), "test_language_version");
298306
assert_eq!(&builder.tracer_version.unwrap(), "test_tracer_version");
307+
assert!(builder.config.debug_enabled);
299308
assert_eq!(
300309
<String as AsRef<str>>::as_ref(&builder.config.endpoint.unwrap().url.to_string()),
301310
"http://localhost/telemetry/proxy/api/v2/apmtelemetry"
302311
);
303312
assert_eq!(
304-
builder.config.telemetry_hearbeat_interval,
313+
builder.config.telemetry_heartbeat_interval,
305314
Duration::from_millis(30)
306315
);
307316
}
@@ -660,7 +669,7 @@ mod tests {
660669
.set_language_version("test_language_version")
661670
.set_tracer_version("test_tracer_version")
662671
.set_url(&server.url("/"))
663-
.set_hearbeat(100)
672+
.set_heartbeat(100)
664673
.set_runtime_id("foo")
665674
.build()
666675
.await;

data-pipeline/src/trace_exporter/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ const DEFAULT_AGENT_URL: &str = "http://127.0.0.1:8126";
779779
pub struct TelemetryConfig {
780780
pub heartbeat: u64,
781781
pub runtime_id: Option<String>,
782+
pub debug_enabled: bool,
782783
}
783784

784785
#[allow(missing_docs)]
@@ -1020,8 +1021,9 @@ impl TraceExporterBuilder {
10201021
.set_language_version(&self.language_version)
10211022
.set_service_name(&self.service)
10221023
.set_tracer_version(&self.tracer_version)
1023-
.set_hearbeat(telemetry_config.heartbeat)
1024-
.set_url(base_url);
1024+
.set_heartbeat(telemetry_config.heartbeat)
1025+
.set_url(base_url)
1026+
.set_debug_enabled(telemetry_config.debug_enabled);
10251027
if let Some(id) = telemetry_config.runtime_id {
10261028
builder = builder.set_runtime_id(&id);
10271029
}
@@ -1124,6 +1126,7 @@ mod tests {
11241126
.enable_telemetry(Some(TelemetryConfig {
11251127
heartbeat: 1000,
11261128
runtime_id: None,
1129+
debug_enabled: false,
11271130
}));
11281131
let exporter = builder.build().unwrap();
11291132

ddtelemetry/examples/tm-metrics-worker-test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn main() -> Result<(), Box<dyn Error>> {
3636
builder.config.endpoint = Some(ddcommon::Endpoint::from_slice(
3737
"file://./tm-metrics-worker-test.output",
3838
));
39-
builder.config.telemetry_hearbeat_interval = Some(Duration::from_secs(1));
39+
builder.config.telemetry_heartbeat_interval = Some(Duration::from_secs(1));
4040

4141
let handle = builder.run_metrics_logs()?;
4242

ddtelemetry/examples/tm-send-sketch.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ pub async fn push_telemetry(config: &Config, telemetry: &Telemetry<'_>) -> anyho
4545
let req = request_builder(config)?
4646
.method(http::Method::POST)
4747
.header(CONTENT_TYPE, ddcommon::header::APPLICATION_JSON)
48-
.header("dd-telemetry-debug-enabled", "true")
4948
.body(serde_json::to_string(telemetry)?.into())?;
5049

5150
let resp = client.request(req).await?;
@@ -116,5 +115,6 @@ async fn async_main() {
116115
api_key: Some(Cow::Owned(std::env::var("DD_API_KEY").unwrap())),
117116
..Default::default()
118117
});
118+
config.debug_enabled = true;
119119
push_telemetry(&config, &req).await.unwrap();
120120
}

ddtelemetry/examples/tm-worker-test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ fn main() -> Result<(), Box<dyn Error>> {
4040
url: ddcommon::parse_uri("file://./tm-worker-test.output").unwrap(),
4141
..Default::default()
4242
});
43-
builder.config.telemetry_hearbeat_interval = Some(Duration::from_secs(1));
43+
builder.config.telemetry_heartbeat_interval = Some(Duration::from_secs(1));
4444

4545
let handle = builder.run()?;
4646

ddtelemetry/src/config.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ pub struct Config {
3131
pub endpoint: Option<Endpoint>,
3232
/// Enables debug logging
3333
pub telemetry_debug_logging_enabled: bool,
34-
pub telemetry_hearbeat_interval: Duration,
34+
pub telemetry_heartbeat_interval: Duration,
3535
pub direct_submission_enabled: bool,
3636
/// Prevents LifecycleAction::Stop from terminating the worker (except if the WorkerHandle is
3737
/// dropped)
3838
pub restartable: bool,
39+
40+
pub debug_enabled: bool,
3941
}
4042

4143
fn endpoint_with_telemetry_path(
@@ -161,9 +163,10 @@ impl Default for Config {
161163
Self {
162164
endpoint: None,
163165
telemetry_debug_logging_enabled: false,
164-
telemetry_hearbeat_interval: Duration::from_secs(60),
166+
telemetry_heartbeat_interval: Duration::from_secs(60),
165167
direct_submission_enabled: false,
166168
restartable: false,
169+
debug_enabled: false,
167170
}
168171
}
169172
}
@@ -233,9 +236,10 @@ impl Config {
233236
let mut this = Self {
234237
endpoint: None,
235238
telemetry_debug_logging_enabled: settings.shared_lib_debug,
236-
telemetry_hearbeat_interval: settings.telemetry_heartbeat_interval,
239+
telemetry_heartbeat_interval: settings.telemetry_heartbeat_interval,
237240
direct_submission_enabled: settings.direct_submission_enabled,
238241
restartable: false,
242+
debug_enabled: false,
239243
};
240244
if let Ok(url) = parse_uri(&trace_agent_url) {
241245
let _res = this.set_endpoint(Endpoint {

ddtelemetry/src/worker/builder.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use ddcommon::Endpoint;
1010
pub struct ConfigBuilder {
1111
pub endpoint: Option<Endpoint>,
1212
pub telemetry_debug_logging_enabled: Option<bool>,
13-
pub telemetry_hearbeat_interval: Option<Duration>,
13+
pub telemetry_heartbeat_interval: Option<Duration>,
1414
}
1515

1616
impl ConfigBuilder {
@@ -20,11 +20,12 @@ impl ConfigBuilder {
2020
telemetry_debug_logging_enabled: self
2121
.telemetry_debug_logging_enabled
2222
.unwrap_or(other.telemetry_debug_logging_enabled),
23-
telemetry_hearbeat_interval: self
24-
.telemetry_hearbeat_interval
25-
.unwrap_or(other.telemetry_hearbeat_interval),
23+
telemetry_heartbeat_interval: self
24+
.telemetry_heartbeat_interval
25+
.unwrap_or(other.telemetry_heartbeat_interval),
2626
direct_submission_enabled: other.direct_submission_enabled,
2727
restartable: other.restartable,
28+
debug_enabled: false,
2829
}
2930
}
3031
}
@@ -38,7 +39,7 @@ mod tests {
3839
let builder = ConfigBuilder {
3940
telemetry_debug_logging_enabled: Some(true),
4041
endpoint: None,
41-
telemetry_hearbeat_interval: None,
42+
telemetry_heartbeat_interval: None,
4243
};
4344

4445
let merged = builder.merge(Config::default());

ddtelemetry/src/worker/http_client.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ pub mod header {
2020
pub const API_VERSION: HeaderName = HeaderName::from_static("dd-telemetry-api-version");
2121
pub const LIBRARY_LANGUAGE: HeaderName = HeaderName::from_static("dd-client-library-language");
2222
pub const LIBRARY_VERSION: HeaderName = HeaderName::from_static("dd-client-library-version");
23+
24+
/// Header key for whether to enable debug mode of telemetry.
25+
pub const DEBUG_ENABLED: HeaderName = HeaderName::from_static("dd-telemetry-debug-enabled");
2326
}
2427

2528
pub type ResponseFuture =
@@ -31,7 +34,14 @@ pub trait HttpClient {
3134

3235
pub fn request_builder(c: &Config) -> anyhow::Result<HttpRequestBuilder> {
3336
match &c.endpoint {
34-
Some(e) => e.to_request_builder(concat!("telemetry/", env!("CARGO_PKG_VERSION"))),
37+
Some(e) => {
38+
let mut builder =
39+
e.to_request_builder(concat!("telemetry/", env!("CARGO_PKG_VERSION")));
40+
if c.debug_enabled {
41+
builder = Ok(builder?.header(header::DEBUG_ENABLED, "true"))
42+
}
43+
builder
44+
}
3545
None => Err(anyhow::Error::msg(
3646
"no valid endpoint found, can't build the request".to_string(),
3747
)),

ddtelemetry/src/worker/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -975,7 +975,7 @@ impl TelemetryWorkerBuilder {
975975
let contexts = MetricContexts::default();
976976
let token = CancellationToken::new();
977977
let config = self.config.merge(external_config);
978-
let telemetry_hearbeat_interval = config.telemetry_hearbeat_interval;
978+
let telemetry_heartbeat_interval = config.telemetry_heartbeat_interval;
979979
let client = http_client::from_config(&config);
980980

981981
#[allow(clippy::unwrap_used)]
@@ -1003,7 +1003,7 @@ impl TelemetryWorkerBuilder {
10031003
MetricBuckets::METRICS_FLUSH_INTERVAL,
10041004
LifecycleAction::FlushMetricAggr,
10051005
),
1006-
(telemetry_hearbeat_interval, LifecycleAction::FlushData),
1006+
(telemetry_heartbeat_interval, LifecycleAction::FlushData),
10071007
(
10081008
time::Duration::from_secs(60 * 60 * 24),
10091009
LifecycleAction::ExtendedHeartbeat,

0 commit comments

Comments
 (0)