From 38545537ec5b6cbf60a5d6308a8b59299182854e Mon Sep 17 00:00:00 2001 From: Louis Tricot Date: Mon, 19 Jan 2026 15:17:56 +0100 Subject: [PATCH 1/2] add process_tags to Application in telemetry --- datadog-sidecar-ffi/src/lib.rs | 18 +++++++++++++++ datadog-sidecar-ffi/tests/sidecar.rs | 2 ++ datadog-sidecar/src/service/blocking.rs | 22 +++++++++++++++++++ datadog-sidecar/src/service/mod.rs | 1 + datadog-sidecar/src/service/session_info.rs | 2 ++ .../src/service/sidecar_interface.rs | 8 +++++++ datadog-sidecar/src/service/sidecar_server.rs | 17 ++++++++++++++ datadog-sidecar/src/service/telemetry.rs | 7 ++++++ libdd-telemetry/src/data/common.rs | 2 ++ 9 files changed, 79 insertions(+) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index d683e9df0b..4e555b42a3 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -559,6 +559,7 @@ pub unsafe extern "C" fn ddog_sidecar_session_set_config( remote_config_capabilities_count: usize, remote_config_enabled: bool, is_fork: bool, + process_tags: ffi::CharSlice ) -> MaybeError { #[cfg(unix)] let remote_config_notify_target = libc::getpid(); @@ -602,6 +603,7 @@ pub unsafe extern "C" fn ddog_sidecar_session_set_config( .as_slice() .to_vec(), remote_config_enabled, + process_tags: process_tags.to_utf8_lossy().into(), }, is_fork )); @@ -609,6 +611,22 @@ pub unsafe extern "C" fn ddog_sidecar_session_set_config( MaybeError::None } +/// Updates the process_tags for an existing session. +#[no_mangle] +pub unsafe extern "C" fn ddog_sidecar_session_set_process_tags( + transport: &mut Box, + session_id: ffi::CharSlice, + process_tags: ffi::CharSlice +) -> MaybeError { + try_c!(blocking::set_session_process_tags( + transport, + session_id.to_utf8_lossy().into(), + process_tags.to_utf8_lossy().into(), + )); + + MaybeError::None +} + #[repr(C)] pub struct TracerHeaderTags<'a> { pub lang: ffi::CharSlice<'a>, diff --git a/datadog-sidecar-ffi/tests/sidecar.rs b/datadog-sidecar-ffi/tests/sidecar.rs index 9008724a5e..4a564d9122 100644 --- a/datadog-sidecar-ffi/tests/sidecar.rs +++ b/datadog-sidecar-ffi/tests/sidecar.rs @@ -112,6 +112,7 @@ fn test_ddog_sidecar_register_app() { 0, false, false, + "".into(), ) .unwrap_none(); @@ -162,6 +163,7 @@ fn test_ddog_sidecar_register_app() { 0, false, false, + "".into(), ) .unwrap_none(); diff --git a/datadog-sidecar/src/service/blocking.rs b/datadog-sidecar/src/service/blocking.rs index 1b43daffe9..b290f40e64 100644 --- a/datadog-sidecar/src/service/blocking.rs +++ b/datadog-sidecar/src/service/blocking.rs @@ -243,6 +243,28 @@ pub fn set_session_config( }) } +/// Updates the process tags for an existing session. +/// +/// # Arguments +/// +/// * `transport` - The transport used for communication. +/// * `session_id` - The ID of the session. +/// * `process_tags` - The process tags string to set. +/// +/// # Returns +/// +/// An `io::Result<()>` indicating the result of the operation. +pub fn set_session_process_tags( + transport: &mut SidecarTransport, + session_id: String, + process_tags: String, +) -> io::Result<()> { + transport.send(SidecarInterfaceRequest::SetSessionProcessTags { + session_id, + process_tags, + }) +} + /// Sends a trace as bytes. /// /// # Arguments diff --git a/datadog-sidecar/src/service/mod.rs b/datadog-sidecar/src/service/mod.rs index b8d4370963..032eaaf80d 100644 --- a/datadog-sidecar/src/service/mod.rs +++ b/datadog-sidecar/src/service/mod.rs @@ -64,6 +64,7 @@ pub struct SessionConfig { pub remote_config_products: Vec, pub remote_config_capabilities: Vec, pub remote_config_enabled: bool, + pub process_tags: String, } #[derive(Debug, Deserialize, Serialize)] diff --git a/datadog-sidecar/src/service/session_info.rs b/datadog-sidecar/src/service/session_info.rs index 6ae0c1d0ce..14556deab5 100644 --- a/datadog-sidecar/src/service/session_info.rs +++ b/datadog-sidecar/src/service/session_info.rs @@ -43,6 +43,7 @@ pub(crate) struct SessionInfo { pub(crate) session_id: String, pub(crate) pid: Arc, pub(crate) remote_config_enabled: Arc>, + pub(crate) process_tags: Arc>> } impl Clone for SessionInfo { @@ -62,6 +63,7 @@ impl Clone for SessionInfo { session_id: self.session_id.clone(), pid: self.pid.clone(), remote_config_enabled: self.remote_config_enabled.clone(), + process_tags: self.process_tags.clone() } } } diff --git a/datadog-sidecar/src/service/sidecar_interface.rs b/datadog-sidecar/src/service/sidecar_interface.rs index 84ec58558e..307152b087 100644 --- a/datadog-sidecar/src/service/sidecar_interface.rs +++ b/datadog-sidecar/src/service/sidecar_interface.rs @@ -67,6 +67,14 @@ pub trait SidecarInterface { is_fork: bool, ); + /// Updates the process tags for an existing session. + /// + /// # Arguments + /// + /// * `session_id` - The ID of the session. + /// * `process_tags` - The process tags string. + async fn set_session_process_tags(session_id: String, process_tags: String); + /// Shuts down a runtime. /// /// # Arguments diff --git a/datadog-sidecar/src/service/sidecar_server.rs b/datadog-sidecar/src/service/sidecar_server.rs index fdc914972b..cc751b72f1 100644 --- a/datadog-sidecar/src/service/sidecar_server.rs +++ b/datadog-sidecar/src/service/sidecar_server.rs @@ -421,6 +421,8 @@ impl SidecarInterface for SidecarServer { .unwrap_or("unknown-service"); let env = entry.get().env.as_deref().unwrap_or("none"); + let process_tags = session.process_tags.lock_or_panic().clone(); + // Lock telemetry client let telemetry_mutex = self.telemetry_clients.get_or_create( service, @@ -438,6 +440,7 @@ impl SidecarInterface for SidecarServer { Config::default() }) }, + process_tags, ); let mut telemetry = telemetry_mutex.lock_or_panic(); @@ -560,6 +563,7 @@ impl SidecarInterface for SidecarServer { *session.remote_config_notify_function.lock().unwrap() = remote_config_notify_function; } *session.remote_config_enabled.lock_or_panic() = config.remote_config_enabled; + *session.process_tags.lock_or_panic() = (!config.process_tags.is_empty()).then_some(config.process_tags.clone()); session.modify_telemetry_config(|cfg| { cfg.telemetry_heartbeat_interval = config.telemetry_heartbeat_interval; let endpoint = get_product_endpoint( @@ -653,6 +657,19 @@ impl SidecarInterface for SidecarServer { }) } + type SetSessionProcessTagsFut = NoResponse; + + fn set_session_process_tags( + self, + _: Context, + session_id: String, + process_tags: String, + ) -> Self::SetSessionProcessTagsFut { + let session = self.get_session(&session_id); + *session.process_tags.lock_or_panic() = (!process_tags.is_empty()).then_some(process_tags); + no_response() + } + type ShutdownRuntimeFut = NoResponse; fn shutdown_runtime(self, _: Context, instance_id: InstanceId) -> Self::ShutdownRuntimeFut { diff --git a/datadog-sidecar/src/service/telemetry.rs b/datadog-sidecar/src/service/telemetry.rs index 2e7814d53c..9de58b8960 100644 --- a/datadog-sidecar/src/service/telemetry.rs +++ b/datadog-sidecar/src/service/telemetry.rs @@ -76,6 +76,7 @@ impl TelemetryCachedClient { instance_id: &InstanceId, runtime_meta: &RuntimeMetadata, get_config: impl FnOnce() -> libdd_telemetry::config::Config, + process_tags: Option, ) -> Self { let mut builder = TelemetryWorkerBuilder::new_fetch_host( service.to_string(), @@ -86,6 +87,7 @@ impl TelemetryCachedClient { builder.runtime_id = Some(instance_id.runtime_id.clone()); builder.application.env = Some(env.to_string()); + builder.application.process_tags = process_tags; let config = get_config(); builder.config = config.clone(); @@ -289,6 +291,7 @@ impl TelemetryCachedClientSet { instance_id: &InstanceId, runtime_meta: &RuntimeMetadata, get_config: F, + process_tags: Option, ) -> Arc> where F: FnOnce() -> libdd_telemetry::config::Config, @@ -321,6 +324,7 @@ impl TelemetryCachedClientSet { instance_id, runtime_meta, get_config, + process_tags, ))), }; @@ -466,6 +470,8 @@ fn get_telemetry_client( }) }; + let process_tags = session.process_tags.lock_or_panic().clone(); + TelemetryCachedClientSet::get_or_create( &sidecar.telemetry_clients, service_name, @@ -473,5 +479,6 @@ fn get_telemetry_client( instance_id, &runtime_meta, get_config, + process_tags, ) } diff --git a/libdd-telemetry/src/data/common.rs b/libdd-telemetry/src/data/common.rs index 032e4e1c48..b2da3fe608 100644 --- a/libdd-telemetry/src/data/common.rs +++ b/libdd-telemetry/src/data/common.rs @@ -52,6 +52,8 @@ pub struct Application { pub runtime_version: Option, #[serde(skip_serializing_if = "Option::is_none")] pub runtime_patches: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub process_tags: Option, } #[derive(Serialize, Deserialize, Default, Debug)] From 3b283c55767d3cdb66de35b836e5554ccaea9032 Mon Sep 17 00:00:00 2001 From: Louis Tricot Date: Tue, 20 Jan 2026 11:01:45 +0100 Subject: [PATCH 2/2] fix ci --- datadog-sidecar-ffi/src/lib.rs | 5 +++-- datadog-sidecar/src/service/session_info.rs | 4 ++-- datadog-sidecar/src/service/sidecar_server.rs | 3 ++- libdd-telemetry/examples/tm-ping.rs | 1 + libdd-telemetry/examples/tm-send-sketch.rs | 1 + 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 4e555b42a3..7788e06fec 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -559,7 +559,7 @@ pub unsafe extern "C" fn ddog_sidecar_session_set_config( remote_config_capabilities_count: usize, remote_config_enabled: bool, is_fork: bool, - process_tags: ffi::CharSlice + process_tags: ffi::CharSlice, ) -> MaybeError { #[cfg(unix)] let remote_config_notify_target = libc::getpid(); @@ -613,10 +613,11 @@ pub unsafe extern "C" fn ddog_sidecar_session_set_config( /// Updates the process_tags for an existing session. #[no_mangle] +#[allow(clippy::missing_safety_doc)] pub unsafe extern "C" fn ddog_sidecar_session_set_process_tags( transport: &mut Box, session_id: ffi::CharSlice, - process_tags: ffi::CharSlice + process_tags: ffi::CharSlice, ) -> MaybeError { try_c!(blocking::set_session_process_tags( transport, diff --git a/datadog-sidecar/src/service/session_info.rs b/datadog-sidecar/src/service/session_info.rs index 14556deab5..a966c9ab76 100644 --- a/datadog-sidecar/src/service/session_info.rs +++ b/datadog-sidecar/src/service/session_info.rs @@ -43,7 +43,7 @@ pub(crate) struct SessionInfo { pub(crate) session_id: String, pub(crate) pid: Arc, pub(crate) remote_config_enabled: Arc>, - pub(crate) process_tags: Arc>> + pub(crate) process_tags: Arc>>, } impl Clone for SessionInfo { @@ -63,7 +63,7 @@ impl Clone for SessionInfo { session_id: self.session_id.clone(), pid: self.pid.clone(), remote_config_enabled: self.remote_config_enabled.clone(), - process_tags: self.process_tags.clone() + process_tags: self.process_tags.clone(), } } } diff --git a/datadog-sidecar/src/service/sidecar_server.rs b/datadog-sidecar/src/service/sidecar_server.rs index cc751b72f1..fa2da2e34b 100644 --- a/datadog-sidecar/src/service/sidecar_server.rs +++ b/datadog-sidecar/src/service/sidecar_server.rs @@ -563,7 +563,8 @@ impl SidecarInterface for SidecarServer { *session.remote_config_notify_function.lock().unwrap() = remote_config_notify_function; } *session.remote_config_enabled.lock_or_panic() = config.remote_config_enabled; - *session.process_tags.lock_or_panic() = (!config.process_tags.is_empty()).then_some(config.process_tags.clone()); + *session.process_tags.lock_or_panic() = + (!config.process_tags.is_empty()).then_some(config.process_tags.clone()); session.modify_telemetry_config(|cfg| { cfg.telemetry_heartbeat_interval = config.telemetry_heartbeat_interval; let endpoint = get_product_endpoint( diff --git a/libdd-telemetry/examples/tm-ping.rs b/libdd-telemetry/examples/tm-ping.rs index e008ee04e8..0a7d3ad17f 100644 --- a/libdd-telemetry/examples/tm-ping.rs +++ b/libdd-telemetry/examples/tm-ping.rs @@ -75,6 +75,7 @@ async fn main() -> Result<(), Box> { runtime_name: None, runtime_version: None, runtime_patches: None, + process_tags: None, }; let host = build_host(); let payload = data::payload::Payload::AppStarted(build_app_started_payload()); diff --git a/libdd-telemetry/examples/tm-send-sketch.rs b/libdd-telemetry/examples/tm-send-sketch.rs index 1eae121834..043b6eacba 100644 --- a/libdd-telemetry/examples/tm-send-sketch.rs +++ b/libdd-telemetry/examples/tm-send-sketch.rs @@ -78,6 +78,7 @@ async fn async_main() { runtime_name: None, runtime_version: None, runtime_patches: None, + process_tags: None, }; let host = build_host();