Skip to content

Commit b3128e7

Browse files
Merge pull request #91 from harness/FFM-3702
FFM-3702 Adding customer logger for evaluation
2 parents 82779d3 + 8b311d8 commit b3128e7

File tree

5 files changed

+103
-35
lines changed

5 files changed

+103
-35
lines changed

client/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func NewCfClient(sdkKey string, options ...ConfigOption) (*CfClient, error) {
9191
return nil, err
9292
}
9393
client.repository = repository.New(lruCache)
94-
client.evaluator, err = evaluation.NewEvaluator(client.repository, client)
94+
client.evaluator, err = evaluation.NewEvaluator(client.repository, client, config.Logger)
9595
if err != nil {
9696
return nil, err
9797
}

evaluation/evaluator.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99
"strconv"
1010
"strings"
1111

12-
"github.com/harness/ff-golang-server-sdk/log"
12+
"github.com/harness/ff-golang-server-sdk/logger"
13+
1314
"github.com/harness/ff-golang-server-sdk/rest"
1415
)
1516

@@ -50,14 +51,16 @@ type PostEvaluateCallback interface {
5051
type Evaluator struct {
5152
query Query
5253
postEvalCallback PostEvaluateCallback
54+
logger logger.Logger
5355
}
5456

5557
// NewEvaluator constructs evaluator with query instance
56-
func NewEvaluator(query Query, postEvalCallback PostEvaluateCallback) (*Evaluator, error) {
58+
func NewEvaluator(query Query, postEvalCallback PostEvaluateCallback, logger logger.Logger) (*Evaluator, error) {
5759
if query == nil {
5860
return nil, ErrQueryProviderMissing
5961
}
6062
return &Evaluator{
63+
logger: logger,
6164
query: query,
6265
postEvalCallback: postEvalCallback,
6366
}, nil
@@ -233,13 +236,13 @@ func (e Evaluator) isTargetIncludedOrExcludedInSegment(segmentList []string, tar
233236
}
234237
// Should Target be excluded - if in excluded list we return false
235238
if segment.Excluded != nil && isTargetInList(target, *segment.Excluded) {
236-
log.Debugf("Target %s excluded from segment %s via exclude list", target.Name, segment.Name)
239+
e.logger.Debugf("Target %s excluded from segment %s via exclude list", target.Name, segment.Name)
237240
return false
238241
}
239242

240243
// Should Target be included - if in included list we return true
241244
if segment.Included != nil && isTargetInList(target, *segment.Included) {
242-
log.Debugf(
245+
e.logger.Debugf(
243246
"Target %s included in segment %s via include list",
244247
target.Name,
245248
segment.Name)
@@ -249,7 +252,7 @@ func (e Evaluator) isTargetIncludedOrExcludedInSegment(segmentList []string, tar
249252
// Should Target be included via segment rules
250253
rules := segment.Rules
251254
if rules != nil && e.evaluateClauses(*rules, target) {
252-
log.Debugf(
255+
e.logger.Debugf(
253256
"Target %s included in segment %s via rules", target.Name, segment.Name)
254257
return true
255258
}
@@ -259,32 +262,32 @@ func (e Evaluator) isTargetIncludedOrExcludedInSegment(segmentList []string, tar
259262

260263
func (e Evaluator) checkPreRequisite(fc *rest.FeatureConfig, target *Target) (bool, error) {
261264
if e.query == nil {
262-
log.Errorf(ErrQueryProviderMissing.Error())
265+
e.logger.Errorf(ErrQueryProviderMissing.Error())
263266
return true, ErrQueryProviderMissing
264267
}
265268
prerequisites := fc.Prerequisites
266269
if prerequisites != nil {
267-
log.Infof(
270+
e.logger.Debugf(
268271
"Checking pre requisites %v of parent feature %v",
269272
prerequisites,
270273
fc.Feature)
271274
for _, pre := range *prerequisites {
272275
prereqFeature := pre.Feature
273276
prereqFeatureConfig, err := e.query.GetFlag(prereqFeature)
274277
if err != nil {
275-
log.Errorf(
278+
e.logger.Errorf(
276279
"Could not retrieve the pre requisite details of feature flag : %v", prereqFeature)
277280
return true, nil
278281
}
279282

280283
prereqEvaluatedVariation, err := e.evaluateFlag(prereqFeatureConfig, target)
281284
if err != nil {
282-
log.Errorf(
285+
e.logger.Errorf(
283286
"Could not evaluate the prerequisite details of feature flag : %v", prereqFeature)
284287
return true, nil
285288
}
286289

287-
log.Infof(
290+
e.logger.Debugf(
288291
"Pre requisite flag %v has variation %v for target %v",
289292
prereqFeatureConfig.Feature,
290293
prereqEvaluatedVariation,
@@ -293,7 +296,7 @@ func (e Evaluator) checkPreRequisite(fc *rest.FeatureConfig, target *Target) (bo
293296
// Compare if the pre requisite variation is a possible valid value of
294297
// the pre requisite FF
295298
validPrereqVariations := pre.Variations
296-
log.Infof(
299+
e.logger.Debugf(
297300
"Pre requisite flag %v should have the variations %v",
298301
prereqFeatureConfig.Feature,
299302
validPrereqVariations)
@@ -311,7 +314,7 @@ func (e Evaluator) checkPreRequisite(fc *rest.FeatureConfig, target *Target) (bo
311314
func (e Evaluator) evaluate(identifier string, target *Target, kind string) (rest.Variation, error) {
312315

313316
if e.query == nil {
314-
log.Errorf(ErrQueryProviderMissing.Error())
317+
e.logger.Errorf(ErrQueryProviderMissing.Error())
315318
return rest.Variation{}, ErrQueryProviderMissing
316319
}
317320
flag, err := e.query.GetFlag(identifier)
@@ -349,7 +352,7 @@ func (e Evaluator) evaluate(identifier string, target *Target, kind string) (res
349352
func (e Evaluator) BoolVariation(identifier string, target *Target, defaultValue bool) bool {
350353
variation, err := e.evaluate(identifier, target, "boolean")
351354
if err != nil {
352-
log.Errorf("Error while evaluating boolean flag '%s', err: %v", identifier, err)
355+
e.logger.Errorf("Error while evaluating boolean flag '%s', err: %v", identifier, err)
353356
return defaultValue
354357
}
355358
return strings.ToLower(variation.Value) == "true"
@@ -360,7 +363,7 @@ func (e Evaluator) StringVariation(identifier string, target *Target, defaultVal
360363

361364
variation, err := e.evaluate(identifier, target, "string")
362365
if err != nil {
363-
log.Errorf("Error while evaluating string flag '%s', err: %v", identifier, err)
366+
e.logger.Errorf("Error while evaluating string flag '%s', err: %v", identifier, err)
364367
return defaultValue
365368
}
366369
return variation.Value
@@ -371,7 +374,7 @@ func (e Evaluator) IntVariation(identifier string, target *Target, defaultValue
371374

372375
variation, err := e.evaluate(identifier, target, "int")
373376
if err != nil {
374-
log.Errorf("Error while evaluating int flag '%s', err: %v", identifier, err)
377+
e.logger.Errorf("Error while evaluating int flag '%s', err: %v", identifier, err)
375378
return defaultValue
376379
}
377380
val, err := strconv.Atoi(variation.Value)
@@ -386,7 +389,7 @@ func (e Evaluator) NumberVariation(identifier string, target *Target, defaultVal
386389

387390
variation, err := e.evaluate(identifier, target, "number")
388391
if err != nil {
389-
log.Errorf("Error while evaluating number flag '%s', err: %v", identifier, err)
392+
e.logger.Errorf("Error while evaluating number flag '%s', err: %v", identifier, err)
390393
return defaultValue
391394
}
392395
val, err := strconv.ParseFloat(variation.Value, 64)
@@ -402,7 +405,7 @@ func (e Evaluator) JSONVariation(identifier string, target *Target,
402405

403406
variation, err := e.evaluate(identifier, target, "json")
404407
if err != nil {
405-
log.Errorf("Error while evaluating json flag '%s', err: %v", identifier, err)
408+
e.logger.Errorf("Error while evaluating json flag '%s', err: %v", identifier, err)
406409
return defaultValue
407410
}
408411
val := make(map[string]interface{})

evaluation/evaluator_test.go

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"reflect"
66
"testing"
77

8+
"github.com/harness/ff-golang-server-sdk/logger"
9+
810
"github.com/harness/ff-golang-server-sdk/rest"
911
)
1012

@@ -303,9 +305,11 @@ func (m TestRepository) GetFlag(identifier string) (rest.FeatureConfig, error) {
303305
}
304306

305307
func TestNewEvaluator(t *testing.T) {
306-
eval, _ := NewEvaluator(testRepo, nil)
308+
noOpLogger := logger.NewNoOpLogger()
309+
eval, _ := NewEvaluator(testRepo, nil, noOpLogger)
307310
type args struct {
308-
query Query
311+
query Query
312+
logger logger.Logger
309313
}
310314
tests := []struct {
311315
name string
@@ -322,15 +326,16 @@ func TestNewEvaluator(t *testing.T) {
322326
{
323327
name: "should return test repo",
324328
args: args{
325-
query: testRepo,
329+
query: testRepo,
330+
logger: noOpLogger,
326331
},
327332
want: eval,
328333
wantErr: false,
329334
},
330335
}
331336
for _, tt := range tests {
332337
t.Run(tt.name, func(t *testing.T) {
333-
got, err := NewEvaluator(tt.args.query, nil)
338+
got, err := NewEvaluator(tt.args.query, nil, noOpLogger)
334339
if (err != nil) != tt.wantErr {
335340
t.Errorf("NewEvaluator() error = %v, wantErr %v", err, tt.wantErr)
336341
return
@@ -616,7 +621,8 @@ func TestEvaluator_evaluateClause(t *testing.T) {
616621
for _, tt := range tests {
617622
t.Run(tt.name, func(t *testing.T) {
618623
e := Evaluator{
619-
query: tt.fields.query,
624+
query: tt.fields.query,
625+
logger: logger.NewNoOpLogger(),
620626
}
621627
if got := e.evaluateClause(tt.args.clause, tt.args.target); got != tt.want {
622628
t.Errorf("Evaluator.evaluateClause() = %v, want %v", got, tt.want)
@@ -797,7 +803,8 @@ func TestEvaluator_evaluateRules(t *testing.T) {
797803
for _, tt := range tests {
798804
t.Run(tt.name, func(t *testing.T) {
799805
e := Evaluator{
800-
query: tt.fields.query,
806+
query: tt.fields.query,
807+
logger: logger.NewNoOpLogger(),
801808
}
802809
if got := e.evaluateRules(tt.args.servingRules, tt.args.target); got != tt.want {
803810
t.Errorf("Evaluator.evaluateRules() = %v, want %v", got, tt.want)
@@ -915,7 +922,8 @@ func TestEvaluator_evaluateVariationMap(t *testing.T) {
915922
for _, tt := range tests {
916923
t.Run(tt.name, func(t *testing.T) {
917924
e := Evaluator{
918-
query: tt.fields.query,
925+
query: tt.fields.query,
926+
logger: logger.NewNoOpLogger(),
919927
}
920928
if got := e.evaluateVariationMap(tt.args.variationsMap, tt.args.target); got != tt.want {
921929
t.Errorf("Evaluator.evaluateVariationMap() = %v, want %v", got, tt.want)
@@ -1080,7 +1088,8 @@ func TestEvaluator_evaluateFlag(t *testing.T) {
10801088
for _, tt := range tests {
10811089
t.Run(tt.name, func(t *testing.T) {
10821090
e := Evaluator{
1083-
query: tt.fields.query,
1091+
query: tt.fields.query,
1092+
logger: logger.NewNoOpLogger(),
10841093
}
10851094
got, err := e.evaluateFlag(tt.args.fc, tt.args.target)
10861095
if (err != nil) != tt.wantErr {
@@ -1181,7 +1190,8 @@ func TestEvaluator_isTargetIncludedOrExcludedInSegment(t *testing.T) {
11811190
for _, tt := range tests {
11821191
t.Run(tt.name, func(t *testing.T) {
11831192
e := Evaluator{
1184-
query: tt.fields.query,
1193+
query: tt.fields.query,
1194+
logger: logger.NewNoOpLogger(),
11851195
}
11861196
if got := e.isTargetIncludedOrExcludedInSegment(tt.args.segmentList, tt.args.target); got != tt.want {
11871197
t.Errorf("Evaluator.isTargetIncludedOrExcludedInSegment() = %v, want %v", got, tt.want)
@@ -1263,7 +1273,8 @@ func TestEvaluator_checkPreRequisite(t *testing.T) {
12631273
for _, tt := range tests {
12641274
t.Run(tt.name, func(t *testing.T) {
12651275
e := Evaluator{
1266-
query: tt.fields.query,
1276+
query: tt.fields.query,
1277+
logger: logger.NewNoOpLogger(),
12671278
}
12681279
got, err := e.checkPreRequisite(tt.args.parent, tt.args.target)
12691280
if (err != nil) != tt.wantErr {
@@ -1380,7 +1391,8 @@ func TestEvaluator_evaluate(t *testing.T) {
13801391
for _, tt := range tests {
13811392
t.Run(tt.name, func(t *testing.T) {
13821393
e := Evaluator{
1383-
query: tt.fields.query,
1394+
query: tt.fields.query,
1395+
logger: logger.NewNoOpLogger(),
13841396
}
13851397
got, err := e.evaluate(tt.args.identifier, tt.args.target, tt.args.kind)
13861398
if (err != nil) != tt.wantErr {
@@ -1451,7 +1463,8 @@ func TestEvaluator_BoolVariation(t *testing.T) {
14511463
for _, tt := range tests {
14521464
t.Run(tt.name, func(t *testing.T) {
14531465
e := Evaluator{
1454-
query: tt.fields.query,
1466+
query: tt.fields.query,
1467+
logger: logger.NewNoOpLogger(),
14551468
}
14561469
if got := e.BoolVariation(tt.args.identifier, tt.args.target, tt.args.defaultValue); got != tt.want {
14571470
t.Errorf("Evaluator.BoolVariation() = %v, want %v", got, tt.want)
@@ -1517,7 +1530,8 @@ func TestEvaluator_StringVariation(t *testing.T) {
15171530
for _, tt := range tests {
15181531
t.Run(tt.name, func(t *testing.T) {
15191532
e := Evaluator{
1520-
query: tt.fields.query,
1533+
query: tt.fields.query,
1534+
logger: logger.NewNoOpLogger(),
15211535
}
15221536
if got := e.StringVariation(tt.args.identifier, tt.args.target, tt.args.defaultValue); got != tt.want {
15231537
t.Errorf("Evaluator.StringVariation() = %v, want %v", got, tt.want)
@@ -1595,7 +1609,8 @@ func TestEvaluator_IntVariation(t *testing.T) {
15951609
for _, tt := range tests {
15961610
t.Run(tt.name, func(t *testing.T) {
15971611
e := Evaluator{
1598-
query: tt.fields.query,
1612+
query: tt.fields.query,
1613+
logger: logger.NewNoOpLogger(),
15991614
}
16001615
if got := e.IntVariation(tt.args.identifier, tt.args.target, tt.args.defaultValue); got != tt.want {
16011616
t.Errorf("Evaluator.IntVariation() = %v, want %v", got, tt.want)
@@ -1673,7 +1688,8 @@ func TestEvaluator_NumberVariation(t *testing.T) {
16731688
for _, tt := range tests {
16741689
t.Run(tt.name, func(t *testing.T) {
16751690
e := Evaluator{
1676-
query: tt.fields.query,
1691+
query: tt.fields.query,
1692+
logger: logger.NewNoOpLogger(),
16771693
}
16781694
if got := e.NumberVariation(tt.args.identifier, tt.args.target, tt.args.defaultValue); got != tt.want {
16791695
t.Errorf("Evaluator.NumberVariation() = %v, want %v", got, tt.want)
@@ -1758,7 +1774,8 @@ func TestEvaluator_JSONVariation(t *testing.T) {
17581774
for _, tt := range tests {
17591775
t.Run(tt.name, func(t *testing.T) {
17601776
e := Evaluator{
1761-
query: tt.fields.query,
1777+
query: tt.fields.query,
1778+
logger: logger.NewNoOpLogger(),
17621779
}
17631780
if got := e.JSONVariation(tt.args.identifier, tt.args.target, tt.args.defaultValue); !reflect.DeepEqual(got, tt.want) {
17641781
t.Errorf("Evaluator.JSONVariation() = %v, want %v", got, tt.want)

logger/nooplogger.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package logger
2+
3+
// NoOpLogger is a type that implements the Logger interface but does nothing
4+
// when it's methods are called
5+
type NoOpLogger struct{}
6+
7+
// NewNoOpLogger returns a NoOpLogger
8+
func NewNoOpLogger() NoOpLogger {
9+
return NoOpLogger{}
10+
}
11+
12+
// Debug does nothing on a NoOpLogger
13+
func (m NoOpLogger) Debug(args ...interface{}) {}
14+
15+
// Debugf does nothing on a NoOpLogger
16+
func (m NoOpLogger) Debugf(template string, args ...interface{}) {}
17+
18+
// Info does nothing on a NoOpLogger
19+
func (m NoOpLogger) Info(args ...interface{}) {}
20+
21+
// Infof does nothing on a NoOpLogger
22+
func (m NoOpLogger) Infof(template string, args ...interface{}) {}
23+
24+
// Warn does nothing on a NoOpLogger
25+
func (m NoOpLogger) Warn(args ...interface{}) {}
26+
27+
// Warnf does nothing on a NoOpLogger
28+
func (m NoOpLogger) Warnf(template string, args ...interface{}) {}
29+
30+
// Error does nothing on a NoOpLogger
31+
func (m NoOpLogger) Error(args ...interface{}) {}
32+
33+
// Errorf does nothing on a NoOpLogger
34+
func (m NoOpLogger) Errorf(template string, args ...interface{}) {}
35+
36+
// Panic does nothing on a NoOpLogger
37+
func (m NoOpLogger) Panic(args ...interface{}) {}
38+
39+
// Panicf does nothing on a NoOpLogger
40+
func (m NoOpLogger) Panicf(template string, args ...interface{}) {}
41+
42+
// Fatal does nothing on a NoOpLogger
43+
func (m NoOpLogger) Fatal(args ...interface{}) {}
44+
45+
// Fatalf does nothing on a NoOpLogger
46+
func (m NoOpLogger) Fatalf(template string, args ...interface{}) {}

tests/evaluator_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"reflect"
99
"testing"
1010

11+
"github.com/harness/ff-golang-server-sdk/logger"
12+
1113
"github.com/harness/ff-golang-server-sdk/evaluation"
1214

1315
"github.com/harness/ff-golang-server-sdk/log"
@@ -77,7 +79,7 @@ func TestEvaluator(t *testing.T) {
7779
t.Error(err)
7880
}
7981
repo := repository.New(lruCache)
80-
evaluator, err := evaluation.NewEvaluator(repo, nil)
82+
evaluator, err := evaluation.NewEvaluator(repo, nil, logger.NewNoOpLogger())
8183
if err != nil {
8284
t.Error(err)
8385
}

0 commit comments

Comments
 (0)