Updated:

2 minute read

개요


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