From 6380964ed8121e92f978de4e5e54367e0fbbcecf Mon Sep 17 00:00:00 2001 From: Leo Romanovsky Date: Fri, 6 Feb 2026 23:25:34 -0500 Subject: [PATCH 1/4] feat: Add FFE_FLAGS remote config product and capability - Add FfeFlags variant to RemoteConfigProduct enum - Add "FFE_FLAGS" string mapping in Display and FromStr - Add FfeFlagConfigurationRules = 46 to RemoteConfigCapabilities - Add FfeFlags(Vec) variant to RemoteConfigData to preserve raw bytes --- datadog-remote-config/src/lib.rs | 1 + datadog-remote-config/src/parse.rs | 3 +++ datadog-remote-config/src/path.rs | 3 +++ 3 files changed, 7 insertions(+) diff --git a/datadog-remote-config/src/lib.rs b/datadog-remote-config/src/lib.rs index 8f2e30119a..f47c4a4b1d 100644 --- a/datadog-remote-config/src/lib.rs +++ b/datadog-remote-config/src/lib.rs @@ -81,4 +81,5 @@ pub enum RemoteConfigCapabilities { ApmTracingEnableLiveDebugging = 41, AsmDdMulticonfig = 42, AsmTraceTaggingRules = 43, + FfeFlagConfigurationRules = 46, } diff --git a/datadog-remote-config/src/parse.rs b/datadog-remote-config/src/parse.rs index 859df1a19a..3bb791265a 100644 --- a/datadog-remote-config/src/parse.rs +++ b/datadog-remote-config/src/parse.rs @@ -17,6 +17,7 @@ pub enum RemoteConfigData { LiveDebugger(LiveDebuggingData), TracerFlareConfig(AgentConfigFile), TracerFlareTask(AgentTaskFile), + FfeFlags(Vec), Ignored(RemoteConfigProduct), } @@ -40,6 +41,7 @@ impl RemoteConfigData { let parsed = datadog_live_debugger::parse_json(&String::from_utf8_lossy(data))?; RemoteConfigData::LiveDebugger(parsed) } + RemoteConfigProduct::FfeFlags => RemoteConfigData::FfeFlags(data.to_vec()), _ => RemoteConfigData::Ignored(product), }) } @@ -53,6 +55,7 @@ impl From<&RemoteConfigData> for RemoteConfigProduct { RemoteConfigData::LiveDebugger(_) => RemoteConfigProduct::LiveDebugger, RemoteConfigData::TracerFlareConfig(_) => RemoteConfigProduct::AgentConfig, RemoteConfigData::TracerFlareTask(_) => RemoteConfigProduct::AgentTask, + RemoteConfigData::FfeFlags(_) => RemoteConfigProduct::FfeFlags, RemoteConfigData::Ignored(product) => *product, } } diff --git a/datadog-remote-config/src/path.rs b/datadog-remote-config/src/path.rs index 74bb80a8c1..35bcae8f29 100644 --- a/datadog-remote-config/src/path.rs +++ b/datadog-remote-config/src/path.rs @@ -23,6 +23,7 @@ pub enum RemoteConfigProduct { AsmData, AsmDD, AsmFeatures, + FfeFlags, #[cfg(feature = "live-debugger")] LiveDebugger, } @@ -37,6 +38,7 @@ impl Display for RemoteConfigProduct { RemoteConfigProduct::AsmData => "ASM_DATA", RemoteConfigProduct::AsmDD => "ASM_DD", RemoteConfigProduct::AsmFeatures => "ASM_FEATURES", + RemoteConfigProduct::FfeFlags => "FFE_FLAGS", #[cfg(feature = "live-debugger")] RemoteConfigProduct::LiveDebugger => "LIVE_DEBUGGING", }; @@ -87,6 +89,7 @@ impl RemoteConfigPath { "ASM_DATA" => RemoteConfigProduct::AsmData, "ASM_DD" => RemoteConfigProduct::AsmDD, "ASM_FEATURES" => RemoteConfigProduct::AsmFeatures, + "FFE_FLAGS" => RemoteConfigProduct::FfeFlags, #[cfg(feature = "live-debugger")] "LIVE_DEBUGGING" => RemoteConfigProduct::LiveDebugger, product => anyhow::bail!("Unknown product {}", product), From 6f9cbbe4a0e8b285c172c8358b7466b236a9d98f Mon Sep 17 00:00:00 2001 From: Leo Romanovsky Date: Sun, 8 Feb 2026 18:37:18 -0500 Subject: [PATCH 2/4] feat: Parse FFE remote config data into UniversalFlagConfig behind feature flag Gate FFE_FLAGS parsing behind an optional `ffe` feature, consistent with how `live-debugger` works. When enabled, data is parsed into a typed UniversalFlagConfig with proper Debug output; otherwise falls back to raw Vec. --- Cargo.lock | 1 + datadog-remote-config/Cargo.toml | 2 ++ datadog-remote-config/src/parse.rs | 16 +++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index eac3ed9658..230d518816 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1548,6 +1548,7 @@ version = "0.0.1" dependencies = [ "anyhow", "base64 0.22.1", + "datadog-ffe", "datadog-live-debugger", "datadog-remote-config", "futures", diff --git a/datadog-remote-config/Cargo.toml b/datadog-remote-config/Cargo.toml index 085fb46f2e..182702363e 100644 --- a/datadog-remote-config/Cargo.toml +++ b/datadog-remote-config/Cargo.toml @@ -23,6 +23,7 @@ client = [ "tracing" ] live-debugger = ["datadog-live-debugger"] +ffe = ["datadog-ffe"] test = ["hyper/server", "hyper-util"] [dependencies] @@ -30,6 +31,7 @@ anyhow = { version = "1.0" } libdd-common = { path = "../libdd-common"} libdd-trace-protobuf = { path = "../libdd-trace-protobuf", optional = true } datadog-live-debugger = { path = "../datadog-live-debugger", optional = true } +datadog-ffe = { path = "../datadog-ffe", optional = true } hyper = { workspace = true, optional = true } http-body-util = {version = "0.1", optional = true } http = { version = "1.0", optional = true } diff --git a/datadog-remote-config/src/parse.rs b/datadog-remote-config/src/parse.rs index 3bb791265a..6f894a71d3 100644 --- a/datadog-remote-config/src/parse.rs +++ b/datadog-remote-config/src/parse.rs @@ -9,6 +9,8 @@ use crate::{ }; #[cfg(feature = "live-debugger")] use datadog_live_debugger::LiveDebuggingData; +#[cfg(feature = "ffe")] +use datadog_ffe::rules_based::UniversalFlagConfig; #[derive(Debug)] pub enum RemoteConfigData { @@ -17,6 +19,9 @@ pub enum RemoteConfigData { LiveDebugger(LiveDebuggingData), TracerFlareConfig(AgentConfigFile), TracerFlareTask(AgentTaskFile), + #[cfg(feature = "ffe")] + FfeFlags(UniversalFlagConfig), + #[cfg(not(feature = "ffe"))] FfeFlags(Vec), Ignored(RemoteConfigProduct), } @@ -41,7 +46,16 @@ impl RemoteConfigData { let parsed = datadog_live_debugger::parse_json(&String::from_utf8_lossy(data))?; RemoteConfigData::LiveDebugger(parsed) } - RemoteConfigProduct::FfeFlags => RemoteConfigData::FfeFlags(data.to_vec()), + RemoteConfigProduct::FfeFlags => { + #[cfg(feature = "ffe")] + { + RemoteConfigData::FfeFlags(UniversalFlagConfig::from_json(data.to_vec())?) + } + #[cfg(not(feature = "ffe"))] + { + RemoteConfigData::FfeFlags(data.to_vec()) + } + } _ => RemoteConfigData::Ignored(product), }) } From 1ee47d0a6c16278c86a69224e6e17523ea8b3416 Mon Sep 17 00:00:00 2001 From: Leo Romanovsky Date: Sun, 8 Feb 2026 18:41:13 -0500 Subject: [PATCH 3/4] fix: Reorder imports to satisfy rustfmt --- datadog-remote-config/src/parse.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog-remote-config/src/parse.rs b/datadog-remote-config/src/parse.rs index 6f894a71d3..94ad43f0a4 100644 --- a/datadog-remote-config/src/parse.rs +++ b/datadog-remote-config/src/parse.rs @@ -7,10 +7,10 @@ use crate::{ }, RemoteConfigPath, RemoteConfigProduct, RemoteConfigSource, }; -#[cfg(feature = "live-debugger")] -use datadog_live_debugger::LiveDebuggingData; #[cfg(feature = "ffe")] use datadog_ffe::rules_based::UniversalFlagConfig; +#[cfg(feature = "live-debugger")] +use datadog_live_debugger::LiveDebuggingData; #[derive(Debug)] pub enum RemoteConfigData { From 8d390176a4238ddb1e8a6aedcb24e38fefce49cb Mon Sep 17 00:00:00 2001 From: Leo Romanovsky Date: Sun, 8 Feb 2026 18:42:49 -0500 Subject: [PATCH 4/4] fix: Gate FfeFlags variant behind ffe feature, matching live-debugger pattern --- datadog-remote-config/src/parse.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/datadog-remote-config/src/parse.rs b/datadog-remote-config/src/parse.rs index 94ad43f0a4..6ba43167ed 100644 --- a/datadog-remote-config/src/parse.rs +++ b/datadog-remote-config/src/parse.rs @@ -21,8 +21,6 @@ pub enum RemoteConfigData { TracerFlareTask(AgentTaskFile), #[cfg(feature = "ffe")] FfeFlags(UniversalFlagConfig), - #[cfg(not(feature = "ffe"))] - FfeFlags(Vec), Ignored(RemoteConfigProduct), } @@ -46,15 +44,9 @@ impl RemoteConfigData { let parsed = datadog_live_debugger::parse_json(&String::from_utf8_lossy(data))?; RemoteConfigData::LiveDebugger(parsed) } + #[cfg(feature = "ffe")] RemoteConfigProduct::FfeFlags => { - #[cfg(feature = "ffe")] - { - RemoteConfigData::FfeFlags(UniversalFlagConfig::from_json(data.to_vec())?) - } - #[cfg(not(feature = "ffe"))] - { - RemoteConfigData::FfeFlags(data.to_vec()) - } + RemoteConfigData::FfeFlags(UniversalFlagConfig::from_json(data.to_vec())?) } _ => RemoteConfigData::Ignored(product), }) @@ -69,6 +61,7 @@ impl From<&RemoteConfigData> for RemoteConfigProduct { RemoteConfigData::LiveDebugger(_) => RemoteConfigProduct::LiveDebugger, RemoteConfigData::TracerFlareConfig(_) => RemoteConfigProduct::AgentConfig, RemoteConfigData::TracerFlareTask(_) => RemoteConfigProduct::AgentTask, + #[cfg(feature = "ffe")] RemoteConfigData::FfeFlags(_) => RemoteConfigProduct::FfeFlags, RemoteConfigData::Ignored(product) => *product, }