From d37979e7ad9cb319dc1c3a0bd4a155a4c6d90776 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 13 Aug 2025 12:40:41 +0200 Subject: [PATCH 01/32] Add new route types --- datadog-sidecar/src/service/mod.rs | 1 + ddtelemetry/src/data/payloads.rs | 61 ++++++++++++++++++++++++++++++ ddtelemetry/src/worker/mod.rs | 29 ++++++++++++-- 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/datadog-sidecar/src/service/mod.rs b/datadog-sidecar/src/service/mod.rs index 16b869db84..2592d91d1f 100644 --- a/datadog-sidecar/src/service/mod.rs +++ b/datadog-sidecar/src/service/mod.rs @@ -72,4 +72,5 @@ pub enum SidecarAction { AddTelemetryMetricPoint((String, f64, Vec)), PhpComposerTelemetryFile(PathBuf), ClearQueueId, + AddRoute(Route), } diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 3b7d9a9c28..1b7c40178b 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -95,3 +95,64 @@ pub enum LogLevel { Warn, Debug, } + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +pub struct EndpointsPayload { + pub is_first: Option, + pub endpoints: Vec, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] +#[serde(rename_all = "UPPERCASE")] +#[repr(C)] +pub enum Method { + Get, + Post, + Put, + Delete, + Patch, + Head, + Options, + Trace, + Connect, + Other, //This is specified as "*" in the OpenAPI spec +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] +#[serde(rename_all = "UPPERCASE")] +#[repr(C)] +pub enum Authentication { + Jwt, + Basic, + Oauth, + Oidc, + ApiKey, + Session, + Mtls, + Saml, + Ldap, + Form, + Other, +} + +#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct Endpoint { + #[serde(default)] + pub r#type: Option, + #[serde(default)] + pub method: Option, + #[serde(default)] + pub path: Option, + pub operation_name: String, + pub resource_name: String, + #[serde(default)] + pub request_body_type: Option>, + #[serde(default)] + pub response_body_type: Option>, + #[serde(default)] + pub response_code: Option>, + #[serde(default)] + pub authentication: Option>, + #[serde(default)] + pub metadata: Option, +} diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index 92173cad68..5a0b9cbe2d 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -7,7 +7,7 @@ pub mod store; use crate::{ config::Config, - data::{self, Application, Dependency, Host, Integration, Log, Payload, Telemetry}, + data::{self, Application, Dependency, Endpoint, Host, Integration, Log, Payload, Telemetry}, metrics::{ContextKey, MetricBuckets, MetricContexts}, }; use ddcommon::Endpoint; @@ -89,6 +89,7 @@ pub enum TelemetryActions { AddDependency(Dependency), AddIntegration(Integration), AddLog((LogIdentifier, Log)), + AddEndpoint(Endpoint), Lifecycle(LifecycleAction), #[serde(skip)] CollectStats(oneshot::Sender), @@ -120,6 +121,7 @@ struct TelemetryWorkerData { dependencies: store::Store, configurations: store::Store, integrations: store::Store, + endpoints: store::Store, logs: store::QueueHashMap, metric_contexts: MetricContexts, metric_buckets: MetricBuckets, @@ -216,6 +218,8 @@ pub struct TelemetryWorkerStats { pub configurations_unflushed: u32, pub integrations_stored: u32, pub integrations_unflushed: u32, + pub endpoints_stored: u32, + pub endpoints_unflushed: u32, pub logs: u32, pub metric_contexts: u32, pub metric_buckets: MetricBucketStats, @@ -232,6 +236,8 @@ impl Add for TelemetryWorkerStats { configurations_unflushed: self.configurations_unflushed + rhs.configurations_unflushed, integrations_stored: self.integrations_stored + rhs.integrations_stored, integrations_unflushed: self.integrations_unflushed + rhs.integrations_unflushed, + endpoints_stored: self.endpoints_stored + rhs.endpoints_stored, + endpoints_unflushed: self.endpoints_unflushed + rhs.endpoints_unflushed, logs: self.logs + rhs.logs, metric_contexts: self.metric_contexts + rhs.metric_contexts, metric_buckets: MetricBucketStats { @@ -350,7 +356,7 @@ impl TelemetryWorker { } } } - AddConfig(_) | AddDependency(_) | AddIntegration(_) | Lifecycle(ExtendedHeartbeat) => {} + AddConfig(_) | AddDependency(_) | AddIntegration(_) | AddEndpoint(_) | Lifecycle(ExtendedHeartbeat) => {} Lifecycle(Stop) => { if !self.data.started { return BREAK; @@ -407,6 +413,7 @@ impl TelemetryWorker { AddDependency(dep) => self.data.dependencies.insert(dep), AddIntegration(integration) => self.data.integrations.insert(integration), AddConfig(cfg) => self.data.configurations.insert(cfg), + AddEndpoint(endpoint) => self.data.endpoints.insert(endpoint), AddLog((identifier, log)) => { let (l, new) = self.data.logs.get_mut_or_insert(identifier, log); if !new { @@ -459,6 +466,7 @@ impl TelemetryWorker { self.data.dependencies.unflush_stored(); self.data.integrations.unflush_stored(); self.data.configurations.unflush_stored(); + self.data.endpoints.unflush_stored(); let app_started = data::Payload::AppStarted(self.build_app_started()); match self.send_payload(&app_started).await { @@ -551,6 +559,13 @@ impl TelemetryWorker { }, )) } + if self.data.endpoints.flush_not_empty() { + payloads.push(data::Payload::AppEndpointsChange( + data::AppEndpointsChange { + endpoints: self.data.endpoints.unflushed().cloned().collect(), + }, + )) + } payloads } @@ -653,6 +668,9 @@ impl TelemetryWorker { .data .configurations .removed_flushed(p.configuration.len()), + AppEndpointsChange(p) => { + self.data.endpoints.removed_flushed(p.endpoints.len()) + } MessageBatch(batch) => { for p in batch { self.payload_sent_success(p); @@ -802,6 +820,8 @@ impl TelemetryWorker { configurations_unflushed: self.data.configurations.len_unflushed() as u32, integrations_stored: self.data.integrations.len_stored() as u32, integrations_unflushed: self.data.integrations.len_unflushed() as u32, + endpoints_stored: self.data.endpoints.len_stored() as u32, + endpoints_unflushed: self.data.endpoints.len_unflushed() as u32, logs: self.data.logs.len() as u32, metric_contexts: self.data.metric_contexts.lock().len() as u32, metric_buckets: self.data.metric_buckets.stats(), @@ -995,7 +1015,7 @@ impl TelemetryWorkerHandle { } } -/// How many dependencies/integrations/configs we keep in memory at most +/// How many dependencies/integrations/configs/endpoints we keep in memory at most pub const MAX_ITEMS: usize = 5000; #[derive(Debug, Default, Clone, Copy)] @@ -1015,6 +1035,7 @@ pub struct TelemetryWorkerBuilder { pub dependencies: store::Store, pub integrations: store::Store, pub configurations: store::Store, + pub endpoints: store::Store, pub native_deps: bool, pub rust_shared_lib_deps: bool, pub config: Config, @@ -1065,6 +1086,7 @@ impl TelemetryWorkerBuilder { dependencies: store::Store::new(MAX_ITEMS), integrations: store::Store::new(MAX_ITEMS), configurations: store::Store::new(MAX_ITEMS), + endpoints: store::Store::new(MAX_ITEMS), native_deps: true, rust_shared_lib_deps: false, config: Config::default(), @@ -1095,6 +1117,7 @@ impl TelemetryWorkerBuilder { dependencies: self.dependencies, integrations: self.integrations, configurations: self.configurations, + endpoints: self.endpoints, logs: store::QueueHashMap::default(), metric_contexts: contexts.clone(), metric_buckets: MetricBuckets::default(), From 259212e9a274d03c4aef31692b732a11ab5cae55 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 13 Aug 2025 17:59:33 +0200 Subject: [PATCH 02/32] Fix errors --- datadog-sidecar/src/service/mod.rs | 2 +- ddtelemetry/src/data/payload.rs | 2 ++ ddtelemetry/src/data/payloads.rs | 5 +++++ ddtelemetry/src/worker/mod.rs | 15 +++++++-------- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/datadog-sidecar/src/service/mod.rs b/datadog-sidecar/src/service/mod.rs index 2592d91d1f..7f270220ff 100644 --- a/datadog-sidecar/src/service/mod.rs +++ b/datadog-sidecar/src/service/mod.rs @@ -72,5 +72,5 @@ pub enum SidecarAction { AddTelemetryMetricPoint((String, f64, Vec)), PhpComposerTelemetryFile(PathBuf), ClearQueueId, - AddRoute(Route), + AddEndpoint(ddtelemetry::data::Endpoint), } diff --git a/ddtelemetry/src/data/payload.rs b/ddtelemetry/src/data/payload.rs index d966008534..db49fa2774 100644 --- a/ddtelemetry/src/data/payload.rs +++ b/ddtelemetry/src/data/payload.rs @@ -12,6 +12,7 @@ pub enum Payload { AppDependenciesLoaded(AppDependenciesLoaded), AppIntegrationsChange(AppIntegrationsChange), AppClientConfigurationChange(AppClientConfigurationChange), + AppEndpointsChange(AppEndpointsChange), AppHeartbeat(#[serde(skip_serializing)] ()), AppClosing(#[serde(skip_serializing)] ()), GenerateMetrics(GenerateMetrics), @@ -29,6 +30,7 @@ impl Payload { AppDependenciesLoaded(_) => "app-dependencies-loaded", AppIntegrationsChange(_) => "app-integrations-change", AppClientConfigurationChange(_) => "app-client-configuration-change", + AppEndpointsChange(_) => "app-endpoints-change", AppHeartbeat(_) => "app-heartbeat", AppClosing(_) => "app-closing", GenerateMetrics(_) => "generate-metrics", diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 1b7c40178b..9b1e0bda6c 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -61,6 +61,11 @@ pub struct AppClientConfigurationChange { pub configuration: Vec, } +#[derive(Debug, Serialize)] +pub struct AppEndpointsChange { + pub endpoints: Vec, +} + #[derive(Serialize, Debug)] pub struct GenerateMetrics { pub series: Vec, diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index 5a0b9cbe2d..a1a44c3368 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -10,7 +10,6 @@ use crate::{ data::{self, Application, Dependency, Endpoint, Host, Integration, Log, Payload, Telemetry}, metrics::{ContextKey, MetricBuckets, MetricContexts}, }; -use ddcommon::Endpoint; use ddcommon::{hyper_migration, tag::Tag, worker::Worker}; use std::fmt::Debug; @@ -791,13 +790,13 @@ impl TelemetryWorker { ); Err(hyper_migration::Error::Other(anyhow::anyhow!("Request cancelled"))) }, - _ = tokio::time::sleep(time::Duration::from_millis(timeout_ms)) => { - debug!( - worker.runtime_id = %self.runtime_id, - http.timeout_ms = timeout_ms, - "Telemetry request timed out" - ); - Err(hyper_migration::Error::Other(anyhow::anyhow!("Request timed out"))) + _ = tokio::time::sleep(time::Duration::from_millis( + if let Some(endpoint) = self.config.endpoint.as_ref() { + endpoint.timeout_ms + } else { + ddcommon::Endpoint::DEFAULT_TIMEOUT + })) => { + Err(anyhow::anyhow!("Request timed out")) }, r = self.client.request(req) => { match r { From 5cb65375c4c921db2a7d79d6ac72cb3ea82a7c3a Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 14 Aug 2025 12:04:53 +0200 Subject: [PATCH 03/32] Add missing action --- datadog-sidecar/src/service/telemetry.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/datadog-sidecar/src/service/telemetry.rs b/datadog-sidecar/src/service/telemetry.rs index a0525bea0d..13ee4b4b7d 100644 --- a/datadog-sidecar/src/service/telemetry.rs +++ b/datadog-sidecar/src/service/telemetry.rs @@ -153,6 +153,9 @@ impl TelemetryCachedClient { SidecarAction::AddTelemetryMetricPoint(point) => { actions.push(self.to_telemetry_point(point)); } + SidecarAction::AddEndpoint(endpoint) => { + actions.push(TelemetryActions::AddEndpoint(endpoint)); + } SidecarAction::PhpComposerTelemetryFile(_) => {} // handled separately SidecarAction::ClearQueueId => {} // handled separately } From 70c4e7e3b26707e0b311e5c600b1802a4509cf50 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 21 Aug 2025 12:19:31 +0200 Subject: [PATCH 04/32] Type enums --- ddtelemetry/src/data/payloads.rs | 42 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 9b1e0bda6c..9ecc28b1f8 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -111,33 +111,33 @@ pub struct EndpointsPayload { #[serde(rename_all = "UPPERCASE")] #[repr(C)] pub enum Method { - Get, - Post, - Put, - Delete, - Patch, - Head, - Options, - Trace, - Connect, - Other, //This is specified as "*" in the OpenAPI spec + Get = 0, + Post = 1, + Put = 2, + Delete = 3, + Patch = 4, + Head = 5, + Options = 6, + Trace = 7, + Connect = 8, + Other = 9, //This is specified as "*" in the OpenAPI spec } #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] #[serde(rename_all = "UPPERCASE")] #[repr(C)] pub enum Authentication { - Jwt, - Basic, - Oauth, - Oidc, - ApiKey, - Session, - Mtls, - Saml, - Ldap, - Form, - Other, + Jwt = 0, + Basic = 1, + Oauth = 2, + Oidc = 3, + ApiKey = 4, + Session = 5, + Mtls = 6, + Saml = 7, + Ldap = 8, + Form = 9, + Other = 10, } #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] From b4c2d57466044df15c370a63344c801bd096d7b1 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 21 Aug 2025 12:49:08 +0200 Subject: [PATCH 05/32] Simplify structs --- ddtelemetry/src/data/payloads.rs | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 9ecc28b1f8..f198425028 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -123,22 +123,22 @@ pub enum Method { Other = 9, //This is specified as "*" in the OpenAPI spec } -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] -#[serde(rename_all = "UPPERCASE")] -#[repr(C)] -pub enum Authentication { - Jwt = 0, - Basic = 1, - Oauth = 2, - Oidc = 3, - ApiKey = 4, - Session = 5, - Mtls = 6, - Saml = 7, - Ldap = 8, - Form = 9, - Other = 10, -} +// #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] +// #[serde(rename_all = "UPPERCASE")] +// #[repr(C)] +// pub enum Authentication { +// Jwt = 0, +// Basic = 1, +// Oauth = 2, +// Oidc = 3, +// ApiKey = 4, +// Session = 5, +// Mtls = 6, +// Saml = 7, +// Ldap = 8, +// Form = 9, +// Other = 10, +// } #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Endpoint { @@ -150,14 +150,14 @@ pub struct Endpoint { pub path: Option, pub operation_name: String, pub resource_name: String, - #[serde(default)] - pub request_body_type: Option>, - #[serde(default)] - pub response_body_type: Option>, - #[serde(default)] - pub response_code: Option>, - #[serde(default)] - pub authentication: Option>, - #[serde(default)] - pub metadata: Option, + // #[serde(default)] + // pub request_body_type: Option>, + // #[serde(default)] + // pub response_body_type: Option>, + // #[serde(default)] + // pub response_code: Option>, + // #[serde(default)] + // pub authentication: Option>, + // #[serde(default)] + // pub metadata: Option, } From 27e0534ce2add5f894e5bc9934b8558c869e49d8 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 25 Aug 2025 15:25:50 +0200 Subject: [PATCH 06/32] wip --- datadog-sidecar-ffi/src/lib.rs | 29 +++++++++++++++++++ datadog-sidecar/src/service/mod.rs | 3 +- datadog-sidecar/src/service/sidecar_server.rs | 8 ++++- datadog-sidecar/src/service/telemetry.rs | 9 +++--- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index a48456b1ff..3e60485611 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -409,6 +409,35 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_enqueueConfig( MaybeError::None } +/// Reports an endpoint to the telemetry. +#[no_mangle] +#[allow(clippy::missing_safety_doc)] +pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( + transport: &mut Box, + instance_id: &InstanceId, + queue_id: &QueueId, + r#type: CharSlice, + method: ddtelemetry::data::Method, + path: CharSlice, + operation_name: CharSlice, + resource_name: CharSlice, +) { + let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { + r#type: Some(r#type.to_utf8_lossy().into_owned()), + method: Some(method), + path: Some(path.to_utf8_lossy().into_owned()), + operation_name: operation_name.to_utf8_lossy().into_owned(), + resource_name: resource_name.to_utf8_lossy().into_owned(), + }); + + try_c!(blocking::enqueue_actions( + transport, + instance_id, + queue_id, + vec![SidecarAction::Telemetry(endpoint)], + )); +} + /// Reports a dependency to the telemetry. #[no_mangle] #[allow(clippy::missing_safety_doc)] diff --git a/datadog-sidecar/src/service/mod.rs b/datadog-sidecar/src/service/mod.rs index 7f270220ff..bd080ab9bd 100644 --- a/datadog-sidecar/src/service/mod.rs +++ b/datadog-sidecar/src/service/mod.rs @@ -71,6 +71,5 @@ pub enum SidecarAction { RegisterTelemetryMetric(MetricContext), AddTelemetryMetricPoint((String, f64, Vec)), PhpComposerTelemetryFile(PathBuf), - ClearQueueId, - AddEndpoint(ddtelemetry::data::Endpoint), + ClearQueueId } diff --git a/datadog-sidecar/src/service/sidecar_server.rs b/datadog-sidecar/src/service/sidecar_server.rs index c95b1cf429..f2f1416f30 100644 --- a/datadog-sidecar/src/service/sidecar_server.rs +++ b/datadog-sidecar/src/service/sidecar_server.rs @@ -449,7 +449,13 @@ impl SidecarInterface for SidecarServer { } SidecarAction::ClearQueueId => { remove_entry = true; - } + }, + SidecarAction::Telemetry(TelemetryActions::AddEndpoint(ref endpoint)) => { + if telemetry.buffered_endpoints.insert(endpoint.clone()) { + buffered_info_changed = true; + actions_to_process.push(action); + } + }, SidecarAction::Telemetry(TelemetryActions::Lifecycle( LifecycleAction::Stop, )) => { diff --git a/datadog-sidecar/src/service/telemetry.rs b/datadog-sidecar/src/service/telemetry.rs index 13ee4b4b7d..3ddbd5bf2d 100644 --- a/datadog-sidecar/src/service/telemetry.rs +++ b/datadog-sidecar/src/service/telemetry.rs @@ -65,8 +65,9 @@ pub struct TelemetryCachedClient { pub config_sent: bool, pub buffered_integrations: HashSet, pub buffered_composer_paths: HashSet, - pub telemetry_metrics: HashMap, - pub handle: Option>, + pub buffered_endpoints: HashSet, + pub telemetry_metrics: Arc>>, + pub handle: Arc>>>, } impl TelemetryCachedClient { @@ -101,6 +102,7 @@ impl TelemetryCachedClient { config_sent: false, buffered_integrations: HashSet::new(), buffered_composer_paths: HashSet::new(), + buffered_endpoints: HashSet::new(), telemetry_metrics: Default::default(), handle: None, } @@ -153,9 +155,6 @@ impl TelemetryCachedClient { SidecarAction::AddTelemetryMetricPoint(point) => { actions.push(self.to_telemetry_point(point)); } - SidecarAction::AddEndpoint(endpoint) => { - actions.push(TelemetryActions::AddEndpoint(endpoint)); - } SidecarAction::PhpComposerTelemetryFile(_) => {} // handled separately SidecarAction::ClearQueueId => {} // handled separately } From 7da8e324b2738d3e9f5bc0aa6d238a56e3c6052b Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 25 Aug 2025 15:40:34 +0200 Subject: [PATCH 07/32] wip --- datadog-sidecar/src/service/mod.rs | 2 +- datadog-sidecar/src/service/telemetry.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/datadog-sidecar/src/service/mod.rs b/datadog-sidecar/src/service/mod.rs index bd080ab9bd..16b869db84 100644 --- a/datadog-sidecar/src/service/mod.rs +++ b/datadog-sidecar/src/service/mod.rs @@ -71,5 +71,5 @@ pub enum SidecarAction { RegisterTelemetryMetric(MetricContext), AddTelemetryMetricPoint((String, f64, Vec)), PhpComposerTelemetryFile(PathBuf), - ClearQueueId + ClearQueueId, } diff --git a/datadog-sidecar/src/service/telemetry.rs b/datadog-sidecar/src/service/telemetry.rs index 3ddbd5bf2d..189534d854 100644 --- a/datadog-sidecar/src/service/telemetry.rs +++ b/datadog-sidecar/src/service/telemetry.rs @@ -113,6 +113,7 @@ impl TelemetryCachedClient { &self.config_sent, &self.buffered_integrations, &self.buffered_composer_paths, + &self.buffered_endpoints, )) { self.shm_writer.write(&buf); } else { From becf9e4d735e07634d10553f29dc98be80dbd49a Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 25 Aug 2025 16:30:58 +0200 Subject: [PATCH 08/32] Amend endpoints payload --- ddtelemetry/src/data/payloads.rs | 7 +------ ddtelemetry/src/worker/mod.rs | 1 + 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index f198425028..11b463a50a 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -63,6 +63,7 @@ pub struct AppClientConfigurationChange { #[derive(Debug, Serialize)] pub struct AppEndpointsChange { + pub is_first: bool, pub endpoints: Vec, } @@ -101,12 +102,6 @@ pub enum LogLevel { Debug, } -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] -pub struct EndpointsPayload { - pub is_first: Option, - pub endpoints: Vec, -} - #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] #[serde(rename_all = "UPPERCASE")] #[repr(C)] diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index a1a44c3368..eb2e9f3bb4 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -561,6 +561,7 @@ impl TelemetryWorker { if self.data.endpoints.flush_not_empty() { payloads.push(data::Payload::AppEndpointsChange( data::AppEndpointsChange { + is_first: true, endpoints: self.data.endpoints.unflushed().cloned().collect(), }, )) From a359ff95f46a274168ea4c32908bef0143ebbf23 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 25 Aug 2025 17:17:33 +0200 Subject: [PATCH 09/32] Fix return --- datadog-sidecar-ffi/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 3e60485611..e642bfe283 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -421,7 +421,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: CharSlice, operation_name: CharSlice, resource_name: CharSlice, -) { +) -> MaybeError { let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { r#type: Some(r#type.to_utf8_lossy().into_owned()), method: Some(method), @@ -436,6 +436,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( queue_id, vec![SidecarAction::Telemetry(endpoint)], )); + MaybeError::None } /// Reports a dependency to the telemetry. From 8a9ff912e3a0295a471721347e49b7b64315adef Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 26 Aug 2025 12:26:43 +0200 Subject: [PATCH 10/32] Avoid writing all endpoints to shared memory --- datadog-sidecar/src/service/sidecar_server.rs | 15 +++++++-------- datadog-sidecar/src/service/telemetry.rs | 6 +++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/datadog-sidecar/src/service/sidecar_server.rs b/datadog-sidecar/src/service/sidecar_server.rs index f2f1416f30..cf863bb035 100644 --- a/datadog-sidecar/src/service/sidecar_server.rs +++ b/datadog-sidecar/src/service/sidecar_server.rs @@ -28,7 +28,7 @@ use std::collections::{HashMap, HashSet}; use std::pin::Pin; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::{Arc, Mutex}; -use std::time::Duration; +use std::time::{Duration, SystemTime}; use tracing::{debug, error, info, trace, warn}; use futures::FutureExt; @@ -422,7 +422,7 @@ impl SidecarInterface for SidecarServer { ); let mut telemetry = telemetry_mutex.lock_or_panic(); - let mut actions_to_process = vec![]; + let mut actions_to_process: Vec = vec![]; let mut composer_paths_to_process = vec![]; let mut buffered_info_changed = false; let mut remove_entry = false; @@ -450,12 +450,11 @@ impl SidecarInterface for SidecarServer { SidecarAction::ClearQueueId => { remove_entry = true; }, - SidecarAction::Telemetry(TelemetryActions::AddEndpoint(ref endpoint)) => { - if telemetry.buffered_endpoints.insert(endpoint.clone()) { - buffered_info_changed = true; - actions_to_process.push(action); - } - }, + SidecarAction::Telemetry(TelemetryActions::AddEndpoint(_)) => { + telemetry.last_endpoints_push = SystemTime::now(); + buffered_info_changed = true; + actions_to_process.push(action); + } SidecarAction::Telemetry(TelemetryActions::Lifecycle( LifecycleAction::Stop, )) => { diff --git a/datadog-sidecar/src/service/telemetry.rs b/datadog-sidecar/src/service/telemetry.rs index 189534d854..8f58d5f1a8 100644 --- a/datadog-sidecar/src/service/telemetry.rs +++ b/datadog-sidecar/src/service/telemetry.rs @@ -65,7 +65,7 @@ pub struct TelemetryCachedClient { pub config_sent: bool, pub buffered_integrations: HashSet, pub buffered_composer_paths: HashSet, - pub buffered_endpoints: HashSet, + pub last_endpoints_push: SystemTime, pub telemetry_metrics: Arc>>, pub handle: Arc>>>, } @@ -102,7 +102,7 @@ impl TelemetryCachedClient { config_sent: false, buffered_integrations: HashSet::new(), buffered_composer_paths: HashSet::new(), - buffered_endpoints: HashSet::new(), + last_endpoints_push: SystemTime::UNIX_EPOCH, telemetry_metrics: Default::default(), handle: None, } @@ -113,7 +113,7 @@ impl TelemetryCachedClient { &self.config_sent, &self.buffered_integrations, &self.buffered_composer_paths, - &self.buffered_endpoints, + &self.last_endpoints_push, )) { self.shm_writer.write(&buf); } else { From 1fd27d5f6c8b70443310812b96899d5a2281188e Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 18 Sep 2025 14:37:57 +0200 Subject: [PATCH 11/32] Fix cloning too much for telemetry workers Turns out telemetry workers were cloning their whole contents, so when the HashSets and HashMaps were updated, the changes weren't persisted. Signed-off-by: Bob Weinand --- datadog-sidecar/src/service/telemetry.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog-sidecar/src/service/telemetry.rs b/datadog-sidecar/src/service/telemetry.rs index 8f58d5f1a8..d23cade42d 100644 --- a/datadog-sidecar/src/service/telemetry.rs +++ b/datadog-sidecar/src/service/telemetry.rs @@ -66,8 +66,8 @@ pub struct TelemetryCachedClient { pub buffered_integrations: HashSet, pub buffered_composer_paths: HashSet, pub last_endpoints_push: SystemTime, - pub telemetry_metrics: Arc>>, - pub handle: Arc>>>, + pub telemetry_metrics: HashMap, + pub handle: Option>, } impl TelemetryCachedClient { From e3cf9d0d97eafeba8794b5033e1128fd7e891d0d Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 23 Sep 2025 10:18:37 +0200 Subject: [PATCH 12/32] Add more fields to endpoints --- datadog-sidecar-ffi/src/lib.rs | 8 ++++++ ddtelemetry/src/data/payloads.rs | 48 ++++++++++++++++---------------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index e642bfe283..9fce4844e8 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -421,6 +421,10 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: CharSlice, operation_name: CharSlice, resource_name: CharSlice, + request_body_type: ffi::Vec, + response_body_type: ffi::Vec, + response_code: ffi::Vec, + authentication: ffi::Vec ) -> MaybeError { let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { r#type: Some(r#type.to_utf8_lossy().into_owned()), @@ -428,6 +432,10 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: Some(path.to_utf8_lossy().into_owned()), operation_name: operation_name.to_utf8_lossy().into_owned(), resource_name: resource_name.to_utf8_lossy().into_owned(), + request_body_type: Some(request_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + response_body_type: Some(response_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + response_code: Some(response_code.iter().cloned().collect()), + authentication: Some(authentication.iter().cloned().collect()), }); try_c!(blocking::enqueue_actions( diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 11b463a50a..b37e7fc443 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -118,22 +118,22 @@ pub enum Method { Other = 9, //This is specified as "*" in the OpenAPI spec } -// #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] -// #[serde(rename_all = "UPPERCASE")] -// #[repr(C)] -// pub enum Authentication { -// Jwt = 0, -// Basic = 1, -// Oauth = 2, -// Oidc = 3, -// ApiKey = 4, -// Session = 5, -// Mtls = 6, -// Saml = 7, -// Ldap = 8, -// Form = 9, -// Other = 10, -// } +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] +#[serde(rename_all = "UPPERCASE")] +#[repr(C)] +pub enum Authentication { + Jwt = 0, + Basic = 1, + Oauth = 2, + Oidc = 3, + ApiKey = 4, + Session = 5, + Mtls = 6, + Saml = 7, + Ldap = 8, + Form = 9, + Other = 10, +} #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Endpoint { @@ -145,14 +145,14 @@ pub struct Endpoint { pub path: Option, pub operation_name: String, pub resource_name: String, - // #[serde(default)] - // pub request_body_type: Option>, - // #[serde(default)] - // pub response_body_type: Option>, - // #[serde(default)] - // pub response_code: Option>, - // #[serde(default)] - // pub authentication: Option>, + #[serde(default)] + pub request_body_type: Option>, + #[serde(default)] + pub response_body_type: Option>, + #[serde(default)] + pub response_code: Option>, + #[serde(default)] + pub authentication: Option>, // #[serde(default)] // pub metadata: Option, } From 9f6801133ecef1403a456a98de9f8f953eb8d358 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 25 Sep 2025 12:00:14 +0200 Subject: [PATCH 13/32] Temp changes --- datadog-sidecar-ffi/src/lib.rs | 51 ++++++++++++++++++++------------ ddtelemetry/src/data/payloads.rs | 8 ++--- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 9fce4844e8..0f76ff1012 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -55,6 +55,9 @@ use std::ptr::NonNull; use std::slice; use std::sync::Arc; use std::time::Duration; +use std::fs::OpenOptions; +use std::io::Write; + #[no_mangle] #[cfg(target_os = "windows")] @@ -423,28 +426,38 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( resource_name: CharSlice, request_body_type: ffi::Vec, response_body_type: ffi::Vec, - response_code: ffi::Vec, - authentication: ffi::Vec + // response_code: ffi::Vec, + // authentication: ffi::Vec ) -> MaybeError { - let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { - r#type: Some(r#type.to_utf8_lossy().into_owned()), - method: Some(method), - path: Some(path.to_utf8_lossy().into_owned()), - operation_name: operation_name.to_utf8_lossy().into_owned(), - resource_name: resource_name.to_utf8_lossy().into_owned(), - request_body_type: Some(request_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), - response_body_type: Some(response_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), - response_code: Some(response_code.iter().cloned().collect()), - authentication: Some(authentication.iter().cloned().collect()), - }); - try_c!(blocking::enqueue_actions( - transport, - instance_id, - queue_id, - vec![SidecarAction::Telemetry(endpoint)], - )); + if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/alex.log") { + let _ = writeln!(file, "Here Alex 0"); + let _ = writeln!(file, "Request body type - {:?}", request_body_type.first()); + let _ = writeln!(file, "Response body type - {:?}", response_body_type.first()); + } + MaybeError::None + + + // let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { + // r#type: Some(r#type.to_utf8_lossy().into_owned()), + // method: Some(method), + // path: Some(path.to_utf8_lossy().into_owned()), + // operation_name: operation_name.to_utf8_lossy().into_owned(), + // resource_name: resource_name.to_utf8_lossy().into_owned(), + // request_body_type: Some(request_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + // response_body_type: Some(response_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + // // response_code: Some(response_code.iter().cloned().collect()), + // // authentication: Some(authentication.iter().cloned().collect()), + // }); + + // try_c!(blocking::enqueue_actions( + // transport, + // instance_id, + // queue_id, + // vec![SidecarAction::Telemetry(endpoint)], + // )); + // MaybeError::None } /// Reports a dependency to the telemetry. diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index b37e7fc443..77610a7c0d 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -149,10 +149,10 @@ pub struct Endpoint { pub request_body_type: Option>, #[serde(default)] pub response_body_type: Option>, - #[serde(default)] - pub response_code: Option>, - #[serde(default)] - pub authentication: Option>, + // #[serde(default)] + // pub response_code: Option>, + // #[serde(default)] + // pub authentication: Option>, // #[serde(default)] // pub metadata: Option, } From 1087177bca1e28c445ee65dded18df74a5275f86 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 25 Sep 2025 12:47:31 +0200 Subject: [PATCH 14/32] Add string vectors --- datadog-sidecar-ffi/src/lib.rs | 48 +++++++++++++------------------- ddtelemetry/src/data/payloads.rs | 6 ++-- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 0f76ff1012..fa8c624d92 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -424,40 +424,30 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: CharSlice, operation_name: CharSlice, resource_name: CharSlice, - request_body_type: ffi::Vec, - response_body_type: ffi::Vec, + request_body_type:&mut ffi::Vec, + response_body_type:&mut ffi::Vec, // response_code: ffi::Vec, // authentication: ffi::Vec ) -> MaybeError { + let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { + r#type: Some(r#type.to_utf8_lossy().into_owned()), + method: Some(method), + path: Some(path.to_utf8_lossy().into_owned()), + operation_name: operation_name.to_utf8_lossy().into_owned(), + resource_name: resource_name.to_utf8_lossy().into_owned(), + request_body_type: Some(request_body_type.as_slice().to_vec()), + response_body_type: Some(response_body_type.as_slice().to_vec()), + // response_code: Some(response_code.iter().cloned().collect()), + // authentication: Some(authentication.iter().cloned().collect()), + }); - if let Ok(mut file) = OpenOptions::new().create(true).append(true).open("/tmp/alex.log") { - let _ = writeln!(file, "Here Alex 0"); - let _ = writeln!(file, "Request body type - {:?}", request_body_type.first()); - let _ = writeln!(file, "Response body type - {:?}", response_body_type.first()); - } - + try_c!(blocking::enqueue_actions( + transport, + instance_id, + queue_id, + vec![SidecarAction::Telemetry(endpoint)], + )); MaybeError::None - - - // let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { - // r#type: Some(r#type.to_utf8_lossy().into_owned()), - // method: Some(method), - // path: Some(path.to_utf8_lossy().into_owned()), - // operation_name: operation_name.to_utf8_lossy().into_owned(), - // resource_name: resource_name.to_utf8_lossy().into_owned(), - // request_body_type: Some(request_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), - // response_body_type: Some(response_body_type.iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), - // // response_code: Some(response_code.iter().cloned().collect()), - // // authentication: Some(authentication.iter().cloned().collect()), - // }); - - // try_c!(blocking::enqueue_actions( - // transport, - // instance_id, - // queue_id, - // vec![SidecarAction::Telemetry(endpoint)], - // )); - // MaybeError::None } /// Reports a dependency to the telemetry. diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 77610a7c0d..e0036cf391 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -5,6 +5,8 @@ use crate::data::metrics; use serde::{Deserialize, Serialize}; +use std::os::raw::c_char; + #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Dependency { pub name: String, @@ -146,9 +148,9 @@ pub struct Endpoint { pub operation_name: String, pub resource_name: String, #[serde(default)] - pub request_body_type: Option>, + pub request_body_type: Option>, #[serde(default)] - pub response_body_type: Option>, + pub response_body_type: Option>, // #[serde(default)] // pub response_code: Option>, // #[serde(default)] From a27db1c63d515e0d5a90f72844f1cb0ba53e8143 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 10:21:45 +0200 Subject: [PATCH 15/32] Add i32 vector --- datadog-sidecar-ffi/src/lib.rs | 6 +++--- ddtelemetry/src/data/payloads.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index fa8c624d92..4752632486 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -426,7 +426,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( resource_name: CharSlice, request_body_type:&mut ffi::Vec, response_body_type:&mut ffi::Vec, - // response_code: ffi::Vec, + response_code:&mut ffi::Vec, // authentication: ffi::Vec ) -> MaybeError { let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { @@ -437,8 +437,8 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( resource_name: resource_name.to_utf8_lossy().into_owned(), request_body_type: Some(request_body_type.as_slice().to_vec()), response_body_type: Some(response_body_type.as_slice().to_vec()), - // response_code: Some(response_code.iter().cloned().collect()), - // authentication: Some(authentication.iter().cloned().collect()), + response_code: Some(response_code.to_vec()), + authentication: Some(authentication.iter().cloned().collect()), }); try_c!(blocking::enqueue_actions( diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index e0036cf391..ece1fce327 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -151,8 +151,8 @@ pub struct Endpoint { pub request_body_type: Option>, #[serde(default)] pub response_body_type: Option>, - // #[serde(default)] - // pub response_code: Option>, + #[serde(default)] + pub response_code: Option>, // #[serde(default)] // pub authentication: Option>, // #[serde(default)] From c9b54660cc9a8b08c9328efcfef02a25bc8dae18 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 10:42:18 +0200 Subject: [PATCH 16/32] Add authentication vec --- datadog-sidecar-ffi/src/lib.rs | 4 ++-- ddtelemetry/src/data/payloads.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 4752632486..df28359cc2 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -427,7 +427,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( request_body_type:&mut ffi::Vec, response_body_type:&mut ffi::Vec, response_code:&mut ffi::Vec, - // authentication: ffi::Vec + authentication: ffi::Vec ) -> MaybeError { let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { r#type: Some(r#type.to_utf8_lossy().into_owned()), @@ -438,7 +438,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( request_body_type: Some(request_body_type.as_slice().to_vec()), response_body_type: Some(response_body_type.as_slice().to_vec()), response_code: Some(response_code.to_vec()), - authentication: Some(authentication.iter().cloned().collect()), + authentication: Some(authentication.to_vec()), }); try_c!(blocking::enqueue_actions( diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index ece1fce327..8eaecef6fb 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -153,8 +153,8 @@ pub struct Endpoint { pub response_body_type: Option>, #[serde(default)] pub response_code: Option>, - // #[serde(default)] - // pub authentication: Option>, + #[serde(default)] + pub authentication: Option>, // #[serde(default)] // pub metadata: Option, } From 8f78c230016d6a74ea974d33ff92c7d0feeb93a6 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 12:10:43 +0200 Subject: [PATCH 17/32] Add serde json --- datadog-sidecar-ffi/Cargo.toml | 1 + datadog-sidecar-ffi/src/lib.rs | 9 ++++++--- ddtelemetry/src/data/payloads.rs | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/datadog-sidecar-ffi/Cargo.toml b/datadog-sidecar-ffi/Cargo.toml index 871fc8a7ea..14cd1ed0a0 100644 --- a/datadog-sidecar-ffi/Cargo.toml +++ b/datadog-sidecar-ffi/Cargo.toml @@ -26,6 +26,7 @@ paste = "1" libc = "0.2" tracing = { version = "0.1", default-features = false } rmp-serde = "1.1.1" +serde_json = "1.0" [target.'cfg(windows)'.dependencies] diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index df28359cc2..8da46941c8 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -55,8 +55,7 @@ use std::ptr::NonNull; use std::slice; use std::sync::Arc; use std::time::Duration; -use std::fs::OpenOptions; -use std::io::Write; +use serde_json::Value; #[no_mangle] @@ -427,8 +426,11 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( request_body_type:&mut ffi::Vec, response_body_type:&mut ffi::Vec, response_code:&mut ffi::Vec, - authentication: ffi::Vec + authentication: ffi::Vec, + metadata: CharSlice ) -> MaybeError { + + let metadata_json = serde_json::from_slice::(&metadata.to_utf8_lossy().into_owned().as_bytes()).unwrap(); let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { r#type: Some(r#type.to_utf8_lossy().into_owned()), method: Some(method), @@ -439,6 +441,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( response_body_type: Some(response_body_type.as_slice().to_vec()), response_code: Some(response_code.to_vec()), authentication: Some(authentication.to_vec()), + metadata: Some(metadata_json), }); try_c!(blocking::enqueue_actions( diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 8eaecef6fb..011ee7f6c8 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -155,6 +155,6 @@ pub struct Endpoint { pub response_code: Option>, #[serde(default)] pub authentication: Option>, - // #[serde(default)] - // pub metadata: Option, + #[serde(default)] + pub metadata: Option, } From 710e2696fa1c07402bf13d45dbcb5c916cc76744 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 16:04:21 +0200 Subject: [PATCH 18/32] Replace char_c for slices --- Cargo.lock | 2 ++ datadog-sidecar-ffi/src/lib.rs | 10 +++++----- ddtelemetry/Cargo.toml | 3 ++- ddtelemetry/src/data/payloads.rs | 6 ++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 69a150c245..050677cce4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1720,6 +1720,7 @@ dependencies = [ "libc", "paste", "rmp-serde", + "serde_json", "tempfile", "tinybytes", "tracing", @@ -1904,6 +1905,7 @@ dependencies = [ "base64 0.22.1", "datadog-ddsketch", "ddcommon", + "ddcommon-ffi", "futures", "hashbrown 0.15.1", "http", diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 8da46941c8..fc8198bdb3 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -423,10 +423,10 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: CharSlice, operation_name: CharSlice, resource_name: CharSlice, - request_body_type:&mut ffi::Vec, - response_body_type:&mut ffi::Vec, + request_body_type:&mut ffi::Vec, + response_body_type:&mut ffi::Vec, response_code:&mut ffi::Vec, - authentication: ffi::Vec, + authentication:&mut ffi::Vec, metadata: CharSlice ) -> MaybeError { @@ -437,8 +437,8 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: Some(path.to_utf8_lossy().into_owned()), operation_name: operation_name.to_utf8_lossy().into_owned(), resource_name: resource_name.to_utf8_lossy().into_owned(), - request_body_type: Some(request_body_type.as_slice().to_vec()), - response_body_type: Some(response_body_type.as_slice().to_vec()), + request_body_type: Some(request_body_type.to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + response_body_type: Some(response_body_type.to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), response_code: Some(response_code.to_vec()), authentication: Some(authentication.to_vec()), metadata: Some(metadata_json), diff --git a/ddtelemetry/Cargo.toml b/ddtelemetry/Cargo.toml index f633fc5efd..b27469d8ea 100644 --- a/ddtelemetry/Cargo.toml +++ b/ddtelemetry/Cargo.toml @@ -31,7 +31,8 @@ tracing = { version = "0.1", default-features = false } uuid = { version = "1.3", features = ["v4"] } hashbrown = "0.15" -ddcommon = { path = "../ddcommon", default-features = false } +ddcommon = { path = "../ddcommon", default-features = false} +ddcommon-ffi = { path = "../ddcommon-ffi", default-features = false } datadog-ddsketch = { path = "../ddsketch" } [target."cfg(unix)".dependencies] diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 011ee7f6c8..74edf55e59 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -5,8 +5,6 @@ use crate::data::metrics; use serde::{Deserialize, Serialize}; -use std::os::raw::c_char; - #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Dependency { pub name: String, @@ -148,9 +146,9 @@ pub struct Endpoint { pub operation_name: String, pub resource_name: String, #[serde(default)] - pub request_body_type: Option>, + pub request_body_type: Option>, #[serde(default)] - pub response_body_type: Option>, + pub response_body_type: Option>, #[serde(default)] pub response_code: Option>, #[serde(default)] From e3ff460125f12a15018fbb3faf303baa11689119 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 29 Sep 2025 17:14:31 +0200 Subject: [PATCH 19/32] Make response code a non vector --- datadog-sidecar-ffi/src/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index fc8198bdb3..c4479507a9 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -425,11 +425,13 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( resource_name: CharSlice, request_body_type:&mut ffi::Vec, response_body_type:&mut ffi::Vec, - response_code:&mut ffi::Vec, + response_code:i32, authentication:&mut ffi::Vec, metadata: CharSlice ) -> MaybeError { + let response_code_vec = vec![response_code]; + let metadata_json = serde_json::from_slice::(&metadata.to_utf8_lossy().into_owned().as_bytes()).unwrap(); let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { r#type: Some(r#type.to_utf8_lossy().into_owned()), @@ -439,7 +441,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( resource_name: resource_name.to_utf8_lossy().into_owned(), request_body_type: Some(request_body_type.to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), response_body_type: Some(response_body_type.to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), - response_code: Some(response_code.to_vec()), + response_code: Some(response_code_vec), authentication: Some(authentication.to_vec()), metadata: Some(metadata_json), }); From f702551ef578c98e242050a997818dd6baf4fbb7 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 30 Sep 2025 10:39:15 +0200 Subject: [PATCH 20/32] Drop pointers --- datadog-sidecar-ffi/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index c4479507a9..53ac024e53 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -452,6 +452,11 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( queue_id, vec![SidecarAction::Telemetry(endpoint)], )); + + std::ptr::drop_in_place(request_body_type); + std::ptr::drop_in_place(response_body_type); + std::ptr::drop_in_place(authentication); + MaybeError::None } From 96e1445442bc0128be82bb152df296d3401188d2 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Tue, 30 Sep 2025 13:10:06 +0200 Subject: [PATCH 21/32] Amend linting --- datadog-sidecar-ffi/src/lib.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 53ac024e53..2c0bea8a9c 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -432,7 +432,15 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( let response_code_vec = vec![response_code]; - let metadata_json = serde_json::from_slice::(&metadata.to_utf8_lossy().into_owned().as_bytes()).unwrap(); + let maybe_metadata = serde_json::from_slice::(std::slice::from_raw_parts( + metadata.as_ptr() as *const u8, + metadata.len(), + )); + if let Err(e) = maybe_metadata { + return MaybeError::Some(e.to_string().into()); + } + #[allow(clippy::unwrap_used)] + let metadata_json = maybe_metadata.unwrap(); let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { r#type: Some(r#type.to_utf8_lossy().into_owned()), method: Some(method), From 4c252240784b046a98e6d75a9978fb5af361c903 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 6 Oct 2025 10:24:13 +0200 Subject: [PATCH 22/32] Wip --- datadog-sidecar-ffi/src/lib.rs | 38 +++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 2c0bea8a9c..2023dbbdc9 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -423,16 +423,40 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: CharSlice, operation_name: CharSlice, resource_name: CharSlice, - request_body_type:&mut ffi::Vec, - response_body_type:&mut ffi::Vec, + request_body_type:*mut ffi::Vec, + response_body_type:*mut ffi::Vec, response_code:i32, - authentication:&mut ffi::Vec, + authentication:*mut ffi::Vec, metadata: CharSlice ) -> MaybeError { let response_code_vec = vec![response_code]; + let request_body_type_local = Box::into_raw(Box::new(ffi::Vec::::new())); + let response_body_type_local = Box::into_raw(Box::new(ffi::Vec::::new())); + let authentication_local = Box::into_raw(Box::new(ffi::Vec::::new())); + if let Some(req_vec) = request_body_type.as_ref() { + if let Some(local_vec) = request_body_type_local.as_mut() { + for item in req_vec.to_vec() { + local_vec.push(item); + } + } + } + if let Some(resp_vec) = response_body_type.as_ref() { + if let Some(local_vec) = response_body_type_local.as_mut() { + for item in resp_vec.to_vec() { + local_vec.push(item); + } + } + } + if let Some(auth_vec) = authentication.as_ref() { + if let Some(local_vec) = authentication_local.as_mut() { + for item in auth_vec.to_vec() { + local_vec.push(item); + } + } + } - let maybe_metadata = serde_json::from_slice::(std::slice::from_raw_parts( + let maybe_metadata: Result = serde_json::from_slice::(std::slice::from_raw_parts( metadata.as_ptr() as *const u8, metadata.len(), )); @@ -447,10 +471,10 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: Some(path.to_utf8_lossy().into_owned()), operation_name: operation_name.to_utf8_lossy().into_owned(), resource_name: resource_name.to_utf8_lossy().into_owned(), - request_body_type: Some(request_body_type.to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), - response_body_type: Some(response_body_type.to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + request_body_type: Some(request_body_type_local.as_ref().unwrap().to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + response_body_type: Some(response_body_type_local.as_ref().unwrap().to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), response_code: Some(response_code_vec), - authentication: Some(authentication.to_vec()), + authentication: Some(authentication_local.as_ref().unwrap().to_vec()), metadata: Some(metadata_json), }); From 1341fca777ce60b2178a9ff0dae482a7de998c02 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 15 Oct 2025 11:58:00 +0200 Subject: [PATCH 23/32] Fix add-routes-collection (#1264) Co-authored-by: Gustavo Lopes --- datadog-sidecar-ffi/src/lib.rs | 80 ++++++++----------- datadog-sidecar/src/service/sidecar_server.rs | 2 +- ddtelemetry/src/data/payloads.rs | 33 +++++++- ddtelemetry/src/worker/mod.rs | 18 +++-- 4 files changed, 77 insertions(+), 56 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 2023dbbdc9..451b0fe2b3 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -55,8 +55,6 @@ use std::ptr::NonNull; use std::slice; use std::sync::Arc; use std::time::Duration; -use serde_json::Value; - #[no_mangle] #[cfg(target_os = "windows")] @@ -411,6 +409,25 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_enqueueConfig( MaybeError::None } +unsafe fn box_from_raw_opt(ptr: *mut T) -> Option> { + if ptr.is_null() { + None + } else { + Some(Box::from_raw(ptr)) + } +} + +fn slice_of_char_slice_to_vec_of_string<'a, T>(ffi_vec: T) -> Vec +where + T: AsRef<[CharSlice<'a>]>, +{ + ffi_vec + .as_ref() + .iter() + .map(|s| s.to_utf8_lossy().into_owned()) + .collect() +} + /// Reports an endpoint to the telemetry. #[no_mangle] #[allow(clippy::missing_safety_doc)] @@ -423,59 +440,30 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( path: CharSlice, operation_name: CharSlice, resource_name: CharSlice, - request_body_type:*mut ffi::Vec, - response_body_type:*mut ffi::Vec, - response_code:i32, - authentication:*mut ffi::Vec, - metadata: CharSlice + request_body_type: *mut ffi::Vec, + response_body_type: *mut ffi::Vec, + response_code: i32, + authentication: *mut ffi::Vec, + metadata: CharSlice, ) -> MaybeError { - let response_code_vec = vec![response_code]; - let request_body_type_local = Box::into_raw(Box::new(ffi::Vec::::new())); - let response_body_type_local = Box::into_raw(Box::new(ffi::Vec::::new())); - let authentication_local = Box::into_raw(Box::new(ffi::Vec::::new())); - if let Some(req_vec) = request_body_type.as_ref() { - if let Some(local_vec) = request_body_type_local.as_mut() { - for item in req_vec.to_vec() { - local_vec.push(item); - } - } - } - if let Some(resp_vec) = response_body_type.as_ref() { - if let Some(local_vec) = response_body_type_local.as_mut() { - for item in resp_vec.to_vec() { - local_vec.push(item); - } - } - } - if let Some(auth_vec) = authentication.as_ref() { - if let Some(local_vec) = authentication_local.as_mut() { - for item in auth_vec.to_vec() { - local_vec.push(item); - } - } - } + let request_body_type = box_from_raw_opt(request_body_type); + let response_body_type = box_from_raw_opt(response_body_type); + let authentication = box_from_raw_opt(authentication); - let maybe_metadata: Result = serde_json::from_slice::(std::slice::from_raw_parts( - metadata.as_ptr() as *const u8, - metadata.len(), - )); - if let Err(e) = maybe_metadata { - return MaybeError::Some(e.to_string().into()); - } #[allow(clippy::unwrap_used)] - let metadata_json = maybe_metadata.unwrap(); let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { r#type: Some(r#type.to_utf8_lossy().into_owned()), method: Some(method), path: Some(path.to_utf8_lossy().into_owned()), operation_name: operation_name.to_utf8_lossy().into_owned(), resource_name: resource_name.to_utf8_lossy().into_owned(), - request_body_type: Some(request_body_type_local.as_ref().unwrap().to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), - response_body_type: Some(response_body_type_local.as_ref().unwrap().to_vec().iter().map(|s| s.to_utf8_lossy().into_owned()).collect()), + request_body_type: request_body_type.map(|v| slice_of_char_slice_to_vec_of_string(&**v)), + response_body_type: response_body_type.map(|v| slice_of_char_slice_to_vec_of_string(&**v)), response_code: Some(response_code_vec), - authentication: Some(authentication_local.as_ref().unwrap().to_vec()), - metadata: Some(metadata_json), + // into_iter() is not implemented correctly for ffi::Vec, so we need to copy the elements + authentication: authentication.map(|v| v.iter().map(|auth| auth.to_owned()).collect()), + metadata: metadata.assume_utf8().to_string(), }); try_c!(blocking::enqueue_actions( @@ -485,10 +473,6 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( vec![SidecarAction::Telemetry(endpoint)], )); - std::ptr::drop_in_place(request_body_type); - std::ptr::drop_in_place(response_body_type); - std::ptr::drop_in_place(authentication); - MaybeError::None } diff --git a/datadog-sidecar/src/service/sidecar_server.rs b/datadog-sidecar/src/service/sidecar_server.rs index cf863bb035..b8d888bd5a 100644 --- a/datadog-sidecar/src/service/sidecar_server.rs +++ b/datadog-sidecar/src/service/sidecar_server.rs @@ -449,7 +449,7 @@ impl SidecarInterface for SidecarServer { } SidecarAction::ClearQueueId => { remove_entry = true; - }, + } SidecarAction::Telemetry(TelemetryActions::AddEndpoint(_)) => { telemetry.last_endpoints_push = SystemTime::now(); buffered_info_changed = true; diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 74edf55e59..1168cbc2c4 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -4,6 +4,7 @@ use crate::data::metrics; use serde::{Deserialize, Serialize}; +use tracing::warn; #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Dependency { @@ -64,7 +65,7 @@ pub struct AppClientConfigurationChange { #[derive(Debug, Serialize)] pub struct AppEndpointsChange { pub is_first: bool, - pub endpoints: Vec, + pub endpoints: Vec, } #[derive(Serialize, Debug)] @@ -154,5 +155,33 @@ pub struct Endpoint { #[serde(default)] pub authentication: Option>, #[serde(default)] - pub metadata: Option, + pub metadata: String, +} + +impl Endpoint { + pub fn to_json_value(&self) -> serde_json::Result { + let result = serde_json::to_value(self); + match result { + Ok(mut value) => { + // replace the metadata string with parsed JSON + if let Some(obj) = value.as_object_mut() { + let metadata_json = if self.metadata.is_empty() { + serde_json::json!({}) + } else { + serde_json::from_str(&self.metadata)? + }; + obj.insert("metadata".to_string(), metadata_json); + } + + Ok(value) + } + Err(err) => { + warn!( + "Failed to convert Endpoint to JSON: {}: {}", + self.metadata, err + ); + Err(err) + } + } + } } diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index eb2e9f3bb4..1e7468ccd9 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -355,7 +355,11 @@ impl TelemetryWorker { } } } - AddConfig(_) | AddDependency(_) | AddIntegration(_) | AddEndpoint(_) | Lifecycle(ExtendedHeartbeat) => {} + AddConfig(_) + | AddDependency(_) + | AddIntegration(_) + | AddEndpoint(_) + | Lifecycle(ExtendedHeartbeat) => {} Lifecycle(Stop) => { if !self.data.started { return BREAK; @@ -562,7 +566,13 @@ impl TelemetryWorker { payloads.push(data::Payload::AppEndpointsChange( data::AppEndpointsChange { is_first: true, - endpoints: self.data.endpoints.unflushed().cloned().collect(), + endpoints: self + .data + .endpoints + .unflushed() + .map(|e| e.to_json_value().unwrap_or_default()) + .filter(|e| e.is_object()) + .collect(), }, )) } @@ -668,9 +678,7 @@ impl TelemetryWorker { .data .configurations .removed_flushed(p.configuration.len()), - AppEndpointsChange(p) => { - self.data.endpoints.removed_flushed(p.endpoints.len()) - } + AppEndpointsChange(p) => self.data.endpoints.removed_flushed(p.endpoints.len()), MessageBatch(batch) => { for p in batch { self.payload_sent_success(p); From 855e1b6252ef8aa006ccb64751e34156d3646393 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Wed, 15 Oct 2025 12:06:38 +0200 Subject: [PATCH 24/32] Rename app endpoint payload --- ddtelemetry/src/data/payload.rs | 4 ++-- ddtelemetry/src/data/payloads.rs | 2 +- ddtelemetry/src/worker/mod.rs | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ddtelemetry/src/data/payload.rs b/ddtelemetry/src/data/payload.rs index db49fa2774..9c466c6618 100644 --- a/ddtelemetry/src/data/payload.rs +++ b/ddtelemetry/src/data/payload.rs @@ -12,7 +12,7 @@ pub enum Payload { AppDependenciesLoaded(AppDependenciesLoaded), AppIntegrationsChange(AppIntegrationsChange), AppClientConfigurationChange(AppClientConfigurationChange), - AppEndpointsChange(AppEndpointsChange), + AppEndpoints(AppEndpoints), AppHeartbeat(#[serde(skip_serializing)] ()), AppClosing(#[serde(skip_serializing)] ()), GenerateMetrics(GenerateMetrics), @@ -30,7 +30,7 @@ impl Payload { AppDependenciesLoaded(_) => "app-dependencies-loaded", AppIntegrationsChange(_) => "app-integrations-change", AppClientConfigurationChange(_) => "app-client-configuration-change", - AppEndpointsChange(_) => "app-endpoints-change", + AppEndpoints(_) => "app-endpoints", AppHeartbeat(_) => "app-heartbeat", AppClosing(_) => "app-closing", GenerateMetrics(_) => "generate-metrics", diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 1168cbc2c4..3bf68c6253 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -63,7 +63,7 @@ pub struct AppClientConfigurationChange { } #[derive(Debug, Serialize)] -pub struct AppEndpointsChange { +pub struct AppEndpoints { pub is_first: bool, pub endpoints: Vec, } diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index 1e7468ccd9..d528e1b067 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -563,8 +563,8 @@ impl TelemetryWorker { )) } if self.data.endpoints.flush_not_empty() { - payloads.push(data::Payload::AppEndpointsChange( - data::AppEndpointsChange { + payloads.push(data::Payload::AppEndpoints( + data::AppEndpoints { is_first: true, endpoints: self .data @@ -678,7 +678,7 @@ impl TelemetryWorker { .data .configurations .removed_flushed(p.configuration.len()), - AppEndpointsChange(p) => self.data.endpoints.removed_flushed(p.endpoints.len()), + AppEndpoints(p) => self.data.endpoints.removed_flushed(p.endpoints.len()), MessageBatch(batch) => { for p in batch { self.payload_sent_success(p); From 58722e7b658c58f17bfba059ae75cb41794e32ee Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Thu, 16 Oct 2025 17:19:37 +0200 Subject: [PATCH 25/32] Ensure it returns always a box --- datadog-sidecar-ffi/src/lib.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 451b0fe2b3..e5cbef575b 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -409,9 +409,9 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_enqueueConfig( MaybeError::None } -unsafe fn box_from_raw_opt(ptr: *mut T) -> Option> { +unsafe fn box_from_raw_opt(ptr: *mut T) -> Option> { if ptr.is_null() { - None + Some(Box::new(T::default())) } else { Some(Box::from_raw(ptr)) } @@ -446,7 +446,10 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( authentication: *mut ffi::Vec, metadata: CharSlice, ) -> MaybeError { - let response_code_vec = vec![response_code]; + let mut response_code_vec = vec![]; + if response_code > -1 { + response_code_vec.push(response_code); + } let request_body_type = box_from_raw_opt(request_body_type); let response_body_type = box_from_raw_opt(response_body_type); let authentication = box_from_raw_opt(authentication); From 4817698af8da42ceebf69c7c5108f3928acdfe25 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 17 Oct 2025 12:12:12 +0200 Subject: [PATCH 26/32] Remove response code --- datadog-sidecar-ffi/src/lib.rs | 6 ------ ddtelemetry/src/data/payloads.rs | 2 -- 2 files changed, 8 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index e5cbef575b..58b53661e8 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -442,14 +442,9 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( resource_name: CharSlice, request_body_type: *mut ffi::Vec, response_body_type: *mut ffi::Vec, - response_code: i32, authentication: *mut ffi::Vec, metadata: CharSlice, ) -> MaybeError { - let mut response_code_vec = vec![]; - if response_code > -1 { - response_code_vec.push(response_code); - } let request_body_type = box_from_raw_opt(request_body_type); let response_body_type = box_from_raw_opt(response_body_type); let authentication = box_from_raw_opt(authentication); @@ -463,7 +458,6 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( resource_name: resource_name.to_utf8_lossy().into_owned(), request_body_type: request_body_type.map(|v| slice_of_char_slice_to_vec_of_string(&**v)), response_body_type: response_body_type.map(|v| slice_of_char_slice_to_vec_of_string(&**v)), - response_code: Some(response_code_vec), // into_iter() is not implemented correctly for ffi::Vec, so we need to copy the elements authentication: authentication.map(|v| v.iter().map(|auth| auth.to_owned()).collect()), metadata: metadata.assume_utf8().to_string(), diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 3bf68c6253..62ac0d480e 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -151,8 +151,6 @@ pub struct Endpoint { #[serde(default)] pub response_body_type: Option>, #[serde(default)] - pub response_code: Option>, - #[serde(default)] pub authentication: Option>, #[serde(default)] pub metadata: String, From de389affead3e26c56ed9b22fac1fc624ae2d000 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 17 Oct 2025 13:08:58 +0200 Subject: [PATCH 27/32] Remove non used fields --- datadog-sidecar-ffi/src/lib.rs | 34 -------------------- ddtelemetry/src/data/payloads.rs | 54 +++----------------------------- 2 files changed, 4 insertions(+), 84 deletions(-) diff --git a/datadog-sidecar-ffi/src/lib.rs b/datadog-sidecar-ffi/src/lib.rs index 58b53661e8..b7d2f9e425 100644 --- a/datadog-sidecar-ffi/src/lib.rs +++ b/datadog-sidecar-ffi/src/lib.rs @@ -409,25 +409,6 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_enqueueConfig( MaybeError::None } -unsafe fn box_from_raw_opt(ptr: *mut T) -> Option> { - if ptr.is_null() { - Some(Box::new(T::default())) - } else { - Some(Box::from_raw(ptr)) - } -} - -fn slice_of_char_slice_to_vec_of_string<'a, T>(ffi_vec: T) -> Vec -where - T: AsRef<[CharSlice<'a>]>, -{ - ffi_vec - .as_ref() - .iter() - .map(|s| s.to_utf8_lossy().into_owned()) - .collect() -} - /// Reports an endpoint to the telemetry. #[no_mangle] #[allow(clippy::missing_safety_doc)] @@ -435,32 +416,17 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_addEndpoint( transport: &mut Box, instance_id: &InstanceId, queue_id: &QueueId, - r#type: CharSlice, method: ddtelemetry::data::Method, path: CharSlice, operation_name: CharSlice, resource_name: CharSlice, - request_body_type: *mut ffi::Vec, - response_body_type: *mut ffi::Vec, - authentication: *mut ffi::Vec, - metadata: CharSlice, ) -> MaybeError { - let request_body_type = box_from_raw_opt(request_body_type); - let response_body_type = box_from_raw_opt(response_body_type); - let authentication = box_from_raw_opt(authentication); - #[allow(clippy::unwrap_used)] let endpoint = TelemetryActions::AddEndpoint(ddtelemetry::data::Endpoint { - r#type: Some(r#type.to_utf8_lossy().into_owned()), method: Some(method), path: Some(path.to_utf8_lossy().into_owned()), operation_name: operation_name.to_utf8_lossy().into_owned(), resource_name: resource_name.to_utf8_lossy().into_owned(), - request_body_type: request_body_type.map(|v| slice_of_char_slice_to_vec_of_string(&**v)), - response_body_type: response_body_type.map(|v| slice_of_char_slice_to_vec_of_string(&**v)), - // into_iter() is not implemented correctly for ffi::Vec, so we need to copy the elements - authentication: authentication.map(|v| v.iter().map(|auth| auth.to_owned()).collect()), - metadata: metadata.assume_utf8().to_string(), }); try_c!(blocking::enqueue_actions( diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index 62ac0d480e..c0226a9f34 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -4,7 +4,6 @@ use crate::data::metrics; use serde::{Deserialize, Serialize}; -use tracing::warn; #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Dependency { @@ -119,67 +118,22 @@ pub enum Method { Other = 9, //This is specified as "*" in the OpenAPI spec } -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] -#[serde(rename_all = "UPPERCASE")] -#[repr(C)] -pub enum Authentication { - Jwt = 0, - Basic = 1, - Oauth = 2, - Oidc = 3, - ApiKey = 4, - Session = 5, - Mtls = 6, - Saml = 7, - Ldap = 8, - Form = 9, - Other = 10, -} - #[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Endpoint { - #[serde(default)] - pub r#type: Option, #[serde(default)] pub method: Option, #[serde(default)] pub path: Option, - pub operation_name: String, - pub resource_name: String, - #[serde(default)] - pub request_body_type: Option>, - #[serde(default)] - pub response_body_type: Option>, - #[serde(default)] - pub authentication: Option>, - #[serde(default)] - pub metadata: String, + pub operation_name: String, + pub resource_name: String } impl Endpoint { pub fn to_json_value(&self) -> serde_json::Result { let result = serde_json::to_value(self); match result { - Ok(mut value) => { - // replace the metadata string with parsed JSON - if let Some(obj) = value.as_object_mut() { - let metadata_json = if self.metadata.is_empty() { - serde_json::json!({}) - } else { - serde_json::from_str(&self.metadata)? - }; - obj.insert("metadata".to_string(), metadata_json); - } - - Ok(value) - } - Err(err) => { - warn!( - "Failed to convert Endpoint to JSON: {}: {}", - self.metadata, err - ); - Err(err) - } + Ok(value) => Ok(value), + Err(err) => Err(err), } } } From 27366371fc1cd07a210e1fd7c2284cdf4feab297 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 17 Oct 2025 16:05:16 +0200 Subject: [PATCH 28/32] Revert changes non required --- ddtelemetry/src/worker/mod.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index d528e1b067..fe3ef81981 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -782,7 +782,7 @@ impl TelemetryWorker { let timeout_ms = if let Some(endpoint) = self.config.endpoint.as_ref() { endpoint.timeout_ms } else { - Endpoint::DEFAULT_TIMEOUT + ddcommon::Endpoint::DEFAULT_TIMEOUT }; debug!( @@ -799,13 +799,13 @@ impl TelemetryWorker { ); Err(hyper_migration::Error::Other(anyhow::anyhow!("Request cancelled"))) }, - _ = tokio::time::sleep(time::Duration::from_millis( - if let Some(endpoint) = self.config.endpoint.as_ref() { - endpoint.timeout_ms - } else { - ddcommon::Endpoint::DEFAULT_TIMEOUT - })) => { - Err(anyhow::anyhow!("Request timed out")) + _ = tokio::time::sleep(time::Duration::from_millis(timeout_ms)) => { + debug!( + worker.runtime_id = %self.runtime_id, + http.timeout_ms = timeout_ms, + "Telemetry request timed out" + ); + Err(hyper_migration::Error::Other(anyhow::anyhow!("Request timed out"))) }, r = self.client.request(req) => { match r { From 31ba5960090b2d1c3d5f764c63a26c94ce5f6484 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Fri, 17 Oct 2025 17:19:51 +0200 Subject: [PATCH 29/32] Stop using store --- ddtelemetry/src/worker/mod.rs | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index fe3ef81981..0c9521bdcb 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -120,7 +120,7 @@ struct TelemetryWorkerData { dependencies: store::Store, configurations: store::Store, integrations: store::Store, - endpoints: store::Store, + endpoints: Vec, logs: store::QueueHashMap, metric_contexts: MetricContexts, metric_buckets: MetricBuckets, @@ -217,8 +217,6 @@ pub struct TelemetryWorkerStats { pub configurations_unflushed: u32, pub integrations_stored: u32, pub integrations_unflushed: u32, - pub endpoints_stored: u32, - pub endpoints_unflushed: u32, pub logs: u32, pub metric_contexts: u32, pub metric_buckets: MetricBucketStats, @@ -235,8 +233,6 @@ impl Add for TelemetryWorkerStats { configurations_unflushed: self.configurations_unflushed + rhs.configurations_unflushed, integrations_stored: self.integrations_stored + rhs.integrations_stored, integrations_unflushed: self.integrations_unflushed + rhs.integrations_unflushed, - endpoints_stored: self.endpoints_stored + rhs.endpoints_stored, - endpoints_unflushed: self.endpoints_unflushed + rhs.endpoints_unflushed, logs: self.logs + rhs.logs, metric_contexts: self.metric_contexts + rhs.metric_contexts, metric_buckets: MetricBucketStats { @@ -416,7 +412,7 @@ impl TelemetryWorker { AddDependency(dep) => self.data.dependencies.insert(dep), AddIntegration(integration) => self.data.integrations.insert(integration), AddConfig(cfg) => self.data.configurations.insert(cfg), - AddEndpoint(endpoint) => self.data.endpoints.insert(endpoint), + AddEndpoint(endpoint) => self.data.endpoints.push(endpoint), AddLog((identifier, log)) => { let (l, new) = self.data.logs.get_mut_or_insert(identifier, log); if !new { @@ -469,7 +465,6 @@ impl TelemetryWorker { self.data.dependencies.unflush_stored(); self.data.integrations.unflush_stored(); self.data.configurations.unflush_stored(); - self.data.endpoints.unflush_stored(); let app_started = data::Payload::AppStarted(self.build_app_started()); match self.send_payload(&app_started).await { @@ -562,19 +557,19 @@ impl TelemetryWorker { }, )) } - if self.data.endpoints.flush_not_empty() { + if !self.data.endpoints.is_empty() { payloads.push(data::Payload::AppEndpoints( data::AppEndpoints { is_first: true, endpoints: self .data .endpoints - .unflushed() + .iter() .map(|e| e.to_json_value().unwrap_or_default()) .filter(|e| e.is_object()) .collect(), }, - )) + )); } payloads } @@ -678,7 +673,7 @@ impl TelemetryWorker { .data .configurations .removed_flushed(p.configuration.len()), - AppEndpoints(p) => self.data.endpoints.removed_flushed(p.endpoints.len()), + AppEndpoints(p) => self.data.endpoints.clear(), MessageBatch(batch) => { for p in batch { self.payload_sent_success(p); @@ -828,8 +823,6 @@ impl TelemetryWorker { configurations_unflushed: self.data.configurations.len_unflushed() as u32, integrations_stored: self.data.integrations.len_stored() as u32, integrations_unflushed: self.data.integrations.len_unflushed() as u32, - endpoints_stored: self.data.endpoints.len_stored() as u32, - endpoints_unflushed: self.data.endpoints.len_unflushed() as u32, logs: self.data.logs.len() as u32, metric_contexts: self.data.metric_contexts.lock().len() as u32, metric_buckets: self.data.metric_buckets.stats(), @@ -1043,7 +1036,7 @@ pub struct TelemetryWorkerBuilder { pub dependencies: store::Store, pub integrations: store::Store, pub configurations: store::Store, - pub endpoints: store::Store, + pub endpoints: Vec, pub native_deps: bool, pub rust_shared_lib_deps: bool, pub config: Config, @@ -1094,7 +1087,7 @@ impl TelemetryWorkerBuilder { dependencies: store::Store::new(MAX_ITEMS), integrations: store::Store::new(MAX_ITEMS), configurations: store::Store::new(MAX_ITEMS), - endpoints: store::Store::new(MAX_ITEMS), + endpoints: Vec::new(), native_deps: true, rust_shared_lib_deps: false, config: Config::default(), From 869a272bdbf19ffd1b30c30e83115f4a8ed598c1 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 20 Oct 2025 10:51:09 +0200 Subject: [PATCH 30/32] Store endpoints on a hashset --- ddtelemetry/src/data/payloads.rs | 20 ++++++++++++++++++-- ddtelemetry/src/worker/mod.rs | 10 +++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index c0226a9f34..e912949dcb 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -1,6 +1,8 @@ // Copyright 2021-Present Datadog, Inc. https://www.datadoghq.com/ // SPDX-License-Identifier: Apache-2.0 +use std::hash::Hasher; + use crate::data::metrics; use serde::{Deserialize, Serialize}; @@ -118,14 +120,28 @@ pub enum Method { Other = 9, //This is specified as "*" in the OpenAPI spec } -#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, Default)] +#[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct Endpoint { #[serde(default)] pub method: Option, #[serde(default)] pub path: Option, pub operation_name: String, - pub resource_name: String + pub resource_name: String +} + +impl PartialEq for Endpoint { + fn eq(&self, other: &Self) -> bool { + self.resource_name == other.resource_name + } +} + +impl Eq for Endpoint {} + +impl std::hash::Hash for Endpoint { + fn hash(&self, state: &mut H) { + self.resource_name.hash(state); + } } impl Endpoint { diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index 0c9521bdcb..4e125fc14f 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -12,7 +12,7 @@ use crate::{ }; use ddcommon::{hyper_migration, tag::Tag, worker::Worker}; -use std::fmt::Debug; +use std::{collections::HashSet, fmt::Debug}; use std::iter::Sum; use std::ops::Add; use std::{ @@ -120,7 +120,7 @@ struct TelemetryWorkerData { dependencies: store::Store, configurations: store::Store, integrations: store::Store, - endpoints: Vec, + endpoints: HashSet, logs: store::QueueHashMap, metric_contexts: MetricContexts, metric_buckets: MetricBuckets, @@ -412,7 +412,7 @@ impl TelemetryWorker { AddDependency(dep) => self.data.dependencies.insert(dep), AddIntegration(integration) => self.data.integrations.insert(integration), AddConfig(cfg) => self.data.configurations.insert(cfg), - AddEndpoint(endpoint) => self.data.endpoints.push(endpoint), + AddEndpoint(endpoint) => { self.data.endpoints.insert(endpoint); }, AddLog((identifier, log)) => { let (l, new) = self.data.logs.get_mut_or_insert(identifier, log); if !new { @@ -1036,7 +1036,7 @@ pub struct TelemetryWorkerBuilder { pub dependencies: store::Store, pub integrations: store::Store, pub configurations: store::Store, - pub endpoints: Vec, + pub endpoints: HashSet, pub native_deps: bool, pub rust_shared_lib_deps: bool, pub config: Config, @@ -1087,7 +1087,7 @@ impl TelemetryWorkerBuilder { dependencies: store::Store::new(MAX_ITEMS), integrations: store::Store::new(MAX_ITEMS), configurations: store::Store::new(MAX_ITEMS), - endpoints: Vec::new(), + endpoints: HashSet::new(), native_deps: true, rust_shared_lib_deps: false, config: Config::default(), From 47f7d57a35949a7be878a002f21f2a54c6952822 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 20 Oct 2025 12:33:33 +0200 Subject: [PATCH 31/32] Lint --- ddtelemetry/src/data/payloads.rs | 4 ++-- ddtelemetry/src/worker/mod.rs | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ddtelemetry/src/data/payloads.rs b/ddtelemetry/src/data/payloads.rs index e912949dcb..88eda0a1ea 100644 --- a/ddtelemetry/src/data/payloads.rs +++ b/ddtelemetry/src/data/payloads.rs @@ -126,8 +126,8 @@ pub struct Endpoint { pub method: Option, #[serde(default)] pub path: Option, - pub operation_name: String, - pub resource_name: String + pub operation_name: String, + pub resource_name: String, } impl PartialEq for Endpoint { diff --git a/ddtelemetry/src/worker/mod.rs b/ddtelemetry/src/worker/mod.rs index 4e125fc14f..8edec7e4ea 100644 --- a/ddtelemetry/src/worker/mod.rs +++ b/ddtelemetry/src/worker/mod.rs @@ -12,7 +12,6 @@ use crate::{ }; use ddcommon::{hyper_migration, tag::Tag, worker::Worker}; -use std::{collections::HashSet, fmt::Debug}; use std::iter::Sum; use std::ops::Add; use std::{ @@ -25,6 +24,7 @@ use std::{ }, time, }; +use std::{collections::HashSet, fmt::Debug}; use crate::metrics::MetricBucketStats; use futures::{ @@ -412,7 +412,9 @@ impl TelemetryWorker { AddDependency(dep) => self.data.dependencies.insert(dep), AddIntegration(integration) => self.data.integrations.insert(integration), AddConfig(cfg) => self.data.configurations.insert(cfg), - AddEndpoint(endpoint) => { self.data.endpoints.insert(endpoint); }, + AddEndpoint(endpoint) => { + self.data.endpoints.insert(endpoint); + } AddLog((identifier, log)) => { let (l, new) = self.data.logs.get_mut_or_insert(identifier, log); if !new { @@ -558,18 +560,16 @@ impl TelemetryWorker { )) } if !self.data.endpoints.is_empty() { - payloads.push(data::Payload::AppEndpoints( - data::AppEndpoints { - is_first: true, - endpoints: self - .data - .endpoints - .iter() - .map(|e| e.to_json_value().unwrap_or_default()) - .filter(|e| e.is_object()) - .collect(), - }, - )); + payloads.push(data::Payload::AppEndpoints(data::AppEndpoints { + is_first: true, + endpoints: self + .data + .endpoints + .iter() + .map(|e| e.to_json_value().unwrap_or_default()) + .filter(|e| e.is_object()) + .collect(), + })); } payloads } @@ -673,7 +673,7 @@ impl TelemetryWorker { .data .configurations .removed_flushed(p.configuration.len()), - AppEndpoints(p) => self.data.endpoints.clear(), + AppEndpoints(_) => self.data.endpoints.clear(), MessageBatch(batch) => { for p in batch { self.payload_sent_success(p); From 436bbdf55e8f3de2b657eacde57252dede508d32 Mon Sep 17 00:00:00 2001 From: Alejandro Estringana Ruiz Date: Mon, 20 Oct 2025 13:20:10 +0200 Subject: [PATCH 32/32] License --- LICENSE-3rdparty.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE-3rdparty.yml b/LICENSE-3rdparty.yml index df6f0abc2c..1eb9412c1a 100644 --- a/LICENSE-3rdparty.yml +++ b/LICENSE-3rdparty.yml @@ -1,4 +1,4 @@ -root_name: builder, build_common, tools, datadog-alloc, datadog-crashtracker, ddcommon, ddtelemetry, datadog-ddsketch, cc_utils, datadog-crashtracker-ffi, ddcommon-ffi, datadog-ipc, datadog-ipc-macros, tarpc, tarpc-plugins, tinybytes, spawn_worker, datadog-library-config, datadog-library-config-ffi, datadog-live-debugger, datadog-live-debugger-ffi, datadog-profiling, datadog-profiling-protobuf, datadog-profiling-ffi, data-pipeline-ffi, data-pipeline, datadog-trace-protobuf, datadog-trace-stats, datadog-trace-utils, datadog-trace-normalization, dogstatsd-client, datadog-log, datadog-log-ffi, ddsketch-ffi, ddtelemetry-ffi, symbolizer-ffi, datadog-profiling-replayer, datadog-remote-config, datadog-sidecar, datadog-sidecar-macros, datadog-sidecar-ffi, datadog-trace-obfuscation, datadog-tracer-flare, sidecar_mockgen, test_spawn_from_lib +root_name: builder, build_common, tools, datadog-alloc, datadog-crashtracker, ddcommon, ddtelemetry, datadog-ddsketch, ddcommon-ffi, cc_utils, datadog-crashtracker-ffi, datadog-ipc, datadog-ipc-macros, tarpc, tarpc-plugins, tinybytes, spawn_worker, datadog-library-config, datadog-library-config-ffi, datadog-live-debugger, datadog-live-debugger-ffi, datadog-profiling, datadog-profiling-protobuf, datadog-profiling-ffi, data-pipeline-ffi, data-pipeline, datadog-trace-protobuf, datadog-trace-stats, datadog-trace-utils, datadog-trace-normalization, dogstatsd-client, datadog-log, datadog-log-ffi, ddsketch-ffi, ddtelemetry-ffi, symbolizer-ffi, datadog-profiling-replayer, datadog-remote-config, datadog-sidecar, datadog-sidecar-macros, datadog-sidecar-ffi, datadog-trace-obfuscation, datadog-tracer-flare, sidecar_mockgen, test_spawn_from_lib third_party_libraries: - package_name: addr2line package_version: 0.24.2