vwo-sdk 1.30.0 → 1.37.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vwo/constants.rb +3 -2
- data/lib/vwo/core/bucketer.rb +50 -48
- data/lib/vwo/core/variation_decider.rb +427 -428
- data/lib/vwo/enums.rb +17 -154
- data/lib/vwo/logger.rb +8 -5
- data/lib/vwo/schemas/settings_file.rb +7 -6
- data/lib/vwo/services/batch_events_dispatcher.rb +45 -38
- data/lib/vwo/services/batch_events_queue.rb +52 -68
- data/lib/vwo/services/event_dispatcher.rb +46 -16
- data/lib/vwo/services/hooks_manager.rb +8 -12
- data/lib/vwo/services/segment_evaluator.rb +17 -15
- data/lib/vwo/services/settings_file_manager.rb +5 -5
- data/lib/vwo/services/settings_file_processor.rb +7 -4
- data/lib/vwo/services/usage_stats.rb +5 -4
- data/lib/vwo/utils/campaign.rb +61 -64
- data/lib/vwo/utils/custom_dimensions.rb +14 -14
- data/lib/vwo/utils/data_location_manager.rb +2 -9
- data/lib/vwo/utils/feature.rb +7 -10
- data/lib/vwo/utils/impression.rb +80 -79
- data/lib/vwo/utils/log_message.rb +69 -0
- data/lib/vwo/utils/request.rb +7 -9
- data/lib/vwo/utils/utility.rb +45 -28
- data/lib/vwo/utils/uuid.rb +12 -10
- data/lib/vwo/utils/validations.rb +124 -49
- data/lib/vwo.rb +472 -620
- metadata +11 -10
data/lib/vwo/enums.rb
CHANGED
@@ -12,8 +12,6 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
# rubocop:disable Metrics/LineLength
|
16
|
-
|
17
15
|
require 'logger'
|
18
16
|
|
19
17
|
class VWO
|
@@ -64,157 +62,23 @@ class VWO
|
|
64
62
|
VWO_PATH = 'vwo'
|
65
63
|
UTIL_PATH = 'vwo/utils'
|
66
64
|
|
67
|
-
VWO = VWO_PATH
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
# Logging Enums
|
87
|
-
module LogMessageEnum
|
88
|
-
# Debug Messages
|
89
|
-
module DebugMessages
|
90
|
-
LOG_LEVEL_SET = '(%<file>s): Log level set to %<level>s'
|
91
|
-
SET_DEVELOPMENT_MODE = '(%<file>s): DEVELOPMENT mode is ON'
|
92
|
-
VALID_CONFIGURATION = '(%<file>s): SDK configuration and account settings are valid.'
|
93
|
-
CUSTOM_LOGGER_USED = '(%<file>s): Custom logger used'
|
94
|
-
SDK_INITIALIZED = '(%<file>s): SDK properly initialized'
|
95
|
-
SETTINGS_FILE_PROCESSED = '(%<file>s): Settings file processed'
|
96
|
-
NO_STORED_VARIATION = '(%<file>s): No stored variation for UserId:%<user_id>s for Campaign:%<campaign_key>s found in UserStorageService'
|
97
|
-
NO_USER_STORAGE_SERVICE_LOOKUP = '(%<file>s): No UserStorageService to look for stored data'
|
98
|
-
NO_USER_STORAGE_SERVICE_SAVE = '(%<file>s): No UserStorageService to save data'
|
99
|
-
GETTING_STORED_VARIATION = '(%<file>s): Got stored variation for UserId:%<user_id>s of Campaign:%<campaign_key>s as Variation: %<variation_name>s found in UserStorageService'
|
100
|
-
CHECK_USER_ELIGIBILITY_FOR_CAMPAIGN = '(%<file>s): campaign:%<campaign_key>s having traffic allocation:%<traffic_allocation>s assigned value:%<traffic_allocation>s to userId:%<user_id>s'
|
101
|
-
USER_HASH_BUCKET_VALUE = '(%<file>s): userId:%<user_id>s having hash:%<hash_value>s got bucketValue:%<bucket_value>s'
|
102
|
-
VARIATION_HASH_BUCKET_VALUE = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s having percent traffic:%<percent_traffic>s got hash-value:%<hash_value>s and bucket value:%<bucket_value>s'
|
103
|
-
IMPRESSION_FAILED = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s got variationName:%<variation_name>s inside method:%<method>s'
|
104
|
-
USER_NOT_PART_OF_CAMPAIGN = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s did not become part of campaign method:%<method>s'
|
105
|
-
UUID_FOR_USER = '(%<file>s): Uuid generated for userId:%<user_id>s and accountId:%<account_id>s is %<desired_uuid>s'
|
106
|
-
IMPRESSION_FOR_TRACK_USER = '(%<file>s): Impression built for track-user - %<properties>s'
|
107
|
-
IMPRESSION_FOR_TRACK_GOAL = '(%<file>s): Impression built for track-goal - %<properties>s'
|
108
|
-
GOT_VARIATION_FOR_USER = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s got variationName:%<variation_name>s'
|
109
|
-
SEGMENTATION_STATUS = '(%<file>s): In API: %<api_name>s, for UserId:%<user_id>s of campaign:%<campaign_key>s with variables:%<custom_variables>s %<status>s %<segmentation_type>s %<variation_name>s'
|
110
|
-
PARAMS_FOR_PUSH_CALL = '(%<file>s): Params for push call - %<properties>s'
|
111
|
-
CAMPAIGN_NOT_ACTIVATED = '(%<file>s): Campaign:%<campaign_key>s for User ID:%<user_id>s is not yet activated for API:%<api_name>s. Use activate API to activate A/B test or isFeatureEnabled API to activate Feature Test.'
|
112
|
-
BATCH_EVENT_LIMIT_EXCEEDED = '(%<file>s): Impression event - %<end_point>s failed due to exceeding payload size. Parameter eventsPerRequest in batchEvents config in launch API has value:%<eventsPerRequest>s for accountId:%<accountId>s. Please read the official documentation for knowing the size limits.'
|
113
|
-
BULK_NOT_PROCESSED = "(%<file>s): Batch events couldn't be received by VWO. Calling Flush Callback with error and data."
|
114
|
-
BEFORE_FLUSHING = '(%<file>s): Flushing events queue %<manually>s having %<length>s events %<timer>s queue summary: %<queue_metadata>s'
|
115
|
-
EVENT_BATCHING_INSUFFICIENT = '(%<file>s): %<key>s not provided, assigning default value'
|
116
|
-
GOT_ELIGIBLE_CAMPAIGNS = "(%<file>s): Campaigns:%<eligible_campaigns_key>s are eligible, %<ineligible_campaigns_log_text>s are ineligible from the Group:%<group_name>s for the User ID:%<user_id>s"
|
117
|
-
IMPRESSION_FOR_EVENT_ARCH_TRACK_USER = "(%<file>s): impression built for vwo_variationShown event for account ID:%<a>s, user ID:%<u>s, and campaign ID:%<c>s"
|
118
|
-
IMPRESSION_FOR_EVENT_ARCH_TRACK_GOAL = "(%<file>s): impression built for %<goal_identifier>s event for account ID:%<a>s, user ID:%<u>s, and campaign ID:%<c>s"
|
119
|
-
IMPRESSION_FOR_EVENT_ARCH_PUSH = "(%<file>s): impression built for visitor property:%<property>s for account ID:%<a>s and user ID:%<u>s"
|
120
|
-
end
|
121
|
-
|
122
|
-
# Info Messages
|
123
|
-
module InfoMessages
|
124
|
-
VARIATION_RANGE_ALLOCATION = '(%<file>s): Campaign:%<campaign_key>s having variations:%<variation_name>s with weight:%<variation_weight>s got range as: ( %<start>s - %<end>s ))'
|
125
|
-
VARIATION_ALLOCATED = '(%<file>s): UserId:%<user_id>s of Campaign:%<campaign_key>s type: %<campaign_type>s got variation: %<variation_name>s'
|
126
|
-
LOOKING_UP_USER_STORAGE_SERVICE = '(%<file>s): Looked into UserStorageService for userId:%<user_id>s %<status>s'
|
127
|
-
SAVING_DATA_USER_STORAGE_SERVICE = '(%<file>s): Saving into UserStorageService for userId:%<user_id>s successful'
|
128
|
-
GOT_STORED_VARIATION = '(%<file>s): Got stored variation:%<variation_name>s of campaign:%<campaign_key>s for userId:%<user_id>s from UserStorageService'
|
129
|
-
NO_VARIATION_ALLOCATED = '(%<file>s): UserId:%<user_id>s of Campaign:%<campaign_key>s did not get any variation'
|
130
|
-
USER_ELIGIBILITY_FOR_CAMPAIGN = '(%<file>s): Is userId:%<user_id>s part of campaign? %<is_user_part>s'
|
131
|
-
AUDIENCE_CONDITION_NOT_MET = '(%<file>s): userId:%<user_id>s does not become part of campaign because of not meeting audience conditions'
|
132
|
-
GOT_VARIATION_FOR_USER = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s got variationName:%<variation_name>s'
|
133
|
-
USER_GOT_NO_VARIATION = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s did not allot any variation'
|
134
|
-
IMPRESSION_SUCCESS_FOR_EVENT_ARCH = '(%<file>s): Impression for %<event>s - %<url>s was successfully received by VWO for account ID:%<a>s'
|
135
|
-
IMPRESSION_SUCCESS = '(%<file>s): Impression event - %<end_point>s was successfully received by VWO having main keys: accountId:%<account_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s'
|
136
|
-
MAIN_KEYS_FOR_IMPRESSION = '(%<file>s): Having main keys: accountId:%<account_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s}'
|
137
|
-
MAIN_KEYS_FOR_PUSH_API = '(%<file>s): Having main keys: accountId:%<account_id>s u:%<u>s and tags:%<tags>s}'
|
138
|
-
INVALID_VARIATION_KEY = '(%<file>s): Variation was not assigned to userId:%<user_id>s for campaign:%<campaign_key>s'
|
139
|
-
|
140
|
-
USER_IN_FEATURE_ROLLOUT = '(%<file>s): User ID:%<user_id>s is in feature rollout:%<campaign_key>s'
|
141
|
-
USER_NOT_IN_FEATURE_ROLLOUT = '(%<file>s): User ID:%<user_id>s is NOT in feature rollout:%<campaign_key>s'
|
142
|
-
FEATURE_ENABLED_FOR_USER = '(%<file>s): In API: %<api_name>s Feature having feature-key:%<feature_key>s for user ID:%<user_id>s is enabled'
|
143
|
-
FEATURE_NOT_ENABLED_FOR_USER = '(%<file>s): In API: %<api_name>s Feature having feature-key:%<feature_key>s for user ID:%<user_id>s is not enabled'
|
144
|
-
|
145
|
-
VARIABLE_FOUND = '(%<file>s): In API: %<api_name>s Value for variable:%<variable_key>s of campaign:%<campaign_key>s and campaign type: %<campaign_type>s is:%<variable_value>s for user:%<user_id>s'
|
146
|
-
|
147
|
-
USER_PASSED_SEGMENTATION = '(%<file>s): UserId:%<user_id>s of campaign:%<campaign_key>s with custom_variables:%<custom_variables>s passed segmentation'
|
148
|
-
USER_FAILED_SEGMENTATION = '(%<file>s): UserId:%<user_id>s of campaign:%<campaign_key>s with custom_variables:%<custom_variables>s failed segmentation'
|
149
|
-
|
150
|
-
NO_CUSTOM_VARIABLES = '(%<file>s): In API: %<api_name>s, for UserId:%<user_id>s customVariables are not passed for campaign:%<campaign_key>s and campaign has pre-segmentation'
|
151
|
-
SKIPPING_SEGMENTATION = '(%<file>s): In API: %<api_name>s, Skipping segmentation:%<variation>s for UserId:%<user_id>s as no valid segments found in campaign:%<campaign_key>s'
|
152
|
-
|
153
|
-
SEGMENTATION_STATUS = '(%<file>s): In API: %<api_name>s, for UserId:%<user_id>s of campaign:%<campaign_key>s with variables:%<custom_variables>s %<status>s %<segmentation_type>s %<variation_name>s'
|
154
|
-
WHITELISTING_SKIPPED = '(%<file>s): In API: %<api_name>s, Skipping whitelisting for UserId:%<user_id>s of campaign:%<campaign_key>s'
|
155
|
-
SETTINGS_NOT_UPDATED = '(%<file>s): Settings-file fetched are same as earlier fetched settings'
|
156
|
-
SETTINGS_FILE_UPDATED = '(%<file>s): %<api_name>s vwo_sdk_instance is updated with the latest settings_file'
|
157
|
-
CAMPAIGN_NOT_ACTIVATED = '(%<file>s): Activate the campaign:%<campaign_key>s for User ID:%<user_id>s to %<reason>s.'
|
158
|
-
GOAL_ALREADY_TRACKED = '(%<file>s): Goal:%<goal_identifier>s of Campaign:%<campaign_key>s for User ID:%<user_id>s has already been tracked earlier. Skipping now'
|
159
|
-
USER_ALREADY_TRACKED = '(%<file>s): User ID:%<user_id>s for Campaign:%<campaign_key>s has already been tracked earlier for "%<api_name>s" API. Skipping now'
|
160
|
-
API_CALLED = '(%<file>s): API: %<api_name>s called for UserId:%<user_id>s'
|
161
|
-
BULK_IMPRESSION_SUCCESS = '(%<file>s): Impression event - %<end_point>s was successfully received by VWO having accountId:%<a>s'
|
162
|
-
AFTER_FLUSHING = '(%<file>s): Events queue having %<length>s events has been flushed %<manually>s queue summary: %<queue_metadata>s'
|
163
|
-
GOT_WINNER_CAMPAIGN = "(%<file>s): Campaign:%<campaign_key>s is selected from the mutually exclusive group:%<group_name>s for the User ID:%<user_id>s"
|
164
|
-
GOT_ELIGIBLE_CAMPAIGNS = "(%<file>s): Got %<no_of_eligible_campaigns>s eligible winners out of %<no_of_group_campaigns>s from the Group:%<group_name>s and for User ID:%<user_id>s"
|
165
|
-
CALLED_CAMPAIGN_NOT_WINNER = "(%<file>s): Campaign:%<campaign_key>s does not qualify from the mutually exclusive group:%<group_name>s for User ID:%<user_id>s"
|
166
|
-
OTHER_CAMPAIGN_SATISFIES_WHITELISTING_OR_STORAGE = "(%<file>s): Campaign:%<campaign_key>s of Group:%<group_name>s satisfies %<type>s for User ID:%<user_id>s"
|
167
|
-
OPT_OUT_API_CALLED = "(%<file>s): You have opted out for not tracking i.e. all API calls will stop functioning and will simply early return"
|
168
|
-
API_NOT_ENABLED = "(%<file>s): %<api>s API is disabled as you opted out for tracking. Reinitialize the SDK to enable the normal functioning of all APIs."
|
169
|
-
end
|
170
|
-
|
171
|
-
# Warning Messages
|
172
|
-
module WarningMessages; end
|
173
|
-
|
174
|
-
# Error Messages
|
175
|
-
module ErrorMessages
|
176
|
-
SETTINGS_FILE_CORRUPTED = '(%<file>s): Settings file is corrupted. Please contact VWO Support for help.'
|
177
|
-
ACTIVATE_API_MISSING_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects campaignTestKey(String) as first and userId(String) as second argument, customVariables(Hash) can be passed via options for pre-segmentation'
|
178
|
-
API_CONFIG_CORRUPTED = '(%<file>s): %<api_name>s API has corrupted configuration'
|
179
|
-
GET_VARIATION_NAME_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects campaignTestKey(String) as first and userId(String) as second argument, customVariables(Hash) can be passed via options for pre-segmentation'
|
180
|
-
GET_VARIATION_API_CONFIG_CORRUPTED = '(%<file>s): "getVariation" API has corrupted configuration'
|
181
|
-
TRACK_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects campaignTestKey(Nil/String/Array) as first userId(String) as second and goalIdentifier(String/Number) as third argument. Fourth is revenueValue(Float/Number/String) and is required for revenue goal only. customVariables(Hash) can be passed via options for pre-segmentation'
|
182
|
-
TRACK_API_CONFIG_CORRUPTED = '(%<file>s): "track" API has corrupted configuration'
|
183
|
-
TRACK_API_GOAL_NOT_FOUND = '(%<file>s): Goal:%<goal_identifier>s not found for campaign:%<campaign_key>s and userId:%<user_id>s'
|
184
|
-
TRACK_API_REVENUE_NOT_PASSED_FOR_REVENUE_GOAL = '(%<file>s): Revenue value should be passed for revenue goal:%<goal_identifier>s for campaign:%<campaign_key>s and userId:%<user_id>s'
|
185
|
-
TRACK_API_VARIATION_NOT_FOUND = '(%<file>s): Variation not found for campaign:%<campaign_key>s and userId:%<user_id>s'
|
186
|
-
CAMPAIGN_NOT_RUNNING = '(%<file>s): API used:%<api_name>s - Campaign:%<campaign_key>s is not RUNNING. Please verify from VWO App'
|
187
|
-
LOOK_UP_USER_STORAGE_SERVICE_FAILED = '(%<file>s): Looking data from UserStorageService failed for userId:%<user_id>s'
|
188
|
-
SAVE_USER_STORAGE_SERVICE_FAILED = '(%<file>s): Saving data into UserStorageService failed for userId:%<user_id>s'
|
189
|
-
INVALID_CAMPAIGN = '(%<file>s): Invalid campaign passed to %<method>s of this file'
|
190
|
-
INVALID_USER_ID = '(%<file>s): Invalid userId:%<user_id>s passed to %<method>s of this file'
|
191
|
-
IMPRESSION_FAILED = '(%<file>s): Impression event could not be sent to VWO - %<end_point>s'
|
192
|
-
CUSTOM_LOGGER_MISCONFIGURED = '(%<file>s): Custom logger is provided but seems to have mis-configured. %<extra_info>s Please check the API Docs. Using default logger.'
|
193
|
-
INVALID_API = '(%<file>s): %<api_name>s API is not valid for user ID: %<user_id>s in campaign ID: %<campaign_key>s having campaign type: %<campaign_type>s.'
|
194
|
-
IS_FEATURE_ENABLED_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects campaign_key(String) as first and user_id(String) as second argument, customVariables(dict) can be passed via options for pre-segmentation'
|
195
|
-
GET_FEATURE_VARIABLE_VALUE_API_INVALID_PARAMS = '(%<file>s): "get_feature_variable" API got bad parameters. It expects campaign_key(String) as first, variable_key(string) as second and user_id(String) as third argument, customVariables(dict) can be passed via options for pre-segmentation'
|
196
|
-
|
197
|
-
VARIABLE_NOT_FOUND = '(%<file>s): In API: %<api_name>s Variable %<variable_key>s not found for campaign %<campaign_key>s and type %<campaign_type>s for user ID %<user_id>s'
|
198
|
-
UNABLE_TO_TYPE_CAST = '(%<file>s): Unable to typecast value: %<value>s of type: %<of_type>s to type: %<variable_type>s.'
|
199
|
-
|
200
|
-
USER_NOT_IN_CAMPAIGN = '(%<file>s): userId:%<user_id>s did not become part of campaign:%<campaign_key>s and campaign type:%<campaign_type>s'
|
201
|
-
API_NOT_WORKING = '(%<file>s): API: %<api_name>s not working, exception caught: %<exception>s. Please contact VWO Support for help.'
|
202
|
-
|
203
|
-
SEGMENTATION_ERROR = '(%<file>s): Error while segmenting the UserId:%<user_id>s of campaign:%<campaign_key>s with custom_variables:%<custom_variables>s. Error message: %<error_message>s'
|
204
|
-
|
205
|
-
PUSH_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects tag_key(String) as first and tag_value(String) as second argument and user_id(String) as third argument'
|
206
|
-
TAG_VALUE_LENGTH_EXCEEDED = '(%<file>s): In API: %<api_name>s, the length of tag_value:%<tag_value>s and userID: %<user_id>s can not be greater than 255'
|
207
|
-
TAG_KEY_LENGTH_EXCEEDED = '(%<file>s): In API: %<api_name>s, the length of tag_key:%<tag_key>s and userID: %<user_id>s can not be greater than 255'
|
208
|
-
TRACK_API_MISSING_PARAMS = '(%<file>s): "track" API got bad parameters. It expects campaignKey(null/String/array) as first, userId(String/Number) as second and goalIdentifier (string) as third argument. options is revenueValue(Float/Number/String) and is required for revenue goal only.'
|
209
|
-
NO_CAMPAIGN_FOUND = '(%<file>s): No campaign found for goal_identifier:%<goal_identifier>s. Please verify from VWO app.'
|
210
|
-
INVALID_GOAL_TYPE = '(%<file>s): goal_type_to_track should be certain strings'
|
211
|
-
EVENT_BATCHING_NOT_OBJECT = '(%<file>s): Batch events settings are not of type object.'
|
212
|
-
EVENTS_PER_REQUEST_INVALID = '(%<file>s): events_per_request should be an integer'
|
213
|
-
REQUEST_TIME_INTERVAL_INVALID = '(%<file>s): request_time_interval should be a number'
|
214
|
-
EVENTS_PER_REQUEST_OUT_OF_BOUNDS = '(%<file>s): events_per_request should be >= %<min_value>s and <= %<max_value>s'
|
215
|
-
REQUEST_TIME_INTERVAL_OUT_OF_BOUNDS = '(%<file>s): request_time_interval should be >= %<min_value>s'
|
216
|
-
FLUSH_CALLBACK_INVALID = '(%<file>s): flush_callback is not callable'
|
217
|
-
end
|
65
|
+
VWO = "#{VWO_PATH}/vwo"
|
66
|
+
BUCKETER = "#{VWO_PATH}/core/bucketer"
|
67
|
+
VARIATION_DECIDER = "#{VWO_PATH}/core/variation_decider"
|
68
|
+
EVENT_DISPATCHER = "#{VWO_PATH}/services/event_dispatcher"
|
69
|
+
SEGMENT_EVALUATOR = "#{VWO_PATH}/services/segment_evaluator"
|
70
|
+
LOGGER = "#{VWO_PATH}/logger"
|
71
|
+
SETTINGS_FILE_PROCESSOR = "#{VWO_PATH}/services/settings_file_processor"
|
72
|
+
BATCH_EVENTS_QUEUE = "#{VWO_PATH}/services/batch_events_queue"
|
73
|
+
BATCH_EVENTS_DISPATCHER = "#{VWO_PATH}/services/batch_events_dispatcher"
|
74
|
+
|
75
|
+
CAMPAIGN_UTIL = "#{UTIL_PATH}/campaign"
|
76
|
+
FUNCTION_UTIL = "#{UTIL_PATH}/function"
|
77
|
+
FEATURE_UTIL = "#{UTIL_PATH}/feature"
|
78
|
+
IMPRESSION_UTIL = "#{UTIL_PATH}/impression"
|
79
|
+
UUID_UTIL = "#{UTIL_PATH}/uuid"
|
80
|
+
VALIDATE_UTIL = "#{UTIL_PATH}/validations"
|
81
|
+
CUSTOM_DIMENSTIONS_UTIL = "#{UTIL_PATH}/custom_dimensions_util"
|
218
82
|
end
|
219
83
|
|
220
84
|
module LogLevelEnum
|
@@ -225,4 +89,3 @@ class VWO
|
|
225
89
|
end
|
226
90
|
end
|
227
91
|
end
|
228
|
-
# rubocop:enable Metrics/LineLength
|
data/lib/vwo/logger.rb
CHANGED
@@ -16,6 +16,11 @@ require 'logger'
|
|
16
16
|
|
17
17
|
class VWO
|
18
18
|
class Logger
|
19
|
+
DEBUG = ::Logger::DEBUG
|
20
|
+
INFO = ::Logger::INFO
|
21
|
+
ERROR = ::Logger::ERROR
|
22
|
+
WARN = ::Logger::WARN
|
23
|
+
|
19
24
|
@logger = nil
|
20
25
|
@logger_instance = nil
|
21
26
|
|
@@ -24,14 +29,12 @@ class VWO
|
|
24
29
|
end
|
25
30
|
|
26
31
|
def initialize(logger_instance)
|
27
|
-
@@logger_instance = logger_instance || ::Logger.new(
|
32
|
+
@@logger_instance = logger_instance || ::Logger.new($stdout)
|
28
33
|
end
|
29
34
|
|
30
35
|
# Override this method to handle logs in a custom manner
|
31
|
-
def log(level, message
|
32
|
-
|
33
|
-
@@logger_instance.log(level, message)
|
34
|
-
end
|
36
|
+
def log(level, message)
|
37
|
+
@@logger_instance.log(level, message)
|
35
38
|
end
|
36
39
|
|
37
40
|
def instance
|
@@ -61,12 +61,12 @@ class VWO
|
|
61
61
|
weight: {
|
62
62
|
type: %w[number string]
|
63
63
|
},
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
64
|
+
variables: {
|
65
|
+
type: 'array',
|
66
|
+
items: {
|
67
|
+
'$ref' => '#/definitions/variables_schema'
|
68
|
+
}
|
69
|
+
}
|
70
70
|
},
|
71
71
|
required: %w[id name weight]
|
72
72
|
},
|
@@ -102,6 +102,7 @@ class VWO
|
|
102
102
|
},
|
103
103
|
isBucketingSeedEnabled: ['boolean'],
|
104
104
|
isUserListEnabled: ['boolean'],
|
105
|
+
isAlwaysCheckSegment: ['boolean'],
|
105
106
|
minItems: 2
|
106
107
|
}
|
107
108
|
},
|
@@ -12,10 +12,10 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative '../logger'
|
16
15
|
require_relative '../enums'
|
17
16
|
require_relative '../utils/request'
|
18
17
|
require_relative '../utils/utility'
|
18
|
+
require_relative '../utils/log_message'
|
19
19
|
class VWO
|
20
20
|
module Services
|
21
21
|
class BatchEventsDispatcher
|
@@ -26,8 +26,9 @@ class VWO
|
|
26
26
|
# @param [Boolean] : To specify whether the request
|
27
27
|
# to our server should be made or not.
|
28
28
|
#
|
29
|
-
def initialize
|
30
|
-
@logger = VWO::Logger
|
29
|
+
def initialize(development_mode = false)
|
30
|
+
@logger = VWO::Utils::Logger
|
31
|
+
@development_mode = development_mode
|
31
32
|
@queue = []
|
32
33
|
end
|
33
34
|
|
@@ -41,72 +42,78 @@ class VWO
|
|
41
42
|
url = CONSTANTS::HTTPS_PROTOCOL + get_url(CONSTANTS::ENDPOINTS::BATCH_EVENTS)
|
42
43
|
account_id = query_params[:a]
|
43
44
|
resp = VWO::Utils::Request.post(url, query_params, impression)
|
44
|
-
|
45
|
+
case resp.code
|
46
|
+
when '200'
|
45
47
|
@logger.log(
|
46
48
|
LogLevelEnum::INFO,
|
47
|
-
|
48
|
-
|
49
|
-
file
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
'IMPRESSION_BATCH_SUCCESS',
|
50
|
+
{
|
51
|
+
'{file}' => FILE,
|
52
|
+
'{endPoint}' => url,
|
53
|
+
'{accountId}' => account_id
|
54
|
+
}
|
53
55
|
)
|
54
56
|
message = nil
|
55
|
-
|
57
|
+
when '413'
|
56
58
|
@logger.log(
|
57
59
|
LogLevelEnum::DEBUG,
|
58
|
-
|
59
|
-
|
60
|
-
file
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
'CONFIG_BATCH_EVENT_LIMIT_EXCEEDED',
|
61
|
+
{
|
62
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
63
|
+
'{endPoint}' => url,
|
64
|
+
'{eventsPerRequest}' => impression.length,
|
65
|
+
'{accountId}' => impression[:a]
|
66
|
+
}
|
65
67
|
)
|
66
68
|
|
67
69
|
@logger.log(
|
68
70
|
LogLevelEnum::ERROR,
|
69
|
-
|
70
|
-
|
71
|
-
file
|
72
|
-
|
73
|
-
|
71
|
+
'IMPRESSION_FAILED',
|
72
|
+
{
|
73
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
74
|
+
'{err}' => resp.message,
|
75
|
+
'{endPoint}' => url
|
76
|
+
}
|
74
77
|
)
|
75
78
|
message = resp.message
|
76
79
|
else
|
77
80
|
@logger.log(
|
78
|
-
LogLevelEnum::
|
79
|
-
|
80
|
-
|
81
|
-
file: FileNameEnum::BatchEventsDispatcher
|
82
|
-
)
|
81
|
+
LogLevelEnum::INFO,
|
82
|
+
'IMPRESSION_BATCH_FAILED',
|
83
|
+
{ '{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER }
|
83
84
|
)
|
84
85
|
|
85
86
|
@logger.log(
|
86
87
|
LogLevelEnum::ERROR,
|
87
|
-
|
88
|
+
'IMPRESSION_FAILED',
|
89
|
+
{
|
90
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
91
|
+
'{err}' => resp.message,
|
92
|
+
'{endPoint}' => url
|
93
|
+
}
|
88
94
|
)
|
89
95
|
message = resp.message
|
90
96
|
end
|
91
|
-
|
92
|
-
|
93
|
-
end
|
97
|
+
callback&.call(message, impression)
|
98
|
+
true
|
94
99
|
rescue StandardError => e
|
95
100
|
@logger.log(
|
96
101
|
LogLevelEnum::DEBUG,
|
97
|
-
|
98
|
-
|
99
|
-
file: FileNameEnum::BatchEventsDispatcher
|
100
|
-
)
|
102
|
+
'IMPRESSION_BATCH_FAILED',
|
103
|
+
{ '{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER }
|
101
104
|
)
|
102
105
|
|
103
106
|
@logger.log(
|
104
107
|
LogLevelEnum::ERROR,
|
105
|
-
|
108
|
+
'IMPRESSION_FAILED',
|
109
|
+
{
|
110
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
111
|
+
'{err}' => e.message,
|
112
|
+
'{endPoint}' => url
|
113
|
+
}
|
106
114
|
)
|
107
115
|
false
|
108
116
|
end
|
109
|
-
|
110
117
|
end
|
111
118
|
end
|
112
119
|
end
|
@@ -12,9 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative '../logger'
|
16
15
|
require_relative '../enums'
|
17
16
|
require_relative '../utils/request'
|
17
|
+
require_relative '../utils/log_message'
|
18
18
|
|
19
19
|
class VWO
|
20
20
|
module Services
|
@@ -23,7 +23,7 @@ class VWO
|
|
23
23
|
|
24
24
|
def initialize(batch_config, is_development_mode = false)
|
25
25
|
@is_development_mode = is_development_mode
|
26
|
-
@logger = VWO::Logger
|
26
|
+
@logger = VWO::Utils::Logger
|
27
27
|
@queue = []
|
28
28
|
@queue_metadata = {}
|
29
29
|
@batch_config = batch_config
|
@@ -33,12 +33,13 @@ class VWO
|
|
33
33
|
else
|
34
34
|
@request_time_interval = CONSTANTS::DEFAULT_REQUEST_TIME_INTERVAL
|
35
35
|
@logger.log(
|
36
|
-
LogLevelEnum::
|
37
|
-
|
38
|
-
|
39
|
-
file
|
40
|
-
|
41
|
-
|
36
|
+
LogLevelEnum::INFO,
|
37
|
+
'EVENT_BATCH_DEFAULTS',
|
38
|
+
{
|
39
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
40
|
+
'{parameter}' => 'request_time_interval',
|
41
|
+
'{defaultValue}' => "#{@request_time_interval} ms"
|
42
|
+
}
|
42
43
|
)
|
43
44
|
end
|
44
45
|
|
@@ -47,19 +48,18 @@ class VWO
|
|
47
48
|
else
|
48
49
|
@events_per_request = CONSTANTS::DEFAULT_EVENTS_PER_REQUEST
|
49
50
|
@logger.log(
|
50
|
-
LogLevelEnum::
|
51
|
-
|
52
|
-
|
53
|
-
file
|
54
|
-
|
55
|
-
|
51
|
+
LogLevelEnum::INFO,
|
52
|
+
'EVENT_BATCH_DEFAULTS',
|
53
|
+
{
|
54
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
55
|
+
'{parameter}' => 'events_per_request',
|
56
|
+
'{defaultValue}' => @events_per_request.to_s
|
57
|
+
}
|
56
58
|
)
|
57
59
|
end
|
58
60
|
|
59
61
|
@flush_callback = nil
|
60
|
-
if batch_config.key?(:flushCallback) && batch_config[:flushCallback].is_a?(Method)
|
61
|
-
@flush_callback = batch_config[:flushCallback]
|
62
|
-
end
|
62
|
+
@flush_callback = batch_config[:flushCallback] if batch_config.key?(:flushCallback) && batch_config[:flushCallback].is_a?(Method)
|
63
63
|
|
64
64
|
@dispatcher = batch_config[:dispatcher]
|
65
65
|
end
|
@@ -70,69 +70,62 @@ class VWO
|
|
70
70
|
|
71
71
|
def enqueue(event)
|
72
72
|
return true if @is_development_mode
|
73
|
+
|
73
74
|
@queue.push(event)
|
74
75
|
update_queue_metadata(event)
|
75
76
|
unless @timer
|
76
77
|
create_new_batch_timer
|
77
|
-
@thread = Thread.new{flush_when_request_times_up}
|
78
|
-
end
|
79
|
-
if @events_per_request === @queue.length()
|
80
|
-
flush
|
81
|
-
kill_old_thread
|
78
|
+
@thread = Thread.new { flush_when_request_times_up }
|
82
79
|
end
|
80
|
+
return unless @events_per_request == @queue.length
|
81
|
+
|
82
|
+
flush
|
83
|
+
kill_old_thread
|
83
84
|
end
|
84
85
|
|
85
86
|
def flush_when_request_times_up
|
86
|
-
while @timer > Time.now
|
87
|
-
sleep(1)
|
88
|
-
end
|
87
|
+
sleep(1) while @timer > Time.now
|
89
88
|
flush
|
90
89
|
kill_old_thread
|
91
90
|
end
|
92
91
|
|
93
92
|
def flush(manual = false)
|
94
|
-
if @queue.length
|
93
|
+
if @queue.length > 0
|
95
94
|
@logger.log(
|
96
95
|
LogLevelEnum::DEBUG,
|
97
|
-
|
98
|
-
|
99
|
-
file
|
100
|
-
manually
|
101
|
-
length
|
102
|
-
timer
|
103
|
-
|
104
|
-
|
96
|
+
'EVENT_BATCH_BEFORE_FLUSHING',
|
97
|
+
{
|
98
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
99
|
+
'{manually}' => manual ? 'manually' : '',
|
100
|
+
'{length}' => @queue.length,
|
101
|
+
'{timer}' => manual ? 'Timer will be cleared and registered again,' : '',
|
102
|
+
'{accountId}' => @batch_config[:account_id]
|
103
|
+
}
|
105
104
|
)
|
106
105
|
|
107
106
|
@dispatcher.call(@queue, @flush_callback)
|
107
|
+
|
108
108
|
@logger.log(
|
109
109
|
LogLevelEnum::INFO,
|
110
|
-
|
111
|
-
|
112
|
-
file
|
113
|
-
manually
|
114
|
-
length
|
115
|
-
|
116
|
-
)
|
110
|
+
'EVENT_BATCH_After_FLUSHING',
|
111
|
+
{
|
112
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
113
|
+
'{manually}' => manual ? 'manually,' : '',
|
114
|
+
'{length}' => @queue.length
|
115
|
+
}
|
117
116
|
)
|
118
117
|
@queue_metadata = {}
|
119
118
|
@queue = []
|
120
119
|
else
|
121
120
|
@logger.log(
|
122
121
|
LogLevelEnum::INFO,
|
123
|
-
|
124
|
-
|
125
|
-
file: FILE
|
126
|
-
)
|
122
|
+
'Batch queue is empty. Nothing to flush.',
|
123
|
+
{ '{file}' => FILE }
|
127
124
|
)
|
128
125
|
end
|
129
126
|
|
130
127
|
clear_request_timer
|
131
|
-
|
132
|
-
if @thread
|
133
|
-
@old_thread = @thread
|
134
|
-
end
|
135
|
-
end
|
128
|
+
@old_thread = @thread if !manual && @thread
|
136
129
|
true
|
137
130
|
end
|
138
131
|
|
@@ -141,32 +134,23 @@ class VWO
|
|
141
134
|
end
|
142
135
|
|
143
136
|
def kill_thread
|
144
|
-
|
145
|
-
@thread.kill
|
146
|
-
end
|
137
|
+
@thread&.kill
|
147
138
|
end
|
148
139
|
|
149
140
|
def kill_old_thread
|
150
|
-
|
151
|
-
@old_thread.kill
|
152
|
-
end
|
141
|
+
@old_thread&.kill
|
153
142
|
end
|
154
143
|
|
155
144
|
def update_queue_metadata(event)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
end
|
145
|
+
case event[:eT]
|
146
|
+
when 1
|
147
|
+
@queue_metadata[VWO::EVENTS::TRACK_USER] = 0 unless @queue_metadata.key?(VWO::EVENTS::TRACK_USER)
|
160
148
|
@queue_metadata[VWO::EVENTS::TRACK_USER] = @queue_metadata[VWO::EVENTS::TRACK_USER] + 1
|
161
|
-
|
162
|
-
unless @queue_metadata.key?(VWO::EVENTS::TRACK_GOAL)
|
163
|
-
@queue_metadata[VWO::EVENTS::TRACK_GOAL] = 0
|
164
|
-
end
|
149
|
+
when 2
|
150
|
+
@queue_metadata[VWO::EVENTS::TRACK_GOAL] = 0 unless @queue_metadata.key?(VWO::EVENTS::TRACK_GOAL)
|
165
151
|
@queue_metadata[VWO::EVENTS::TRACK_GOAL] = @queue_metadata[VWO::EVENTS::TRACK_GOAL] + 1
|
166
|
-
|
167
|
-
unless @queue_metadata.key?(VWO::EVENTS::PUSH)
|
168
|
-
@queue_metadata[VWO::EVENTS::PUSH] = 0
|
169
|
-
end
|
152
|
+
when 3
|
153
|
+
@queue_metadata[VWO::EVENTS::PUSH] = 0 unless @queue_metadata.key?(VWO::EVENTS::PUSH)
|
170
154
|
@queue_metadata[VWO::EVENTS::PUSH] = @queue_metadata[VWO::EVENTS::PUSH] + 1
|
171
155
|
end
|
172
156
|
end
|