Skip to content

Commit 69d9f02

Browse files
committed
chore: improve logging in telemetry crate
# Conflicts: # data-pipeline/Cargo.toml # data-pipeline/examples/send-traces-with-stats.rs # examples/ffi/README.md
1 parent 9052563 commit 69d9f02

File tree

12 files changed

+252
-46
lines changed

12 files changed

+252
-46
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

data-pipeline-ffi/src/trace_exporter.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use ddcommon_ffi::{
1111
{slice::AsBytes, slice::ByteSlice},
1212
};
1313
use std::{ptr::NonNull, time::Duration};
14-
use tracing::error;
14+
use tracing::{debug, error};
1515

1616
#[cfg(all(feature = "catch_panic", panic = "unwind"))]
1717
use std::panic::{catch_unwind, AssertUnwindSafe};
@@ -325,16 +325,16 @@ pub unsafe extern "C" fn ddog_trace_exporter_config_enable_telemetry(
325325
catch_panic!(
326326
if let Option::Some(config) = config {
327327
if let Option::Some(telemetry_cfg) = telemetry_cfg {
328-
config.telemetry_cfg = Some(TelemetryConfig {
328+
let cfg = TelemetryConfig {
329329
heartbeat: telemetry_cfg.interval,
330330
runtime_id: match sanitize_string(telemetry_cfg.runtime_id) {
331331
Ok(s) => Some(s),
332332
Err(e) => return Some(e),
333333
},
334334
debug_enabled: telemetry_cfg.debug_enabled,
335-
})
336-
} else {
337-
config.telemetry_cfg = Some(TelemetryConfig::default());
335+
};
336+
debug!(telemetry_cfg = ?cfg, "Configuring telemetry");
337+
config.telemetry_cfg = Some(cfg);
338338
}
339339
None
340340
} else {
@@ -467,7 +467,7 @@ pub unsafe extern "C" fn ddog_trace_exporter_new(
467467
}
468468

469469
if let Some(cfg) = &config.telemetry_cfg {
470-
builder.enable_telemetry(Some(cfg.clone()));
470+
builder.enable_telemetry(cfg.clone());
471471
}
472472

473473
if let Some(token) = &config.test_session_token {

data-pipeline/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ harness = false
5151
path = "benches/main.rs"
5252

5353
[dev-dependencies]
54+
datadog-log = { path = "../datadog-log" }
55+
clap = { version = "4.0", features = ["derive"] }
5456
criterion = "0.5.1"
5557
datadog-trace-utils = { path = "../datadog-trace-utils", features = ["test-utils"] }
5658
httpmock = "0.7.0"

data-pipeline/examples/send-traces-with-stats.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright 2024-Present Datadog, Inc. https://www.datadoghq.com/
22
// SPDX-License-Identifier: Apache-2.0
33

4+
use clap::Parser;
5+
use data_pipeline::trace_exporter::{TelemetryConfig, TraceExporter, TraceExporterInputFormat, TraceExporterOutputFormat};
46
use data_pipeline::trace_exporter::{
57
TraceExporter, TraceExporterInputFormat, TraceExporterOutputFormat,
68
};
@@ -9,6 +11,7 @@ use std::{
911
collections::HashMap,
1012
time::{Duration, UNIX_EPOCH},
1113
};
14+
use datadog_log::logger::{logger_configure_std, logger_set_log_level, LogEventLevel, StdConfig, StdTarget};
1215

1316
fn get_span(now: i64, trace_id: u64, span_id: u64) -> pb::Span {
1417
pb::Span {
@@ -30,6 +33,14 @@ fn get_span(now: i64, trace_id: u64, span_id: u64) -> pb::Span {
3033
}
3134

3235
fn main() {
36+
logger_configure_std(StdConfig {
37+
target: StdTarget::Out
38+
}).expect("Failed to configure logger");
39+
logger_set_log_level(LogEventLevel::Debug)
40+
.expect("Failed to set log level");
41+
42+
let args = Args::parse();
43+
let telemetry_cfg = TelemetryConfig::default();
3344
let mut builder = TraceExporter::builder();
3445
builder
3546
.set_url("http://localhost:8126")
@@ -42,20 +53,27 @@ fn main() {
4253
.set_language_version(env!("CARGO_PKG_RUST_VERSION"))
4354
.set_input_format(TraceExporterInputFormat::V04)
4455
.set_output_format(TraceExporterOutputFormat::V04)
56+
.enable_telemetry(telemetry_cfg)
4557
.enable_stats(Duration::from_secs(10));
46-
let exporter = builder.build().unwrap();
47-
let now = UNIX_EPOCH.elapsed().unwrap().as_nanos() as i64;
58+
let exporter = builder.build()
59+
.expect("Failed to build TraceExporter");
60+
let now = UNIX_EPOCH.elapsed()
61+
.expect("Failed to get time since UNIX_EPOCH")
62+
.as_nanos() as i64;
4863

4964
let mut traces = Vec::new();
50-
for trace_id in 1..=100 {
65+
for trace_id in 1..=2 {
5166
let mut trace = Vec::new();
52-
for span_id in 1..=1000 {
67+
for span_id in 1..=2 {
5368
trace.push(get_span(now, trace_id, span_id));
5469
}
5570
traces.push(trace);
5671
}
57-
let data = rmp_serde::to_vec_named(&traces).unwrap();
72+
let data = rmp_serde::to_vec_named(&traces)
73+
.expect("Failed to serialize traces");
5874

59-
exporter.send(data.as_ref(), 100).unwrap();
60-
exporter.shutdown(None).unwrap();
75+
exporter.send(data.as_ref(), 2)
76+
.expect("Failed to send traces");
77+
exporter.shutdown(None)
78+
.expect("Failed to shutdown exporter");
6179
}

data-pipeline/src/trace_exporter/builder.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,8 @@ impl TraceExporterBuilder {
193193
}
194194

195195
/// Enables sending telemetry metrics.
196-
pub fn enable_telemetry(&mut self, cfg: Option<TelemetryConfig>) -> &mut Self {
197-
if let Some(cfg) = cfg {
198-
self.telemetry = Some(cfg);
199-
} else {
200-
self.telemetry = Some(TelemetryConfig::default());
201-
}
196+
pub fn enable_telemetry(&mut self, cfg: TelemetryConfig) -> &mut Self {
197+
self.telemetry = Some(cfg);
202198
self
203199
}
204200

ddtelemetry/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ license.workspace = true
1010
bench = false
1111

1212
[features]
13-
default = []
13+
default = ["tracing"]
1414
tracing = ["tracing/std"]
1515

1616
[dependencies]

ddtelemetry/src/config.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
use ddcommon::{config::parse_env, parse_uri, Endpoint};
55
use http::{uri::PathAndQuery, Uri};
66
use std::{borrow::Cow, time::Duration};
7+
use tracing::debug;
78

89
pub const DEFAULT_DD_SITE: &str = "datadoghq.com";
910
pub const PROD_INTAKE_SUBDOMAIN: &str = "instrumentation-telemetry-intake";
@@ -119,6 +120,10 @@ impl Settings {
119120
const _DD_SHARED_LIB_DEBUG: &'static str = "_DD_SHARED_LIB_DEBUG";
120121

121122
pub fn from_env() -> Self {
123+
debug!(
124+
config.source = "environment",
125+
"Loading telemetry settings from environment variables"
126+
);
122127
let default = Self::default();
123128
Self {
124129
agent_host: parse_env::str_not_empty(Self::DD_AGENT_HOST),

ddtelemetry/src/lib.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#![cfg_attr(not(test), deny(clippy::unimplemented))]
1111

1212
use ddcommon::entity_id;
13+
use tracing::debug;
1314

1415
pub mod config;
1516
pub mod data;
@@ -18,11 +19,24 @@ pub mod metrics;
1819
pub mod worker;
1920

2021
pub fn build_host() -> data::Host {
22+
debug!("Building telemetry host information");
23+
let hostname = info::os::real_hostname().unwrap_or_else(|_| String::from("unknown_hostname"));
24+
let container_id = entity_id::get_container_id().map(|f| f.to_string());
25+
let os_version = info::os::os_version().ok();
26+
27+
debug!(
28+
host.hostname = %hostname,
29+
host.container_id = ?container_id,
30+
host.os = info::os::os_name(),
31+
host.os_version = ?os_version,
32+
"Built telemetry host information"
33+
);
34+
2135
data::Host {
22-
hostname: info::os::real_hostname().unwrap_or_else(|_| String::from("unknown_hostname")),
23-
container_id: entity_id::get_container_id().map(|f| f.to_string()),
36+
hostname,
37+
container_id,
2438
os: Some(String::from(info::os::os_name())),
25-
os_version: info::os::os_version().ok(),
39+
os_version,
2640
kernel_name: None,
2741
kernel_release: None,
2842
kernel_version: None,

ddtelemetry/src/worker/http_client.rs

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use std::{
1212
};
1313

1414
use crate::config::Config;
15+
use tracing::{debug, error, info, warn};
1516

1617
pub mod header {
1718
#![allow(clippy::declare_interior_mutable_const)]
@@ -35,16 +36,29 @@ pub trait HttpClient {
3536
pub fn request_builder(c: &Config) -> anyhow::Result<HttpRequestBuilder> {
3637
match &c.endpoint {
3738
Some(e) => {
39+
debug!(
40+
endpoint.url = %e.url,
41+
endpoint.timeout_ms = e.timeout_ms,
42+
telemetry.version = env!("CARGO_PKG_VERSION"),
43+
"Building telemetry request"
44+
);
3845
let mut builder =
3946
e.to_request_builder(concat!("telemetry/", env!("CARGO_PKG_VERSION")));
4047
if c.debug_enabled {
48+
debug!(
49+
telemetry.debug_enabled = true,
50+
"Telemetry debug mode enabled"
51+
);
4152
builder = Ok(builder?.header(header::DEBUG_ENABLED, "true"))
4253
}
4354
builder
4455
}
45-
None => Err(anyhow::Error::msg(
46-
"no valid endpoint found, can't build the request".to_string(),
47-
)),
56+
None => {
57+
error!("No valid telemetry endpoint found, cannot build request");
58+
Err(anyhow::Error::msg(
59+
"no valid endpoint found, can't build the request".to_string(),
60+
))
61+
}
4862
}
4963
}
5064

@@ -54,6 +68,10 @@ pub fn from_config(c: &Config) -> Box<dyn HttpClient + Sync + Send> {
5468
#[allow(clippy::expect_used)]
5569
let file_path = ddcommon::decode_uri_path_in_authority(&e.url)
5670
.expect("file urls should always have been encoded in authority");
71+
info!(
72+
file.path = ?file_path,
73+
"Using file-based mock telemetry client"
74+
);
5775
return Box::new(MockClient {
5876
#[allow(clippy::expect_used)]
5977
file: Arc::new(Mutex::new(Box::new(
@@ -65,7 +83,19 @@ pub fn from_config(c: &Config) -> Box<dyn HttpClient + Sync + Send> {
6583
))),
6684
});
6785
}
68-
Some(_) | None => {}
86+
Some(e) => {
87+
info!(
88+
endpoint.url = %e.url,
89+
endpoint.timeout_ms = e.timeout_ms,
90+
"Using HTTP telemetry client"
91+
);
92+
}
93+
None => {
94+
warn!(
95+
endpoint = "default",
96+
"No telemetry endpoint configured, using default HTTP client"
97+
);
98+
}
6999
};
70100
Box::new(HyperClient {
71101
inner: hyper_migration::new_client_periodic(),
@@ -78,8 +108,28 @@ pub struct HyperClient {
78108

79109
impl HttpClient for HyperClient {
80110
fn request(&self, req: hyper_migration::HttpRequest) -> ResponseFuture {
111+
debug!(
112+
"Sending HTTP request via HyperClient"
113+
);
81114
let resp = self.inner.request(req);
82-
Box::pin(async { Ok(hyper_migration::into_response(resp.await?)) })
115+
Box::pin(async move {
116+
match resp.await {
117+
Ok(response) => {
118+
debug!(
119+
http.status = response.status().as_u16(),
120+
"HTTP request completed successfully"
121+
);
122+
Ok(hyper_migration::into_response(response))
123+
}
124+
Err(e) => {
125+
error!(
126+
error = %e,
127+
"HTTP request failed"
128+
);
129+
Err(e.into())
130+
}
131+
}
132+
})
83133
}
84134
}
85135

@@ -92,16 +142,35 @@ impl HttpClient for MockClient {
92142
fn request(&self, req: hyper_migration::HttpRequest) -> ResponseFuture {
93143
let s = self.clone();
94144
Box::pin(async move {
145+
debug!(
146+
"MockClient writing request to file"
147+
);
95148
let mut body = req.collect().await?.to_bytes().to_vec();
96149
body.push(b'\n');
97150

98151
{
99152
#[allow(clippy::expect_used)]
100153
let mut writer = s.file.lock().expect("mutex poisoned");
101154

102-
writer.write_all(body.as_ref())?;
155+
match writer.write_all(body.as_ref()) {
156+
Ok(()) => debug!(
157+
file.bytes_written = body.len(),
158+
"Successfully wrote payload to mock file"
159+
),
160+
Err(e) => {
161+
error!(
162+
error = %e,
163+
"Failed to write to mock file"
164+
);
165+
return Err(e.into());
166+
}
167+
}
103168
}
104169

170+
debug!(
171+
http.status = 202,
172+
"MockClient returning success response"
173+
);
105174
hyper_migration::empty_response(hyper::Response::builder().status(202))
106175
})
107176
}

0 commit comments

Comments
 (0)