OpenFeature: Add context attributes to frontend settings (#112105)
* Update targeting key to namespace * Pass eval ctx attributes to frontend * Add context config to the frontend * Fix OF namespace not defined in e2e tests * Set default namespace and targeting key * remove e2e server config now that namespace is default --------- Co-authored-by: joshhunt <josh.hunt@grafana.com>
This commit is contained in:
@@ -15,7 +15,7 @@ type OpenFeatureSettings struct {
|
||||
ProviderType string
|
||||
URL *url.URL
|
||||
TargetingKey string
|
||||
ContextAttrs map[string]any
|
||||
ContextAttrs map[string]string
|
||||
}
|
||||
|
||||
func (cfg *Cfg) readOpenFeatureSettings() error {
|
||||
@@ -24,10 +24,15 @@ func (cfg *Cfg) readOpenFeatureSettings() error {
|
||||
config := cfg.Raw.Section("feature_toggles.openfeature")
|
||||
cfg.OpenFeature.APIEnabled = config.Key("enable_api").MustBool(true)
|
||||
cfg.OpenFeature.ProviderType = config.Key("provider").MustString(StaticProviderType)
|
||||
cfg.OpenFeature.TargetingKey = config.Key("targetingKey").MustString(cfg.AppURL)
|
||||
|
||||
strURL := config.Key("url").MustString("")
|
||||
|
||||
defaultTargetingKey := "default"
|
||||
if cfg.StackID != "" {
|
||||
defaultTargetingKey = fmt.Sprintf("stacks-%s", cfg.StackID)
|
||||
}
|
||||
|
||||
cfg.OpenFeature.TargetingKey = config.Key("targetingKey").MustString(defaultTargetingKey)
|
||||
|
||||
if strURL != "" && cfg.OpenFeature.ProviderType == GOFFProviderType {
|
||||
u, err := url.Parse(strURL)
|
||||
if err != nil {
|
||||
@@ -38,7 +43,7 @@ func (cfg *Cfg) readOpenFeatureSettings() error {
|
||||
|
||||
// build the eval context attributes using [feature_toggles.openfeature.context] section
|
||||
ctxConf := cfg.Raw.Section("feature_toggles.openfeature.context")
|
||||
attrs := map[string]any{}
|
||||
attrs := map[string]string{}
|
||||
for _, key := range ctxConf.KeyStrings() {
|
||||
attrs[key] = ctxConf.Key(key).String()
|
||||
}
|
||||
@@ -48,6 +53,10 @@ func (cfg *Cfg) readOpenFeatureSettings() error {
|
||||
attrs["grafana_version"] = BuildVersion
|
||||
}
|
||||
|
||||
if _, ok := attrs["namespace"]; !ok {
|
||||
attrs["namespace"] = defaultTargetingKey
|
||||
}
|
||||
|
||||
cfg.OpenFeature.ContextAttrs = attrs
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -11,12 +11,13 @@ func Test_CtxAttrs(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
conf string
|
||||
expected map[string]any
|
||||
expected map[string]string
|
||||
}{
|
||||
{
|
||||
name: "empty config - only default attributes should be present",
|
||||
expected: map[string]any{
|
||||
expected: map[string]string{
|
||||
"grafana_version": "",
|
||||
"namespace": "default",
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -26,11 +27,12 @@ func Test_CtxAttrs(t *testing.T) {
|
||||
foo = bar
|
||||
baz = qux
|
||||
quux = corge`,
|
||||
expected: map[string]any{
|
||||
expected: map[string]string{
|
||||
"foo": "bar",
|
||||
"baz": "qux",
|
||||
"quux": "corge",
|
||||
"grafana_version": "",
|
||||
"namespace": "default",
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -39,9 +41,10 @@ quux = corge`,
|
||||
[feature_toggles.openfeature.context]
|
||||
grafana_version = 10.0.0
|
||||
foo = bar`,
|
||||
expected: map[string]any{
|
||||
expected: map[string]string{
|
||||
"grafana_version": "10.0.0",
|
||||
"foo": "bar",
|
||||
"namespace": "default",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user