Repository navigation
Conversation
Expose owned prerequisite results and exposure eligibility for server SDK integrations. Environment: Datadog workspace Co-Authored-By: Codex GPT-6 <noreply@localhost>
📚 Documentation Check Results📦
|
🔒 Cargo Deny Results📦
|
🎉 All green!🧪 All tests passed 🎯 Code Coverage (details) 🔗 Commit SHA: a6cb21f | Docs | View more details | Give us feedback! |
BenchmarksComparisonBenchmark execution time: 2026-11-03 01:44:13 Comparing candidate commit a6cb21f in PR branch Found 0 performance improvements and 1 performance regressions! Performance is the same for 16 metrics, 0 unstable metrics.
|
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | a6cb21f | 1793669622 | helen/dependent-flags-sdk-ffi |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | execution_time | 31.303ms | 31.447ms ± 0.053ms | 31.443ms ± 0.029ms | 31.474ms | 31.530ms | 31.572ms | 31.580ms | 0.44% | 0.047 | 0.622 | 0.17% | 0.007ms | 1 | 50 |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | 79163.157op/s | 79500.280op/s ± 133.183op/s | 79508.193op/s ± 72.432op/s | 79576.236op/s | 79700.584op/s | 79813.198op/s | 79863.552op/s | 0.45% | -0.034 | 0.625 | 0.17% | 18.835op/s | 1 | 50 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | 191.046ms | 191.925ms ± 0.895ms | 191.664ms ± 0.225ms | 191.914ms | 194.215ms | 194.746ms | 194.779ms | 1.63% | 2.479 | 5.251 | 0.46% | 0.179ms | 1 | 25 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | 5134.035op/s | 5210.487op/s ± 24.036op/s | 5217.465op/s ± 6.142op/s | 5223.473op/s | 5225.373op/s | 5232.273op/s | 5234.333op/s | 0.32% | -2.464 | 5.196 | 0.45% | 4.807op/s | 1 | 25 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | 686.033µs | 696.655µs ± 4.014µs | 696.590µs ± 1.939µs | 699.620µs | 703.532µs | 704.311µs | 704.359µs | 1.12% | -0.540 | 0.709 | 0.57% | 0.401µs | 1 | 100 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | 141973.090op/s | 143547.789op/s ± 829.859op/s | 143556.415op/s ± 400.728op/s | 143896.507op/s | 145305.873op/s | 145732.004op/s | 145765.556op/s | 1.54% | 0.582 | 0.764 | 0.58% | 82.986op/s | 1 | 100 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | execution_time | [31.432ms; 31.461ms] or [-0.046%; +0.046%] | None | None | None |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | [79463.364op/s; 79537.196op/s] or [-0.046%; +0.046%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | [191.574ms; 192.276ms] or [-0.183%; +0.183%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | [5201.065op/s; 5219.909op/s] or [-0.181%; +0.181%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | [695.868µs; 697.442µs] or [-0.113%; +0.113%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | [143385.140op/s; 143710.439op/s] or [-0.113%; +0.113%] | None | None | None |
Group 2
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | a6cb21f | 1793669622 | helen/dependent-flags-sdk-ffi |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dependent_flags/one_prerequisite | execution_time | 727.818ns | 731.538ns ± 1.198ns | 731.370ns ± 0.290ns | 731.729ns | 732.667ns | 737.619ns | 740.429ns | 1.24% | 4.623 | 30.967 | 0.16% | 0.085ns | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| dependent_flags/one_prerequisite | execution_time | [731.372ns; 731.704ns] or [-0.023%; +0.023%] | None | None | None |
Group 3
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | a6cb21f | 1793669622 | helen/dependent-flags-sdk-ffi |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| single_flag_killswitch/rules-based | execution_time | 199.370ns | 202.372ns ± 1.885ns | 202.055ns ± 1.541ns | 203.773ns | 206.132ns | 207.101ns | 208.658ns | 3.27% | 0.482 | 0.107 | 0.93% | 0.133ns | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| single_flag_killswitch/rules-based | execution_time | [202.111ns; 202.634ns] or [-0.129%; +0.129%] | None | None | None |
Group 4
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | a6cb21f | 1793669622 | helen/dependent-flags-sdk-ffi |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dependent_flags/memoized_16_references | execution_time | 3.306µs | 3.320µs ± 0.004µs | 3.320µs ± 0.001µs | 3.321µs | 3.328µs | 3.338µs | 3.344µs | 0.74% | 1.995 | 9.073 | 0.13% | 0.000µs | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| dependent_flags/memoized_16_references | execution_time | [3.320µs; 3.321µs] or [-0.018%; +0.018%] | None | None | None |
Group 5
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | a6cb21f | 1793669622 | helen/dependent-flags-sdk-ffi |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dependent_flags/legacy | execution_time | 113.202ns | 113.896ns ± 0.116ns | 113.897ns ± 0.048ns | 113.943ns | 114.037ns | 114.152ns | 114.539ns | 0.56% | -0.563 | 12.948 | 0.10% | 0.008ns | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| dependent_flags/legacy | execution_time | [113.880ns; 113.912ns] or [-0.014%; +0.014%] | None | None | None |
Group 6
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | a6cb21f | 1793669622 | helen/dependent-flags-sdk-ffi |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sdk_test_data/rules-based | execution_time | 301.624µs | 306.945µs ± 12.094µs | 304.074µs ± 1.291µs | 305.729µs | 320.962µs | 355.625µs | 429.028µs | 41.09% | 6.836 | 57.467 | 3.93% | 0.855µs | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| sdk_test_data/rules-based | execution_time | [305.269µs; 308.622µs] or [-0.546%; +0.546%] | None | None | None |
Group 7
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | a6cb21f | 1793669622 | helen/dependent-flags-sdk-ffi |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | execution_time | 34.233ms | 34.415ms ± 0.086ms | 34.421ms ± 0.053ms | 34.459ms | 34.565ms | 34.609ms | 34.633ms | 0.62% | 0.165 | -0.058 | 0.25% | 0.012ms | 1 | 50 |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | 72185.742op/s | 72643.745op/s ± 182.297op/s | 72630.621op/s ± 111.628op/s | 72762.290op/s | 72930.973op/s | 73011.807op/s | 73029.429op/s | 0.55% | -0.151 | -0.068 | 0.25% | 25.781op/s | 1 | 50 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | 184.437ms | 185.013ms ± 0.312ms | 185.063ms ± 0.198ms | 185.210ms | 185.411ms | 185.559ms | 185.603ms | 0.29% | -0.265 | -0.715 | 0.17% | 0.062ms | 1 | 25 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | 5387.832op/s | 5405.054op/s ± 9.120op/s | 5403.576op/s ± 5.794op/s | 5411.655op/s | 5420.944op/s | 5421.781op/s | 5421.901op/s | 0.34% | 0.271 | -0.715 | 0.17% | 1.824op/s | 1 | 25 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | 846.236µs | 848.580µs ± 0.790µs | 848.566µs ± 0.549µs | 849.143µs | 849.751µs | 850.195µs | 850.533µs | 0.23% | -0.078 | -0.112 | 0.09% | 0.079µs | 1 | 100 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | 117573.276op/s | 117844.024op/s ± 109.674op/s | 117845.860op/s ± 76.182op/s | 117914.504op/s | 118024.995op/s | 118072.083op/s | 118170.362op/s | 0.28% | 0.084 | -0.108 | 0.09% | 10.967op/s | 1 | 100 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | execution_time | [34.391ms; 34.439ms] or [-0.070%; +0.070%] | None | None | None |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | [72593.215op/s; 72694.274op/s] or [-0.070%; +0.070%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | [184.890ms; 185.135ms] or [-0.066%; +0.066%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | [5401.480op/s; 5408.629op/s] or [-0.066%; +0.066%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | [848.425µs; 848.735µs] or [-0.018%; +0.018%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | [117822.528op/s; 117865.519op/s] or [-0.018%; +0.018%] | None | None | None |
Baseline
Baseline benchmark details
Group 1
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 1cf7834 | 1793629234 | helen/ffe-dependent-flags-evaluator |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | execution_time | 31.222ms | 31.356ms ± 0.047ms | 31.360ms ± 0.030ms | 31.386ms | 31.417ms | 31.445ms | 31.448ms | 0.28% | -0.615 | 0.342 | 0.15% | 0.007ms | 1 | 50 |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | 79497.190op/s | 79729.404op/s ± 119.601op/s | 79720.283op/s ± 75.564op/s | 79809.378op/s | 79945.131op/s | 80030.213op/s | 80071.549op/s | 0.44% | 0.623 | 0.355 | 0.15% | 16.914op/s | 1 | 50 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | 190.785ms | 191.513ms ± 1.011ms | 191.243ms ± 0.123ms | 191.383ms | 194.147ms | 194.833ms | 194.842ms | 1.88% | 2.937 | 7.015 | 0.52% | 0.202ms | 1 | 25 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | 5132.367op/s | 5221.716op/s ± 27.157op/s | 5228.941op/s ± 3.354op/s | 5232.014op/s | 5238.443op/s | 5241.026op/s | 5241.493op/s | 0.24% | -2.931 | 6.993 | 0.51% | 5.431op/s | 1 | 25 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | 685.136µs | 697.928µs ± 4.330µs | 699.408µs ± 2.478µs | 700.774µs | 702.946µs | 703.750µs | 703.766µs | 0.62% | -1.115 | 0.601 | 0.62% | 0.433µs | 1 | 100 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | 142092.602op/s | 143286.687op/s ± 895.127op/s | 142978.128op/s ± 506.665op/s | 143763.878op/s | 145381.118op/s | 145477.230op/s | 145956.423op/s | 2.08% | 1.140 | 0.665 | 0.62% | 89.513op/s | 1 | 100 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | execution_time | [31.343ms; 31.369ms] or [-0.042%; +0.042%] | None | None | None |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | [79696.253op/s; 79762.555op/s] or [-0.042%; +0.042%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | [191.117ms; 191.909ms] or [-0.207%; +0.207%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | [5211.071op/s; 5232.361op/s] or [-0.204%; +0.204%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | [697.080µs; 698.777µs] or [-0.122%; +0.122%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | [143111.245op/s; 143462.128op/s] or [-0.122%; +0.122%] | None | None | None |
Group 2
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 1cf7834 | 1793629234 | helen/ffe-dependent-flags-evaluator |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dependent_flags/one_prerequisite | execution_time | 718.396ns | 722.385ns ± 1.011ns | 722.296ns ± 0.274ns | 722.575ns | 723.418ns | 726.757ns | 731.304ns | 1.25% | 3.927 | 34.205 | 0.14% | 0.071ns | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| dependent_flags/one_prerequisite | execution_time | [722.245ns; 722.525ns] or [-0.019%; +0.019%] | None | None | None |
Group 3
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 1cf7834 | 1793629234 | helen/ffe-dependent-flags-evaluator |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| single_flag_killswitch/rules-based | execution_time | 199.889ns | 203.039ns ± 1.929ns | 202.689ns ± 1.411ns | 204.435ns | 206.582ns | 207.611ns | 208.777ns | 3.00% | 0.373 | -0.257 | 0.95% | 0.136ns | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| single_flag_killswitch/rules-based | execution_time | [202.772ns; 203.307ns] or [-0.132%; +0.132%] | None | None | None |
Group 4
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 1cf7834 | 1793629234 | helen/ffe-dependent-flags-evaluator |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dependent_flags/memoized_16_references | execution_time | 2.997µs | 3.012µs ± 0.005µs | 3.011µs ± 0.001µs | 3.013µs | 3.015µs | 3.027µs | 3.065µs | 1.79% | 6.588 | 57.641 | 0.18% | 0.000µs | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| dependent_flags/memoized_16_references | execution_time | [3.011µs; 3.013µs] or [-0.025%; +0.025%] | None | None | None |
Group 5
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 1cf7834 | 1793629234 | helen/ffe-dependent-flags-evaluator |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dependent_flags/legacy | execution_time | 110.380ns | 110.935ns ± 0.128ns | 110.930ns ± 0.042ns | 110.970ns | 111.085ns | 111.334ns | 111.689ns | 0.68% | 1.420 | 12.868 | 0.11% | 0.009ns | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| dependent_flags/legacy | execution_time | [110.917ns; 110.953ns] or [-0.016%; +0.016%] | None | None | None |
Group 6
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 1cf7834 | 1793629234 | helen/ffe-dependent-flags-evaluator |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sdk_test_data/rules-based | execution_time | 301.576µs | 306.855µs ± 11.645µs | 303.913µs ± 1.116µs | 305.545µs | 318.728µs | 354.609µs | 421.679µs | 38.75% | 6.709 | 54.626 | 3.79% | 0.823µs | 1 | 200 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| sdk_test_data/rules-based | execution_time | [305.241µs; 308.469µs] or [-0.526%; +0.526%] | None | None | None |
Group 7
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 1cf7834 | 1793629234 | helen/ffe-dependent-flags-evaluator |
| scenario | metric | min | mean ± sd | median ± mad | p75 | p95 | p99 | max | peak_to_median_ratio | skewness | kurtosis | cv | sem | runs | sample_size |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | execution_time | 34.384ms | 34.597ms ± 0.102ms | 34.608ms ± 0.069ms | 34.664ms | 34.727ms | 34.819ms | 34.850ms | 0.70% | -0.060 | -0.302 | 0.29% | 0.014ms | 1 | 50 |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | 71735.993op/s | 72262.225op/s ± 213.305op/s | 72236.807op/s ± 144.222op/s | 72405.895op/s | 72616.431op/s | 72686.985op/s | 72707.868op/s | 0.65% | 0.075 | -0.310 | 0.29% | 30.166op/s | 1 | 50 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | 181.901ms | 182.497ms ± 0.373ms | 182.522ms ± 0.214ms | 182.672ms | 183.122ms | 183.384ms | 183.454ms | 0.51% | 0.500 | 0.301 | 0.20% | 0.075ms | 1 | 25 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | 5450.959op/s | 5479.549op/s ± 11.201op/s | 5478.795op/s ± 6.425op/s | 5487.757op/s | 5496.780op/s | 5497.358op/s | 5497.482op/s | 0.34% | -0.488 | 0.281 | 0.20% | 2.240op/s | 1 | 25 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | 836.113µs | 837.936µs ± 0.889µs | 837.877µs ± 0.588µs | 838.490µs | 839.435µs | 840.087µs | 840.474µs | 0.31% | 0.425 | 0.043 | 0.11% | 0.089µs | 1 | 100 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | 118980.510op/s | 119340.948op/s ± 126.519op/s | 119349.266op/s ± 83.787op/s | 119424.125op/s | 119542.600op/s | 119576.452op/s | 119601.053op/s | 0.21% | -0.419 | 0.036 | 0.11% | 12.652op/s | 1 | 100 |
| scenario | metric | 95% CI mean | Shapiro-Wilk pvalue | Ljung-Box pvalue (lag=1) | Dip test pvalue |
|---|---|---|---|---|---|
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | execution_time | [34.568ms; 34.625ms] or [-0.082%; +0.082%] | None | None | None |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | [72203.101op/s; 72321.349op/s] or [-0.082%; +0.082%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | [182.351ms; 182.644ms] or [-0.080%; +0.080%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | [5475.159op/s; 5483.940op/s] or [-0.080%; +0.080%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | [837.762µs; 838.110µs] or [-0.021%; +0.021%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | [119316.151op/s; 119365.745op/s] or [-0.021%; +0.021%] | None | None | None |
Artifact Size Benchmark Reportaarch64-alpine-linux-musl
aarch64-unknown-linux-gnu
libdatadog-x64-windows
libdatadog-x86-windows
x86_64-alpine-linux-musl
x86_64-unknown-linux-gnu
|
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a6cb21f762
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| }; | ||
|
|
||
| let assignment_result = config.eval_flag_with_options( | ||
| let evaluation = config.eval_flag_with_trace( |
There was a problem hiding this comment.
Preserve evaluation trace logging
When any ddog_ffe_get_assignment* entry point is used with trace logging enabled, this direct call to eval_flag_with_trace bypasses Configuration::eval_flag_with_options, whose success and failure branches emit the evaluator's log::trace! records. Consequently, all C FFI evaluations silently lose their existing diagnostic logs, including evaluations without prerequisites; retain equivalent logging while collecting the trace.
Useful? React with 👍 / 👎.
| /// `assignment` must be a live handle. | ||
| #[unsafe(no_mangle)] | ||
| // allow(ffi-panic-boundary): reads the length of an owned vector. | ||
| pub unsafe extern "C" fn ddog_ffe_assignment_dependency_count( |
There was a problem hiding this comment.
🤖 Comment from Claude working with Aaron Silverman:
Heads up: This PR is based on 1cf7834, not on the current head of #2748 (983b4b0).
- A merge of this head with
983b4b0is clean, and983b4b0does not change any type that this PR uses. 983b4b0does change behavior that these accessors expose: prerequisites rejected by the depth guard now appear inddog_ffe_assignment_dependency_count, an invalidmaxDependencyDepthno longer failsddog_ffe_configuration_new, and empty value lists are accepted.- This PR also conflicts with
mainin this file:mainaddsfeaturesandfeature_destinationsnext to the newdependenciesfield. Keep all three fields. - The description reports 991 Ruby OpenFeature examples against a local build of this stack. Please rerun them after the rebase.
| /// # Safety | ||
| /// `assignment` must be a live handle. | ||
| #[unsafe(no_mangle)] | ||
| pub unsafe extern "C" fn ddog_ffe_assignment_dependency_result( |
There was a problem hiding this comment.
🤖 Comment from Claude working with Aaron Silverman:
[P3] Small API points to settle before these accessors ship.
- This function returns an owned handle, but it has no
#[must_use]. A caller that ignores the result leaks it. With#[must_use], cbindgen emitsDDOG_CHECK_RETURN. - The new names (
ddog_ffe_assignment_dependency_{count,key,exposure_eligible,result}) do not follow the existingddog_ffe_assignment_get_*pattern. Considerddog_ffe_assignment_get_dependency_*, before callers depend on them. - The
allow(ffi-panic-boundary)comments say these calls only read an owned vector.Handle::as_refcan panic on a null handle, as the existing accessors can; these accessors require a live handle. Please reword the comments to say so. - The open Codex thread on line 298 is valid: calling
eval_flag_with_tracedirectly bypasses the evaluator'slog::trace!records for every C FFI evaluation. The impact is low (trace level only). The fix belongs ineval_flag_with_tracein feat(ffe): evaluate dependent flags with prerequisite telemetry #2748.
Ruby calls the shared Rust feature-flag evaluator through its existing C extension and libdatadog's C FFI. The evaluator can now evaluate prerequisite flags, but the C FFI currently drops those prerequisite observations when converting the result into a resolution handle. Ruby therefore cannot report the prerequisite evaluations and eligible exposures associated with a dependent-flag assignment.
This PR carries those observations across the C FFI boundary so dd-trace-rb #6613 can consume them:
The accessors expose each reached prerequisite's flag key, evaluation result (including errors), and exposure eligibility. The Ruby integration uses these results to report prerequisite evaluation counts/metrics and eligible exposures, respecting the evaluator's decisions about which prerequisites contributed to the assignment. Each child result is independently owned and remains valid after the root result and configuration are freed.
This is an extension of the native bridge used by Ruby; it does not introduce a standalone C feature-flagging SDK. Dependent-flag evaluation logic lives in #2748. Ruby-side capability advertisement, result consumption, and telemetry are implemented in dd-trace-rb #6613.
Stacked on #2748; this diff contains only the FFI integration and its tests. Ruby's release dependency must be updated to a published libdatadog package containing both PRs before default installations can enable dependent-flag support.
Validation: 9 FFI unit tests and doc tests; cargo check, Clippy and formatting; AST checks (existing repository warnings); C FFI ownership example compiled and passed through
cargo ffi-test --skip-build --filter ffe_dependencies. The Ruby consumer also passed 991 OpenFeature examples against a clean local native build of this stack.