diff options
author | John Cai <jcai@gitlab.com> | 2019-02-28 04:03:04 +0300 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2019-03-26 18:28:12 +0300 |
commit | 1c2bfc99bad4b2b1579334b2e018bfec53b96025 (patch) | |
tree | f3f4b7313c618c6c114fc286f7b61e2ed9910ce4 /doc | |
parent | 12818c20430bec5b54903e19ff78b0575c61f05c (diff) |
Add development documentation for gitaly feature flags
Diffstat (limited to 'doc')
-rw-r--r-- | doc/development/gitaly.md | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md index b1785e6f803..2dc1aba02f1 100644 --- a/doc/development/gitaly.md +++ b/doc/development/gitaly.md @@ -191,3 +191,82 @@ as a [CI environment variable](../ci/variables/README.md#variables). --- [Return to Development documentation](README.md) + +## Wrapping RPCs in Feature Flags + +Here are the steps to gate a new feature in Gitaly behind a feature flag. + +### Gitaly + +1. Create a package scoped flag name: + + ```go + var findAllTagsFeatureFlag = "go-find-all-tags" + ``` + +1. Create a switch in the code using the `featureflag` package: + + ```go + if featureflag.IsEnabled(ctx, findAllTagsFeatureFlag) { + // go implementation + } else { + // ruby implementation + } + ``` + +1. Create prometheus metrics: + + ```go + var findAllTagsRequests = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "gitaly_find_all_tags_requests_total", + Help: "Counter of go vs ruby implementation of FindAllTags", + }, + []string{"implementation"}, + ) + ) + + func init() { + prometheus.Register(findAllTagsRequests) + } + + if featureflag.IsEnabled(ctx, findAllTagsFeatureFlag) { + findAllTagsRequests.WithLabelValues("go").Inc() + // go implementation + } else { + findAllTagsRequests.WithLabelValues("ruby").Inc() + // ruby impelmentation + } + ``` + +1. Set headers in tests: + + ```go + import ( + "google.golang.org/grpc/metadata" + + "gitlab.com/gitlab-org/gitaly/internal/featureflag" + ) + + //... + + md := metadata.New(map[string]string{featureflag.HeaderKey(findAllTagsFeatureFlag): "true"}) + ctx = metadata.NewOutgoingContext(context.Background(), md) + + c, err = client.FindAllTags(ctx, rpcRequest) + require.NoError(t, err) + ``` + +### Gitlab-Rails + +1. Add feature flag to `lib/gitlab/gitaly_client.rb` (in gitlab-rails): + + ```ruby + SERVER_FEATURE_FLAGS = %w[go-find-all-tags].freeze + ``` + +1. Test in rails console by setting feature flag: + + ```ruby + Feature.enable('gitaly_go-find-all-tags') + ``` |