Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pkg/bucketeer/cache/processor/feature_flag_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ type processor struct {
pushSizeMetricsEvent func(sizeByte int, api model.APIID)
pushErrorEvent func(err error, api model.APIID)
tag string
sdkVersion string
closeCh chan struct{}
loggers *log.Loggers
}
Expand Down Expand Up @@ -140,6 +141,7 @@ func (p *processor) updateCache() error {
req := model.NewGetFeatureFlagsRequest(
p.tag,
ftsID,
p.sdkVersion,
requestedAt,
)
// Get the latest cache from the server
Expand Down
23 changes: 14 additions & 9 deletions pkg/bucketeer/cache/processor/feature_flag_processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ import (
mockevt "github.com/bucketeer-io/go-server-sdk/test/mock/event"
)

const (
sdkVersion = "1.5.5"
)

func TestPollingInterval(t *testing.T) {
t.Parallel()
mockController := gomock.NewController(t)
Expand Down Expand Up @@ -114,7 +118,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsIDKey).Return("", nil)
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsRequestedAtKey).Return(int64(0), nil)

req := model.NewGetFeatureFlagsRequest(tag, "", int64(0))
req := model.NewGetFeatureFlagsRequest(tag, "", sdkVersion, int64(0))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
nil,
0,
Expand All @@ -136,7 +140,7 @@ func TestUpdateCache(t *testing.T) {
// Call in the processor cache
p.cache.(*mockcache.MockCache).EXPECT().Put(featureFlagsIDKey, "feature-flags-id-2", cacheTTL).Return(internalErr)

req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", int64(10))
req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", sdkVersion, int64(10))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{
FeatureFlagsID: "feature-flags-id-2",
Expand Down Expand Up @@ -171,7 +175,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsIDKey).Return("feature-flags-id-1", nil)
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsRequestedAtKey).Return(int64(10), nil)

req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", int64(10))
req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", sdkVersion, int64(10))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{
FeatureFlagsID: "feature-flags-id-2",
Expand Down Expand Up @@ -210,7 +214,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsIDKey).Return("feature-flags-id-1", nil)
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsRequestedAtKey).Return(int64(10), nil)

req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", int64(10))
req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", sdkVersion, int64(10))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{
FeatureFlagsID: "feature-flags-id-2",
Expand Down Expand Up @@ -248,7 +252,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsIDKey).Return("feature-flags-id-1", nil)
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsRequestedAtKey).Return(int64(10), nil)

req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", int64(10))
req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", sdkVersion, int64(10))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{
FeatureFlagsID: "feature-flags-id-2",
Expand Down Expand Up @@ -288,7 +292,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Put(featureFlagsIDKey, "", cacheTTL).Return(nil)
p.cache.(*mockcache.MockCache).EXPECT().Put(featureFlagsRequestedAtKey, int64(0), cacheTTL).Return(nil)

req := model.NewGetFeatureFlagsRequest(tag, "", int64(10))
req := model.NewGetFeatureFlagsRequest(tag, "", sdkVersion, int64(10))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{},
1,
Expand All @@ -309,7 +313,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Put(featureFlagsIDKey, "", cacheTTL).Return(nil)
p.cache.(*mockcache.MockCache).EXPECT().Put(featureFlagsRequestedAtKey, int64(0), cacheTTL).Return(nil)

req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", int64(0))
req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", sdkVersion, int64(0))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{},
1,
Expand Down Expand Up @@ -340,7 +344,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Put(featureFlagsIDKey, "feature-flags-id-2", cacheTTL).Return(nil)
p.cache.(*mockcache.MockCache).EXPECT().Put(featureFlagsRequestedAtKey, int64(20), cacheTTL).Return(nil)

req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", int64(10))
req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", sdkVersion, int64(10))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{
FeatureFlagsID: "feature-flags-id-2",
Expand All @@ -366,7 +370,7 @@ func TestUpdateCache(t *testing.T) {
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsIDKey).Return("feature-flags-id-1", nil)
p.cache.(*mockcache.MockCache).EXPECT().Get(featureFlagsRequestedAtKey).Return(int64(10), nil)

req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", int64(10))
req := model.NewGetFeatureFlagsRequest(tag, "feature-flags-id-1", sdkVersion, int64(10))
p.apiClient.(*mockapi.MockClient).EXPECT().GetFeatureFlags(req).Return(
&model.GetFeatureFlagsResponse{
FeatureFlagsID: "feature-flags-id-2",
Expand Down Expand Up @@ -442,6 +446,7 @@ func newMockFeatureFlagProcessor(
cache: cacheInMemory,
featureFlagsCache: featureFlagsCache,
tag: tag,
sdkVersion: sdkVersion,
closeCh: make(chan struct{}),
pollingInterval: pollingInterval,
loggers: log.NewLoggers(loggerConf),
Expand Down
21 changes: 14 additions & 7 deletions pkg/bucketeer/event/processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ type processor struct {
closeCh chan struct{}
workerWG sync.WaitGroup
tag string
sdkVersion string
}

// ProcessorConfig is the config for Processor.
Expand Down Expand Up @@ -99,6 +100,9 @@ type ProcessorConfig struct {
//
// The tag is set when a Feature Flag is created, and can be retrieved from the admin console.
Tag string

// SDKVersion is the SDK version.
SDKVersion string
}

// NewProcessor creates a new Processor.
Expand All @@ -117,6 +121,7 @@ func NewProcessor(ctx context.Context, conf *ProcessorConfig) Processor {
loggers: conf.Loggers,
closeCh: make(chan struct{}),
tag: conf.Tag,
sdkVersion: conf.SDKVersion,
}
go p.startWorkers(ctx)
return p
Expand All @@ -130,6 +135,7 @@ func (p *processor) PushEvaluationEvent(
p.tag,
evaluation.FeatureID,
evaluation.VariationID,
p.sdkVersion,
evaluation.FeatureVersion,
user,
evaluation.Reason,
Expand Down Expand Up @@ -160,6 +166,7 @@ func (p *processor) PushDefaultEvaluationEvent(user *user.User, featureID string
p.tag,
featureID,
"",
p.sdkVersion,
0,
user,
&model.Reason{Type: model.ReasonClient},
Expand All @@ -186,7 +193,7 @@ func (p *processor) PushDefaultEvaluationEvent(user *user.User, featureID string
}

func (p *processor) PushGoalEvent(user *user.User, GoalID string, value float64) {
goalEvt := model.NewGoalEvent(p.tag, GoalID, value, user)
goalEvt := model.NewGoalEvent(p.tag, GoalID, p.sdkVersion, value, user)
encodedGoalEvt, err := json.Marshal(goalEvt)
if err != nil {
p.loggers.Errorf(
Expand Down Expand Up @@ -217,7 +224,7 @@ func (p *processor) PushLatencyMetricsEvent(duration time.Duration, api model.AP
p.loggers.Errorf("bucketeer/event: PushLatencyMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
return
}
metricsEvt := model.NewMetricsEvent(encodedGELMetricsEvt)
metricsEvt := model.NewMetricsEvent(encodedGELMetricsEvt, p.sdkVersion)
encodedMetricsEvt, err := json.Marshal(metricsEvt)
if err != nil {
p.loggers.Errorf("bucketeer/event: PushLatencyMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
Expand All @@ -236,7 +243,7 @@ func (p *processor) PushSizeMetricsEvent(sizeByte int, api model.APIID) {
p.loggers.Errorf("bucketeer/event: PushSizeMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
return
}
metricsEvt := model.NewMetricsEvent(encodedGESMetricsEvt)
metricsEvt := model.NewMetricsEvent(encodedGESMetricsEvt, p.sdkVersion)
encodedMetricsEvt, err := json.Marshal(metricsEvt)
if err != nil {
p.loggers.Errorf("bucketeer/event: PushSizeMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
Expand All @@ -256,7 +263,7 @@ func (p *processor) pushTimeoutErrorMetricsEvent(api model.APIID) {
p.loggers.Errorf("bucketeer/event: pushTimeoutErrorMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
return
}
metricsEvt := model.NewMetricsEvent(encodedTECMetricsEvt)
metricsEvt := model.NewMetricsEvent(encodedTECMetricsEvt, p.sdkVersion)
encodedMetricsEvt, err := json.Marshal(metricsEvt)
if err != nil {
p.loggers.Errorf("bucketeer/event: pushTimeoutErrorMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
Expand All @@ -275,7 +282,7 @@ func (p *processor) pushInternalSDKErrorMetricsEvent(api model.APIID, err error)
p.loggers.Errorf("bucketeer/event: pushInternalSDKErrorMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
return
}
metricsEvt := model.NewMetricsEvent(encodedIECMetricsEvt)
metricsEvt := model.NewMetricsEvent(encodedIECMetricsEvt, p.sdkVersion)
encodedMetricsEvt, err := json.Marshal(metricsEvt)
if err != nil {
p.loggers.Errorf("bucketeer/event: pushInternalSDKErrorMetricsEvent failed (err: %v, tag: %s", err, p.tag)
Expand Down Expand Up @@ -323,7 +330,7 @@ func (p *processor) pushErrorStatusCodeMetricsEvent(api model.APIID, code int, e
p.loggers.Errorf("bucketeer/event: pushErrorStatusCodeMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
return
}
metricsEvt := model.NewMetricsEvent(encodedESCMetricsEvt)
metricsEvt := model.NewMetricsEvent(encodedESCMetricsEvt, p.sdkVersion)
encodedMetricsEvt, err := json.Marshal(metricsEvt)
if err != nil {
p.loggers.Errorf("bucketeer/event: pushErrorStatusCodeMetricsEvent failed (err: %v, tag: %s", err, p.tag)
Expand All @@ -342,7 +349,7 @@ func (p *processor) PushNetworkErrorMetricsEvent(api model.APIID) {
p.loggers.Errorf("bucketeer/event: PushNetworkErrorMetricsEvent failed (err: %v, tag: %s)", err, p.tag)
return
}
metricsEvt := model.NewMetricsEvent(encodedNEMetricsEvt)
metricsEvt := model.NewMetricsEvent(encodedNEMetricsEvt, p.sdkVersion)
encodedMetricsEvt, err := json.Marshal(metricsEvt)
if err != nil {
p.loggers.Errorf("bucketeer/event: PushNetworkErrorMetricsEvent failed (err: %v, tag: %s", err, p.tag)
Expand Down
11 changes: 3 additions & 8 deletions pkg/bucketeer/event/processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,14 @@ const (
processorGoalID = "goal-id"
)

type registerEventsResponseError struct {
Retriable bool `json:"retriable,omitempty"`
Message string `json:"message,omitempty"`
}

Comment on lines -30 to -34
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This struct is unused now.

func TestPushEvaluationEvent(t *testing.T) {
t.Parallel()
p := newProcessorForTestPushEvent(t, 10)
user := newUser(t, processorUserID)
evaluation := newEvaluation(t, processorFeatureID, processorVariationID)
p.PushEvaluationEvent(user, evaluation)
evt := <-p.evtQueue.eventCh()
e := &model.EvaluationEvent{}
e := model.NewEvaluationEvent(p.tag, processorFeatureID, "", version.SDKVersion, 0, user, &model.Reason{Type: model.ReasonClient})
err := json.Unmarshal(evt.Event, e)
assert.NoError(t, err)
assert.Equal(t, p.tag, e.Tag)
Expand All @@ -59,7 +54,7 @@ func TestPushDefaultEvaluationEvent(t *testing.T) {
user := newUser(t, processorUserID)
p.PushDefaultEvaluationEvent(user, processorFeatureID)
evt := <-p.evtQueue.eventCh()
e := &model.EvaluationEvent{}
e := model.NewEvaluationEvent(p.tag, processorFeatureID, "", version.SDKVersion, 0, user, &model.Reason{Type: model.ReasonClient})
err := json.Unmarshal(evt.Event, e)
assert.NoError(t, err)
assert.Equal(t, p.tag, e.Tag)
Expand All @@ -79,7 +74,7 @@ func TestPushGoalEvent(t *testing.T) {
user := newUser(t, processorUserID)
p.PushGoalEvent(user, processorGoalID, 1.1)
evt := <-p.evtQueue.eventCh()
e := &model.GoalEvent{}
e := model.NewGoalEvent(p.tag, processorGoalID, version.SDKVersion, 1.1, user)
err := json.Unmarshal(evt.Event, e)
assert.NoError(t, err)
assert.Equal(t, p.tag, e.Tag)
Expand Down
6 changes: 2 additions & 4 deletions pkg/bucketeer/model/evaluation_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"time"

"github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/user"

"github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/version"
)

type EvaluationEvent struct {
Expand All @@ -23,7 +21,7 @@ type EvaluationEvent struct {
}

func NewEvaluationEvent(
tag, featureID, variationID string,
tag, featureID, variationID, sdkVersion string,
featureVersion int32,
user *user.User,
reason *Reason,
Expand All @@ -37,7 +35,7 @@ func NewEvaluationEvent(
User: user,
Reason: reason,
SourceID: SourceIDGoServer,
SDKVersion: version.SDKVersion,
SDKVersion: sdkVersion,
Metadata: map[string]string{},
Type: EvaluationEventType,
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/bucketeer/model/evaluation_event_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

func TestNewEvaluationEvent(t *testing.T) {
t.Parallel()
e := NewEvaluationEvent(tag, featureID, variationID, featureVersion, newUser(t, id), &Reason{Type: ReasonClient})
e := NewEvaluationEvent(tag, featureID, variationID, version.SDKVersion, featureVersion, newUser(t, id), &Reason{Type: ReasonClient})
assert.IsType(t, &EvaluationEvent{}, e)
assert.Equal(t, tag, e.Tag)
assert.Equal(t, EvaluationEventType, e.Type)
Expand Down
8 changes: 5 additions & 3 deletions pkg/bucketeer/model/get_evaluation_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package model

import (
"github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/user"
"github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/version"
)

type GetEvaluationRequest struct {
Expand All @@ -13,12 +12,15 @@ type GetEvaluationRequest struct {
SDKVersion string `json:"sdkVersion,omitempty"`
}

func NewGetEvaluationRequest(tag, featureID string, user *user.User) *GetEvaluationRequest {
func NewGetEvaluationRequest(
tag, featureID, sdkVersion string,
user *user.User,
) *GetEvaluationRequest {
return &GetEvaluationRequest{
Tag: tag,
User: user,
FeatureID: featureID,
SourceID: SourceIDGoServer,
SDKVersion: version.SDKVersion,
SDKVersion: sdkVersion,
}
}
2 changes: 1 addition & 1 deletion pkg/bucketeer/model/get_evaluation_request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

func TestNewGetEvaluationRequest(t *testing.T) {
t.Parallel()
e := NewGetEvaluationRequest(tag, featureID, newUser(t, id))
e := NewGetEvaluationRequest(tag, featureID, version.SDKVersion, newUser(t, id))
assert.IsType(t, &GetEvaluationRequest{}, e)
assert.Equal(t, tag, e.Tag)
assert.Equal(t, SourceIDGoServer, e.SourceID)
Expand Down
11 changes: 5 additions & 6 deletions pkg/bucketeer/model/get_feature_flags_request.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package model

import (
"github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/version"
)

type GetFeatureFlagsRequest struct {
Tag string `json:"tag"`
FeatureFlagsID string `json:"featureFlagsId"`
Expand All @@ -12,12 +8,15 @@ type GetFeatureFlagsRequest struct {
SDKVersion string `json:"sdkVersion"`
}

func NewGetFeatureFlagsRequest(tag, featureFlagsID string, requestedAt int64) *GetFeatureFlagsRequest {
func NewGetFeatureFlagsRequest(
tag, featureFlagsID, sdkVersion string,
requestedAt int64,
) *GetFeatureFlagsRequest {
return &GetFeatureFlagsRequest{
Tag: tag,
FeatureFlagsID: featureFlagsID,
RequestedAt: requestedAt,
SourceID: SourceIDGoServer,
SDKVersion: version.SDKVersion,
SDKVersion: sdkVersion,
}
}
3 changes: 2 additions & 1 deletion pkg/bucketeer/model/get_feature_flags_request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ func TestNewGetFeatureFlagsRequest(t *testing.T) {
t.Parallel()
featureFlagsID := "fid-1"
requestedAt := int64(1)
e := NewGetFeatureFlagsRequest(tag, featureFlagsID, requestedAt)
sdkVersion := version.SDKVersion
e := NewGetFeatureFlagsRequest(tag, featureFlagsID, sdkVersion, requestedAt)
assert.IsType(t, &GetFeatureFlagsRequest{}, e)
assert.Equal(t, tag, e.Tag)
assert.Equal(t, featureFlagsID, e.FeatureFlagsID)
Expand Down
10 changes: 6 additions & 4 deletions pkg/bucketeer/model/goal_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"time"

"github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/user"

"github.com/bucketeer-io/go-server-sdk/pkg/bucketeer/version"
)

type GoalEvent struct {
Expand All @@ -21,7 +19,11 @@ type GoalEvent struct {
Type EventType `json:"@type,omitempty"`
}

func NewGoalEvent(tag, goalID string, value float64, user *user.User) *GoalEvent {
func NewGoalEvent(
tag, goalID, sdkVersion string,
value float64,
user *user.User,
) *GoalEvent {
return &GoalEvent{
Tag: tag,
Timestamp: time.Now().Unix(),
Expand All @@ -30,7 +32,7 @@ func NewGoalEvent(tag, goalID string, value float64, user *user.User) *GoalEvent
Value: value,
User: user,
SourceID: SourceIDGoServer,
SDKVersion: version.SDKVersion,
SDKVersion: sdkVersion,
Metadata: map[string]string{},
Type: GoalEventType,
}
Expand Down
Loading