Skip to content
Draft
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ccaad89
feat(ffe): Add Feature Flagging and Experimentation support
leoromanovsky Feb 12, 2026
310c757
fix(ffe): Address code review findings across FFI, PHP provider, and …
leoromanovsky Feb 12, 2026
dea34a4
feat(ffe): Implement FlagEvalMetrics OTel hook
leoromanovsky Mar 11, 2026
6b83643
fix(ffe): Correct error code mapping and enforce ERROR reason for non…
leoromanovsky Mar 11, 2026
3c1ab2f
fix(ffe): PHP 7.0 compat + regenerate supported-configurations.json
leoromanovsky Mar 11, 2026
0fcef1e
fix(ffe): C89/MSVC compliance — move variable declarations before sta…
leoromanovsky Mar 11, 2026
1098067
fix(ffe): address code review findings
leoromanovsky Mar 11, 2026
e05636f
chore: add FFE SDK team as codeowners for FeatureFlags and OpenFeatur…
leoromanovsky Mar 12, 2026
de33150
test(ffe): add UFC evaluation test harness with fixture-driven cases
leoromanovsky Mar 12, 2026
c77115f
Merge branch 'master' into feature/ffe-feature-flagging
leoromanovsky Mar 12, 2026
f117f00
Merge remote-tracking branch 'origin/master' into feature/ffe-feature…
leoromanovsky Apr 21, 2026
6edadc7
feat(ffe): sync sidecar exposure pipeline and proper stub functions p…
leoromanovsky Apr 21, 2026
564c881
fix(ffe): wrap unsafe CharSlice::from_raw_parts and import AsBytes trait
leoromanovsky Apr 22, 2026
9ce5444
fix(composer): map DDTrace\\OpenFeature\\ namespace to src/DDTrace/Op…
leoromanovsky Apr 22, 2026
2216fad
revert(composer): drop DDTrace\\OpenFeature\\ psr-4 mapping
leoromanovsky Apr 22, 2026
ee8fe52
fix(composer): move open-feature/sdk from require-dev to openfeature …
leoromanovsky Apr 22, 2026
611f0db
fix(test): point featureflags phpunit suite at tests/OpenFeature/
leoromanovsky Apr 22, 2026
8ecafb4
fix(openfeature): drop readonly keyword from ExposureContext (PHP 8.0…
leoromanovsky Apr 22, 2026
bf5d4d2
ci(featureflags): add Feature flags test job and make target
leoromanovsky Apr 22, 2026
0111335
test(stress): skip ffe_send_exposure on PHP < 8.1
leoromanovsky Apr 22, 2026
b9c5db0
chore(cargo): sync Cargo.lock with datadog-ffe and lru deps
leoromanovsky Apr 22, 2026
58ed65d
fix(openfeature): lazy-load adapter via separate bridge file (PHP 8.0…
leoromanovsky Apr 22, 2026
ae5e4d4
fix(ci): pull bridge artifacts into Feature flags tests job
leoromanovsky Apr 22, 2026
4523eb2
fix(ci): install open-feature/sdk for Feature flags tests job
leoromanovsky Apr 22, 2026
5f25a7a
refactor(ffe): replace changed-flag with monotonic version counter + …
leoromanovsky Apr 22, 2026
11de6c2
test(ffe): add cross-tracer fixture-driven eval parity tests
leoromanovsky Apr 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ compile_rust.sh @Datadog/libdatadog-apm
# APM IDM Team
/src/ @DataDog/apm-idm-php

# FFE (Feature Flagging & Experimentation) SDK Team
/src/DDTrace/FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk
/src/DDTrace/OpenFeature/ @DataDog/feature-flagging-and-experimentation-sdk
/tests/FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk

# Release files
Cargo.lock @DataDog/apm-php @DataDog/profiling-php @Datadog/libdatadog-apm
package.xml @DataDog/apm-php @DataDog/profiling-php @Datadog/asm-php
Expand Down
3 changes: 2 additions & 1 deletion components-rs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@ libdd-telemetry-ffi = { path = "../libdatadog/libdd-telemetry-ffi", default-feat
datadog-live-debugger = { path = "../libdatadog/datadog-live-debugger" }
datadog-live-debugger-ffi = { path = "../libdatadog/datadog-live-debugger-ffi", default-features = false }
datadog-ipc = { path = "../libdatadog/datadog-ipc" }
datadog-remote-config = { path = "../libdatadog/datadog-remote-config" }
datadog-remote-config = { path = "../libdatadog/datadog-remote-config", features = ["ffe"] }
datadog-sidecar = { path = "../libdatadog/datadog-sidecar" }
datadog-sidecar-ffi = { path = "../libdatadog/datadog-sidecar-ffi" }
libdd-tinybytes = { path = "../libdatadog/libdd-tinybytes" }
libdd-trace-utils = { path = "../libdatadog/libdd-trace-utils" }
libdd-crashtracker-ffi = { path = "../libdatadog/libdd-crashtracker-ffi", default-features = false, features = ["collector"] }
libdd-library-config-ffi = { path = "../libdatadog/libdd-library-config-ffi", default-features = false }
spawn_worker = { path = "../libdatadog/spawn_worker" }
datadog-ffe = { path = "../libdatadog/datadog-ffe" }
anyhow = { version = "1.0" }
const-str = "0.5.6"
itertools = "0.11.0"
Expand Down
34 changes: 33 additions & 1 deletion components-rs/ddtrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,46 @@ uint32_t ddog_get_logs_count(ddog_CharSlice level);

void ddog_init_remote_config(bool live_debugging_enabled,
bool appsec_activation,
bool appsec_config);
bool appsec_config,
bool ffe_enabled);

struct ddog_RemoteConfigState *ddog_init_remote_config_state(const struct ddog_Endpoint *endpoint);

const char *ddog_remote_config_get_path(const struct ddog_RemoteConfigState *remote_config);

bool ddog_process_remote_configs(struct ddog_RemoteConfigState *remote_config);

bool ddog_ffe_load_config(const char *json);

bool ddog_ffe_has_config(void);

bool ddog_ffe_config_changed(void);

struct FfeResult;

struct FfeAttribute {
const char *key;
int32_t value_type; /* 0=string, 1=number, 2=bool */
const char *string_value;
double number_value;
bool bool_value;
Comment thread
leoromanovsky marked this conversation as resolved.
};

struct FfeResult *ddog_ffe_evaluate(
const char *flag_key,
int32_t expected_type,
const char *targeting_key,
const struct FfeAttribute *attributes,
size_t attributes_count);

const char *ddog_ffe_result_value(const struct FfeResult *r);
const char *ddog_ffe_result_variant(const struct FfeResult *r);
const char *ddog_ffe_result_allocation_key(const struct FfeResult *r);
int32_t ddog_ffe_result_reason(const struct FfeResult *r);
int32_t ddog_ffe_result_error_code(const struct FfeResult *r);
bool ddog_ffe_result_do_log(const struct FfeResult *r);
void ddog_ffe_free_result(struct FfeResult *r);

bool ddog_type_can_be_instrumented(const struct ddog_RemoteConfigState *remote_config,
ddog_CharSlice typename_);

Expand Down
Loading
Loading