Observed behavior
While trying to evaluate feature flags using /ofrep/v1/evaluate/flags endpoint, I encountered an issue related to feature flags synchronization. In standard way of defined flags management, if definition of given flag changes (like its default variant, metadata etc.), appropriate event is being raised and its centralized state is updated.
Example (clarification for what I'm referring to in the beginning)
I have defined following flag inside feature_flags.json file:
{
"flags": {
"myFeature": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "off",
"metadata": {
"description": "Some description"
}
}
}
}
When I evaluate flags (i.e. call mentioned endpoint) first, I receive following response:
C:\>curl -X POST http://localhost:8016/ofrep/v1/evaluate/flags
{"flags":[{"value":false,"key":"myFeature","reason":"STATIC","variant":"off","metadata":{"description":"Some description"}}],"metadata":{}}
After altering feature flag in file, I see its state has changed.
feature_flags.json:
{
"flags": {
"myFeature": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "on", // <- changed from "off" to "on"
"metadata": {
"description": "Some description"
}
}
}
}
Response (flag value changed to "on" variant):
C:\>curl -X POST http://localhost:8016/ofrep/v1/evaluate/flags
{"flags":[{"value":true,"key":"myFeature","reason":"STATIC","variant":"on","metadata":{"description":"Some description"}}],"metadata":{}}
However, if I remove mentioned feature_flags.json file and restore it back, synchronization between running flagd and feature flag source breaks, making ofrep endpoint response unchanged (assuming You have just one flags definition source)
Before removing and restoring feature_flag.json file back
feature_flags.json file content:
{
"flags": {
"myFeature": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "on",
"metadata": {
"description": "Some description"
}
}
}
}
Ofrep endpoint response:
C:\>curl -X POST http://localhost:8016/ofrep/v1/evaluate/flags
{"flags":[{"value":true,"key":"myFeature","reason":"STATIC","variant":"on","metadata":{"description":"Some description"}}],"metadata":{}}
After removing and restoring feature_flag.json file back, I defined 2 feature flags in feature_flag.json file:
{
"flags": {
"myFeature": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "off",
"metadata": {
"description": "Some description"
}
},
"myFeature2": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "off",
"metadata": {
"description": "Some description"
}
}
}
}
Ofrep endpoint response:
C:\>curl -X POST http://localhost:8016/ofrep/v1/evaluate/flags
{"flags":[{"value":true,"key":"myFeature","reason":"STATIC","variant":"on","metadata":{"description":"Some description"}}],"metadata":{}}
Seems like this removing and restoring file procedure, removes a source watcher permanently, so flagd cannot track/keep in sync defined flag state.
Expected Behavior
Removing and restoring file with feature flags definitions shouldn't break synchronization between flagd and sources. If such situation occurs, file watcher should be rebuilt, making sure that managed flags are always in sync with specified sources
Steps to reproduce
Prerequisites:
- Create "feature_flags.json" file with following content:
{
"flags": {
"myFeature": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "off",
"metadata": {
"description": "Some description"
}
}
}
}
- Start flagd process using following command:
flagd.exe start --debug --uri file:C:\dev\misc\github\feature_flags.json --ofrep-port 8016 --sync-port 8015 --port 8013 --management-port 8014
- Send a POST request to
/ofrep/v1/evaluate/flags endpoint to evaluate defined feature flags
- Remove created
feature_flags.json file and restore it back (delete and use ctrl+z right away)
- Define new feature flag within
feature_flags.json - see example:
{
"flags": {
"myFeature": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "off",
"metadata": {
"description": "Some description"
}
},
"myFeature2": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "off",
"metadata": {
"description": "Some description"
}
}
}
}
- Send a POST request to
/ofrep/v1/evaluate/flags endpoint to evaluate defined feature flags
- Compare responses received in steps 3 and 6. Response for request sent in step 6 should contain information regarding both
myFeature and myFeature2 flag, whereas response from step 3 should provide information about myFeature flag only
Observed behavior
While trying to evaluate feature flags using
/ofrep/v1/evaluate/flagsendpoint, I encountered an issue related to feature flags synchronization. In standard way of defined flags management, if definition of given flag changes (like its default variant, metadata etc.), appropriate event is being raised and its centralized state is updated.Example (clarification for what I'm referring to in the beginning)
I have defined following flag inside
feature_flags.jsonfile:When I evaluate flags (i.e. call mentioned endpoint) first, I receive following response:
After altering feature flag in file, I see its state has changed.
feature_flags.json:
Response (flag value changed to "on" variant):
However, if I remove mentioned feature_flags.json file and restore it back, synchronization between running flagd and feature flag source breaks, making ofrep endpoint response unchanged (assuming You have just one flags definition source)
Before removing and restoring feature_flag.json file back
feature_flags.json file content:
Ofrep endpoint response:
After removing and restoring feature_flag.json file back, I defined 2 feature flags in feature_flag.json file:
Ofrep endpoint response:
Seems like this removing and restoring file procedure, removes a source watcher permanently, so flagd cannot track/keep in sync defined flag state.
Expected Behavior
Removing and restoring file with feature flags definitions shouldn't break synchronization between flagd and sources. If such situation occurs, file watcher should be rebuilt, making sure that managed flags are always in sync with specified sources
Steps to reproduce
Prerequisites:
flagd.exe start --debug --uri file:C:\dev\misc\github\feature_flags.json --ofrep-port 8016 --sync-port 8015 --port 8013 --management-port 8014/ofrep/v1/evaluate/flagsendpoint to evaluate defined feature flagsfeature_flags.jsonfile and restore it back (delete and use ctrl+z right away)feature_flags.json- see example:/ofrep/v1/evaluate/flagsendpoint to evaluate defined feature flagsmyFeatureandmyFeature2flag, whereas response from step 3 should provide information aboutmyFeatureflag only