feat(openfeature): add flag evaluation metrics#17029
feat(openfeature): add flag evaluation metrics#17029gh-worker-dd-mergequeue-cf854d[bot] merged 11 commits intomainfrom
Conversation
c241395 to
93848cb
Compare
Codeowners resolved as |
93848cb to
b08bbaa
Compare
This comment has been minimized.
This comment has been minimized.
5585746 to
f4e7b65
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f4e7b65fe9
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
b1b46c7 to
b292329
Compare
Performance SLOsComparing candidate sameerank/FFL-1942/add-flag-eval-metrics (0951d14) with baseline main (ecc75ad) 📈 Performance Regressions (2 suites)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 103.332µs (SLO: <130.000µs 📉 -20.5%) vs baseline: +2.2% Memory: ✅ 43.911MB (SLO: <46.000MB -4.5%) vs baseline: +5.0% ✅ add_inplace_aspectTime: ✅ 100.563µs (SLO: <130.000µs 📉 -22.6%) vs baseline: -0.4% Memory: ✅ 44.064MB (SLO: <46.000MB -4.2%) vs baseline: +5.2% ✅ add_inplace_noaspectTime: ✅ 28.067µs (SLO: <40.000µs 📉 -29.8%) vs baseline: ~same Memory: ✅ 43.972MB (SLO: <46.000MB -4.4%) vs baseline: +5.0% ✅ add_noaspectTime: ✅ 49.610µs (SLO: <70.000µs 📉 -29.1%) vs baseline: +1.8% Memory: ✅ 43.947MB (SLO: <46.000MB -4.5%) vs baseline: +4.7% ✅ bytearray_aspectTime: ✅ 248.816µs (SLO: <400.000µs 📉 -37.8%) vs baseline: -0.2% Memory: ✅ 43.991MB (SLO: <46.000MB -4.4%) vs baseline: +5.0% ✅ bytearray_extend_aspectTime: ✅ 650.192µs (SLO: <800.000µs 📉 -18.7%) vs baseline: -1.8% Memory: ✅ 43.946MB (SLO: <46.000MB -4.5%) vs baseline: +4.8% ✅ bytearray_extend_noaspectTime: ✅ 268.532µs (SLO: <400.000µs 📉 -32.9%) vs baseline: +1.7% Memory: ✅ 43.851MB (SLO: <46.000MB -4.7%) vs baseline: +4.5% ✅ bytearray_noaspectTime: ✅ 138.274µs (SLO: <300.000µs 📉 -53.9%) vs baseline: +0.1% Memory: ✅ 44.051MB (SLO: <46.000MB -4.2%) vs baseline: +5.2% ✅ bytes_aspectTime: ✅ 216.055µs (SLO: <300.000µs 📉 -28.0%) vs baseline: -0.8% Memory: ✅ 43.874MB (SLO: <46.000MB -4.6%) vs baseline: +4.8% ✅ bytes_noaspectTime: ✅ 133.468µs (SLO: <200.000µs 📉 -33.3%) vs baseline: +1.3% Memory: ✅ 43.949MB (SLO: <46.000MB -4.5%) vs baseline: +5.1% ✅ bytesio_aspectTime: ✅ 3.778ms (SLO: <5.000ms 📉 -24.4%) vs baseline: +0.2% Memory: ✅ 43.850MB (SLO: <46.000MB -4.7%) vs baseline: +4.0% ✅ bytesio_noaspectTime: ✅ 316.473µs (SLO: <420.000µs 📉 -24.6%) vs baseline: +0.9% Memory: ✅ 43.835MB (SLO: <46.000MB -4.7%) vs baseline: +5.0% ✅ capitalize_aspectTime: ✅ 88.053µs (SLO: <300.000µs 📉 -70.6%) vs baseline: +0.1% Memory: ✅ 43.946MB (SLO: <46.000MB -4.5%) vs baseline: +5.0% ✅ capitalize_noaspectTime: ✅ 248.220µs (SLO: <300.000µs 📉 -17.3%) vs baseline: +1.3% Memory: ✅ 43.970MB (SLO: <46.000MB -4.4%) vs baseline: +4.8% ✅ casefold_aspectTime: ✅ 88.170µs (SLO: <500.000µs 📉 -82.4%) vs baseline: +0.5% Memory: ✅ 43.950MB (SLO: <46.000MB -4.5%) vs baseline: +5.2% ✅ casefold_noaspectTime: ✅ 303.965µs (SLO: <500.000µs 📉 -39.2%) vs baseline: +0.6% Memory: ✅ 43.874MB (SLO: <46.000MB -4.6%) vs baseline: +5.0% ✅ decode_aspectTime: ✅ 86.970µs (SLO: <100.000µs 📉 -13.0%) vs baseline: +0.6% Memory: ✅ 44.016MB (SLO: <46.000MB -4.3%) vs baseline: +4.8% ✅ decode_noaspectTime: ✅ 153.130µs (SLO: <210.000µs 📉 -27.1%) vs baseline: +0.3% Memory: ✅ 43.929MB (SLO: <46.000MB -4.5%) vs baseline: +4.9% ✅ encode_aspectTime: ✅ 84.098µs (SLO: <200.000µs 📉 -58.0%) vs baseline: -0.9% Memory: ✅ 43.919MB (SLO: <46.000MB -4.5%) vs baseline: +4.8% ✅ encode_noaspectTime: ✅ 141.192µs (SLO: <200.000µs 📉 -29.4%) vs baseline: +1.0% Memory: ✅ 43.947MB (SLO: <46.000MB -4.5%) vs baseline: +5.2% ✅ format_aspectTime: ✅ 14.560ms (SLO: <19.200ms 📉 -24.2%) vs baseline: -0.5% Memory: ✅ 44.015MB (SLO: <46.000MB -4.3%) vs baseline: +4.7% ✅ format_map_aspectTime: ✅ 16.431ms (SLO: <21.500ms 📉 -23.6%) vs baseline: +0.6% Memory: ✅ 44.102MB (SLO: <46.000MB -4.1%) vs baseline: +5.0% ✅ format_map_noaspectTime: ✅ 375.012µs (SLO: <500.000µs 📉 -25.0%) vs baseline: +0.5% Memory: ✅ 44.015MB (SLO: <46.000MB -4.3%) vs baseline: +5.1% ✅ format_noaspectTime: ✅ 303.694µs (SLO: <500.000µs 📉 -39.3%) vs baseline: +0.5% Memory: ✅ 43.836MB (SLO: <46.000MB -4.7%) vs baseline: +4.8% ✅ index_aspectTime: ✅ 137.253µs (SLO: <300.000µs 📉 -54.2%) vs baseline: 📈 +11.4% Memory: ✅ 43.986MB (SLO: <46.000MB -4.4%) vs baseline: +5.1% ✅ index_noaspectTime: ✅ 40.502µs (SLO: <300.000µs 📉 -86.5%) vs baseline: -0.7% Memory: ✅ 44.006MB (SLO: <46.000MB -4.3%) vs baseline: +5.3% ✅ join_aspectTime: ✅ 208.389µs (SLO: <300.000µs 📉 -30.5%) vs baseline: -0.5% Memory: ✅ 43.972MB (SLO: <46.000MB -4.4%) vs baseline: +5.2% ✅ join_noaspectTime: ✅ 144.616µs (SLO: <300.000µs 📉 -51.8%) vs baseline: +0.8% Memory: ✅ 44.047MB (SLO: <46.000MB -4.2%) vs baseline: +5.2% ✅ ljust_aspectTime: ✅ 502.339µs (SLO: <700.000µs 📉 -28.2%) vs baseline: +0.1% Memory: ✅ 43.916MB (SLO: <46.000MB -4.5%) vs baseline: +4.8% ✅ ljust_noaspectTime: ✅ 270.667µs (SLO: <300.000µs -9.8%) vs baseline: +6.6% Memory: ✅ 43.900MB (SLO: <46.000MB -4.6%) vs baseline: +4.8% ✅ lower_aspectTime: ✅ 296.668µs (SLO: <500.000µs 📉 -40.7%) vs baseline: +0.8% Memory: ✅ 43.909MB (SLO: <46.000MB -4.5%) vs baseline: +4.8% ✅ lower_noaspectTime: ✅ 231.808µs (SLO: <300.000µs 📉 -22.7%) vs baseline: +1.0% Memory: ✅ 43.913MB (SLO: <46.000MB -4.5%) vs baseline: +4.9% ✅ lstrip_aspectTime: ✅ 0.273ms (SLO: <3.000ms 📉 -90.9%) vs baseline: -2.0% Memory: ✅ 43.879MB (SLO: <46.000MB -4.6%) vs baseline: +5.1% ✅ lstrip_noaspectTime: ✅ 0.177ms (SLO: <3.000ms 📉 -94.1%) vs baseline: +0.3% Memory: ✅ 44.126MB (SLO: <46.000MB -4.1%) vs baseline: +5.6% ✅ modulo_aspectTime: ✅ 14.267ms (SLO: <18.750ms 📉 -23.9%) vs baseline: ~same Memory: ✅ 44.170MB (SLO: <46.000MB -4.0%) vs baseline: +5.2% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 14.764ms (SLO: <19.350ms 📉 -23.7%) vs baseline: -0.6% Memory: ✅ 44.061MB (SLO: <46.000MB -4.2%) vs baseline: +4.8% ✅ modulo_aspect_for_bytesTime: ✅ 14.323ms (SLO: <18.900ms 📉 -24.2%) vs baseline: -0.4% Memory: ✅ 44.064MB (SLO: <46.000MB -4.2%) vs baseline: +4.6% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 14.605ms (SLO: <19.150ms 📉 -23.7%) vs baseline: -0.4% Memory: ✅ 44.050MB (SLO: <46.000MB -4.2%) vs baseline: +4.7% ✅ modulo_noaspectTime: ✅ 0.356ms (SLO: <3.000ms 📉 -88.1%) vs baseline: ~same Memory: ✅ 43.933MB (SLO: <46.000MB -4.5%) vs baseline: +5.0% ✅ replace_aspectTime: ✅ 18.411ms (SLO: <24.000ms 📉 -23.3%) vs baseline: ~same Memory: ✅ 44.027MB (SLO: <46.000MB -4.3%) vs baseline: +4.8% ✅ replace_noaspectTime: ✅ 281.227µs (SLO: <400.000µs 📉 -29.7%) vs baseline: +0.1% Memory: ✅ 43.971MB (SLO: <46.000MB -4.4%) vs baseline: +5.0% ✅ repr_aspectTime: ✅ 318.352µs (SLO: <420.000µs 📉 -24.2%) vs baseline: -0.3% Memory: ✅ 43.830MB (SLO: <46.000MB -4.7%) vs baseline: +4.5% ✅ repr_noaspectTime: ✅ 46.520µs (SLO: <90.000µs 📉 -48.3%) vs baseline: -0.7% Memory: ✅ 43.834MB (SLO: <46.000MB -4.7%) vs baseline: +4.7% ✅ rstrip_aspectTime: ✅ 387.434µs (SLO: <500.000µs 📉 -22.5%) vs baseline: +1.1% Memory: ✅ 43.921MB (SLO: <46.000MB -4.5%) vs baseline: +5.1% ✅ rstrip_noaspectTime: ✅ 180.033µs (SLO: <300.000µs 📉 -40.0%) vs baseline: -1.6% Memory: ✅ 43.777MB (SLO: <46.000MB -4.8%) vs baseline: +4.5% ✅ slice_aspectTime: ✅ 185.496µs (SLO: <300.000µs 📉 -38.2%) vs baseline: +0.9% Memory: ✅ 43.849MB (SLO: <46.000MB -4.7%) vs baseline: +4.3% ✅ slice_noaspectTime: ✅ 54.174µs (SLO: <90.000µs 📉 -39.8%) vs baseline: -1.4% Memory: ✅ 43.991MB (SLO: <46.000MB -4.4%) vs baseline: +5.1% ✅ stringio_aspectTime: ✅ 3.775ms (SLO: <5.000ms 📉 -24.5%) vs baseline: -0.6% Memory: ✅ 43.811MB (SLO: <46.000MB -4.8%) vs baseline: +4.2% ✅ stringio_noaspectTime: ✅ 377.413µs (SLO: <500.000µs 📉 -24.5%) vs baseline: +9.5% Memory: ✅ 43.990MB (SLO: <46.000MB -4.4%) vs baseline: +5.1% ✅ strip_aspectTime: ✅ 273.072µs (SLO: <350.000µs 📉 -22.0%) vs baseline: -0.9% Memory: ✅ 43.929MB (SLO: <46.000MB -4.5%) vs baseline: +5.0% ✅ strip_noaspectTime: ✅ 175.766µs (SLO: <240.000µs 📉 -26.8%) vs baseline: +0.6% Memory: ✅ 43.889MB (SLO: <46.000MB -4.6%) vs baseline: +5.0% ✅ swapcase_aspectTime: ✅ 331.825µs (SLO: <500.000µs 📉 -33.6%) vs baseline: +0.3% Memory: ✅ 43.851MB (SLO: <46.000MB -4.7%) vs baseline: +4.4% ✅ swapcase_noaspectTime: ✅ 267.762µs (SLO: <400.000µs 📉 -33.1%) vs baseline: +0.7% Memory: ✅ 43.966MB (SLO: <46.000MB -4.4%) vs baseline: +4.9% ✅ title_aspectTime: ✅ 325.854µs (SLO: <500.000µs 📉 -34.8%) vs baseline: +1.9% Memory: ✅ 43.890MB (SLO: <46.000MB -4.6%) vs baseline: +4.7% ✅ title_noaspectTime: ✅ 255.330µs (SLO: <400.000µs 📉 -36.2%) vs baseline: +1.3% Memory: ✅ 43.814MB (SLO: <46.000MB -4.8%) vs baseline: +4.7% ✅ translate_aspectTime: ✅ 493.693µs (SLO: <700.000µs 📉 -29.5%) vs baseline: +0.8% Memory: ✅ 43.853MB (SLO: <46.000MB -4.7%) vs baseline: +4.2% ✅ translate_noaspectTime: ✅ 424.230µs (SLO: <500.000µs 📉 -15.2%) vs baseline: -0.8% Memory: ✅ 43.939MB (SLO: <46.000MB -4.5%) vs baseline: +5.3% ✅ upper_aspectTime: ✅ 298.712µs (SLO: <500.000µs 📉 -40.3%) vs baseline: +1.0% Memory: ✅ 43.890MB (SLO: <46.000MB -4.6%) vs baseline: +4.7% ✅ upper_noaspectTime: ✅ 230.561µs (SLO: <400.000µs 📉 -42.4%) vs baseline: ~same Memory: ✅ 43.938MB (SLO: <46.000MB -4.5%) vs baseline: +5.1% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 508.138µs (SLO: <700.000µs 📉 -27.4%) vs baseline: 📈 +20.0% Memory: ✅ 43.612MB (SLO: <46.000MB -5.2%) vs baseline: +4.3% ✅ ospathbasename_noaspectTime: ✅ 430.508µs (SLO: <700.000µs 📉 -38.5%) vs baseline: -0.3% Memory: ✅ 43.960MB (SLO: <46.000MB -4.4%) vs baseline: +4.5% ✅ ospathjoin_aspectTime: ✅ 623.095µs (SLO: <700.000µs 📉 -11.0%) vs baseline: ~same Memory: ✅ 43.845MB (SLO: <46.000MB -4.7%) vs baseline: +5.2% ✅ ospathjoin_noaspectTime: ✅ 635.568µs (SLO: <700.000µs -9.2%) vs baseline: +0.2% Memory: ✅ 43.975MB (SLO: <46.000MB -4.4%) vs baseline: +4.9% ✅ ospathnormcase_aspectTime: ✅ 350.456µs (SLO: <700.000µs 📉 -49.9%) vs baseline: -0.9% Memory: ✅ 43.681MB (SLO: <46.000MB -5.0%) vs baseline: +3.9% ✅ ospathnormcase_noaspectTime: ✅ 362.650µs (SLO: <700.000µs 📉 -48.2%) vs baseline: +0.7% Memory: ✅ 44.085MB (SLO: <46.000MB -4.2%) vs baseline: +5.2% ✅ ospathsplit_aspectTime: ✅ 482.183µs (SLO: <700.000µs 📉 -31.1%) vs baseline: ~same Memory: ✅ 43.580MB (SLO: <46.000MB -5.3%) vs baseline: +5.0% ✅ ospathsplit_noaspectTime: ✅ 497.175µs (SLO: <700.000µs 📉 -29.0%) vs baseline: +0.3% Memory: ✅ 43.660MB (SLO: <46.000MB -5.1%) vs baseline: +4.2% ✅ ospathsplitdrive_aspectTime: ✅ 371.000µs (SLO: <700.000µs 📉 -47.0%) vs baseline: -0.8% Memory: ✅ 43.810MB (SLO: <46.000MB -4.8%) vs baseline: +4.3% ✅ ospathsplitdrive_noaspectTime: ✅ 72.890µs (SLO: <700.000µs 📉 -89.6%) vs baseline: +0.2% Memory: ✅ 43.842MB (SLO: <46.000MB -4.7%) vs baseline: +4.3% ✅ ospathsplitext_aspectTime: ✅ 456.281µs (SLO: <700.000µs 📉 -34.8%) vs baseline: -0.2% Memory: ✅ 43.760MB (SLO: <46.000MB -4.9%) vs baseline: +4.1% ✅ ospathsplitext_noaspectTime: ✅ 466.177µs (SLO: <700.000µs 📉 -33.4%) vs baseline: -0.3% Memory: ✅ 43.984MB (SLO: <46.000MB -4.4%) vs baseline: +4.8% 🟡 Near SLO Breach (3 suites)🟡 djangosimple - 30/30✅ appsecTime: ✅ 19.664ms (SLO: <22.300ms 📉 -11.8%) vs baseline: ~same Memory: ✅ 68.798MB (SLO: <73.500MB -6.4%) vs baseline: +5.1% ✅ exception-replay-enabledTime: ✅ 1.401ms (SLO: <1.450ms -3.4%) vs baseline: -0.3% Memory: ✅ 66.882MB (SLO: <71.500MB -6.5%) vs baseline: +5.0% ✅ iastTime: ✅ 19.684ms (SLO: <22.250ms 📉 -11.5%) vs baseline: -0.1% Memory: ✅ 68.669MB (SLO: <75.000MB -8.4%) vs baseline: +4.8% ✅ profilerTime: ✅ 15.014ms (SLO: <16.550ms -9.3%) vs baseline: -0.8% Memory: ✅ 60.445MB (SLO: <61.000MB 🟡 -0.9%) vs baseline: +4.8% ✅ resource-renamingTime: ✅ 19.599ms (SLO: <21.750ms -9.9%) vs baseline: -0.1% Memory: ✅ 68.874MB (SLO: <73.500MB -6.3%) vs baseline: +5.2% ✅ span-code-originTime: ✅ 20.232ms (SLO: <28.200ms 📉 -28.3%) vs baseline: +2.3% Memory: ✅ 68.755MB (SLO: <75.000MB -8.3%) vs baseline: +4.8% ✅ tracerTime: ✅ 19.681ms (SLO: <21.750ms -9.5%) vs baseline: +0.3% Memory: ✅ 68.824MB (SLO: <75.000MB -8.2%) vs baseline: +5.1% ✅ tracer-and-profilerTime: ✅ 21.011ms (SLO: <23.500ms 📉 -10.6%) vs baseline: +0.6% Memory: ✅ 70.949MB (SLO: <75.000MB -5.4%) vs baseline: +5.3% ✅ tracer-dont-create-db-spansTime: ✅ 19.765ms (SLO: <21.500ms -8.1%) vs baseline: -0.2% Memory: ✅ 68.802MB (SLO: <75.000MB -8.3%) vs baseline: +4.8% ✅ tracer-minimalTime: ✅ 16.811ms (SLO: <17.500ms -3.9%) vs baseline: +0.2% Memory: ✅ 68.817MB (SLO: <75.000MB -8.2%) vs baseline: +5.0% ✅ tracer-nativeTime: ✅ 19.566ms (SLO: <21.750ms 📉 -10.0%) vs baseline: -0.5% Memory: ✅ 68.805MB (SLO: <72.500MB -5.1%) vs baseline: +5.0% ✅ tracer-no-cachesTime: ✅ 17.613ms (SLO: <19.650ms 📉 -10.4%) vs baseline: +0.4% Memory: ✅ 68.794MB (SLO: <75.000MB -8.3%) vs baseline: +5.1% ✅ tracer-no-databasesTime: ✅ 19.318ms (SLO: <20.100ms -3.9%) vs baseline: -0.1% Memory: ✅ 68.869MB (SLO: <75.000MB -8.2%) vs baseline: +5.0% ✅ tracer-no-middlewareTime: ✅ 19.321ms (SLO: <21.500ms 📉 -10.1%) vs baseline: -0.3% Memory: ✅ 68.765MB (SLO: <75.000MB -8.3%) vs baseline: +4.9% ✅ tracer-no-templatesTime: ✅ 19.551ms (SLO: <22.000ms 📉 -11.1%) vs baseline: +0.5% Memory: ✅ 68.899MB (SLO: <73.500MB -6.3%) vs baseline: +5.2% 🟡 otelsdkspan - 24/24✅ add-eventTime: ✅ 40.435ms (SLO: <42.000ms -3.7%) vs baseline: ~same Memory: ✅ 39.046MB (SLO: <40.750MB -4.2%) vs baseline: +4.9% ✅ add-linkTime: ✅ 36.596ms (SLO: <38.550ms -5.1%) vs baseline: +0.2% Memory: ✅ 39.184MB (SLO: <40.750MB -3.8%) vs baseline: +5.0% ✅ add-metricsTime: ✅ 217.245ms (SLO: <232.000ms -6.4%) vs baseline: -0.9% Memory: ✅ 39.243MB (SLO: <40.750MB -3.7%) vs baseline: +5.2% ✅ add-tagsTime: ✅ 211.196ms (SLO: <221.600ms -4.7%) vs baseline: -0.8% Memory: ✅ 39.066MB (SLO: <40.750MB -4.1%) vs baseline: +4.8% ✅ get-contextTime: ✅ 29.233ms (SLO: <31.300ms -6.6%) vs baseline: +0.7% Memory: ✅ 39.105MB (SLO: <40.750MB -4.0%) vs baseline: +4.8% ✅ is-recordingTime: ✅ 29.205ms (SLO: <31.000ms -5.8%) vs baseline: -0.4% Memory: ✅ 39.184MB (SLO: <40.750MB -3.8%) vs baseline: +4.7% ✅ record-exceptionTime: ✅ 63.272ms (SLO: <65.850ms -3.9%) vs baseline: ~same Memory: ✅ 39.086MB (SLO: <40.750MB -4.1%) vs baseline: +4.8% ✅ set-statusTime: ✅ 31.800ms (SLO: <34.150ms -6.9%) vs baseline: -0.4% Memory: ✅ 39.105MB (SLO: <40.750MB -4.0%) vs baseline: +4.6% ✅ startTime: ✅ 29.578ms (SLO: <30.150ms 🟡 -1.9%) vs baseline: +1.5% Memory: ✅ 39.105MB (SLO: <40.750MB -4.0%) vs baseline: +4.8% ✅ start-finishTime: ✅ 34.025ms (SLO: <35.350ms -3.7%) vs baseline: +1.1% Memory: ✅ 39.125MB (SLO: <40.750MB -4.0%) vs baseline: +5.1% ✅ start-finish-telemetryTime: ✅ 34.000ms (SLO: <35.450ms -4.1%) vs baseline: ~same Memory: ✅ 39.125MB (SLO: <40.750MB -4.0%) vs baseline: +4.9% ✅ update-nameTime: ✅ 31.201ms (SLO: <33.400ms -6.6%) vs baseline: ~same Memory: ✅ 39.105MB (SLO: <40.750MB -4.0%) vs baseline: +4.8% 🟡 recursivecomputation - 8/8✅ deepTime: ✅ 311.011ms (SLO: <320.950ms -3.1%) vs baseline: ~same Memory: ✅ 37.473MB (SLO: <38.750MB -3.3%) vs baseline: +4.9% ✅ deep-profiledTime: ✅ 333.008ms (SLO: <359.150ms -7.3%) vs baseline: +0.2% Memory: ✅ 43.726MB (SLO: <46.000MB -4.9%) vs baseline: +4.7% ✅ mediumTime: ✅ 7.280ms (SLO: <7.400ms 🟡 -1.6%) vs baseline: ~same Memory: ✅ 36.235MB (SLO: <38.000MB -4.6%) vs baseline: +4.7% ✅ shallowTime: ✅ 1.014ms (SLO: <1.050ms -3.4%) vs baseline: +1.6% Memory: ✅ 36.255MB (SLO: <38.000MB -4.6%) vs baseline: +4.9%
|
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b292329966
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
ed503c2 to
70eb5ba
Compare
810d4c8 to
74f4110
Compare
74f4110 to
6dd59ec
Compare
leoromanovsky
left a comment
There was a problem hiding this comment.
Let me know what you decide in terms of unknown for missing reason; I can make the change in go (or feel free to). Same for the lowercasing.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6dd59ec52a
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
c435e25 to
0ce14d8
Compare
emmettbutler
left a comment
There was a problem hiding this comment.
Core and test sources look good to me
7410042 to
c540472
Compare
Update minimum SDK version to 0.8.0 which adds the `details` parameter to the `finally_after` hook stage. This is required for the flag evaluation metrics feature to access variant, reason, and error_code.
…ENABLED=true Check the _otel_metrics_enabled config before creating the OTel counter to avoid overhead when OTel metrics are not enabled. This follows the established pattern in ddtrace for gating OTel metrics features.
… fix config deletion handling
c540472 to
0951d14
Compare
Description
Adds
feature_flag.evaluationsOTel counter metric emitted on every flag evaluation, following the Go implementation pattern.Requirements:
DD_METRICS_OTEL_ENABLED=truemust be set for metrics to emitopenfeature-sdk>=0.8.0(required forfinally_afterhook to receive evaluation details)Changes:
Reason.ERRORwithErrorCode.FLAG_NOT_FOUNDwhen flag is not in existing config (aligns with Go/iOS SDKs)Reason.DEFAULTonly when no configuration is loaded (preserving existing behavior)Testing
Unit test parity with Go SDK
The following tests mirror the Go SDK
flageval_metrics_test.go:TestRecord(targeting match)test_record_basic_attributesTestRecord(allocation key)test_record_with_allocation_keyTestRecord(empty allocation key)test_record_empty_allocation_key_not_includedTestRecord(error flag not found)test_record_with_errorTestRecord(disabled flag)test_record_disabled_reasonTestRecordMultipleEvaluationstest_record_multiple_evaluationsTestRecordDifferentFlagstest_record_different_flagsTestRecordAllErrorTypestest_record_all_error_typesTestIntegrationEvaluate(type mismatch)test_type_conversion_error_records_type_mismatchNote: Go tests use a real OTel test meter provider. Python unit tests (
TestFlagEvalMetrics) use mocks for faster isolated testing, whileTestMetricsWithRealOTelvalidates behavior with real OTel runtime.Python-specific tests (not in Go)
TestFlagEvalMetrics: OTel initialization tests (graceful handling when OTel not available), metrics disabled whenDD_METRICS_OTEL_ENABLED=false, shutdown behaviorTestFlagEvalHook: Tests the hook mechanism (finally_aftercallsmetrics.recordwith correct arguments)TestProviderHooksIntegration: Tests provider hook registration,get_provider_hooks()returns correct hooks, cleanup on shutdownTestMetricsWithRealOTel: Integration tests with real OTel runtimeSystem tests
Risks
Reason.ERRORinstead ofReason.DEFAULTwhen configuration is available. Release note added.openfeature-sdkversion increased from 0.6.0 to 0.8.0. Users on older versions will need to upgrade. Release note added.Additional Notes
Reference files in Go SDK: flageval_metrics.go, flageval_metrics_test.go, provider.go, provider_test.go