Skip to content

feature (logging): Logging sdk key with every log message. #242

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 29 commits into from
Mar 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
6ee2407
refactor to simply include logger via sdk key
thomaszurkan-optimizely Mar 18, 2020
0db3e58
start fixing tests
thomaszurkan-optimizely Mar 19, 2020
3e5cbf2
fix more tests
thomaszurkan-optimizely Mar 19, 2020
e181b81
fixing tests
thomaszurkan-optimizely Mar 19, 2020
7ae6d3d
fixing some errors
thomaszurkan-optimizely Mar 19, 2020
5f470d7
remove commented out log message
thomaszurkan-optimizely Mar 19, 2020
b5634ff
fix broken tests
thomaszurkan-optimizely Mar 19, 2020
21a8b9c
add test for sdk Key in log
thomaszurkan-optimizely Mar 19, 2020
4c51687
sort imports
thomaszurkan-optimizely Mar 19, 2020
92a63f7
remove 1.8 for 1.10 and upgrade 1.13 to 1.14
thomaszurkan-optimizely Mar 19, 2020
a794097
try and upgrade to golang 1.10
thomaszurkan-optimizely Mar 19, 2020
b576951
Merge branch 'loggingPerSDK' of https://github.com/optimizely/go-sdk …
thomaszurkan-optimizely Mar 19, 2020
67de14e
add a mapper to hide sdk key. add unit test
thomaszurkan-optimizely Mar 23, 2020
ea3d926
added a comment for lint
thomaszurkan-optimizely Mar 23, 2020
a21ec56
format cleanup
thomaszurkan-optimizely Mar 23, 2020
a92a474
go lint
thomaszurkan-optimizely Mar 23, 2020
dd307a8
remove go get that is failing
thomaszurkan-optimizely Mar 23, 2020
c9d69e4
put go get back in..fails
thomaszurkan-optimizely Mar 23, 2020
0eda1e1
update to go 1.11
thomaszurkan-optimizely Mar 23, 2020
b069b61
move back to 10
thomaszurkan-optimizely Mar 23, 2020
8baac24
fix: update new dependency location
juancarlostong Mar 23, 2020
e568567
add sdk key logger override and use sdk key for logging
thomaszurkan-optimizely Mar 23, 2020
4ab256e
go lint
thomaszurkan-optimizely Mar 23, 2020
4291bfd
remove sdk key from bucketer, pass in logger
thomaszurkan-optimizely Mar 24, 2020
e808adc
fix order, fix count, add tests
thomaszurkan-optimizely Mar 24, 2020
ee14e3e
fix lint error
thomaszurkan-optimizely Mar 24, 2020
01e259b
cleanup log writting
thomaszurkan-optimizely Mar 25, 2020
910719a
cleanup log to use fprintf
thomaszurkan-optimizely Mar 25, 2020
08d4c37
refactor to make the logger the last argument except in varg parameters
thomaszurkan-optimizely Mar 25, 2020
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
8 changes: 4 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:

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

- <<: *test
stage: 'Unit test'
env: GIMME_GO_VERSION=1.13.x
env: GIMME_GO_VERSION=1.14.x
before_script:
- go get github.com/mattn/goveralls
after_success:
Expand Down
77 changes: 38 additions & 39 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,14 @@ import (
"github.com/optimizely/go-sdk/pkg/utils"
)

var logger = logging.GetLogger("Client")

// OptimizelyClient is the entry point to the Optimizely SDK
type OptimizelyClient struct {
ConfigManager config.ProjectConfigManager
DecisionService decision.Service
EventProcessor event.Processor
notificationCenter notification.Center
execGroup *utils.ExecGroup
logger logging.OptimizelyLogProducer
}

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

decisionContext, experimentDecision, err := o.getExperimentDecision(experimentKey, userContext)
if err != nil {
logger.Error("received an error while computing experiment decision", err)
o.logger.Error("received an error while computing experiment decision", err)
return result, err
}

Expand Down Expand Up @@ -95,14 +94,14 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
err = errors.New("unexpected error")
}
errorMessage := fmt.Sprintf("IsFeatureEnabled call, optimizely SDK is panicking with the error:")
logger.Error(errorMessage, err)
logger.Debug(string(debug.Stack()))
o.logger.Error(errorMessage, err)
o.logger.Debug(string(debug.Stack()))
}
}()

decisionContext, featureDecision, err := o.getFeatureDecision(featureKey, "", userContext)
if err != nil {
logger.Error("received an error while computing feature decision", err)
o.logger.Error("received an error while computing feature decision", err)
return result, err
}

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

if result {
logger.Info(fmt.Sprintf(`Feature "%s" is enabled for user "%s".`, featureKey, userContext.ID))
o.logger.Info(fmt.Sprintf(`Feature "%s" is enabled for user "%s".`, featureKey, userContext.ID))
} else {
logger.Info(fmt.Sprintf(`Feature "%s" is not enabled for user "%s".`, featureKey, userContext.ID))
o.logger.Info(fmt.Sprintf(`Feature "%s" is not enabled for user "%s".`, featureKey, userContext.ID))
}

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

projectConfig, err := o.getProjectConfig()
if err != nil {
logger.Error("Error retrieving ProjectConfig", err)
o.logger.Error("Error retrieving ProjectConfig", err)
return enabledFeatures, err
}

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

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

feature := decisionContext.Feature
if feature == nil {
logger.Warning(fmt.Sprintf(`feature "%s" does not exist`, featureKey))
o.logger.Warning(fmt.Sprintf(`feature "%s" does not exist`, featureKey))
return enabled, variableMap, nil
}

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

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

_, experimentDecision, err := o.getExperimentDecision(experimentKey, userContext)
if err != nil {
logger.Error("received an error while computing experiment decision", err)
o.logger.Error("received an error while computing experiment decision", err)
}

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

projectConfig, e := o.getProjectConfig()
if e != nil {
logger.Error("Optimizely SDK tracking error", e)
o.logger.Error("Optimizely SDK tracking error", e)
return e
}

configEvent, e := projectConfig.GetEventByKey(eventKey)

if e != nil {
errorMessage := fmt.Sprintf(`Unable to get event for key "%s": %s`, eventKey, e)
logger.Warning(errorMessage)
o.logger.Warning(errorMessage)
return nil
}

userEvent := event.CreateConversionUserEvent(projectConfig, configEvent, userContext, eventTags)
if o.EventProcessor.ProcessEvent(userEvent) && o.notificationCenter != nil {
trackNotification := notification.TrackNotification{EventKey: eventKey, UserContext: userContext, EventTags: eventTags, ConversionEvent: *userEvent.Conversion}
if err = o.notificationCenter.Send(notification.Track, trackNotification); err != nil {
logger.Warning("Problem with sending notification")
o.logger.Warning("Problem with sending notification")
}
}

Expand All @@ -373,31 +372,31 @@ func (o *OptimizelyClient) getFeatureDecision(featureKey, variableKey string, us
err = errors.New("unexpected error")
}
errorMessage := fmt.Sprintf("getFeatureDecision call, optimizely SDK is panicking with the error:")
logger.Error(errorMessage, err)
logger.Debug(string(debug.Stack()))
o.logger.Error(errorMessage, err)
o.logger.Debug(string(debug.Stack()))
}
}()

userID := userContext.ID
logger.Debug(fmt.Sprintf(`Evaluating feature "%s" for user "%s".`, featureKey, userID))
o.logger.Debug(fmt.Sprintf(`Evaluating feature "%s" for user "%s".`, featureKey, userID))

projectConfig, e := o.getProjectConfig()
if e != nil {
logger.Error("Error calling getFeatureDecision", e)
o.logger.Error("Error calling getFeatureDecision", e)
return decisionContext, featureDecision, e
}

feature, e := projectConfig.GetFeatureByKey(featureKey)
if e != nil {
logger.Warning(fmt.Sprintf(`Could not get feature for key "%s": %s`, featureKey, e))
o.logger.Warning(fmt.Sprintf(`Could not get feature for key "%s": %s`, featureKey, e))
return decisionContext, featureDecision, nil
}

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

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

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

userID := userContext.ID
logger.Debug(fmt.Sprintf(`Evaluating experiment "%s" for user "%s".`, experimentKey, userID))
o.logger.Debug(fmt.Sprintf(`Evaluating experiment "%s" for user "%s".`, experimentKey, userID))

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

experiment, e := projectConfig.GetExperimentByKey(experimentKey)
if e != nil {
logger.Warning(fmt.Sprintf(`Could not get experiment for key "%s": %s`, experimentKey, e))
o.logger.Warning(fmt.Sprintf(`Could not get experiment for key "%s": %s`, experimentKey, e))
return decisionContext, experimentDecision, nil
}

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

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

if experimentDecision.Variation != nil {
result := experimentDecision.Variation.Key
logger.Info(fmt.Sprintf(`User "%s" is bucketed into variation "%s" of experiment "%s".`, userContext.ID, result, experimentKey))
o.logger.Info(fmt.Sprintf(`User "%s" is bucketed into variation "%s" of experiment "%s".`, userContext.ID, result, experimentKey))
} else {
logger.Info(fmt.Sprintf(`User "%s" is not bucketed into any variation for experiment "%s": %s.`, userContext.ID, experimentKey, experimentDecision.Reason))
o.logger.Info(fmt.Sprintf(`User "%s" is not bucketed into any variation for experiment "%s": %s.`, userContext.ID, experimentKey, experimentDecision.Reason))
}

return decisionContext, experimentDecision, err
Expand All @@ -469,12 +468,12 @@ func (o *OptimizelyClient) OnTrack(callback func(eventKey string, userContext en
}
}
if !success {
logger.Warning(fmt.Sprintf("Unable to convert notification payload %v into TrackNotification", payload))
o.logger.Warning(fmt.Sprintf("Unable to convert notification payload %v into TrackNotification", payload))
}
}
id, err := o.notificationCenter.AddHandler(notification.Track, handler)
if err != nil {
logger.Warning("Problem with adding notification handler")
o.logger.Warning("Problem with adding notification handler")
return 0, err
}
return id, nil
Expand All @@ -486,7 +485,7 @@ func (o *OptimizelyClient) RemoveOnTrack(id int) error {
return fmt.Errorf("no notification center found")
}
if err := o.notificationCenter.RemoveHandler(id, notification.Track); err != nil {
logger.Warning("Problem with removing notification handler")
o.logger.Warning("Problem with removing notification handler")
return err
}
return nil
Expand Down
Loading