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
22 changes: 12 additions & 10 deletions dtos/impression.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ package dtos

// Impression struct to map an impression
type Impression struct {
KeyName string `json:"k"`
BucketingKey string `json:"b"`
FeatureName string `json:"f"`
Treatment string `json:"t"`
Label string `json:"r"`
ChangeNumber int64 `json:"c"`
Time int64 `json:"m"`
Pt int64 `json:"pt,omitempty"`
Disabled bool `json:"-"`
Properties string `json:"properties,omitempty"`
KeyName string `json:"k"`
BucketingKey string `json:"b"`
DefinitionName string `json:"f"`
Treatment string `json:"t"`
Label string `json:"r"`
ChangeNumber int64 `json:"c"`
Time int64 `json:"m"`
Pt int64 `json:"pt,omitempty"`
Disabled bool `json:"-"`
Properties string `json:"properties,omitempty"`
EntityType string `json:"et,omitempty"`
}

// ImpressionQueueObject struct mapping impressions
Expand All @@ -30,6 +31,7 @@ type ImpressionDTO struct {
BucketingKey string `json:"b,omitempty"`
Pt int64 `json:"pt,omitempty"`
Properties string `json:"properties,omitempty"`
EntityType string `json:"et,omitempty"`
}

// ImpressionsDTO struct mapping impressions to post
Expand Down
4 changes: 2 additions & 2 deletions engine/evaluator/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func (e *Evaluator) evaluateTreatment(key string, bucketingKey string, featureFl
label := impressionlabels.SplitNotFound
if splitDto == nil {
fallbackTratment := e.fallbackTratmentCalculator.Resolve(featureFlag, &label)
e.logger.Warning(fmt.Sprintf("Feature flag %s not found, returning fallback treatment.", featureFlag))
e.logger.Warning(fmt.Sprintf("Definition %s not found, returning fallback.", featureFlag))
return &Result{Treatment: *fallbackTratment.Treatment, Label: *fallbackTratment.Label(), Config: fallbackTratment.Config}
}

Expand Down Expand Up @@ -221,7 +221,7 @@ func (e *Evaluator) EvaluateDefault(definitionName string) *Result {
if definition == nil {
label := impressionlabels.SplitNotFound
fallbackTratment := e.fallbackTratmentCalculator.Resolve(definitionName, &label)
e.logger.Warning(fmt.Sprintf("Definition %s not found, returning fallback treatment.", definitionName))
e.logger.Warning(fmt.Sprintf("Definition %s not found, returning fallback.", definitionName))
return &Result{
Treatment: *fallbackTratment.Treatment,
Config: nil,
Expand Down
16 changes: 8 additions & 8 deletions provisional/impmanager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func TestImpManagerInMemoryDebugListenerDisabled(t *testing.T) {
imp1 := &dtos.Impression{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand Down Expand Up @@ -53,7 +53,7 @@ func TestImpManagerInMemoryDebug(t *testing.T) {
imp1 := &dtos.Impression{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand Down Expand Up @@ -88,7 +88,7 @@ func TestImpManagerInMemoryOptimized(t *testing.T) {
imp1 := &dtos.Impression{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand Down Expand Up @@ -130,7 +130,7 @@ func TestImpManagerInMemoryNone(t *testing.T) {
imp1 := &dtos.Impression{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand Down Expand Up @@ -159,7 +159,7 @@ func TestImpManagerRedis(t *testing.T) {
imp1 := &dtos.Impression{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand Down Expand Up @@ -199,7 +199,7 @@ func TestProcess(t *testing.T) {
{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand All @@ -209,7 +209,7 @@ func TestProcess(t *testing.T) {
{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "harnessFlag",
DefinitionName: "harnessFlag",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand All @@ -219,7 +219,7 @@ func TestProcess(t *testing.T) {
{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "featureTest",
DefinitionName: "featureTest",
KeyName: "someKey",
Label: "someLabel",
Time: now,
Expand Down
2 changes: 1 addition & 1 deletion provisional/strategy/debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func NewDebugImpl(impressionObserver ImpressionObserver, listenerEnabled bool) P

func (s *DebugImpl) apply(impression *dtos.Impression) bool {
if len(impression.Properties) == 0 {
impression.Pt, _ = s.impressionObserver.TestAndSet(impression.FeatureName, impression)
impression.Pt, _ = s.impressionObserver.TestAndSet(impression.DefinitionName, impression)
}

return true
Expand Down
6 changes: 3 additions & 3 deletions provisional/strategy/debug_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func TestDebugMode(t *testing.T) {
Label: "someLabel",
Time: 123456,
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
}

toLog, toListener := debug.Apply([]dtos.Impression{imp})
Expand All @@ -43,7 +43,7 @@ func TestDebugModeWithProperties(t *testing.T) {
Label: "someLabel",
Time: 123456,
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
Properties: "{'hello':'world'}",
}

Expand All @@ -68,7 +68,7 @@ func TestApplySingleDebug(t *testing.T) {
Label: "someLabel",
Time: 123456,
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
}

toLog := debug.ApplySingle(&imp)
Expand Down
8 changes: 4 additions & 4 deletions provisional/strategy/impcounter.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import (

// Key struct for mapping each key to an amount
type Key struct {
FeatureName string
TimeFrame int64
DefinitionName string
TimeFrame int64
}

// ImpressionsCounter struct for storing generated impressions counts
Expand All @@ -28,8 +28,8 @@ func NewImpressionsCounter() *ImpressionsCounter {

func makeKey(splitName string, timeFrame int64) Key {
return Key{
FeatureName: splitName,
TimeFrame: util.TruncateTimeFrame(timeFrame),
DefinitionName: splitName,
TimeFrame: util.TruncateTimeFrame(timeFrame),
}
}

Expand Down
6 changes: 3 additions & 3 deletions provisional/strategy/impcounter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ func TestMakeKey(t *testing.T) {
timestamp := time.Date(2020, 9, 2, 10, 0, 0, 0, time.UTC).UnixNano() / int64(time.Millisecond)

actualKey := makeKey("someFeature", time.Date(2020, 9, 2, 10, 0, 0, 0, time.UTC).UnixNano())
expectedKey := Key{FeatureName: "someFeature", TimeFrame: timestamp}
expectedKey := Key{DefinitionName: "someFeature", TimeFrame: timestamp}
if actualKey != expectedKey {
t.Error(fmt.Sprintf("Unexpected key generated %v, %v", actualKey, expectedKey))
}

actualKey2 := makeKey("", time.Date(2020, 9, 2, 10, 0, 0, 0, time.UTC).UnixNano())
expectedKey2 := Key{FeatureName: "", TimeFrame: timestamp}
expectedKey2 := Key{DefinitionName: "", TimeFrame: timestamp}
if actualKey2 != expectedKey2 {
t.Error(fmt.Sprintf("Unexpected key generated %v, %v", actualKey2, expectedKey2))
}

actualKey3 := makeKey("someFeature", 0)
expectedKey3 := Key{FeatureName: "someFeature", TimeFrame: 0}
expectedKey3 := Key{DefinitionName: "someFeature", TimeFrame: 0}
if actualKey3 != expectedKey3 {
t.Error(fmt.Sprintf("Unexpected key generated %v, %v", actualKey3, expectedKey3))
}
Expand Down
4 changes: 2 additions & 2 deletions provisional/strategy/none.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ func NewNoneImpl(impressionCounter *ImpressionsCounter, uniqueKeysTracker Unique
}

func (s *NoneImpl) apply(impression *dtos.Impression, now int64) bool {
s.impressionsCounter.Inc(impression.FeatureName, now, 1)
s.uniqueKeysTracker.Track(impression.FeatureName, impression.KeyName)
s.impressionsCounter.Inc(impression.DefinitionName, now, 1)
s.uniqueKeysTracker.Track(impression.DefinitionName, impression.KeyName)

return false
}
Expand Down
8 changes: 4 additions & 4 deletions provisional/strategy/none_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func TestNoneMode(t *testing.T) {
Label: "someLabel",
Time: now,
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
}

toLog, toListener := none.Apply([]dtos.Impression{imp})
Expand All @@ -40,8 +40,8 @@ func TestNoneMode(t *testing.T) {

counts := counter.PopAll()
value := counts[Key{
FeatureName: imp.FeatureName,
TimeFrame: util.TruncateTimeFrame(now),
DefinitionName: imp.DefinitionName,
TimeFrame: util.TruncateTimeFrame(now),
}]

if value != 2 {
Expand All @@ -63,7 +63,7 @@ func TestApplySingleNone(t *testing.T) {
Label: "someLabel",
Time: now,
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
}

toLog := none.ApplySingle(&imp)
Expand Down
4 changes: 2 additions & 2 deletions provisional/strategy/optimized.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ func (s *OptimizedImpl) apply(impression *dtos.Impression, now int64) bool {
if len(impression.Properties) != 0 {
return true
}
impression.Pt, _ = s.impressionObserver.TestAndSet(impression.FeatureName, impression)
impression.Pt, _ = s.impressionObserver.TestAndSet(impression.DefinitionName, impression)
if impression.Pt != 0 {
s.impressionsCounter.Inc(impression.FeatureName, now, 1)
s.impressionsCounter.Inc(impression.DefinitionName, now, 1)
}

if impression.Pt == 0 || impression.Pt < util.TruncateTimeFrame(now) {
Expand Down
10 changes: 5 additions & 5 deletions provisional/strategy/optimized_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func TestOptimizedMode(t *testing.T) {
Label: "someLabel",
Time: time.Now().UTC().UnixNano(),
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
}

toLog, toListener := optimized.Apply([]dtos.Impression{imp})
Expand All @@ -38,7 +38,7 @@ func TestOptimizedMode(t *testing.T) {
rawCounts := counter.PopAll()
assert.Equal(t, 1, len(rawCounts), "Should have counts")
for key, counts := range counter.PopAll() {
assert.Equal(t, "feature-test", key.FeatureName, "Feature should be feature-test")
assert.Equal(t, "feature-test", key.DefinitionName, "Feature should be feature-test")
assert.Equal(t, 1, counts, "It should be tracked only once")
}
}
Expand All @@ -55,7 +55,7 @@ func TestOptimizedModeWithProperties(t *testing.T) {
Label: "someLabel",
Time: time.Now().UTC().UnixNano(),
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
Properties: "{'hello':'world'}",
}

Expand All @@ -72,7 +72,7 @@ func TestOptimizedModeWithProperties(t *testing.T) {
rawCounts := counter.PopAll()
assert.Equal(t, 0, len(rawCounts), "Should doesn't have counts")
for key, counts := range counter.PopAll() {
assert.Equal(t, "feature-test", key.FeatureName, "Feature should be feature-test")
assert.Equal(t, "feature-test", key.DefinitionName, "Feature should be feature-test")
assert.Equal(t, 1, counts, "It should be tracked empty")
}
}
Expand All @@ -89,7 +89,7 @@ func TestApplySingleOptimized(t *testing.T) {
Label: "someLabel",
Time: time.Now().UTC().UnixNano(),
Treatment: "on",
FeatureName: "feature-test",
DefinitionName: "feature-test",
}

toLog := optimized.ApplySingle(&imp)
Expand Down
26 changes: 13 additions & 13 deletions storage/inmemory/mutexqueue/impressions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@ func TestMSImpressionsStorage(t *testing.T) {
logger := logging.NewLogger(nil)
runtimeTelemetry, _ := inmemory.NewTelemetryStorage()

i0 := dtos.Impression{FeatureName: "feature0", BucketingKey: "123", ChangeNumber: 123, KeyName: "k0", Time: 123, Treatment: "i0"}
i1 := dtos.Impression{FeatureName: "feature1", BucketingKey: "123", ChangeNumber: 123, KeyName: "k1", Time: 123, Treatment: "i1"}
i2 := dtos.Impression{FeatureName: "feature2", BucketingKey: "123", ChangeNumber: 123, KeyName: "k2", Time: 123, Treatment: "i2"}
i3 := dtos.Impression{FeatureName: "feature3", BucketingKey: "123", ChangeNumber: 123, KeyName: "k3", Time: 123, Treatment: "i3"}
i4 := dtos.Impression{FeatureName: "feature4", BucketingKey: "123", ChangeNumber: 123, KeyName: "k4", Time: 123, Treatment: "i4"}
i5 := dtos.Impression{FeatureName: "feature5", BucketingKey: "123", ChangeNumber: 123, KeyName: "k5", Time: 123, Treatment: "i5"}
i6 := dtos.Impression{FeatureName: "feature6", BucketingKey: "123", ChangeNumber: 123, KeyName: "k6", Time: 123, Treatment: "i6"}
i7 := dtos.Impression{FeatureName: "feature7", BucketingKey: "123", ChangeNumber: 123, KeyName: "k7", Time: 123, Treatment: "i7"}
i8 := dtos.Impression{FeatureName: "feature8", BucketingKey: "123", ChangeNumber: 123, KeyName: "k8", Time: 123, Treatment: "i8"}
i9 := dtos.Impression{FeatureName: "feature9", BucketingKey: "123", ChangeNumber: 123, KeyName: "k9", Time: 123, Treatment: "i9"}
i0 := dtos.Impression{DefinitionName: "feature0", BucketingKey: "123", ChangeNumber: 123, KeyName: "k0", Time: 123, Treatment: "i0"}
i1 := dtos.Impression{DefinitionName: "feature1", BucketingKey: "123", ChangeNumber: 123, KeyName: "k1", Time: 123, Treatment: "i1"}
i2 := dtos.Impression{DefinitionName: "feature2", BucketingKey: "123", ChangeNumber: 123, KeyName: "k2", Time: 123, Treatment: "i2"}
i3 := dtos.Impression{DefinitionName: "feature3", BucketingKey: "123", ChangeNumber: 123, KeyName: "k3", Time: 123, Treatment: "i3"}
i4 := dtos.Impression{DefinitionName: "feature4", BucketingKey: "123", ChangeNumber: 123, KeyName: "k4", Time: 123, Treatment: "i4"}
i5 := dtos.Impression{DefinitionName: "feature5", BucketingKey: "123", ChangeNumber: 123, KeyName: "k5", Time: 123, Treatment: "i5"}
i6 := dtos.Impression{DefinitionName: "feature6", BucketingKey: "123", ChangeNumber: 123, KeyName: "k6", Time: 123, Treatment: "i6"}
i7 := dtos.Impression{DefinitionName: "feature7", BucketingKey: "123", ChangeNumber: 123, KeyName: "k7", Time: 123, Treatment: "i7"}
i8 := dtos.Impression{DefinitionName: "feature8", BucketingKey: "123", ChangeNumber: 123, KeyName: "k8", Time: 123, Treatment: "i8"}
i9 := dtos.Impression{DefinitionName: "feature9", BucketingKey: "123", ChangeNumber: 123, KeyName: "k9", Time: 123, Treatment: "i9"}

isFull := make(chan string, 1)
queueSize := 20
Expand All @@ -49,8 +49,8 @@ func TestMSImpressionsStorage(t *testing.T) {
t.Error("KeyName error")
}

if impressions[i].FeatureName != "feature"+strconv.Itoa(i) {
t.Error("FeatureName error")
if impressions[i].DefinitionName != "feature"+strconv.Itoa(i) {
t.Error("DefinitionName error")
}

if impressions[i].Treatment != "i"+strconv.Itoa(i) {
Expand All @@ -66,7 +66,7 @@ func TestMSImpressionsStorage(t *testing.T) {
func TestMSImpressionsStorageMaxSize(t *testing.T) {
logger := logging.NewLogger(nil)
runtimeTelemetry, _ := inmemory.NewTelemetryStorage()
impression := dtos.Impression{FeatureName: "feature0", BucketingKey: "123", ChangeNumber: 123, KeyName: "k0", Time: 123, Treatment: "i0"}
impression := dtos.Impression{DefinitionName: "feature0", BucketingKey: "123", ChangeNumber: 123, KeyName: "k0", Time: 123, Treatment: "i0"}

isFull := make(chan string, 1)
maxSize := 10
Expand Down
6 changes: 3 additions & 3 deletions storage/redis/impressions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func TestLogImpressionsError(t *testing.T) {
impression := dtos.Impression{
BucketingKey: "someBuck",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: 123456789,
Expand Down Expand Up @@ -76,7 +76,7 @@ func TestLogImpressions(t *testing.T) {
impression := dtos.Impression{
BucketingKey: "someBuck",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: 123456789,
Expand All @@ -97,7 +97,7 @@ func wrapImpression(feature string) dtos.Impression {
Label: "someLabel",
Time: 123456789,
Treatment: "someTreatment",
FeatureName: feature,
DefinitionName: feature,
}
}

Expand Down
2 changes: 1 addition & 1 deletion synchronizer/synchronizer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ func TestPeriodicRecording(t *testing.T) {
return []dtos.Impression{{
BucketingKey: "someBucketingKey",
ChangeNumber: 123456789,
FeatureName: "someFeature",
DefinitionName: "someFeature",
KeyName: "someKey",
Label: "someLabel",
Time: 123456789,
Expand Down
2 changes: 1 addition & 1 deletion synchronizer/worker/impression/redis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func getImpressions(amount int) []dtos.Impression {
impressions = append(impressions, dtos.Impression{
BucketingKey: fmt.Sprintf("someBucketingKey%d", i),
ChangeNumber: 123456789,
FeatureName: fmt.Sprintf("someFeature%d", i),
DefinitionName: fmt.Sprintf("someFeature%d", i),
KeyName: fmt.Sprintf("someKey%d", i),
Label: "someLabel",
Time: 123456789,
Expand Down
Loading
Loading