feat(ffe)!: send flagevaluation producer identity - #2430
Conversation
📚 Documentation Check Results📦
|
🔒 Cargo Deny Results📦
|
🎉 All green!🧪 All tests passed 🎯 Code Coverage (details) 🔗 Commit SHA: 637b05c | Docs | View more details | Give us feedback! |
BenchmarksComparisonBenchmark execution time: 2026-08-28 01:41:08 Comparing candidate commit 637b05c in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 14 metrics, 0 unstable metrics.
|
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 637b05c | 1787880736 | vickie/ffl-3019-flagevaluation-producer-identity |
| 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 | 154.680ns | 158.533ns ± 2.833ns | 158.042ns ± 1.631ns | 160.059ns | 163.432ns | 167.774ns | 169.749ns | 7.41% | 1.144 | 1.658 | 1.78% | 0.200ns | 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 | [158.141ns; 158.926ns] or [-0.248%; +0.248%] | None | None | None |
Group 2
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 637b05c | 1787880736 | vickie/ffl-3019-flagevaluation-producer-identity |
| 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 | 257.454µs | 263.934µs ± 12.123µs | 260.946µs ± 1.246µs | 263.087µs | 276.134µs | 312.918µs | 388.908µs | 49.04% | 6.964 | 60.513 | 4.58% | 0.857µ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 | [262.253µs; 265.614µs] or [-0.637%; +0.637%] | None | None | None |
Group 3
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 637b05c | 1787880736 | vickie/ffl-3019-flagevaluation-producer-identity |
| 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 | 5.301ms | 5.366ms ± 0.025ms | 5.372ms ± 0.005ms | 5.377ms | 5.383ms | 5.390ms | 5.567ms | 3.62% | 1.633 | 20.676 | 0.46% | 0.002ms | 1 | 200 |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | 449104.755op/s | 465934.194op/s ± 2147.440op/s | 465377.941op/s ± 435.175op/s | 466009.478op/s | 470334.375op/s | 470908.454op/s | 471605.928op/s | 1.34% | -1.366 | 18.440 | 0.46% | 151.847op/s | 1 | 200 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | 7.915ms | 7.932ms ± 0.012ms | 7.930ms ± 0.004ms | 7.934ms | 7.964ms | 7.970ms | 7.995ms | 0.83% | 2.391 | 6.735 | 0.15% | 0.001ms | 1 | 200 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | 125071.431op/s | 126064.577op/s ± 182.748op/s | 126106.355op/s ± 59.466op/s | 126160.848op/s | 126242.447op/s | 126312.305op/s | 126338.259op/s | 0.18% | -2.378 | 6.656 | 0.14% | 12.922op/s | 1 | 200 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | 178.154µs | 184.168µs ± 52.107µs | 180.348µs ± 0.313µs | 180.768µs | 181.701µs | 182.168µs | 917.334µs | 408.65% | 14.033 | 194.949 | 28.22% | 3.685µs | 1 | 200 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | 109011.549op/s | 551848.575op/s ± 31527.912op/s | 554485.020op/s ± 962.037op/s | 555334.953op/s | 556017.570op/s | 557853.738op/s | 561312.123op/s | 1.23% | -13.959 | 193.571 | 5.70% | 2229.360op/s | 1 | 200 |
| 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 | [5.362ms; 5.369ms] or [-0.064%; +0.064%] | None | None | None |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | [465636.580op/s; 466231.809op/s] or [-0.064%; +0.064%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | [7.931ms; 7.934ms] or [-0.020%; +0.020%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | [126039.250op/s; 126089.905op/s] or [-0.020%; +0.020%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | [176.946µs; 191.389µs] or [-3.921%; +3.921%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | [547479.109op/s; 556218.040op/s] or [-0.792%; +0.792%] | None | None | None |
Group 4
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 637b05c | 1787880736 | vickie/ffl-3019-flagevaluation-producer-identity |
| 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 | 21.977ms | 22.091ms ± 0.061ms | 22.079ms ± 0.033ms | 22.122ms | 22.215ms | 22.262ms | 22.360ms | 1.27% | 1.117 | 1.543 | 0.28% | 0.004ms | 1 | 200 |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | 111808.530op/s | 113168.045op/s ± 312.123op/s | 113230.693op/s ± 170.928op/s | 113381.986op/s | 113543.854op/s | 113661.996op/s | 113755.277op/s | 0.46% | -1.098 | 1.472 | 0.28% | 22.070op/s | 1 | 200 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | 102.541ms | 103.343ms ± 0.441ms | 103.348ms ± 0.174ms | 103.510ms | 103.755ms | 104.092ms | 108.115ms | 4.61% | 6.273 | 66.866 | 0.43% | 0.031ms | 1 | 200 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | 9249.386op/s | 9676.676op/s ± 40.244op/s | 9676.051op/s ± 16.312op/s | 9694.043op/s | 9727.094op/s | 9737.314op/s | 9752.158op/s | 0.79% | -5.904 | 61.809 | 0.41% | 2.846op/s | 1 | 200 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | 607.020µs | 608.462µs ± 0.552µs | 608.449µs ± 0.355µs | 608.786µs | 609.415µs | 609.770µs | 610.414µs | 0.32% | 0.311 | 0.352 | 0.09% | 0.039µs | 1 | 200 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | 163823.308op/s | 164348.869op/s ± 149.065op/s | 164352.292op/s ± 95.914op/s | 164454.389op/s | 164580.715op/s | 164661.936op/s | 164739.259op/s | 0.24% | -0.305 | 0.345 | 0.09% | 10.541op/s | 1 | 200 |
| 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 | [22.083ms; 22.100ms] or [-0.038%; +0.038%] | None | None | None |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | [113124.787op/s; 113211.302op/s] or [-0.038%; +0.038%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | [103.282ms; 103.404ms] or [-0.059%; +0.059%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | [9671.098op/s; 9682.253op/s] or [-0.058%; +0.058%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | [608.386µs; 608.539µs] or [-0.013%; +0.013%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | [164328.210op/s; 164369.528op/s] or [-0.013%; +0.013%] | None | None | None |
Baseline
Baseline benchmark details
Group 1
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 7327f30 | 1787834472 | main |
| 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 | 154.589ns | 158.201ns ± 2.713ns | 157.504ns ± 1.508ns | 159.540ns | 163.445ns | 165.673ns | 171.778ns | 9.06% | 1.325 | 2.723 | 1.71% | 0.192ns | 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 | [157.825ns; 158.577ns] or [-0.238%; +0.238%] | None | None | None |
Group 2
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 7327f30 | 1787834472 | main |
| 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 | 258.098µs | 264.109µs ± 12.222µs | 261.033µs ± 1.162µs | 263.140µs | 277.527µs | 309.612µs | 389.979µs | 49.40% | 6.951 | 60.264 | 4.62% | 0.864µ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 | [262.415µs; 265.803µs] or [-0.641%; +0.641%] | None | None | None |
Group 3
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 7327f30 | 1787834472 | main |
| 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 | 5.287ms | 5.305ms ± 0.025ms | 5.303ms ± 0.005ms | 5.308ms | 5.315ms | 5.321ms | 5.634ms | 6.24% | 12.200 | 161.434 | 0.46% | 0.002ms | 1 | 200 |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | 443730.295op/s | 471287.096op/s ± 2063.119op/s | 471416.197op/s ± 473.655op/s | 471923.885op/s | 472472.352op/s | 472641.348op/s | 472877.810op/s | 0.31% | -11.995 | 157.777 | 0.44% | 145.885op/s | 1 | 200 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | 7.924ms | 7.958ms ± 0.010ms | 7.957ms ± 0.005ms | 7.963ms | 7.974ms | 7.981ms | 7.993ms | 0.45% | -0.211 | 1.515 | 0.13% | 0.001ms | 1 | 200 |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | 125115.247op/s | 125665.212op/s ± 164.333op/s | 125676.011op/s ± 74.586op/s | 125739.060op/s | 125983.175op/s | 126117.844op/s | 126206.386op/s | 0.42% | 0.225 | 1.523 | 0.13% | 11.620op/s | 1 | 200 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | 178.222µs | 180.392µs ± 0.789µs | 180.218µs ± 0.426µs | 180.770µs | 181.591µs | 182.356µs | 185.660µs | 3.02% | 1.848 | 9.040 | 0.44% | 0.056µs | 1 | 200 |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | 538620.431op/s | 554359.063op/s ± 2404.655op/s | 554882.712op/s ± 1314.543op/s | 556053.581op/s | 556743.560op/s | 558056.066op/s | 561097.169op/s | 1.12% | -1.751 | 8.298 | 0.43% | 170.035op/s | 1 | 200 |
| 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 | [5.301ms; 5.308ms] or [-0.064%; +0.064%] | None | None | None |
| flagevaluation_evp/coalescer/scale/2500flags_500users_20fields | throughput | [471001.168op/s; 471573.025op/s] or [-0.061%; +0.061%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | execution_time | [7.956ms; 7.959ms] or [-0.018%; +0.018%] | None | None | None |
| flagevaluation_evp/coalescer/stress/10flags_1000users_250fields | throughput | [125642.437op/s; 125687.987op/s] or [-0.018%; +0.018%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | execution_time | [180.283µs; 180.501µs] or [-0.061%; +0.061%] | None | None | None |
| flagevaluation_evp/coalescer/typical/100flags_50users_10fields | throughput | [554025.801op/s; 554692.325op/s] or [-0.060%; +0.060%] | None | None | None |
Group 4
| cpu_model | git_commit_sha | git_commit_date | git_branch |
|---|---|---|---|
| Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz | 7327f30 | 1787834472 | main |
| 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 | 21.753ms | 21.888ms ± 0.090ms | 21.862ms ± 0.052ms | 21.951ms | 22.060ms | 22.140ms | 22.159ms | 1.36% | 0.893 | 0.017 | 0.41% | 0.006ms | 1 | 200 |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | 112821.966op/s | 114220.063op/s ± 468.398op/s | 114354.278op/s ± 271.186op/s | 114581.936op/s | 114764.652op/s | 114842.144op/s | 114928.764op/s | 0.50% | -0.878 | -0.021 | 0.41% | 33.121op/s | 1 | 200 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | 102.763ms | 103.961ms ± 0.542ms | 104.070ms ± 0.169ms | 104.224ms | 104.399ms | 104.454ms | 108.959ms | 4.70% | 3.448 | 34.643 | 0.52% | 0.038ms | 1 | 200 |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | 9177.725op/s | 9619.282op/s ± 49.287op/s | 9608.919op/s ± 15.604op/s | 9637.849op/s | 9698.949op/s | 9711.421op/s | 9731.082op/s | 1.27% | -3.077 | 30.645 | 0.51% | 3.485op/s | 1 | 200 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | 597.670µs | 598.736µs ± 0.558µs | 598.655µs ± 0.451µs | 599.185µs | 599.651µs | 599.905µs | 600.100µs | 0.24% | 0.194 | -0.773 | 0.09% | 0.039µs | 1 | 200 |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | 166638.887op/s | 167018.643op/s ± 155.542op/s | 167041.018op/s ± 125.927op/s | 167135.574op/s | 167251.857op/s | 167314.358op/s | 167316.405op/s | 0.16% | -0.191 | -0.774 | 0.09% | 10.999op/s | 1 | 200 |
| 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 | [21.875ms; 21.900ms] or [-0.057%; +0.057%] | None | None | None |
| flagevaluation_evp/payloads/scale/2500flags_500users_20fields | throughput | [114155.147op/s; 114284.978op/s] or [-0.057%; +0.057%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | execution_time | [103.886ms; 104.036ms] or [-0.072%; +0.072%] | None | None | None |
| flagevaluation_evp/payloads/stress/10flags_1000users_250fields | throughput | [9612.451op/s; 9626.113op/s] or [-0.071%; +0.071%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | execution_time | [598.659µs; 598.813µs] or [-0.013%; +0.013%] | None | None | None |
| flagevaluation_evp/payloads/typical/100flags_50users_10fields | throughput | [166997.086op/s; 167040.199op/s] or [-0.013%; +0.013%] | None | None | None |
Add validated EVP origin metadata to flag evaluation requests and keep producer identity isolated across coalesced batches. BREAKING CHANGE: FlagEvaluationEvpSendConfig::new now requires origin and origin-version values and returns a validation result. Generated with Claude Code
dcdc00a to
637b05c
Compare
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 637b05cfbf
ℹ️ 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".
|
|
||
| const USER_AGENT: &str = concat!("ddtrace-sidecar/", env!("CARGO_PKG_VERSION")); | ||
| const EVP_ORIGIN: &str = "ddtrace-sidecar"; | ||
| const EVP_ORIGIN_VERSION: &str = env!("CARGO_PKG_VERSION"); |
There was a problem hiding this comment.
Use the configured sidecar version in the EVP header
When an integration supplies its release version through SIDECAR_VERSION, this header ignores it and expands to the datadog-sidecar package version, which is permanently 0.0.1 in datadog-sidecar/Cargo.toml. Existing sidecar version reporting uses crate::sidecar_version!() specifically to honor that override, so shipped releases will all send DD-EVP-ORIGIN-VERSION: 0.0.1, defeating version-level producer attribution; derive this value through the same macro.
Useful? React with 👍 / 👎.
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
|
What does this PR do?
Adds explicit producer identity metadata to libdatadog flag-evaluation EVP requests.
originandorigin_versionvalues inFlagEvaluationEvpSendConfigDD-EVP-ORIGINandDD-EVP-ORIGIN-VERSIONon every requestddtrace-sidecarwith its Cargo package versionMotivation
Implements FFL-3019. The Agent now forwards EVP origin metadata, so libdatadog needs to provide the configured producer identity for flag-evaluation intake attribution.
Additional Notes
User-Agentremains independent from EVP origin metadata. This does not add an event-levelsourcefield or change payload limits, endpoint routing, timeout handling, metrics, or delivery behavior.How to test the change?