Skip to content

Conversation

@sameerank
Copy link

@sameerank sameerank commented Oct 24, 2025

What does this PR do?

Adds a datadog-ffe-ffi crate, which provides a C FFI (Foreign Function Interface) bindings for the datadog-ffe (Feature Flag Evaluation) library. This is to allow dd-trace-rb to interact with the feature flag evaluation engine through a C-compatible API.

The crate exposes the following key components:

  • Configuration: FFI bindings for feature flag configuration management
  • Evaluation Context: FFI bindings for creating and managing evaluation contexts used for flag evaluation
  • Assignment: FFI bindings for handling feature flag assignment results
  • Error handling: FFI-compatible error types and handling

Motivation

The motivation for FFL-1284 is to enable non-Rust languages (PHP, Ruby, Python, etc.) to use the feature flag evaluator in libdatadog, for consistent feature flag evaluation in SDKs across languages.

Additional Notes

  • The crate follows similar patterns to other *-ffi crates in this repository (e.g., datadog-profiling-ffi, datadog-crashtracker-ffi)
  • Uses cbindgen for automatic C generation
  • Configured to build as both static and dynamic libraries (staticlib, cdylib)

How to test the change?

  1. Build verification: cargo build -p datadog-ffe-ffi
  2. Verify C headers are generated: cargo build -p datadog-ffe-ffi --features cbindgen (Check that headers are generated in target/include/)
  3. Integration testing: Verify binding works locally in [FFL-1273] bindings for libdatadog datadog ffe api dd-trace-rb#5001 [FFL-1273] bindings for ffe in openfeature provider dd-trace-rb#5007

@pr-commenter
Copy link

pr-commenter bot commented Oct 24, 2025

Benchmarks

Comparison

Benchmark execution time: 2025-11-07 17:57:42

Comparing candidate commit e290eb7 in PR branch sameerank/FFL-1284-Create-datadog-ffe-ffi-crate with baseline commit b78a66b in branch main.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 55 metrics, 2 unstable metrics.

Candidate

Candidate benchmark details

Group 1

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
credit_card/is_card_number/ execution_time 3.892µs 3.915µs ± 0.003µs 3.915µs ± 0.002µs 3.917µs 3.920µs 3.922µs 3.922µs 0.17% -2.204 17.489 0.08% 0.000µs 1 200
credit_card/is_card_number/ throughput 254979386.005op/s 255407670.134op/s ± 193383.976op/s 255415835.782op/s ± 118204.599op/s 255529636.593op/s 255649053.322op/s 255725680.941op/s 256932628.824op/s 0.59% 2.238 17.802 0.08% 13674.312op/s 1 200
credit_card/is_card_number/ 3782-8224-6310-005 execution_time 76.327µs 77.747µs ± 0.656µs 77.652µs ± 0.357µs 78.049µs 78.975µs 79.592µs 79.618µs 2.53% 0.643 0.424 0.84% 0.046µs 1 200
credit_card/is_card_number/ 3782-8224-6310-005 throughput 12559999.556op/s 12863196.086op/s ± 107926.995op/s 12877891.522op/s ± 59199.835op/s 12931904.787op/s 13020399.111op/s 13066202.695op/s 13101541.005op/s 1.74% -0.593 0.349 0.84% 7631.591op/s 1 200
credit_card/is_card_number/ 378282246310005 execution_time 70.765µs 72.075µs ± 0.721µs 71.998µs ± 0.510µs 72.530µs 73.328µs 73.841µs 74.088µs 2.90% 0.349 -0.384 1.00% 0.051µs 1 200
credit_card/is_card_number/ 378282246310005 throughput 13497518.433op/s 13875875.374op/s ± 138279.488op/s 13889240.589op/s ± 98335.789op/s 13976342.604op/s 14094048.687op/s 14126174.434op/s 14131325.232op/s 1.74% -0.305 -0.431 0.99% 9777.836op/s 1 200
credit_card/is_card_number/37828224631 execution_time 3.898µs 3.916µs ± 0.003µs 3.916µs ± 0.002µs 3.918µs 3.920µs 3.922µs 3.927µs 0.27% -0.928 7.221 0.08% 0.000µs 1 200
credit_card/is_card_number/37828224631 throughput 254646704.120op/s 255346706.697op/s ± 192366.541op/s 255346121.968op/s ± 117867.634op/s 255462901.353op/s 255642256.847op/s 255686262.260op/s 256560293.929op/s 0.48% 0.947 7.328 0.08% 13602.369op/s 1 200
credit_card/is_card_number/378282246310005 execution_time 67.205µs 68.606µs ± 0.766µs 68.602µs ± 0.610µs 69.161µs 69.882µs 70.359µs 70.704µs 3.06% 0.252 -0.555 1.11% 0.054µs 1 200
credit_card/is_card_number/378282246310005 throughput 14143547.579op/s 14577741.799op/s ± 162411.926op/s 14576880.753op/s ± 130060.949op/s 14712788.653op/s 14833934.148op/s 14860007.012op/s 14879947.671op/s 2.08% -0.207 -0.603 1.11% 11484.257op/s 1 200
credit_card/is_card_number/37828224631000521389798 execution_time 52.653µs 52.974µs ± 0.103µs 52.968µs ± 0.072µs 53.051µs 53.144µs 53.161µs 53.168µs 0.38% -0.127 -0.340 0.19% 0.007µs 1 200
credit_card/is_card_number/37828224631000521389798 throughput 18808182.216op/s 18877159.325op/s ± 36600.080op/s 18879252.647op/s ± 25837.549op/s 18902808.487op/s 18933357.269op/s 18970911.122op/s 18992254.878op/s 0.60% 0.137 -0.327 0.19% 2588.016op/s 1 200
credit_card/is_card_number/x371413321323331 execution_time 6.427µs 6.437µs ± 0.004µs 6.437µs ± 0.003µs 6.440µs 6.444µs 6.448µs 6.455µs 0.27% 0.502 1.057 0.06% 0.000µs 1 200
credit_card/is_card_number/x371413321323331 throughput 154922453.980op/s 155343440.691op/s ± 100189.295op/s 155344708.208op/s ± 73499.716op/s 155418864.348op/s 155498309.326op/s 155539431.648op/s 155583878.344op/s 0.15% -0.497 1.042 0.06% 7084.453op/s 1 200
credit_card/is_card_number_no_luhn/ execution_time 3.896µs 3.915µs ± 0.003µs 3.915µs ± 0.002µs 3.917µs 3.920µs 3.922µs 3.923µs 0.22% -0.773 6.785 0.08% 0.000µs 1 200
credit_card/is_card_number_no_luhn/ throughput 254894676.123op/s 255425116.702op/s ± 196845.182op/s 255447186.295op/s ± 117341.279op/s 255549704.422op/s 255685934.812op/s 255736318.289op/s 256662888.214op/s 0.48% 0.792 6.902 0.08% 13919.056op/s 1 200
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 execution_time 64.917µs 65.177µs ± 0.159µs 65.130µs ± 0.081µs 65.270µs 65.477µs 65.690µs 65.819µs 1.06% 1.203 1.600 0.24% 0.011µs 1 200
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 throughput 15193238.259op/s 15342902.891op/s ± 37345.194op/s 15353976.462op/s ± 19186.634op/s 15368817.054op/s 15388880.072op/s 15395671.081op/s 15404253.114op/s 0.33% -1.187 1.542 0.24% 2640.704op/s 1 200
credit_card/is_card_number_no_luhn/ 378282246310005 execution_time 58.471µs 58.800µs ± 0.208µs 58.770µs ± 0.130µs 58.925µs 59.173µs 59.392µs 59.654µs 1.50% 1.089 1.547 0.35% 0.015µs 1 200
credit_card/is_card_number_no_luhn/ 378282246310005 throughput 16763392.750op/s 17007051.255op/s ± 59944.719op/s 17015593.300op/s ± 37856.755op/s 17050084.197op/s 17080651.977op/s 17096042.943op/s 17102587.622op/s 0.51% -1.064 1.453 0.35% 4238.732op/s 1 200
credit_card/is_card_number_no_luhn/37828224631 execution_time 3.894µs 3.915µs ± 0.003µs 3.915µs ± 0.002µs 3.917µs 3.919µs 3.922µs 3.924µs 0.24% -1.399 12.020 0.08% 0.000µs 1 200
credit_card/is_card_number_no_luhn/37828224631 throughput 254845124.484op/s 255437471.652op/s ± 193371.696op/s 255453200.974op/s ± 118471.367op/s 255561104.660op/s 255657687.105op/s 255744039.672op/s 256827231.768op/s 0.54% 1.426 12.232 0.08% 13673.444op/s 1 200
credit_card/is_card_number_no_luhn/378282246310005 execution_time 55.393µs 55.745µs ± 0.210µs 55.702µs ± 0.136µs 55.869µs 56.115µs 56.408µs 56.417µs 1.28% 0.896 0.470 0.38% 0.015µs 1 200
credit_card/is_card_number_no_luhn/378282246310005 throughput 17725155.511op/s 17939231.547op/s ± 67393.183op/s 17952525.444op/s ± 43909.133op/s 17992586.605op/s 18019711.422op/s 18031683.064op/s 18052741.083op/s 0.56% -0.877 0.417 0.37% 4765.418op/s 1 200
credit_card/is_card_number_no_luhn/37828224631000521389798 execution_time 52.635µs 52.947µs ± 0.110µs 52.946µs ± 0.067µs 53.000µs 53.141µs 53.183µs 53.205µs 0.49% 0.039 -0.023 0.21% 0.008µs 1 200
credit_card/is_card_number_no_luhn/37828224631000521389798 throughput 18795282.086op/s 18886981.352op/s ± 39076.019op/s 18887039.713op/s ± 23906.021op/s 18913961.816op/s 18946120.001op/s 18977178.409op/s 18998665.771op/s 0.59% -0.026 -0.016 0.21% 2763.092op/s 1 200
credit_card/is_card_number_no_luhn/x371413321323331 execution_time 6.429µs 6.438µs ± 0.004µs 6.438µs ± 0.003µs 6.441µs 6.445µs 6.448µs 6.451µs 0.19% 0.185 -0.187 0.06% 0.000µs 1 200
credit_card/is_card_number_no_luhn/x371413321323331 throughput 155021472.920op/s 155316933.892op/s ± 97671.923op/s 155318179.996op/s ± 69419.841op/s 155385617.475op/s 155471627.479op/s 155512447.889op/s 155542584.214op/s 0.14% -0.182 -0.191 0.06% 6906.448op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
credit_card/is_card_number/ execution_time [3.915µs; 3.916µs] or [-0.010%; +0.010%] None None None
credit_card/is_card_number/ throughput [255380868.975op/s; 255434471.294op/s] or [-0.010%; +0.010%] None None None
credit_card/is_card_number/ 3782-8224-6310-005 execution_time [77.656µs; 77.838µs] or [-0.117%; +0.117%] None None None
credit_card/is_card_number/ 3782-8224-6310-005 throughput [12848238.443op/s; 12878153.730op/s] or [-0.116%; +0.116%] None None None
credit_card/is_card_number/ 378282246310005 execution_time [71.975µs; 72.175µs] or [-0.139%; +0.139%] None None None
credit_card/is_card_number/ 378282246310005 throughput [13856711.167op/s; 13895039.581op/s] or [-0.138%; +0.138%] None None None
credit_card/is_card_number/37828224631 execution_time [3.916µs; 3.917µs] or [-0.010%; +0.010%] None None None
credit_card/is_card_number/37828224631 throughput [255320046.545op/s; 255373366.850op/s] or [-0.010%; +0.010%] None None None
credit_card/is_card_number/378282246310005 execution_time [68.500µs; 68.712µs] or [-0.155%; +0.155%] None None None
credit_card/is_card_number/378282246310005 throughput [14555233.068op/s; 14600250.530op/s] or [-0.154%; +0.154%] None None None
credit_card/is_card_number/37828224631000521389798 execution_time [52.960µs; 52.989µs] or [-0.027%; +0.027%] None None None
credit_card/is_card_number/37828224631000521389798 throughput [18872086.906op/s; 18882231.744op/s] or [-0.027%; +0.027%] None None None
credit_card/is_card_number/x371413321323331 execution_time [6.437µs; 6.438µs] or [-0.009%; +0.009%] None None None
credit_card/is_card_number/x371413321323331 throughput [155329555.418op/s; 155357325.963op/s] or [-0.009%; +0.009%] None None None
credit_card/is_card_number_no_luhn/ execution_time [3.915µs; 3.915µs] or [-0.011%; +0.011%] None None None
credit_card/is_card_number_no_luhn/ throughput [255397835.853op/s; 255452397.551op/s] or [-0.011%; +0.011%] None None None
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 execution_time [65.155µs; 65.199µs] or [-0.034%; +0.034%] None None None
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 throughput [15337727.207op/s; 15348078.576op/s] or [-0.034%; +0.034%] None None None
credit_card/is_card_number_no_luhn/ 378282246310005 execution_time [58.771µs; 58.829µs] or [-0.049%; +0.049%] None None None
credit_card/is_card_number_no_luhn/ 378282246310005 throughput [16998743.493op/s; 17015359.016op/s] or [-0.049%; +0.049%] None None None
credit_card/is_card_number_no_luhn/37828224631 execution_time [3.914µs; 3.915µs] or [-0.010%; +0.010%] None None None
credit_card/is_card_number_no_luhn/37828224631 throughput [255410672.195op/s; 255464271.109op/s] or [-0.010%; +0.010%] None None None
credit_card/is_card_number_no_luhn/378282246310005 execution_time [55.715µs; 55.774µs] or [-0.052%; +0.052%] None None None
credit_card/is_card_number_no_luhn/378282246310005 throughput [17929891.500op/s; 17948571.594op/s] or [-0.052%; +0.052%] None None None
credit_card/is_card_number_no_luhn/37828224631000521389798 execution_time [52.932µs; 52.962µs] or [-0.029%; +0.029%] None None None
credit_card/is_card_number_no_luhn/37828224631000521389798 throughput [18881565.791op/s; 18892396.912op/s] or [-0.029%; +0.029%] None None None
credit_card/is_card_number_no_luhn/x371413321323331 execution_time [6.438µs; 6.439µs] or [-0.009%; +0.009%] None None None
credit_card/is_card_number_no_luhn/x371413321323331 throughput [155303397.503op/s; 155330470.281op/s] or [-0.009%; +0.009%] None None None

Group 2

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
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 173.425ns 178.519ns ± 9.651ns 177.131ns ± 2.051ns 179.282ns 185.543ns 190.087ns 303.866ns 71.55% 11.101 140.821 5.39% 0.682ns 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 [177.182ns; 179.857ns] or [-0.749%; +0.749%] None None None

Group 3

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching deserializing traces from msgpack to their internal representation execution_time 59.965ms 60.393ms ± 2.254ms 60.087ms ± 0.048ms 60.146ms 60.372ms 73.211ms 81.795ms 36.13% 8.362 70.097 3.72% 0.159ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching deserializing traces from msgpack to their internal representation execution_time [60.081ms; 60.706ms] or [-0.517%; +0.517%] None None None

Group 4

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching string interning on wordpress profile execution_time 162.113µs 162.871µs ± 0.323µs 162.829µs ± 0.112µs 162.973µs 163.266µs 163.821µs 165.764µs 1.80% 4.046 32.090 0.20% 0.023µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching string interning on wordpress profile execution_time [162.826µs; 162.916µs] or [-0.027%; +0.027%] None None None

Group 5

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching serializing traces from their internal representation to msgpack execution_time 14.632ms 14.692ms ± 0.036ms 14.688ms ± 0.017ms 14.704ms 14.747ms 14.845ms 14.880ms 1.31% 2.224 7.499 0.25% 0.003ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching serializing traces from their internal representation to msgpack execution_time [14.687ms; 14.698ms] or [-0.034%; +0.034%] None None None

Group 6

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
ip_address/quantize_peer_ip_address_benchmark execution_time 4.967µs 5.039µs ± 0.049µs 5.033µs ± 0.045µs 5.079µs 5.121µs 5.129µs 5.130µs 1.92% 0.193 -1.224 0.97% 0.003µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
ip_address/quantize_peer_ip_address_benchmark execution_time [5.032µs; 5.046µs] or [-0.135%; +0.135%] None None None

Group 7

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
tags/replace_trace_tags execution_time 2.404µs 2.440µs ± 0.016µs 2.439µs ± 0.009µs 2.446µs 2.473µs 2.495µs 2.498µs 2.39% 1.441 2.906 0.66% 0.001µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
tags/replace_trace_tags execution_time [2.438µs; 2.442µs] or [-0.091%; +0.091%] None None None

Group 8

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
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 121.574µs 123.779µs ± 1.491µs 123.573µs ± 0.579µs 124.186µs 125.343µs 130.103µs 137.149µs 10.99% 4.943 36.638 1.20% 0.105µ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 [123.572µs; 123.986µs] or [-0.167%; +0.167%] None None None

Group 9

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_trace/test_trace execution_time 248.430ns 257.975ns ± 11.713ns 251.498ns ± 1.957ns 261.263ns 285.470ns 291.206ns 306.038ns 21.69% 1.726 2.336 4.53% 0.828ns 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_trace/test_trace execution_time [256.352ns; 259.598ns] or [-0.629%; +0.629%] None None None

Group 10

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
write only interface execution_time 1.175µs 3.247µs ± 1.449µs 3.021µs ± 0.029µs 3.055µs 3.695µs 14.517µs 14.760µs 388.52% 7.275 54.276 44.50% 0.102µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
write only interface execution_time [3.046µs; 3.448µs] or [-6.183%; +6.183%] None None None

Group 11

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... execution_time 534.405µs 536.009µs ± 1.359µs 535.522µs ± 0.572µs 536.574µs 538.479µs 541.313µs 543.245µs 1.44% 1.941 5.318 0.25% 0.096µs 1 200
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... throughput 1840791.064op/s 1865651.547op/s ± 4707.338op/s 1867335.994op/s ± 1991.382op/s 1868808.695op/s 1870299.453op/s 1870878.608op/s 1871241.007op/s 0.21% -1.915 5.147 0.25% 332.859op/s 1 200
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて execution_time 380.205µs 380.976µs ± 0.398µs 380.951µs ± 0.223µs 381.184µs 381.501µs 381.781µs 384.105µs 0.83% 2.462 17.589 0.10% 0.028µs 1 200
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて throughput 2603457.142op/s 2624842.598op/s ± 2734.155op/s 2625012.961op/s ± 1536.925op/s 2626469.428op/s 2628571.068op/s 2629719.715op/s 2630159.744op/s 0.20% -2.420 17.180 0.10% 193.334op/s 1 200
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters execution_time 189.929µs 190.348µs ± 0.189µs 190.339µs ± 0.121µs 190.485µs 190.649µs 190.751µs 190.980µs 0.34% 0.132 -0.028 0.10% 0.013µs 1 200
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters throughput 5236163.739op/s 5253553.067op/s ± 5217.194op/s 5253783.684op/s ± 3333.144op/s 5256740.559op/s 5262415.227op/s 5264554.963op/s 5265129.654op/s 0.22% -0.127 -0.034 0.10% 368.911op/s 1 200
normalization/normalize_service/normalize_service/[empty string] execution_time 37.708µs 37.795µs ± 0.038µs 37.793µs ± 0.028µs 37.822µs 37.858µs 37.871µs 37.886µs 0.25% 0.119 -0.666 0.10% 0.003µs 1 200
normalization/normalize_service/normalize_service/[empty string] throughput 26394841.694op/s 26458411.309op/s ± 26698.439op/s 26460032.712op/s ± 19511.840op/s 26479184.583op/s 26500016.689op/s 26508157.346op/s 26519395.623op/s 0.22% -0.115 -0.667 0.10% 1887.865op/s 1 200
normalization/normalize_service/normalize_service/test_ASCII execution_time 45.838µs 45.925µs ± 0.047µs 45.919µs ± 0.028µs 45.949µs 46.009µs 46.050µs 46.150µs 0.50% 0.940 2.000 0.10% 0.003µs 1 200
normalization/normalize_service/normalize_service/test_ASCII throughput 21668331.517op/s 21774509.739op/s ± 22234.903op/s 21777514.621op/s ± 13266.041op/s 21789206.141op/s 21806650.198op/s 21812555.766op/s 21815971.133op/s 0.18% -0.930 1.960 0.10% 1572.245op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... execution_time [535.821µs; 536.198µs] or [-0.035%; +0.035%] None None None
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... throughput [1864999.155op/s; 1866303.939op/s] or [-0.035%; +0.035%] None None None
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて execution_time [380.920µs; 381.031µs] or [-0.014%; +0.014%] None None None
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて throughput [2624463.670op/s; 2625221.525op/s] or [-0.014%; +0.014%] None None None
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters execution_time [190.321µs; 190.374µs] or [-0.014%; +0.014%] None None None
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters throughput [5252830.014op/s; 5254276.120op/s] or [-0.014%; +0.014%] None None None
normalization/normalize_service/normalize_service/[empty string] execution_time [37.790µs; 37.800µs] or [-0.014%; +0.014%] None None None
normalization/normalize_service/normalize_service/[empty string] throughput [26454711.162op/s; 26462111.456op/s] or [-0.014%; +0.014%] None None None
normalization/normalize_service/normalize_service/test_ASCII execution_time [45.919µs; 45.932µs] or [-0.014%; +0.014%] None None None
normalization/normalize_service/normalize_service/test_ASCII throughput [21771428.196op/s; 21777591.283op/s] or [-0.014%; +0.014%] None None None

Group 12

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... execution_time 205.791µs 206.257µs ± 0.236µs 206.217µs ± 0.139µs 206.386µs 206.672µs 206.999µs 207.181µs 0.47% 0.908 1.595 0.11% 0.017µs 1 200
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... throughput 4826697.429op/s 4848337.082op/s ± 5553.293op/s 4849254.693op/s ± 3270.808op/s 4851824.461op/s 4856269.389op/s 4858006.596op/s 4859309.208op/s 0.21% -0.899 1.566 0.11% 392.677op/s 1 200
normalization/normalize_name/normalize_name/bad-name execution_time 18.610µs 18.779µs ± 0.107µs 18.766µs ± 0.091µs 18.867µs 18.961µs 19.035µs 19.098µs 1.77% 0.450 -0.647 0.57% 0.008µs 1 200
normalization/normalize_name/normalize_name/bad-name throughput 52362688.833op/s 53251759.998op/s ± 303487.538op/s 53287115.062op/s ± 258549.545op/s 53521638.799op/s 53633819.688op/s 53714603.887op/s 53734061.931op/s 0.84% -0.430 -0.681 0.57% 21459.810op/s 1 200
normalization/normalize_name/normalize_name/good execution_time 10.843µs 10.907µs ± 0.030µs 10.909µs ± 0.020µs 10.928µs 10.954µs 10.971µs 10.983µs 0.68% -0.050 -0.606 0.27% 0.002µs 1 200
normalization/normalize_name/normalize_name/good throughput 91051512.915op/s 91684155.470op/s ± 252377.425op/s 91666981.561op/s ± 163754.663op/s 91855067.971op/s 92092569.905op/s 92181884.173op/s 92223645.861op/s 0.61% 0.061 -0.610 0.27% 17845.779op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... execution_time [206.224µs; 206.289µs] or [-0.016%; +0.016%] None None None
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... throughput [4847567.450op/s; 4849106.715op/s] or [-0.016%; +0.016%] None None None
normalization/normalize_name/normalize_name/bad-name execution_time [18.764µs; 18.794µs] or [-0.079%; +0.079%] None None None
normalization/normalize_name/normalize_name/bad-name throughput [53209699.544op/s; 53293820.452op/s] or [-0.079%; +0.079%] None None None
normalization/normalize_name/normalize_name/good execution_time [10.903µs; 10.911µs] or [-0.038%; +0.038%] None None None
normalization/normalize_name/normalize_name/good throughput [91649178.386op/s; 91719132.554op/s] or [-0.038%; +0.038%] None None None

Group 13

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
concentrator/add_spans_to_concentrator execution_time 10.669ms 10.700ms ± 0.013ms 10.699ms ± 0.008ms 10.707ms 10.722ms 10.738ms 10.773ms 0.69% 1.277 4.701 0.12% 0.001ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
concentrator/add_spans_to_concentrator execution_time [10.698ms; 10.702ms] or [-0.017%; +0.017%] None None None

Group 14

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
two way interface execution_time 17.365µs 25.148µs ± 9.330µs 17.642µs ± 0.247µs 33.996µs 43.149µs 43.952µs 56.913µs 222.59% 0.691 -0.773 37.01% 0.660µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
two way interface execution_time [23.855µs; 26.441µs] or [-5.142%; +5.142%] None None None

Group 15

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
receiver_entry_point/report/2597 execution_time 6.332ms 6.427ms ± 0.026ms 6.425ms ± 0.015ms 6.440ms 6.472ms 6.493ms 6.540ms 1.78% 0.731 2.989 0.41% 0.002ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
receiver_entry_point/report/2597 execution_time [6.423ms; 6.430ms] or [-0.057%; +0.057%] None None None

Group 16

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
redis/obfuscate_redis_string execution_time 33.622µs 34.203µs ± 1.099µs 33.706µs ± 0.040µs 33.763µs 36.537µs 36.580µs 38.602µs 14.52% 1.806 1.615 3.20% 0.078µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
redis/obfuscate_redis_string execution_time [34.051µs; 34.355µs] or [-0.445%; +0.445%] None None None

Group 17

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz e290eb7 1762537007 sameerank/FFL-1284-Create-datadog-ffe-ffi-crate
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
sql/obfuscate_sql_string execution_time 85.430µs 85.637µs ± 0.169µs 85.615µs ± 0.056µs 85.681µs 85.778µs 85.874µs 87.659µs 2.39% 8.758 101.187 0.20% 0.012µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
sql/obfuscate_sql_string execution_time [85.614µs; 85.661µs] or [-0.027%; +0.027%] None None None

Baseline

Omitted due to size.

@codecov-commenter
Copy link

codecov-commenter commented Oct 24, 2025

Codecov Report

❌ Patch coverage is 0% with 314 lines in your changes missing coverage. Please review.
✅ Project coverage is 71.31%. Comparing base (b78a66b) to head (e290eb7).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1282      +/-   ##
==========================================
- Coverage   71.66%   71.31%   -0.36%     
==========================================
  Files         370      374       +4     
  Lines       58581    58895     +314     
==========================================
+ Hits        41984    42001      +17     
- Misses      16597    16894     +297     
Components Coverage Δ
datadog-crashtracker 50.67% <ø> (+0.08%) ⬆️
datadog-crashtracker-ffi 5.86% <ø> (ø)
datadog-alloc ∅ <ø> (∅)
data-pipeline 87.89% <ø> (ø)
data-pipeline-ffi 88.19% <ø> (ø)
ddcommon 80.97% <ø> (ø)
ddcommon-ffi 73.90% <ø> (ø)
ddtelemetry ∅ <ø> (∅)
ddtelemetry-ffi ∅ <ø> (∅)
dogstatsd-client ∅ <ø> (∅)
datadog-ipc 82.59% <ø> (ø)
datadog-profiling 75.92% <ø> (ø)
datadog-profiling-ffi 62.11% <ø> (ø)
datadog-sidecar 37.05% <ø> (ø)
datdog-sidecar-ffi 13.12% <ø> (ø)
spawn-worker 55.18% <ø> (ø)
tinybytes ∅ <ø> (∅)
datadog-trace-normalization ∅ <ø> (∅)
datadog-trace-obfuscation 94.17% <ø> (ø)
datadog-trace-protobuf ∅ <ø> (∅)
datadog-trace-utils 90.21% <ø> (ø)
datadog-tracer-flare 61.03% <ø> (ø)
datadog-log ∅ <ø> (∅)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@dd-octo-sts
Copy link

dd-octo-sts bot commented Oct 24, 2025

Artifact Size Benchmark Report

aarch64-alpine-linux-musl
Artifact Baseline Commit Change
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.so 7.50 MB 7.50 MB 0% (0 B) 👌
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.a 82.76 MB 82.76 MB 0% (0 B) 👌
aarch64-unknown-linux-gnu
Artifact Baseline Commit Change
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.so 9.54 MB 9.54 MB 0% (0 B) 👌
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.a 95.94 MB 95.94 MB 0% (0 B) 👌
libdatadog-x64-windows
Artifact Baseline Commit Change
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.dll 18.89 MB 18.89 MB 0% (0 B) 👌
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.lib 52.66 KB 52.66 KB 0% (0 B) 👌
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.pdb 131.14 MB 131.15 MB +0% (+8.00 KB) 👌
/libdatadog-x64-windows/debug/static/datadog_profiling_ffi.lib 690.41 MB 690.41 MB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.dll 6.24 MB 6.24 MB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.lib 52.66 KB 52.66 KB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.pdb 18.87 MB 18.87 MB 0% (0 B) 👌
/libdatadog-x64-windows/release/static/datadog_profiling_ffi.lib 36.47 MB 36.47 MB 0% (0 B) 👌
libdatadog-x86-windows
Artifact Baseline Commit Change
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.dll 15.99 MB 15.99 MB 0% (0 B) 👌
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.lib 53.48 KB 53.48 KB 0% (0 B) 👌
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.pdb 133.33 MB 133.33 MB 0% (0 B) 👌
/libdatadog-x86-windows/debug/static/datadog_profiling_ffi.lib 679.45 MB 679.45 MB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.dll 4.79 MB 4.79 MB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.lib 53.48 KB 53.48 KB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.pdb 20.02 MB 20.02 MB 0% (0 B) 👌
/libdatadog-x86-windows/release/static/datadog_profiling_ffi.lib 34.25 MB 34.25 MB 0% (0 B) 👌
x86_64-alpine-linux-musl
Artifact Baseline Commit Change
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.a 71.74 MB 71.74 MB 0% (0 B) 👌
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.so 8.91 MB 8.91 MB 0% (0 B) 👌
x86_64-unknown-linux-gnu
Artifact Baseline Commit Change
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.a 90.75 MB 90.75 MB 0% (0 B) 👌
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.so 10.25 MB 10.25 MB 0% (0 B) 👌

Creates C-compatible FFI layer for Feature Flagging & Experimentation:

- Add datadog-ffe-ffi crate following ddsketch-ffi patterns
- Implement Handle<T> wrappers for Configuration, EvaluationContext, Assignment
- Export get_assignment, configuration_new, evaluation_context_new functions
- Add memory management with drop functions
- Generate C headers via cbindgen for Ruby integration
- Update Cargo.toml to include new FFI crate in workspace
- Remove trailing whitespace from doc comments
- Reformat function call in assignment.rs to fit line length constraints
@sameerank sameerank force-pushed the sameerank/FFL-1284-Create-datadog-ffe-ffi-crate branch from 553e2ac to dfc60e3 Compare October 24, 2025 19:11
- Updated build.rs to use a variable for the header name and improved readability.
- Modified cbindgen.toml to reorganize export settings and enforce naming conventions for types and functions.
- Added Clippy lints in lib.rs to enhance code quality and prevent common pitfalls.
@sameerank sameerank marked this pull request as ready for review October 27, 2025 21:54
@sameerank sameerank requested review from a team as code owners October 27, 2025 21:54
sameerank and others added 2 commits October 28, 2025 11:12
Pin datadog-ffe to exact version

Co-authored-by: Oleksii Shmalko <[email protected]>
refactor(ffe): simplify error handling

Merge branch 'sameerank/FFL-1284-Create-datadog-ffe-ffi-crate' into ffe-simplify-error-handling

Co-authored-by: sameerank <[email protected]>
sameerank and others added 3 commits November 3, 2025 18:46
The distinction served us well in Eppo but it's less useful as we're
migrating to OpenFeature and it handles these various errors rather
similarly.
@dd-oleksii dd-oleksii requested a review from a team as a code owner November 4, 2025 09:13
@dd-oleksii dd-oleksii changed the base branch from main to ffe-pyo3-methods November 4, 2025 09:15
Base automatically changed from ffe-pyo3-methods to main November 5, 2025 02:36
(I think) the way serde_json implements untagged enum parsing is by
first parsing into serde_json::Value and then parsing that to one of
the variants. This breaks RawValue deserialization because Value does
not hold onto original string.

This PR makes TryParse work by quickly scanning into RawValue first,
and then trying to parse it into target type. If that parsing fails,
the RawValue is copied into Box.
@dd-oleksii dd-oleksii force-pushed the sameerank/FFL-1284-Create-datadog-ffe-ffi-crate branch from ac5f6bd to 080057f Compare November 6, 2025 14:10
VariantValue::Object(unsafe { BorrowedStr::borrow_from_str(raw.get()) })
}
},
_ => VariantValue::None,
Copy link
Author

@sameerank sameerank Nov 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One difference I'm observing

  • FFI: Error cases return "empty" values (VariantValue::None)
  • Ruby: Error cases return the provided default_value

Since there's no default value argument for this method, this means that when the binding is implemented in Ruby, the Ruby code should handle returning a fallback default if the result is an empty type

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still working on getting all the test-case-*.json tests to pass in DataDog/dd-trace-rb#5007, and I suspect part of the challenge might be ambiguity around interpreting what this None result means

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

None means that user-provided default should be used

Comment on lines 98 to 99
VariationType::Integer => FlagType::Integer,
VariationType::Numeric => FlagType::Float,
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm trying to find where the variation types get converted to the types in the test case files

variationType --> "string", "number", "boolean", "object"

Without that conversion the computed variationType will differ from the precomputed response. I see this section

#[serde(rename_all = "snake_case")]
#[repr(u8)]
pub enum FlagType {
#[serde(alias = "BOOLEAN")]
Boolean = 1,
#[serde(alias = "STRING")]
String = 1 << 1,
#[serde(alias = "NUMERIC")]
Float = 1 << 2,
#[serde(alias = "INTEGER")]
Integer = 1 << 3,
#[serde(alias = "JSON")]
Object = 1 << 4,
}

But rename_all = "snake_case" wouldn't know to change "INTEGER" to "number"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FlagType's canonical representation matches our expected precomputed API: "boolean" | "string" | "float" | "integer" | "object".

"number" is a fake flag type and is only returned from precomputed API temporarily as part of incident response. Once all clients upgrade to properly handle "integer" | "float", that's what we're going to return.

That's irrelevant to our test files though as these still use legacy names: "BOOLEAN" | "STRING" | "NUMERIC" | "INTEGER" | "JSON". This is where aliases here come into play and allow us to parse these strings in test cases as FlagType.

Comment on lines +15 to +21
pub struct ResolutionDetails {
inner: Result<Assignment, EvaluationError>,
// memoizing some fields, so we can hand off references to them:
error_message: Option<String>,
extra_logging: Vec<KeyValue<BorrowedStr, BorrowedStr>>,
flag_metadata: Vec<KeyValue<BorrowedStr, BorrowedStr>>,
}
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the format of the output that I should be expecting?

What I currently have in DataDog/dd-trace-rb#5007 using the FFI in #1282 for the binding looks like

context = Datadog::OpenFeature::Binding::EvaluationContext.new('test_user')
native = Datadog::OpenFeature::Binding::NativeEvaluator.new(libdatadog_config)
result = native.get_assignment('test_flag', context)

# Output:
result.class            # => Datadog::OpenFeature::Binding::ResolutionDetails
result.value            # => "control_value"
result.variant          # => "control"
result.error_code       # => nil
result.error_message    # => nil
result.reason           # => :static
result.allocation_key   # => "rollout"
result.do_log          # => false

Is that right? Given that there isn't an exact 1:1 match with https://github.com/open-feature/ruby-sdk/blob/main/lib/open_feature/sdk/provider/resolution_details.rb I wonder if we should rename our internal ResolutionDetails to something else to avoid confusion

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ddog_ffe_ResolutionDetails is an opaque C type, it doesn't have any publicly accessible fields. The C side can interact with it via function calls only.

With the exception of value which is allowed to be missing, the type is the superset of OF's resolution details.

The Ruby extension may still rename the type and rearrange the fields as it sees fit

@dd-oleksii dd-oleksii force-pushed the sameerank/FFL-1284-Create-datadog-ffe-ffi-crate branch from 0a63cce to b032372 Compare November 7, 2025 07:51
@dd-oleksii dd-oleksii changed the base branch from main to oleksii/ffe-preserve-json-raw-value November 7, 2025 15:05
@dd-oleksii dd-oleksii force-pushed the oleksii/ffe-preserve-json-raw-value branch from acd42d4 to 295f929 Compare November 7, 2025 15:34
@dd-oleksii dd-oleksii force-pushed the sameerank/FFL-1284-Create-datadog-ffe-ffi-crate branch from d5d0cf1 to 4cba0bf Compare November 7, 2025 15:35
Base automatically changed from oleksii/ffe-preserve-json-raw-value to main November 7, 2025 17:06
@dd-oleksii dd-oleksii force-pushed the sameerank/FFL-1284-Create-datadog-ffe-ffi-crate branch from 4cba0bf to d04a06c Compare November 7, 2025 17:33
@dd-oleksii dd-oleksii force-pushed the sameerank/FFL-1284-Create-datadog-ffe-ffi-crate branch from d04a06c to e290eb7 Compare November 7, 2025 17:40
@sameerank
Copy link
Author

Thanks for clarifying above. The PR looks good from my perspective! I would click approve if I could, but I opened the PR so I don't have that permission ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants