개요
- 구성 접근방식
- YAML, TOML or JSON
- S3, Google Cloud Storage, Github, HTTP, Kubernetes config maps, Local file …
- 구성 포맷
- 에디터
- 포맷
- 예시
- YAML
-
# This is your configuration for your first flag
first-flag:
variations: # All possible return value for your feature flag
A: false
B: true
targeting: # If you want to target a subset of your users in particular
- query: key eq "random-key"
percentage:
A: 0
B: 100
defaultRule: # When no targeting match we use the defaultRule
variation: A
metadata:
issue_link: https://github.com/thomaspoignant/go-feature-flag/issues/XXX
description: this is my first feature flag
- 배포 전략
- 사용 데이터 수집
예제
- flags.yaml
-
flag-1:
variations:
Variation_1: true
Variation_2: false
targeting:
- name: Rule 1
query: key eq "key-1"
variation: Variation_1
defaultRule:
variation: Variation_2
- OpenFeature SDK
- Go
- 코드
-
package main
import (
"context"
"strconv"
"time"
gofeatureflag "github.com/open-feature/go-sdk-contrib/providers/go-feature-flag/pkg"
"github.com/open-feature/go-sdk/openfeature"
ffclient "github.com/thomaspoignant/go-feature-flag"
"github.com/thomaspoignant/go-feature-flag/retriever/fileretriever"
)
func getProvider() (openfeature.FeatureProvider, error) {
options := gofeatureflag.ProviderOptions{
GOFeatureFlagConfig: &ffclient.Config{
PollingInterval: 10 * time.Second,
Context: context.Background(),
Retriever: &fileretriever.Retriever{
Path: "./flags.yaml",
},
},
}
return gofeatureflag.NewProvider(options)
}
func main() {
if provider, err := getProvider(); err != nil {
panic(err)
} else if err := openfeature.SetProvider(provider); err != nil {
panic(err)
}
client := openfeature.NewClient("application name")
defer openfeature.Shutdown()
for i := 0; i < 5; i++ {
key := "key-" + strconv.Itoa(i)
evaluationContext := openfeature.NewEvaluationContext(key, nil)
if value, err := client.BooleanValue(context.TODO(), "flag-1", true, evaluationContext); err != nil {
panic(err)
} else {
println(key, "-", value)
}
}
}
- 실행 결과
key-0 - false
key-1 - true
key-2 - false
key-3 - false
key-4 - false
- GO module
- Go
- 코드
-
package main
import (
"context"
"strconv"
"time"
ffclient "github.com/thomaspoignant/go-feature-flag"
"github.com/thomaspoignant/go-feature-flag/exporter/fileexporter"
"github.com/thomaspoignant/go-feature-flag/ffcontext"
"github.com/thomaspoignant/go-feature-flag/retriever/fileretriever"
)
func main() {
if err := ffclient.Init(ffclient.Config{
PollingInterval: 10 * time.Second,
Context: context.Background(),
Retriever: &fileretriever.Retriever{
Path: "./flags.yaml",
},
DataExporter: ffclient.DataExporter{
FlushInterval: 10 * time.Second,
MaxEventInMemory: 100,
Exporter: &fileexporter.Exporter{
OutputDir: "./",
Format: "csv",
Filename: "flag-variation--.",
CsvTemplate: ";;;;;;;;\n",
},
},
}); err != nil {
panic(err)
}
defer ffclient.Close()
for i := 0; i < 5; i++ {
key := "key-" + strconv.Itoa(i)
evaluationContext := ffcontext.NewEvaluationContext(key)
if value, err := ffclient.BoolVariation("flag-1", evaluationContext, true); err != nil {
panic(err)
} else {
println(key, "-", value)
}
}
}
- 실행 결과
- 표준 출력
key-0 - false
key-1 - true
key-2 - false
key-3 - false
key-4 - false
- flag-variation-localhost.localdomain-1712026275.csv
-
feature;user;key-0;1712026275;flag-1;Variation_2;false;false;SERVER
feature;user;key-1;1712026275;flag-1;Variation_1;true;false;SERVER
feature;user;key-2;1712026275;flag-1;Variation_2;false;false;SERVER
feature;user;key-3;1712026275;flag-1;Variation_2;false;false;SERVER
feature;user;key-4;1712026275;flag-1;Variation_2;false;false;SERVER