Repository navigation
[Feature Flags] Add privacy-protected flagevaluation EVP events through the Agent - #9351
Conversation
…dotnet # Conflicts: # Datadog.Trace.Build.g.sln # Datadog.Trace.sln
Execution-Time Benchmarks Report ⏱️Execution-time results for samples comparing This PR (9351) and master. ✅ No regressions detected |
BenchmarksBenchmark execution time: 2026-10-19 15:50:16 Comparing candidate commit 27f6512 in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 72 metrics, 0 unstable metrics, 11 known flaky benchmarks, 115 flaky benchmarks without significant changes.
|
Supporting evidence: performance and validation historyPreserved from the PR description on October 5, 2026 so the overview can stay concise. This comment records existing evidence, not a new test or benchmark run. Unit validation is at Measured performance overheadThe historical measurements below used the former 16,384-observation queue. The current default is 4,096 for cross-SDK consistency; these results have not been rerun with the smaller queue. These are local engineering measurements, not final-head measurements or a claim of performance equivalence. Baseline: Native ARM64, Linux/musl, .NET 10.0.12; real OpenFeature/native-instrumentation path and a responsive local Agent fixture. Each burst run measured 100,000 evaluations, 64 subjects and eight attributes after warm-up. Values are medians of three serial runs. CPUs mean affinity slots, not container quotas. Caller latency excludes final flush; CPU and allocation include all process threads and final flush.
Test coverage
Detailed design considerationsKey decisions / assumptions
|
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
There was a problem hiding this comment.
On .NET Core 3.1, a saturated Agent Unix socket backlog can block event delivery beyond the five-second deadline, eventually filling the evaluation queue and dropping subsequent events.
🤖 Bits Code Review · Commit cef4278
Note to self: ffe-dogfoodingPASS — no evaluation-result regressions in the tested matrix. Rerun 2026-10-09 on the native ARM64 workspace, comparing this PR at
Used harness main All cases passed first-run. Run-owned containers/network/volumes were removed. This rerun does not refresh performance, mixed-version, or agentless-delivery evidence. Installed artifact identity (SHA-256)
|
Note to self: system-testsPASS — all 51 selected Agent-only FFE tests pass at
Latest dogfooding results and artifact hashes. Commands on each pinned local build: ./build.sh dotnet -w poc --docker-platform linux/arm64/v8 --binary-path <staged-local-artifacts> -i weblog
./run.sh FEATURE_FLAGGING_AND_EXPERIMENTATION --library dotnet tests/ffe/test_flag_eval_evp.py
./run.sh FEATURE_FLAGGING_AND_EXPERIMENTATION --library dotnet tests/ffe |
|
/code blockers |
|
View all feedbacks in Devflow UI.
Checking merge blockers for #9351...
Detected 3 merge blocker(s) to address: 🔴 Blocking
|
Integrate Agentless evaluation delivery with the existing exposure transport policy while retaining privacy, payload limits, and bounded flushing. Keep separate transport instances, preserve Remote Config admission, and fix startup exporter settings replay.
…dotnet # Conflicts: # tracer/src/Datadog.Tracer.Native/Generated/generated_calltargets.g.cpp
|
@arp review |
Pre-merge blocker: no-Agent behavior
flagevaluationdelivery when that transport work lands.flagevaluationemission. Before merging this PR, decide and validate transport reuse or an explicit no-Agent gating policy. The current implementation remains Agent-only and can build/queue events that cannot be delivered without an Agent. Review discussion.Summary of changes
Adds aggregated
flagevaluationtrack EVP events for successful and unsuccessful Datadog OpenFeature evaluations, protecting targeting keys and context by default without changing flag results.Key decisions / assumptions
trueforobserveFullEvaluationDataallows raw keys and bounded context; consent and timestamp are captured once per evaluation.Measured performance overhead
Historical comparison:
b32fca42ccvs masterf0114c8c71, before the worker-batching change; 4,096-entry queue. ARM64 Linux/glibc, .NET 10.0.12; 100,000-evaluation bursts, medians of three runs. CPUs are affinity slots, not quotas; process CPU/allocation include final flush, caller latency does not.Historical methodology, full workload matrix, and memory results. Earlier experiments and validation history used different artifacts/settings and are not an isolated optimization comparison.
Test coverage
cef427882a: targeted feature-flag, telemetry, and metadata tests: 1,312 passed / two skipped on each of .NET 10 and .NET Core 3.1. Tracer builds passed for all four target frameworks with zero warnings/errors. Subsequent commits changed only CODEOWNERS; these runs do not replace final-head external/performance validation.7fe8e0651f: 780 feature-flag tests passed / two platform skips; benchmark project built with zero warnings/errors. Full tracer suite: 13,507 passed / 71 skipped / zero failed. Writer-attribution fix and regression coverage.b32fca42cc: 746 feature-flag tests passed / one skipped; full tracer suite 13,473 passed / 70 skipped / zero failed. Benchmark project built without warnings/errors.b32fca42cc: all 51 Agent-only FFE tests passed, including all 12 EVP cases; baseline passed the other 39 and failed only those 12 unimplemented cases. All 12,000 degradation observations retained.b32fca42cc: identical results across 81 live, 24 controlled-consent, and six no-Agent requests. Verified emission, SDK identity, strict consent, and mixed-version/uninstrumented safety.Reviewer QA
Compare flag results with emission on/off and with the Agent disconnected. Verify strict consent, protected payloads, and unchanged exposure/span-enrichment behavior; disabling emission must produce no new
flagevaluationevents.Blast radius
DD_FLAGGING_EVALUATION_COUNTS_ENABLED=falsedisables them. Hook registration is decided when the provider is constructed; enabling events after starting disabled requires provider recreation or an application restart. Adds CPU/allocation and best-effort shutdown work; consented snapshots retain more data.External follow-ups
External/performance results above predate the latest review fixes and need a final-head refresh. Remaining coordination, in addition to the no-Agent blocker above: