Skip to content

Commit e532857

Browse files
authored
fix(logs): Fixing log messages (#259)
1 parent 41afc38 commit e532857

File tree

9 files changed

+224
-217
lines changed

9 files changed

+224
-217
lines changed

lib/optimizely.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -806,15 +806,16 @@ def get_feature_variable_for_variation(feature_flag_key, feature_enabled, variat
806806
"Got variable value '#{variable_value}' for variable '#{variable['key']}' of feature flag '#{feature_flag_key}'.")
807807
else
808808
@logger.log(Logger::DEBUG,
809-
"Variable '#{variable['key']}' is not used in variation '#{variation['key']}'. Returning the default variable value '#{variable_value}'.")
809+
"Variable value is not defined. Returning the default variable value '#{variable_value}' for variable '#{variable['key']}'.")
810+
810811
end
811812
else
812813
@logger.log(Logger::DEBUG,
813-
"Feature '#{feature_flag_key}' for variation '#{variation['key']}' is not enabled. Returning the default variable value '#{variable_value}'.")
814+
"Feature '#{feature_flag_key}' is not enabled for user '#{user_id}'. Returning the default variable value '#{variable_value}'.")
814815
end
815816
else
816817
@logger.log(Logger::INFO,
817-
"User '#{user_id}' was not bucketed into any variation for feature flag '#{feature_flag_key}'. Returning the default variable value '#{variable_value}'.")
818+
"User '#{user_id}' was not bucketed into experiment or rollout for feature flag '#{feature_flag_key}'. Returning the default variable value '#{variable_value}'.")
818819
end
819820
variable_value
820821
end

lib/optimizely/audience.rb

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,32 @@ module Optimizely
2424
module Audience
2525
module_function
2626

27-
def user_in_experiment?(config, experiment, attributes, logger)
28-
# Determine for given experiment if user satisfies the audiences for the experiment.
27+
def user_meets_audience_conditions?(config, experiment, attributes, logger, logging_hash = nil, logging_key = nil)
28+
# Determine for given experiment/rollout rule if user satisfies the audience conditions.
2929
#
3030
# config - Representation of the Optimizely project config.
31-
# experiment - Experiment for which visitor is to be bucketed.
31+
# experiment - Experiment/Rollout rule in which user is to be bucketed.
3232
# attributes - Hash representing user attributes which will be used in determining if
3333
# the audience conditions are met.
34+
# logger - Provides a logger instance.
35+
# logging_hash - Optional string representing logs hash inside Helpers::Constants.
36+
# This defaults to 'EXPERIMENT_AUDIENCE_EVALUATION_LOGS'.
37+
# logging_key - Optional string to be logged as an identifier of experiment under evaluation.
38+
# This defaults to experiment['key'].
3439
#
3540
# Returns boolean representing if user satisfies audience conditions for the audiences or not.
41+
logging_hash ||= 'EXPERIMENT_AUDIENCE_EVALUATION_LOGS'
42+
logging_key ||= experiment['key']
43+
44+
logs_hash = Object.const_get "Optimizely::Helpers::Constants::#{logging_hash}"
3645

3746
audience_conditions = experiment['audienceConditions'] || experiment['audienceIds']
3847

3948
logger.log(
4049
Logger::DEBUG,
4150
format(
42-
Helpers::Constants::AUDIENCE_EVALUATION_LOGS['EVALUATING_AUDIENCES_COMBINED'],
43-
experiment['key'],
51+
logs_hash['EVALUATING_AUDIENCES_COMBINED'],
52+
logging_key,
4453
audience_conditions
4554
)
4655
)
@@ -50,8 +59,8 @@ def user_in_experiment?(config, experiment, attributes, logger)
5059
logger.log(
5160
Logger::INFO,
5261
format(
53-
Helpers::Constants::AUDIENCE_EVALUATION_LOGS['AUDIENCE_EVALUATION_RESULT_COMBINED'],
54-
experiment['key'],
62+
logs_hash['AUDIENCE_EVALUATION_RESULT_COMBINED'],
63+
logging_key,
5564
'TRUE'
5665
)
5766
)
@@ -74,7 +83,7 @@ def user_in_experiment?(config, experiment, attributes, logger)
7483
logger.log(
7584
Logger::DEBUG,
7685
format(
77-
Helpers::Constants::AUDIENCE_EVALUATION_LOGS['EVALUATING_AUDIENCE'],
86+
logs_hash['EVALUATING_AUDIENCE'],
7887
audience_id,
7988
audience_conditions
8089
)
@@ -85,7 +94,7 @@ def user_in_experiment?(config, experiment, attributes, logger)
8594
result_str = result.nil? ? 'UNKNOWN' : result.to_s.upcase
8695
logger.log(
8796
Logger::DEBUG,
88-
format(Helpers::Constants::AUDIENCE_EVALUATION_LOGS['AUDIENCE_EVALUATION_RESULT'], audience_id, result_str)
97+
format(logs_hash['AUDIENCE_EVALUATION_RESULT'], audience_id, result_str)
8998
)
9099
result
91100
end
@@ -97,8 +106,8 @@ def user_in_experiment?(config, experiment, attributes, logger)
97106
logger.log(
98107
Logger::INFO,
99108
format(
100-
Helpers::Constants::AUDIENCE_EVALUATION_LOGS['AUDIENCE_EVALUATION_RESULT_COMBINED'],
101-
experiment['key'],
109+
logs_hash['AUDIENCE_EVALUATION_RESULT_COMBINED'],
110+
logging_key,
102111
eval_result.to_s.upcase
103112
)
104113
)

lib/optimizely/bucketer.rb

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

33
#
4-
# Copyright 2016-2017, 2019 Optimizely and contributors
4+
# Copyright 2016-2017, 2019-2020 Optimizely and contributors
55
#
66
# Licensed under the Apache License, Version 2.0 (the "License");
77
# you may not use this file except in compliance with the License.
@@ -39,14 +39,15 @@ def bucket(project_config, experiment, bucketing_id, user_id)
3939
# Determines ID of variation to be shown for a given experiment key and user ID.
4040
#
4141
# project_config - Instance of ProjectConfig
42-
# experiment - Experiment for which visitor is to be bucketed.
42+
# experiment - Experiment or Rollout rule for which visitor is to be bucketed.
4343
# bucketing_id - String A customer-assigned value used to generate the bucketing key
4444
# user_id - String ID for user.
4545
#
4646
# Returns variation in which visitor with ID user_id has been placed. Nil if no variation.
4747
return nil if experiment.nil?
4848

4949
# check if experiment is in a group; if so, check if user is bucketed into specified experiment
50+
# this will not affect evaluation of rollout rules.
5051
experiment_id = experiment['id']
5152
experiment_key = experiment['key']
5253
group_id = experiment['groupId']
@@ -82,11 +83,6 @@ def bucket(project_config, experiment, bucketing_id, user_id)
8283
variation_id = find_bucket(bucketing_id, user_id, experiment_id, traffic_allocations)
8384
if variation_id && variation_id != ''
8485
variation = project_config.get_variation_from_id(experiment_key, variation_id)
85-
variation_key = variation ? variation['key'] : nil
86-
@logger.log(
87-
Logger::INFO,
88-
"User '#{user_id}' is in variation '#{variation_key}' of experiment '#{experiment_key}'."
89-
)
9086
return variation
9187
end
9288

@@ -98,7 +94,6 @@ def bucket(project_config, experiment, bucketing_id, user_id)
9894
)
9995
end
10096

101-
@logger.log(Logger::INFO, "User '#{user_id}' is in no variation.")
10297
nil
10398
end
10499

lib/optimizely/decision_service.rb

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

33
#
4-
# Copyright 2017-2019, Optimizely and contributors
4+
# Copyright 2017-2020, Optimizely and contributors
55
#
66
# Licensed under the Apache License, Version 2.0 (the "License");
77
# you may not use this file except in compliance with the License.
@@ -94,7 +94,7 @@ def get_variation(project_config, experiment_key, user_id, attributes = nil)
9494
end
9595

9696
# Check audience conditions
97-
unless Audience.user_in_experiment?(project_config, experiment, attributes, @logger)
97+
unless Audience.user_meets_audience_conditions?(project_config, experiment, attributes, @logger)
9898
@logger.log(
9999
Logger::INFO,
100100
"User '#{user_id}' does not meet the conditions to be in experiment '#{experiment_key}'."
@@ -106,6 +106,16 @@ def get_variation(project_config, experiment_key, user_id, attributes = nil)
106106
variation = @bucketer.bucket(project_config, experiment, bucketing_id, user_id)
107107
variation_id = variation ? variation['id'] : nil
108108

109+
if variation_id
110+
variation_key = variation['key']
111+
@logger.log(
112+
Logger::INFO,
113+
"User '#{user_id}' is in variation '#{variation_key}' of experiment '#{experiment_key}'."
114+
)
115+
else
116+
@logger.log(Logger::INFO, "User '#{user_id}' is in no variation.")
117+
end
118+
109119
# Persist bucketing decision
110120
save_user_profile(user_profile, experiment_id, variation_id)
111121
variation_id
@@ -125,21 +135,9 @@ def get_variation_for_feature(project_config, feature_flag, user_id, attributes
125135
decision = get_variation_for_feature_experiment(project_config, feature_flag, user_id, attributes)
126136
return decision unless decision.nil?
127137

128-
feature_flag_key = feature_flag['key']
129138
decision = get_variation_for_feature_rollout(project_config, feature_flag, user_id, attributes)
130-
if decision
131-
@logger.log(
132-
Logger::INFO,
133-
"User '#{user_id}' is bucketed into a rollout for feature flag '#{feature_flag_key}'."
134-
)
135-
return decision
136-
end
137-
@logger.log(
138-
Logger::INFO,
139-
"User '#{user_id}' is not bucketed into a rollout for feature flag '#{feature_flag_key}'."
140-
)
141139

142-
nil
140+
decision
143141
end
144142

145143
def get_variation_for_feature_experiment(project_config, feature_flag, user_id, attributes = nil)
@@ -178,10 +176,7 @@ def get_variation_for_feature_experiment(project_config, feature_flag, user_id,
178176
next unless variation_id
179177

180178
variation = project_config.variation_id_map[experiment_key][variation_id]
181-
@logger.log(
182-
Logger::INFO,
183-
"The user '#{user_id}' is bucketed into experiment '#{experiment_key}' of feature '#{feature_flag_key}'."
184-
)
179+
185180
return Decision.new(experiment, variation, DECISION_SOURCES['FEATURE_TEST'])
186181
end
187182

@@ -231,20 +226,23 @@ def get_variation_for_feature_rollout(project_config, feature_flag, user_id, att
231226
# Go through each experiment in order and try to get the variation for the user
232227
number_of_rules.times do |index|
233228
rollout_rule = rollout_rules[index]
234-
audience_id = rollout_rule['audienceIds'][0]
235-
audience = project_config.get_audience_from_id(audience_id)
236-
audience_name = audience['name']
229+
logging_key = index + 1
237230

238231
# Check that user meets audience conditions for targeting rule
239-
unless Audience.user_in_experiment?(project_config, rollout_rule, attributes, @logger)
232+
unless Audience.user_meets_audience_conditions?(project_config, rollout_rule, attributes, @logger, 'ROLLOUT_AUDIENCE_EVALUATION_LOGS', logging_key)
240233
@logger.log(
241234
Logger::DEBUG,
242-
"User '#{user_id}' does not meet the conditions to be in rollout rule for audience '#{audience_name}'."
235+
"User '#{user_id}' does not meet the audience conditions for targeting rule '#{logging_key}'."
243236
)
244237
# move onto the next targeting rule
245238
next
246239
end
247240

241+
@logger.log(
242+
Logger::DEBUG,
243+
"User '#{user_id}' meets the audience conditions for targeting rule '#{logging_key}'."
244+
)
245+
248246
# Evaluate if user satisfies the traffic allocation for this rollout rule
249247
variation = @bucketer.bucket(project_config, rollout_rule, bucketing_id, user_id)
250248
return Decision.new(rollout_rule, variation, DECISION_SOURCES['ROLLOUT']) unless variation.nil?
@@ -254,17 +252,20 @@ def get_variation_for_feature_rollout(project_config, feature_flag, user_id, att
254252

255253
# get last rule which is the everyone else rule
256254
everyone_else_experiment = rollout_rules[number_of_rules]
255+
logging_key = 'Everyone Else'
257256
# Check that user meets audience conditions for last rule
258-
unless Audience.user_in_experiment?(project_config, everyone_else_experiment, attributes, @logger)
259-
audience_id = everyone_else_experiment['audienceIds'][0]
260-
audience = project_config.get_audience_from_id(audience_id)
261-
audience_name = audience['name']
257+
unless Audience.user_meets_audience_conditions?(project_config, everyone_else_experiment, attributes, @logger, 'ROLLOUT_AUDIENCE_EVALUATION_LOGS', logging_key)
262258
@logger.log(
263259
Logger::DEBUG,
264-
"User '#{user_id}' does not meet the conditions to be in rollout rule for audience '#{audience_name}'."
260+
"User '#{user_id}' does not meet the audience conditions for targeting rule '#{logging_key}'."
265261
)
266262
return nil
267263
end
264+
265+
@logger.log(
266+
Logger::DEBUG,
267+
"User '#{user_id}' meets the audience conditions for targeting rule '#{logging_key}'."
268+
)
268269
variation = @bucketer.bucket(project_config, everyone_else_experiment, bucketing_id, user_id)
269270
return Decision.new(everyone_else_experiment, variation, DECISION_SOURCES['ROLLOUT']) unless variation.nil?
270271

lib/optimizely/helpers/constants.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,7 @@ module Constants
335335

336336
AUDIENCE_EVALUATION_LOGS = {
337337
'AUDIENCE_EVALUATION_RESULT' => "Audience '%s' evaluated to %s.",
338-
'AUDIENCE_EVALUATION_RESULT_COMBINED' => "Audiences for experiment '%s' collectively evaluated to %s.",
339338
'EVALUATING_AUDIENCE' => "Starting to evaluate audience '%s' with conditions: %s.",
340-
'EVALUATING_AUDIENCES_COMBINED' => "Evaluating audiences for experiment '%s': %s.",
341339
'INFINITE_ATTRIBUTE_VALUE' => 'Audience condition %s evaluated to UNKNOWN because the number value ' \
342340
"for user attribute '%s' is not in the range [-2^53, +2^53].",
343341
'MISSING_ATTRIBUTE_VALUE' => 'Audience condition %s evaluated as UNKNOWN because no value ' \
@@ -354,6 +352,16 @@ module Constants
354352
'to upgrade to a newer release of the Optimizely SDK.'
355353
}.freeze
356354

355+
EXPERIMENT_AUDIENCE_EVALUATION_LOGS = {
356+
'AUDIENCE_EVALUATION_RESULT_COMBINED' => "Audiences for experiment '%s' collectively evaluated to %s.",
357+
'EVALUATING_AUDIENCES_COMBINED' => "Evaluating audiences for experiment '%s': %s."
358+
}.merge(AUDIENCE_EVALUATION_LOGS).freeze
359+
360+
ROLLOUT_AUDIENCE_EVALUATION_LOGS = {
361+
'AUDIENCE_EVALUATION_RESULT_COMBINED' => "Audiences for rule '%s' collectively evaluated to %s.",
362+
'EVALUATING_AUDIENCES_COMBINED' => "Evaluating audiences for rule '%s': %s."
363+
}.merge(AUDIENCE_EVALUATION_LOGS).freeze
364+
357365
DECISION_NOTIFICATION_TYPES = {
358366
'AB_TEST' => 'ab-test',
359367
'FEATURE' => 'feature',

0 commit comments

Comments
 (0)