Skip to content

Commit 9ec69fa

Browse files
committed
chore(telemetry): add session id support
1 parent a29b90b commit 9ec69fa

6 files changed

Lines changed: 373 additions & 4 deletions

File tree

libdd-telemetry-ffi/src/builder/expanded.rs

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,70 @@ mod macros {
245245
};
246246
ffi::MaybeError::None
247247
}
248+
#[no_mangle]
249+
pub unsafe extern "C" fn ddog_telemetry_builder_with_str_session_id(
250+
telemetry_builder: &mut TelemetryWorkerBuilder,
251+
param: ffi::CharSlice,
252+
) -> ffi::MaybeError {
253+
telemetry_builder.config.session_id = match (|s: ffi::CharSlice| -> Result<_, String> {
254+
Ok(Some(s.to_utf8_lossy().into_owned()))
255+
})(param)
256+
{
257+
Ok(o) => o,
258+
Err(e) => {
259+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
260+
({
261+
let res = std::fmt::format(format_args!("{e:?}"));
262+
res
263+
}),
264+
));
265+
}
266+
};
267+
ffi::MaybeError::None
268+
}
269+
#[no_mangle]
270+
pub unsafe extern "C" fn ddog_telemetry_builder_with_str_root_session_id(
271+
telemetry_builder: &mut TelemetryWorkerBuilder,
272+
param: ffi::CharSlice,
273+
) -> ffi::MaybeError {
274+
telemetry_builder.config.root_session_id = match (|s: ffi::CharSlice| -> Result<_, String> {
275+
Ok(Some(s.to_utf8_lossy().into_owned()))
276+
})(param)
277+
{
278+
Ok(o) => o,
279+
Err(e) => {
280+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
281+
({
282+
let res = std::fmt::format(format_args!("{e:?}"));
283+
res
284+
}),
285+
));
286+
}
287+
};
288+
ffi::MaybeError::None
289+
}
290+
#[no_mangle]
291+
pub unsafe extern "C" fn ddog_telemetry_builder_with_str_parent_session_id(
292+
telemetry_builder: &mut TelemetryWorkerBuilder,
293+
param: ffi::CharSlice,
294+
) -> ffi::MaybeError {
295+
telemetry_builder.config.parent_session_id =
296+
match (|s: ffi::CharSlice| -> Result<_, String> {
297+
Ok(Some(s.to_utf8_lossy().into_owned()))
298+
})(param)
299+
{
300+
Ok(o) => o,
301+
Err(e) => {
302+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
303+
({
304+
let res = std::fmt::format(format_args!("{e:?}"));
305+
res
306+
}),
307+
));
308+
}
309+
};
310+
ffi::MaybeError::None
311+
}
248312
#[repr(C)]
249313
#[allow(dead_code)]
250314
pub enum TelemetryWorkerBuilderStrProperty {
@@ -259,6 +323,9 @@ mod macros {
259323
HostKernelRelease,
260324
HostKernelVersion,
261325
RuntimeId,
326+
SessionId,
327+
RootSessionId,
328+
ParentSessionId,
262329
}
263330
#[no_mangle]
264331
/**
@@ -288,6 +355,12 @@ mod macros {
288355
289356
* runtime_id
290357
358+
* session_id
359+
360+
* root_session_id
361+
362+
* parent_session_id
363+
291364
*/
292365
pub unsafe extern "C" fn ddog_telemetry_builder_with_property_str(
293366
telemetry_builder: &mut TelemetryWorkerBuilder,
@@ -481,6 +554,57 @@ mod macros {
481554
}
482555
};
483556
}
557+
SessionId => {
558+
telemetry_builder.config.session_id =
559+
match (|s: ffi::CharSlice| -> Result<_, String> {
560+
Ok(Some(s.to_utf8_lossy().into_owned()))
561+
})(param)
562+
{
563+
Ok(o) => o,
564+
Err(e) => {
565+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
566+
({
567+
let res = std::fmt::format(format_args!("{e:?}"));
568+
res
569+
}),
570+
));
571+
}
572+
};
573+
}
574+
RootSessionId => {
575+
telemetry_builder.config.root_session_id =
576+
match (|s: ffi::CharSlice| -> Result<_, String> {
577+
Ok(Some(s.to_utf8_lossy().into_owned()))
578+
})(param)
579+
{
580+
Ok(o) => o,
581+
Err(e) => {
582+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
583+
({
584+
let res = std::fmt::format(format_args!("{e:?}"));
585+
res
586+
}),
587+
));
588+
}
589+
};
590+
}
591+
ParentSessionId => {
592+
telemetry_builder.config.parent_session_id =
593+
match (|s: ffi::CharSlice| -> Result<_, String> {
594+
Ok(Some(s.to_utf8_lossy().into_owned()))
595+
})(param)
596+
{
597+
Ok(o) => o,
598+
Err(e) => {
599+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
600+
({
601+
let res = std::fmt::format(format_args!("{e:?}"));
602+
res
603+
}),
604+
));
605+
}
606+
};
607+
}
484608
}
485609
ffi::MaybeError::None
486610
}
@@ -512,6 +636,12 @@ mod macros {
512636
513637
* runtime_id
514638
639+
* session_id
640+
641+
* root_session_id
642+
643+
* parent_session_id
644+
515645
*/
516646
pub unsafe extern "C" fn ddog_telemetry_builder_with_str_named_property(
517647
telemetry_builder: &mut TelemetryWorkerBuilder,
@@ -715,6 +845,57 @@ mod macros {
715845
}
716846
};
717847
}
848+
"session_id" => {
849+
telemetry_builder.config.session_id =
850+
match (|s: ffi::CharSlice| -> Result<_, String> {
851+
Ok(Some(s.to_utf8_lossy().into_owned()))
852+
})(param)
853+
{
854+
Ok(o) => o,
855+
Err(e) => {
856+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
857+
({
858+
let res = std::fmt::format(format_args!("{e:?}"));
859+
res
860+
}),
861+
));
862+
}
863+
};
864+
}
865+
"root_session_id" => {
866+
telemetry_builder.config.root_session_id =
867+
match (|s: ffi::CharSlice| -> Result<_, String> {
868+
Ok(Some(s.to_utf8_lossy().into_owned()))
869+
})(param)
870+
{
871+
Ok(o) => o,
872+
Err(e) => {
873+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
874+
({
875+
let res = std::fmt::format(format_args!("{e:?}"));
876+
res
877+
}),
878+
));
879+
}
880+
};
881+
}
882+
"parent_session_id" => {
883+
telemetry_builder.config.parent_session_id =
884+
match (|s: ffi::CharSlice| -> Result<_, String> {
885+
Ok(Some(s.to_utf8_lossy().into_owned()))
886+
})(param)
887+
{
888+
Ok(o) => o,
889+
Err(e) => {
890+
return ffi::MaybeError::Some(libdd_common_ffi::Error::from(
891+
({
892+
let res = std::fmt::format(format_args!("{e:?}"));
893+
res
894+
}),
895+
));
896+
}
897+
};
898+
}
718899
_ => return ffi::MaybeError::None,
719900
}
720901
ffi::MaybeError::None

libdd-telemetry-ffi/src/builder/macros.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ crate::c_setters!(
3636
host.kernel_release,
3737
host.kernel_version,
3838

39-
runtime_id
39+
runtime_id,
40+
session_id,
41+
root_session_id,
42+
parent_session_id,
4043
}
4144
);
4245

libdd-telemetry-ffi/src/lib.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,37 @@ mod tests {
200200
);
201201
assert_eq!(builder.runtime_id.as_deref(), Some("abcd"));
202202

203+
assert_eq!(
204+
ddog_telemetry_builder_with_property_str(
205+
&mut builder,
206+
TelemetryWorkerBuilderStrProperty::SessionId,
207+
ffi::CharSlice::from("sess-1")
208+
),
209+
MaybeError::None,
210+
);
211+
assert_eq!(builder.config.session_id.as_deref(), Some("sess-1"));
212+
assert_eq!(
213+
ddog_telemetry_builder_with_property_str(
214+
&mut builder,
215+
TelemetryWorkerBuilderStrProperty::RootSessionId,
216+
ffi::CharSlice::from("root-9")
217+
),
218+
MaybeError::None,
219+
);
220+
assert_eq!(builder.config.root_session_id.as_deref(), Some("root-9"));
221+
assert_eq!(
222+
ddog_telemetry_builder_with_property_str(
223+
&mut builder,
224+
TelemetryWorkerBuilderStrProperty::ParentSessionId,
225+
ffi::CharSlice::from("parent-2")
226+
),
227+
MaybeError::None,
228+
);
229+
assert_eq!(
230+
builder.config.parent_session_id.as_deref(),
231+
Some("parent-2")
232+
);
233+
203234
assert_eq!(
204235
ddog_telemetry_builder_with_property_str(
205236
&mut builder,

libdd-telemetry/src/config.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ pub struct Config {
3333
pub restartable: bool,
3434

3535
pub debug_enabled: bool,
36+
37+
#[serde(default)]
38+
pub session_id: Option<String>,
39+
#[serde(default)]
40+
pub root_session_id: Option<String>,
41+
#[serde(default)]
42+
pub parent_session_id: Option<String>,
3643
}
3744

3845
fn endpoint_with_telemetry_path(
@@ -166,6 +173,9 @@ impl Default for Config {
166173
direct_submission_enabled: false,
167174
restartable: false,
168175
debug_enabled: false,
176+
session_id: None,
177+
root_session_id: None,
178+
parent_session_id: None,
169179
}
170180
}
171181
}
@@ -249,6 +259,9 @@ impl Config {
249259
direct_submission_enabled: settings.direct_submission_enabled,
250260
restartable: false,
251261
debug_enabled: false,
262+
session_id: None,
263+
root_session_id: None,
264+
parent_session_id: None,
252265
};
253266
if let Ok(url) = parse_uri(&trace_agent_url) {
254267
let _res = this.set_endpoint(Endpoint {

libdd-telemetry/src/worker/http_client.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,36 @@ pub mod header {
2222
pub const LIBRARY_LANGUAGE: HeaderName = HeaderName::from_static("dd-client-library-language");
2323
pub const LIBRARY_VERSION: HeaderName = HeaderName::from_static("dd-client-library-version");
2424

25-
/// Header key for whether to enable debug mode of telemetry.
2625
pub const DEBUG_ENABLED: HeaderName = HeaderName::from_static("dd-telemetry-debug-enabled");
26+
27+
pub const DD_SESSION_ID: HeaderName = HeaderName::from_static("dd-session-id");
28+
pub const DD_ROOT_SESSION_ID: HeaderName = HeaderName::from_static("dd-root-session-id");
29+
pub const DD_PARENT_SESSION_ID: HeaderName = HeaderName::from_static("dd-parent-session-id");
30+
}
31+
32+
pub(crate) fn add_instrumentation_session_headers(
33+
mut builder: HttpRequestBuilder,
34+
session_id: Option<&str>,
35+
root_session_id: Option<&str>,
36+
parent_session_id: Option<&str>,
37+
) -> HttpRequestBuilder {
38+
let Some(s) = session_id.filter(|id| !id.is_empty()) else {
39+
return builder;
40+
};
41+
builder = builder.header(header::DD_SESSION_ID, s);
42+
if let Some(r) = root_session_id
43+
.filter(|r| !r.is_empty())
44+
.filter(|r| *r != s)
45+
{
46+
builder = builder.header(header::DD_ROOT_SESSION_ID, r);
47+
}
48+
if let Some(p) = parent_session_id
49+
.filter(|p| !p.is_empty())
50+
.filter(|p| *p != s)
51+
{
52+
builder = builder.header(header::DD_PARENT_SESSION_ID, p);
53+
}
54+
builder
2755
}
2856

2957
pub type ResponseFuture =

0 commit comments

Comments
 (0)