[Feature Flagging] GO Feature Flag
Updated:
개요
- 사이트/GitHub
- OpenFeature를 만족하는 프로바이더
- OpenFeature SDK 또는 GO module로 사용
Feature Flag 구성
- 구성 접근방식
- 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
-
- YAML
- 배포 전략
- 사용 데이터 수집
- format : parquet, JSON or CSV
- exporters
예제
- 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
- 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
-
- 표준 출력
- 코드
- Go