2 분 소요

개요


Feature Flag 구성

# 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