Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

Local evaluation buckets percentage splits with the server key, so results differ from Flagsmith

Offen Anfängerfreundlich
#109 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
75/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
ruby
Bereich
backend

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:

https://github.com/Flagsmith/flagsmith-ruby-client/blob/f92f66df821b8a21565a412d5c2331c62e364b24/lib/flagsmith.rb#L343-L345

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

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus Flagsmith/flagsmith-ruby-client

Alle Issues in Flagsmith/flagsmith-ruby-client

Ähnliche Issues

Weitere Issues zu Ruby

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.