Local evaluation buckets percentage splits with the server key, so results differ from Flagsmith
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 75/100
Rechercherichtung
Beginne mit Client#get_identity_model in lib/flagsmith.rb, insbesondere mit der im Issue verlinkten Zusammensetzung des zusammengesetzten Schlüssels, und verfolge, wie der API-Schlüssel der Umgebung bei der lokalen Auswertung verfügbar gemacht wird. Vergleiche den resultierenden Schlüssel mit der Erwartung client_key_account_two aus der Reproduktion. Aktualisiere die gezielten Tests für die lokale Auswertung von Percentage Splits und führe sie aus; fertig ist die Aufgabe, wenn das SDK mit dem Split-Ergebnis des Dashboards übereinstimmt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
In local evaluation mode, the client builds the identity's composite key from the environment_key it was configured with:
Local evaluation requires a server-side key, so environment_key is always ser.…. The composite key ends up as ser.<env key>_<identifier>, and that's what PERCENTAGE_SPLIT conditions hash, together with the segment ID.
Flagsmith itself appears to hash splits with the environment's client-side key, the api_key field of the environment document, giving <env key>_<identifier>. The two keys produce different percentages, so the SDK puts a different set of identities in every partial percentage split than the Flagsmith dashboard shows for the same identity and traits.
We found this when an identity that the dashboard showed in a 5% split segment evaluated as outside it in our app. Hashing <env key>_<identifier> gave 1.36 (in the percentage-based segment). Hashing ser.<env key>_<identifier>, what the SDK uses, gave 5.23 (outside the segment).
Reproduction
require "flagsmith"
document = {
id: 1,
api_key: "client_key",
project: {
id: 1, name: "Project", hide_disabled_flags: false,
organisation: {id: 1, name: "Org", feature_analytics: false, stop_serving_flags: false, persist_trait_data: true},
segments: [{
id: 1, name: "60% rollout",
rules: [{type: "ALL", rules: [], conditions: [{operator: "PERCENTAGE_SPLIT", value: "60", property_: "$.identity.key"}]}],
feature_states: [{django_id: 2, featurestate_uuid: "segment-state", enabled: true, feature_state_value: nil,
feature: {id: 1, name: "rollout", type: "STANDARD"}, multivariate_feature_state_values: []}]
}]
},
feature_states: [{django_id: 1, featurestate_uuid: "default-state", enabled: false, feature_state_value: nil,
feature: {id: 1, name: "rollout", type: "STANDARD"}, multivariate_feature_state_values: []}],
identity_overrides: []
}
environment = Flagsmith::Engine::Environment.build(document)
handler = Object.new
handler.define_singleton_method(:environment) { environment }
client = Flagsmith::Client.new(
environment_key: "ser.server_key",
offline_mode: true,
offline_handler: handler,
enable_local_evaluation: true
)
client.get_identity_flags("account_two").is_feature_enabled("rollout")
# => false. Hashing "client_key_account_two" gives 57.05, which is inside the 60% split;
# the SDK hashes "ser.server_key_account_two", which gives 62.53.
Expected
The SDK should match the dashboard and the other evaluation paths by building the composite key from environment.api_key.
Affected versions
4.1.1 and 4.3.0 (latest on RubyGems). It's also present in v5.0.0 and on main. In v5, Mappers::Identity.build_environment_context sets key: identity.composite_key, so the correct fallback in Segments::Evaluator.get_enriched_context, which builds "#{context[:environment][:key]}_#{identifier}" from the environment's api_key, never runs.
Suggested fix
In Client#get_identity_model, pass environment_api_key: environment.api_key instead of environment_key. We're running that change as a monkeypatch.
- Vorherrschende Sprache
- Ruby
- Sterne
- 12
- Forks
- 7
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus Flagsmith/flagsmith-ruby-client
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 55/100
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
-
Dependency DashboardOffen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 15/100
-
Local evaluation silently drops identity overrides on large environmentsEvtl. vergeben @marc-merino hat das vor 9 Tagen übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 55/100
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 42/100
Alle Issues in Flagsmith/flagsmith-ruby-client
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
thewca/worldcubeassociation.org#16088 ·
Maintainer antworten meist innerhalb von 1 Tag
-
cocoapods: bundled activesupport raises `unknown keyword: quirks_mode` once json 3 is installedOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Homebrew/homebrew-core#319232 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
Maintainer antworten meist innerhalb von 1 Tag