Skip to content

Commit e149ce6

Browse files
feature (logging): Logging sdk key with every log message. (#242)
* refactor to simply include logger via sdk key * start fixing tests * fix more tests * fixing tests * fixing some errors * remove commented out log message * fix broken tests * add test for sdk Key in log * sort imports * remove 1.8 for 1.10 and upgrade 1.13 to 1.14 * try and upgrade to golang 1.10 * add a mapper to hide sdk key. add unit test * added a comment for lint * format cleanup * go lint * remove go get that is failing * put go get back in..fails * update to go 1.11 * move back to 10 * fix: update new dependency location DATA-DOG/godog moved to cucumber/godog * add sdk key logger override and use sdk key for logging * go lint * remove sdk key from bucketer, pass in logger * fix order, fix count, add tests * fix lint error * cleanup log writting * cleanup log to use fprintf * refactor to make the logger the last argument except in varg parameters Co-authored-by: Juan Carlos Tong <[email protected]>
1 parent 931ab96 commit e149ce6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+545
-295
lines changed

.travis.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ jobs:
4747

4848
- <<: *test
4949
stage: 'Unit test'
50-
env: GIMME_GO_VERSION=1.8.x
50+
env: GIMME_GO_VERSION=1.10.x
5151
before_script:
5252
# GO module was not introduced earlier. need symlink to search in GOPATH
5353
- mkdir -p $GOPATH/src/github.com && pushd $GOPATH/src/github.com && ln -s $HOME/build/optimizely optimizely && popd
@@ -56,15 +56,15 @@ jobs:
5656
- mkdir $GOPATH/src/github.com/twmb && cd $GOPATH/src/github.com/twmb && git clone https://github.com/twmb/murmur3.git && cd $TRAVIS_BUILD_DIR
5757
- pushd $GOPATH/src/github.com/twmb/murmur3 && git checkout v1.0.0 && popd
5858
- go get -v -d ./...
59-
# This pkg not in go 1.8
59+
# This pkg not in go 1.10
6060
- go get github.com/stretchr/testify
6161
- pushd $GOPATH/src/github.com/stretchr/testify && git checkout v1.4.0 && popd
62-
# -coverprofile was not introduced in 1.8
62+
# -coverprofile was not introduced in 1.10
6363
- make test
6464

6565
- <<: *test
6666
stage: 'Unit test'
67-
env: GIMME_GO_VERSION=1.13.x
67+
env: GIMME_GO_VERSION=1.14.x
6868
before_script:
6969
- go get github.com/mattn/goveralls
7070
after_success:

pkg/client/client.go

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,14 @@ import (
3333
"github.com/optimizely/go-sdk/pkg/utils"
3434
)
3535

36-
var logger = logging.GetLogger("Client")
37-
3836
// OptimizelyClient is the entry point to the Optimizely SDK
3937
type OptimizelyClient struct {
4038
ConfigManager config.ProjectConfigManager
4139
DecisionService decision.Service
4240
EventProcessor event.Processor
4341
notificationCenter notification.Center
4442
execGroup *utils.ExecGroup
43+
logger logging.OptimizelyLogProducer
4544
}
4645

4746
// Activate returns the key of the variation the user is bucketed into and queues up an impression event to be sent to
@@ -59,14 +58,14 @@ func (o *OptimizelyClient) Activate(experimentKey string, userContext entities.U
5958
err = errors.New("unexpected error")
6059
}
6160
errorMessage := fmt.Sprintf("Activate call, optimizely SDK is panicking with the error:")
62-
logger.Error(errorMessage, err)
63-
logger.Debug(string(debug.Stack()))
61+
o.logger.Error(errorMessage, err)
62+
o.logger.Debug(string(debug.Stack()))
6463
}
6564
}()
6665

6766
decisionContext, experimentDecision, err := o.getExperimentDecision(experimentKey, userContext)
6867
if err != nil {
69-
logger.Error("received an error while computing experiment decision", err)
68+
o.logger.Error("received an error while computing experiment decision", err)
7069
return result, err
7170
}
7271

@@ -95,14 +94,14 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
9594
err = errors.New("unexpected error")
9695
}
9796
errorMessage := fmt.Sprintf("IsFeatureEnabled call, optimizely SDK is panicking with the error:")
98-
logger.Error(errorMessage, err)
99-
logger.Debug(string(debug.Stack()))
97+
o.logger.Error(errorMessage, err)
98+
o.logger.Debug(string(debug.Stack()))
10099
}
101100
}()
102101

103102
decisionContext, featureDecision, err := o.getFeatureDecision(featureKey, "", userContext)
104103
if err != nil {
105-
logger.Error("received an error while computing feature decision", err)
104+
o.logger.Error("received an error while computing feature decision", err)
106105
return result, err
107106
}
108107

@@ -113,9 +112,9 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
113112
}
114113

115114
if result {
116-
logger.Info(fmt.Sprintf(`Feature "%s" is enabled for user "%s".`, featureKey, userContext.ID))
115+
o.logger.Info(fmt.Sprintf(`Feature "%s" is enabled for user "%s".`, featureKey, userContext.ID))
117116
} else {
118-
logger.Info(fmt.Sprintf(`Feature "%s" is not enabled for user "%s".`, featureKey, userContext.ID))
117+
o.logger.Info(fmt.Sprintf(`Feature "%s" is not enabled for user "%s".`, featureKey, userContext.ID))
119118
}
120119

121120
if featureDecision.Source == decision.FeatureTest && featureDecision.Variation != nil {
@@ -141,14 +140,14 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
141140
err = errors.New("unexpected error")
142141
}
143142
errorMessage := fmt.Sprintf("GetEnabledFeatures call, optimizely SDK is panicking with the error:")
144-
logger.Error(errorMessage, err)
145-
logger.Debug(string(debug.Stack()))
143+
o.logger.Error(errorMessage, err)
144+
o.logger.Debug(string(debug.Stack()))
146145
}
147146
}()
148147

149148
projectConfig, err := o.getProjectConfig()
150149
if err != nil {
151-
logger.Error("Error retrieving ProjectConfig", err)
150+
o.logger.Error("Error retrieving ProjectConfig", err)
152151
return enabledFeatures, err
153152
}
154153

@@ -241,7 +240,7 @@ func (o *OptimizelyClient) GetAllFeatureVariables(featureKey string, userContext
241240
variableMap = make(map[string]interface{})
242241
decisionContext, featureDecision, err := o.getFeatureDecision(featureKey, "", userContext)
243242
if err != nil {
244-
logger.Error("Optimizely SDK tracking error", err)
243+
o.logger.Error("Optimizely SDK tracking error", err)
245244
return enabled, variableMap, err
246245
}
247246

@@ -251,7 +250,7 @@ func (o *OptimizelyClient) GetAllFeatureVariables(featureKey string, userContext
251250

252251
feature := decisionContext.Feature
253252
if feature == nil {
254-
logger.Warning(fmt.Sprintf(`feature "%s" does not exist`, featureKey))
253+
o.logger.Warning(fmt.Sprintf(`feature "%s" does not exist`, featureKey))
255254
return enabled, variableMap, nil
256255
}
257256

@@ -275,7 +274,7 @@ func (o *OptimizelyClient) GetAllFeatureVariables(featureKey string, userContext
275274
out, err = strconv.Atoi(val)
276275
case entities.String:
277276
default:
278-
logger.Warning(fmt.Sprintf(`type "%s" is unknown, returning string`, varType))
277+
o.logger.Warning(fmt.Sprintf(`type "%s" is unknown, returning string`, varType))
279278
}
280279

281280
variableMap[v.Key] = out
@@ -298,14 +297,14 @@ func (o *OptimizelyClient) GetVariation(experimentKey string, userContext entiti
298297
err = errors.New("unexpected error")
299298
}
300299
errorMessage := fmt.Sprintf("GetVariation call, optimizely SDK is panicking with the error:")
301-
logger.Error(errorMessage, err)
302-
logger.Debug(string(debug.Stack()))
300+
o.logger.Error(errorMessage, err)
301+
o.logger.Debug(string(debug.Stack()))
303302
}
304303
}()
305304

306305
_, experimentDecision, err := o.getExperimentDecision(experimentKey, userContext)
307306
if err != nil {
308-
logger.Error("received an error while computing experiment decision", err)
307+
o.logger.Error("received an error while computing experiment decision", err)
309308
}
310309

311310
if experimentDecision.Variation != nil {
@@ -330,30 +329,30 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
330329
err = errors.New("unexpected error")
331330
}
332331
errorMessage := fmt.Sprintf("Track call, optimizely SDK is panicking with the error:")
333-
logger.Error(errorMessage, err)
334-
logger.Debug(string(debug.Stack()))
332+
o.logger.Error(errorMessage, err)
333+
o.logger.Debug(string(debug.Stack()))
335334
}
336335
}()
337336

338337
projectConfig, e := o.getProjectConfig()
339338
if e != nil {
340-
logger.Error("Optimizely SDK tracking error", e)
339+
o.logger.Error("Optimizely SDK tracking error", e)
341340
return e
342341
}
343342

344343
configEvent, e := projectConfig.GetEventByKey(eventKey)
345344

346345
if e != nil {
347346
errorMessage := fmt.Sprintf(`Unable to get event for key "%s": %s`, eventKey, e)
348-
logger.Warning(errorMessage)
347+
o.logger.Warning(errorMessage)
349348
return nil
350349
}
351350

352351
userEvent := event.CreateConversionUserEvent(projectConfig, configEvent, userContext, eventTags)
353352
if o.EventProcessor.ProcessEvent(userEvent) && o.notificationCenter != nil {
354353
trackNotification := notification.TrackNotification{EventKey: eventKey, UserContext: userContext, EventTags: eventTags, ConversionEvent: *userEvent.Conversion}
355354
if err = o.notificationCenter.Send(notification.Track, trackNotification); err != nil {
356-
logger.Warning("Problem with sending notification")
355+
o.logger.Warning("Problem with sending notification")
357356
}
358357
}
359358

@@ -373,31 +372,31 @@ func (o *OptimizelyClient) getFeatureDecision(featureKey, variableKey string, us
373372
err = errors.New("unexpected error")
374373
}
375374
errorMessage := fmt.Sprintf("getFeatureDecision call, optimizely SDK is panicking with the error:")
376-
logger.Error(errorMessage, err)
377-
logger.Debug(string(debug.Stack()))
375+
o.logger.Error(errorMessage, err)
376+
o.logger.Debug(string(debug.Stack()))
378377
}
379378
}()
380379

381380
userID := userContext.ID
382-
logger.Debug(fmt.Sprintf(`Evaluating feature "%s" for user "%s".`, featureKey, userID))
381+
o.logger.Debug(fmt.Sprintf(`Evaluating feature "%s" for user "%s".`, featureKey, userID))
383382

384383
projectConfig, e := o.getProjectConfig()
385384
if e != nil {
386-
logger.Error("Error calling getFeatureDecision", e)
385+
o.logger.Error("Error calling getFeatureDecision", e)
387386
return decisionContext, featureDecision, e
388387
}
389388

390389
feature, e := projectConfig.GetFeatureByKey(featureKey)
391390
if e != nil {
392-
logger.Warning(fmt.Sprintf(`Could not get feature for key "%s": %s`, featureKey, e))
391+
o.logger.Warning(fmt.Sprintf(`Could not get feature for key "%s": %s`, featureKey, e))
393392
return decisionContext, featureDecision, nil
394393
}
395394

396395
variable := entities.Variable{}
397396
if variableKey != "" {
398397
variable, err = projectConfig.GetVariableByKey(feature.Key, variableKey)
399398
if err != nil {
400-
logger.Warning(fmt.Sprintf(`Could not get variable for key "%s": %s`, variableKey, err))
399+
o.logger.Warning(fmt.Sprintf(`Could not get variable for key "%s": %s`, variableKey, err))
401400
return decisionContext, featureDecision, nil
402401
}
403402
}
@@ -410,7 +409,7 @@ func (o *OptimizelyClient) getFeatureDecision(featureKey, variableKey string, us
410409

411410
featureDecision, err = o.DecisionService.GetFeatureDecision(decisionContext, userContext)
412411
if err != nil {
413-
logger.Warning(fmt.Sprintf(`Received error while making a decision for feature "%s": %s`, featureKey, err))
412+
o.logger.Warning(fmt.Sprintf(`Received error while making a decision for feature "%s": %s`, featureKey, err))
414413
return decisionContext, featureDecision, nil
415414
}
416415

@@ -420,7 +419,7 @@ func (o *OptimizelyClient) getFeatureDecision(featureKey, variableKey string, us
420419
func (o *OptimizelyClient) getExperimentDecision(experimentKey string, userContext entities.UserContext) (decisionContext decision.ExperimentDecisionContext, experimentDecision decision.ExperimentDecision, err error) {
421420

422421
userID := userContext.ID
423-
logger.Debug(fmt.Sprintf(`Evaluating experiment "%s" for user "%s".`, experimentKey, userID))
422+
o.logger.Debug(fmt.Sprintf(`Evaluating experiment "%s" for user "%s".`, experimentKey, userID))
424423

425424
projectConfig, e := o.getProjectConfig()
426425
if e != nil {
@@ -429,7 +428,7 @@ func (o *OptimizelyClient) getExperimentDecision(experimentKey string, userConte
429428

430429
experiment, e := projectConfig.GetExperimentByKey(experimentKey)
431430
if e != nil {
432-
logger.Warning(fmt.Sprintf(`Could not get experiment for key "%s": %s`, experimentKey, e))
431+
o.logger.Warning(fmt.Sprintf(`Could not get experiment for key "%s": %s`, experimentKey, e))
433432
return decisionContext, experimentDecision, nil
434433
}
435434

@@ -440,15 +439,15 @@ func (o *OptimizelyClient) getExperimentDecision(experimentKey string, userConte
440439

441440
experimentDecision, err = o.DecisionService.GetExperimentDecision(decisionContext, userContext)
442441
if err != nil {
443-
logger.Warning(fmt.Sprintf(`Received error while making a decision for experiment "%s": %s`, experimentKey, err))
442+
o.logger.Warning(fmt.Sprintf(`Received error while making a decision for experiment "%s": %s`, experimentKey, err))
444443
return decisionContext, experimentDecision, nil
445444
}
446445

447446
if experimentDecision.Variation != nil {
448447
result := experimentDecision.Variation.Key
449-
logger.Info(fmt.Sprintf(`User "%s" is bucketed into variation "%s" of experiment "%s".`, userContext.ID, result, experimentKey))
448+
o.logger.Info(fmt.Sprintf(`User "%s" is bucketed into variation "%s" of experiment "%s".`, userContext.ID, result, experimentKey))
450449
} else {
451-
logger.Info(fmt.Sprintf(`User "%s" is not bucketed into any variation for experiment "%s": %s.`, userContext.ID, experimentKey, experimentDecision.Reason))
450+
o.logger.Info(fmt.Sprintf(`User "%s" is not bucketed into any variation for experiment "%s": %s.`, userContext.ID, experimentKey, experimentDecision.Reason))
452451
}
453452

454453
return decisionContext, experimentDecision, err
@@ -469,12 +468,12 @@ func (o *OptimizelyClient) OnTrack(callback func(eventKey string, userContext en
469468
}
470469
}
471470
if !success {
472-
logger.Warning(fmt.Sprintf("Unable to convert notification payload %v into TrackNotification", payload))
471+
o.logger.Warning(fmt.Sprintf("Unable to convert notification payload %v into TrackNotification", payload))
473472
}
474473
}
475474
id, err := o.notificationCenter.AddHandler(notification.Track, handler)
476475
if err != nil {
477-
logger.Warning("Problem with adding notification handler")
476+
o.logger.Warning("Problem with adding notification handler")
478477
return 0, err
479478
}
480479
return id, nil
@@ -486,7 +485,7 @@ func (o *OptimizelyClient) RemoveOnTrack(id int) error {
486485
return fmt.Errorf("no notification center found")
487486
}
488487
if err := o.notificationCenter.RemoveHandler(id, notification.Track); err != nil {
489-
logger.Warning("Problem with removing notification handler")
488+
o.logger.Warning("Problem with removing notification handler")
490489
return err
491490
}
492491
return nil

0 commit comments

Comments
 (0)