diff --git a/CHANGES.txt b/CHANGES.txt index 715cec9f..5ad30b91 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,7 @@ +5.6.0 (Jan 23, 2024) +- Replaced redis KEYS operation in favor of SCAN. +- Added FlagSets stats into Split dashboard. + 5.5.1 (Dec 21, 2023) - Updated docker images for vulnerability fixes. - Updated go-split-commons version. diff --git a/LICENSE b/LICENSE index 65f5999d..c022e920 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright © 2023 Split Software, Inc. +Copyright © 2024 Split Software, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/go.mod b/go.mod index 67791ff1..1ddeff5b 100644 --- a/go.mod +++ b/go.mod @@ -8,8 +8,8 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/google/uuid v1.3.0 github.com/splitio/gincache v1.0.1 - github.com/splitio/go-split-commons/v5 v5.1.1 - github.com/splitio/go-toolkit/v5 v5.3.2 + github.com/splitio/go-split-commons/v5 v5.2.0 + github.com/splitio/go-toolkit/v5 v5.4.0 github.com/stretchr/testify v1.8.4 go.etcd.io/bbolt v1.3.6 golang.org/x/exp v0.0.0-20231006140011-7918f672742d diff --git a/go.sum b/go.sum index e87bab4d..1a1bff0b 100644 --- a/go.sum +++ b/go.sum @@ -90,14 +90,10 @@ github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUA github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/splitio/gincache v1.0.1 h1:dLYdANY/BqH4KcUMCe/LluLyV5WtuE/LEdQWRE06IXU= github.com/splitio/gincache v1.0.1/go.mod h1:CcgJDSM9Af75kyBH0724v55URVwMBuSj5x1eCWIOECY= -github.com/splitio/go-split-commons/v5 v5.1.0 h1:mki1235gjXwuxcXdv/bKVduX1Lv09uXJogds+BspqSM= -github.com/splitio/go-split-commons/v5 v5.1.0/go.mod h1:9vAZrlhKvhensyRC11hyVFdgLIBrkX9D5vdYc9qB13w= -github.com/splitio/go-split-commons/v5 v5.1.1-0.20231215145627-50f20bea9ccd h1:SyJzAn3pLbMFafPEzOliYcA4RojNiFk+Sdn0H5cKSVQ= -github.com/splitio/go-split-commons/v5 v5.1.1-0.20231215145627-50f20bea9ccd/go.mod h1:9vAZrlhKvhensyRC11hyVFdgLIBrkX9D5vdYc9qB13w= -github.com/splitio/go-split-commons/v5 v5.1.1 h1:lLOqNQMdZA5Z7FBBh4YODWdE2QFgxSPMptX9ty14x4c= -github.com/splitio/go-split-commons/v5 v5.1.1/go.mod h1:9vAZrlhKvhensyRC11hyVFdgLIBrkX9D5vdYc9qB13w= -github.com/splitio/go-toolkit/v5 v5.3.2 h1:Yy9YBcHRmK5WVZjeA/klLGEdF38xpsL1ejnC3ro8a2M= -github.com/splitio/go-toolkit/v5 v5.3.2/go.mod h1:xYhUvV1gga9/1029Wbp5pjnR6Cy8nvBpjw99wAbsMko= +github.com/splitio/go-split-commons/v5 v5.2.0 h1:1P66JdUV1Fj1DUeWU1rwkeObqinl9AecRxDsktBsx0g= +github.com/splitio/go-split-commons/v5 v5.2.0/go.mod h1:m1Od/jxiSUJXpdbRvRxTaKeSAdQVem5AZr7AjI4xXn8= +github.com/splitio/go-toolkit/v5 v5.4.0 h1:g5WFpRhQomnXCmvfsNOWV4s5AuUrWIZ+amM68G8NBKM= +github.com/splitio/go-toolkit/v5 v5.4.0/go.mod h1:xYhUvV1gga9/1029Wbp5pjnR6Cy8nvBpjw99wAbsMko= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= diff --git a/main b/main new file mode 100755 index 00000000..98420ac9 Binary files /dev/null and b/main differ diff --git a/splitio/admin/controllers/dashboard.go b/splitio/admin/controllers/dashboard.go index a6718764..355f209b 100644 --- a/splitio/admin/controllers/dashboard.go +++ b/splitio/admin/controllers/dashboard.go @@ -157,5 +157,6 @@ func (c *DashboardController) gatherStats() *dashboard.GlobalStats { LoggedErrors: errorCount, LoggedMessages: errorMessages, Uptime: int64(c.runtime.Uptime().Seconds()), + FlagSets: getFlagSetsInfo(c.storages.SplitStorage), } } diff --git a/splitio/admin/controllers/helpers.go b/splitio/admin/controllers/helpers.go index d698b5e1..1016c6d7 100644 --- a/splitio/admin/controllers/helpers.go +++ b/splitio/admin/controllers/helpers.go @@ -1,6 +1,8 @@ package controllers import ( + "sort" + "strings" "time" "github.com/splitio/go-split-commons/v5/storage" @@ -34,6 +36,7 @@ func bundleSplitInfo(splitStorage storage.SplitStorageConsumer) []dashboard.Spli Killed: split.Killed, DefaultTreatment: split.DefaultTreatment, Treatments: treatmentsS, + FlagSets: split.Sets, LastModified: time.Unix(0, split.ChangeNumber*int64(time.Millisecond)).UTC().Format(time.UnixDate), ChangeNumber: split.ChangeNumber, }) @@ -208,6 +211,26 @@ func getEventsSize(eventStorage storage.EventMultiSdkConsumer) int64 { return eventStorage.Count() } +func getFlagSetsInfo(splitsStorage storage.SplitStorage) []dashboard.FlagSetsSummary { + flagSetNames := splitsStorage.GetAllFlagSetNames() + + summaries := make([]dashboard.FlagSetsSummary, 0, len(flagSetNames)) + featureFlagsBySets := splitsStorage.GetNamesByFlagSets(flagSetNames) + + for key, featureFlags := range featureFlagsBySets { + summaries = append(summaries, dashboard.FlagSetsSummary{ + Name: key, + FeatureFlagsAssociated: int64(len(featureFlags)), + FeatureFlags: strings.Join(featureFlags, ", "), + }) + } + sort.Slice(summaries, func(i, j int) bool { + return summaries[j].Name > summaries[i].Name + }) + + return summaries +} + func getImpressionSize(impressionStorage storage.ImpressionMultiSdkConsumer) int64 { if impressionStorage == nil { return 0 diff --git a/splitio/admin/controllers/observability.go b/splitio/admin/controllers/observability.go index 1170f55c..d4ae8a75 100644 --- a/splitio/admin/controllers/observability.go +++ b/splitio/admin/controllers/observability.go @@ -12,6 +12,12 @@ import ( "github.com/gin-gonic/gin" ) +type ObservabilityDto struct { + ActiveSplits []string `json:"activeSplits"` + ActiveSegments map[string]int `json:"activeSegments"` + ActiveFlagSets []string `json:"activeFlagSets"` +} + // ObservabilityController interface is used to have a single constructor that returns the apropriate controller type ObservabilityController interface { Register(gin.IRouter) @@ -30,9 +36,10 @@ func (c *SyncObservabilityController) Register(router gin.IRouter) { } func (c *SyncObservabilityController) observability(ctx *gin.Context) { - ctx.JSON(200, gin.H{ - "activeSplits": c.splits.SplitNames(), - "activeSegments": c.segments.NamesAndCount(), + ctx.JSON(200, ObservabilityDto{ + ActiveSplits: c.splits.SplitNames(), + ActiveSegments: c.segments.NamesAndCount(), + ActiveFlagSets: c.splits.GetAllFlagSetNames(), }) } diff --git a/splitio/admin/controllers/observability_test.go b/splitio/admin/controllers/observability_test.go new file mode 100644 index 00000000..0a0d8512 --- /dev/null +++ b/splitio/admin/controllers/observability_test.go @@ -0,0 +1,131 @@ +package controllers + +import ( + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/splitio/go-split-commons/v5/dtos" + "github.com/splitio/go-split-commons/v5/storage/mocks" + "github.com/splitio/go-toolkit/v5/datastructures/set" + "github.com/splitio/go-toolkit/v5/logging" + adminCommon "github.com/splitio/split-synchronizer/v5/splitio/admin/common" + "github.com/splitio/split-synchronizer/v5/splitio/provisional/observability" +) + +func TestSyncObservabilityEndpoint(t *testing.T) { + logger := logging.NewLogger(nil) + + extSplitStorage := &extMockSplitStorage{ + &mocks.MockSplitStorage{ + SplitNamesCall: func() []string { + return []string{"split1", "split2", "split3"} + }, + SegmentNamesCall: func() *set.ThreadUnsafeSet { + return set.NewSet("segment1") + }, + GetAllFlagSetNamesCall: func() []string { + return []string{"fSet1", "fSet2"} + }, + }, + nil, + } + + extSegmentStorage := &extMockSegmentStorage{ + MockSegmentStorage: &mocks.MockSegmentStorage{}, + SizeCall: func(name string) (int, error) { + switch name { + case "segment1": + return 10, nil + case "segment2": + return 20, nil + } + return 0, nil + }, + } + + oSplitStorage, err := observability.NewObservableSplitStorage(extSplitStorage, logger) + if err != nil { + t.Error(err) + return + } + + oSegmentStorage, err := observability.NewObservableSegmentStorage(logger, extSplitStorage, extSegmentStorage) + if err != nil { + t.Error(err) + return + } + + storages := adminCommon.Storages{ + SplitStorage: oSplitStorage, + SegmentStorage: oSegmentStorage, + } + + ctrl, err := NewObservabilityController(false, logger, storages) + + if err != nil { + t.Error(err) + return + } + + resp := httptest.NewRecorder() + ctx, router := gin.CreateTestContext(resp) + ctrl.Register(router) + + ctx.Request, _ = http.NewRequest(http.MethodGet, "/observability", nil) + router.ServeHTTP(resp, ctx.Request) + + if resp.Code != 200 { + t.Error("hay crap.") + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Error(err) + return + } + + var result ObservabilityDto + if err := json.Unmarshal(body, &result); err != nil { + t.Error("there should be no error ", err) + } + + if len(result.ActiveFlagSets) != 2 { + t.Errorf("Active flag sets should be 2. Actual %d", len(result.ActiveFlagSets)) + } + + if len(result.ActiveSplits) != 3 { + t.Errorf("Active splits should be 3. Actual %d", len(result.ActiveSplits)) + } + + if len(result.ActiveSegments) != 1 { + t.Errorf("Active segments should be 1. Actual %d", len(result.ActiveSegments)) + } +} + +// TODO: should unify this classes +type extMockSplitStorage struct { + *mocks.MockSplitStorage + UpdateWithErrorsCall func([]dtos.SplitDTO, []dtos.SplitDTO, int64) error +} + +func (e *extMockSplitStorage) UpdateWithErrors(toAdd []dtos.SplitDTO, toRemove []dtos.SplitDTO, cn int64) error { + return e.UpdateWithErrorsCall(toAdd, toRemove, cn) +} + +type extMockSegmentStorage struct { + *mocks.MockSegmentStorage + UpdateWithSummaryCall func(string, *set.ThreadUnsafeSet, *set.ThreadUnsafeSet, int64) (int, int, error) + SizeCall func(string) (int, error) +} + +func (e *extMockSegmentStorage) UpdateWithSummary(name string, toAdd *set.ThreadUnsafeSet, toRemove *set.ThreadUnsafeSet, till int64) (added int, removed int, err error) { + return e.UpdateWithSummaryCall(name, toAdd, toRemove, till) +} + +func (e *extMockSegmentStorage) Size(name string) (int, error) { + return e.SizeCall(name) +} diff --git a/splitio/admin/views/dashboard/datainspector.go b/splitio/admin/views/dashboard/datainspector.go index ef17c505..6081b894 100644 --- a/splitio/admin/views/dashboard/datainspector.go +++ b/splitio/admin/views/dashboard/datainspector.go @@ -9,121 +9,140 @@ const dataInspector = `
  • -  Segments - + + + + +  Segments + +
  • +
  • + + +  Flag Sets +
  • - + -
    +
    - -
    -
    -
    -
    - -
    -
    -
    - - - - - -
    + +
    +
    +
    +
    + +
    +
    +
    + + + + +
    -
    -
    - - - - - - - - - - - - -
    Feature FlagStatusKilledTreatmentsLast Modified
    -
    +
    +
    +
    + + + + + + + + + + + + + +
    Feature FlagStatusKilledTreatmentsFlag SetsLast Modified
    +
    + + +
    +
    +
    +
    + + + + + {{if .ProxyMode}} + + + + + + + {{else}} + + + + + {{end}} + + + + +
     SegmentTotal KeysRemoved KeysActive KeysLast Modified SegmentActive KeysLast Modified
    +
    +
    +
    +
    - -
    -
    -
    -
    - - - - - {{if .ProxyMode}} - - - - - - - {{else}} - - - - - {{end}} - - - - -
     SegmentTotal KeysRemoved KeysActive KeysLast Modified SegmentActive KeysLast Modified
    -
    + +
    +
    +
    +
    + + + + {{if .ProxyMode}} + + {{else}} + + + + {{end}} + + + + +
     Flag SetTotal Feature Flags AssociatedFeature Flags
    +
    {{end}} ` diff --git a/splitio/admin/views/dashboard/js.go b/splitio/admin/views/dashboard/js.go index 7d3ff2c3..eb584b99 100644 --- a/splitio/admin/views/dashboard/js.go +++ b/splitio/admin/views/dashboard/js.go @@ -241,6 +241,7 @@ const mainScript = ` (!featureFlag.active ? 'ARCHIVED' : 'ACTIVE') + (featureFlag.killed ? 'true' : 'false') + ' ' + formatTreatments(featureFlag) + '' + + ' ' + featureFlag.flagSets + '' + ' ' + featureFlag.cn + '' + '\n'); }; @@ -254,6 +255,21 @@ const mainScript = ` } }; + function formatFlagSet(flagSet) { + return ( + '' + + ' ' + flagSet.name + '' + + ' ' + flagSet.featureFlagsAssociated + '' + + ' ' + flagSet.featureFlags + '' + + '\n'); + }; + + function updateFlagSets(flagSets) { + const formatted = flagSets.map(formatFlagSet).join('\n'); + $('#flag_sets_rows tbody').empty(); + $('#flag_sets_rows tbody').append(formatted); + } + function formatSegment(segment) { return '' + '' + @@ -317,6 +333,7 @@ const mainScript = ` $('#backend_total_requests').html(stats.backendTotalRequests); $('#feature_flags_number').html(stats.featureFlags.length); $('#segments_number').html(stats.segments.length); + $('#flag_sets_number').html(stats.flagSets.length); $('#impressions_queue_value').html(stats.impressionsQueueSize); $('#events_queue_value').html(stats.eventsQueueSize); $('#feature_flags_number').html(); @@ -408,6 +425,7 @@ const mainScript = ` updateFeatureFlags(stats.featureFlags); updateSegments(stats.segments); updateLogEntries(stats.loggedMessages); + updateFlagSets(stats.flagSets) renderBackendStatsChart(stats.backendLatencies); {{if .ProxyMode}} diff --git a/splitio/admin/views/dashboard/main.go b/splitio/admin/views/dashboard/main.go index 76567cb1..b790e22a 100644 --- a/splitio/admin/views/dashboard/main.go +++ b/splitio/admin/views/dashboard/main.go @@ -87,23 +87,24 @@ type RootObject struct { // GlobalStats runtime stats used to render the dashboard type GlobalStats struct { - BackendTotalRequests int64 `json:"backendTotalRequests"` - RequestsOk int64 `json:"requestsOk"` - RequestsErrored int64 `json:"requestsErrored"` - BackendRequestsOk int64 `json:"backendRequestsOk"` - BackendRequestsErrored int64 `json:"backendRequestsErrored"` - SdksTotalRequests int64 `json:"sdksTotalRequests"` - LoggedErrors int64 `json:"loggedErrors"` - LoggedMessages []string `json:"loggedMessages"` - FeatureFlags []SplitSummary `json:"featureFlags"` - Segments []SegmentSummary `json:"segments"` - Latencies []ChartJSData `json:"latencies"` - BackendLatencies []ChartJSData `json:"backendLatencies"` - ImpressionsQueueSize int64 `json:"impressionsQueueSize"` - ImpressionsLambda float64 `json:"impressionsLambda"` - EventsQueueSize int64 `json:"eventsQueueSize"` - EventsLambda float64 `json:"eventsLambda"` - Uptime int64 `json:"uptime"` + BackendTotalRequests int64 `json:"backendTotalRequests"` + RequestsOk int64 `json:"requestsOk"` + RequestsErrored int64 `json:"requestsErrored"` + BackendRequestsOk int64 `json:"backendRequestsOk"` + BackendRequestsErrored int64 `json:"backendRequestsErrored"` + SdksTotalRequests int64 `json:"sdksTotalRequests"` + LoggedErrors int64 `json:"loggedErrors"` + LoggedMessages []string `json:"loggedMessages"` + FeatureFlags []SplitSummary `json:"featureFlags"` + Segments []SegmentSummary `json:"segments"` + Latencies []ChartJSData `json:"latencies"` + BackendLatencies []ChartJSData `json:"backendLatencies"` + ImpressionsQueueSize int64 `json:"impressionsQueueSize"` + ImpressionsLambda float64 `json:"impressionsLambda"` + EventsQueueSize int64 `json:"eventsQueueSize"` + EventsLambda float64 `json:"eventsLambda"` + Uptime int64 `json:"uptime"` + FlagSets []FlagSetsSummary `json:"flagSets"` } // SplitSummary encapsulates a minimalistic view of feature flag properties to be presented in the dashboard @@ -113,6 +114,7 @@ type SplitSummary struct { Killed bool `json:"killed"` DefaultTreatment string `json:"defaultTreatment"` Treatments []string `json:"treatments"` + FlagSets []string `json:"flagSets"` LastModified string `json:"cn"` ChangeNumber int64 `json:"changeNumber"` } @@ -134,6 +136,12 @@ type SegmentKeySummary struct { ChangeNumber int64 `json:"cn"` } +type FlagSetsSummary struct { + Name string `json:"name"` + FeatureFlagsAssociated int64 `json:"featureFlagsAssociated"` + FeatureFlags string `json:"featureFlags"` +} + // RGBA bundles input to CSS's rgba function type RGBA struct { Red int32 diff --git a/splitio/admin/views/dashboard/stats.go b/splitio/admin/views/dashboard/stats.go index a46a52d8..914b525d 100644 --- a/splitio/admin/views/dashboard/stats.go +++ b/splitio/admin/views/dashboard/stats.go @@ -68,18 +68,24 @@ const cards = `

    -
    +

    Cached Feature Flags

    -
    +

    Cached Segments

    +
    +
    +

    Cached Flag Sets

    +

    +
    +
    {{end}}
    diff --git a/splitio/producer/initialization.go b/splitio/producer/initialization.go index f1a865cb..884b4a6d 100644 --- a/splitio/producer/initialization.go +++ b/splitio/producer/initialization.go @@ -90,7 +90,7 @@ func Start(logger logging.LoggerInterface, cfg *conf.Main) error { flagSetsFilter := flagsets.NewFlagSetFilter(cfg.FlagSetsFilter) // These storages are forwarded to the dashboard, the sdk-telemetry is irrelevant there - splitStorage, err := observability.NewObservableSplitStorage(redis.NewSplitStorage(redisClient, logger, flagSetsFilter), logger) + splitStorage, err := observability.NewObservableSplitStorage(redis.NewSplitStorage(redisClient, logger, flagSetsFilter, int64(redisOptions.ScanCount)), logger) if err != nil { return fmt.Errorf("error instantiating observable feature flag storage: %w", err) } diff --git a/splitio/producer/util.go b/splitio/producer/util.go index f7cda7f2..bd151e01 100644 --- a/splitio/producer/util.go +++ b/splitio/producer/util.go @@ -30,6 +30,7 @@ import ( const ( impressionsCountPeriodTaskInMemory = 1800 // 30 min impressionObserverSize = 500 + ScanCount = 10 ) func parseTLSConfig(opt *conf.Redis) (*tls.Config, error) { @@ -99,6 +100,7 @@ func parseRedisOptions(cfg *conf.Redis) (*config.RedisConfig, error) { WriteTimeout: cfg.WriteTimeout, PoolSize: cfg.PoolSize, TLSConfig: tlsCfg, + ScanCount: ScanCount, } if cfg.SentinelReplication { diff --git a/splitio/proxy/caching/workers_test.go b/splitio/proxy/caching/workers_test.go index e90ca744..a979c9d9 100644 --- a/splitio/proxy/caching/workers_test.go +++ b/splitio/proxy/caching/workers_test.go @@ -289,6 +289,9 @@ func (*splitStorageMock) FetchMany(splitNames []string) map[string]*dtos.SplitDT func (*splitStorageMock) GetNamesByFlagSets(sets []string) map[string][]string { panic("unimplemented") } +func (*splitStorageMock) GetAllFlagSetNames() []string { + panic("unimplemented") +} func (*splitStorageMock) KillLocally(splitName string, defaultTreatment string, changeNumber int64) { panic("unimplemented") } @@ -346,28 +349,28 @@ func (*segmentStorageMock) SegmentContainsKey(segmentName string, key string) (b func (*segmentStorageMock) SegmentKeysCount() int64 { panic("unimplemented") } /* -type segmentUpdaterMock struct { - SynchronizeSegmentCall func(name string, till *int64) (*segment.UpdateResult, error) - SynchronizeSegmentsCall func() (map[string]segment.UpdateResult, error) - SegmentNamesCall func() []interface{} - IsSegmentCachedCall func(segmentName string) bool -} + type segmentUpdaterMock struct { + SynchronizeSegmentCall func(name string, till *int64) (*segment.UpdateResult, error) + SynchronizeSegmentsCall func() (map[string]segment.UpdateResult, error) + SegmentNamesCall func() []interface{} + IsSegmentCachedCall func(segmentName string) bool + } -func (s *segmentUpdaterMock) SynchronizeSegment(name string, till *int64) (*segment.UpdateResult, error) { - return s.SynchronizeSegmentCall(name, till) -} + func (s *segmentUpdaterMock) SynchronizeSegment(name string, till *int64) (*segment.UpdateResult, error) { + return s.SynchronizeSegmentCall(name, till) + } -func (s *segmentUpdaterMock) SynchronizeSegments() (map[string]segment.UpdateResult, error) { - return s.SynchronizeSegmentsCall() -} + func (s *segmentUpdaterMock) SynchronizeSegments() (map[string]segment.UpdateResult, error) { + return s.SynchronizeSegmentsCall() + } -func (s *segmentUpdaterMock) SegmentNames() []interface{} { - return s.SegmentNamesCall() -} + func (s *segmentUpdaterMock) SegmentNames() []interface{} { + return s.SegmentNamesCall() + } -func (s *segmentUpdaterMock) IsSegmentCached(segmentName string) bool { - return s.IsSegmentCachedCall(segmentName) -} + func (s *segmentUpdaterMock) IsSegmentCached(segmentName string) bool { + return s.IsSegmentCachedCall(segmentName) + } */ var _ split.Updater = (*splitUpdaterMock)(nil) var _ storage.SplitStorage = (*splitStorageMock)(nil) diff --git a/splitio/proxy/storage/splits.go b/splitio/proxy/storage/splits.go index 46cfc04d..4214dd52 100644 --- a/splitio/proxy/storage/splits.go +++ b/splitio/proxy/storage/splits.go @@ -179,6 +179,13 @@ func (*ProxySplitStorageImpl) GetNamesByFlagSets(sets []string) map[string][]str return nil } +// GetAllFlagSetNames implements storage.SplitStorage +func (*ProxySplitStorageImpl) GetAllFlagSetNames() []string { + // NOTE: This method is NOT used by the proxy. + // we need to revisit our interfaces so that we're not obliged to do this smeely empty impls. + return nil +} + func (p *ProxySplitStorageImpl) setStartingPoint(cn int64) { p.mtx.Lock() // will be executed only the first time this method is called or when diff --git a/splitio/version.go b/splitio/version.go index a906b92b..d1d43be0 100644 --- a/splitio/version.go +++ b/splitio/version.go @@ -2,4 +2,4 @@ package splitio // Version is the version of this Agent -const Version = "5.5.1" +const Version = "5.6.0"