Skip to content

Commit 48607ea

Browse files
fix: make batch event processor default (#325)
* make batch event processor default * documentation fix * remove unnecessary super
1 parent 89fd7b4 commit 48607ea

File tree

6 files changed

+222
-37
lines changed

6 files changed

+222
-37
lines changed

lib/optimizely.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
require_relative 'optimizely/decision_service'
2626
require_relative 'optimizely/error_handler'
2727
require_relative 'optimizely/event_builder'
28-
require_relative 'optimizely/event/forwarding_event_processor'
28+
require_relative 'optimizely/event/batch_event_processor'
2929
require_relative 'optimizely/event/event_factory'
3030
require_relative 'optimizely/event/user_event_factory'
3131
require_relative 'optimizely/event_dispatcher'
@@ -67,6 +67,7 @@ class Project
6767
# @param notification_center - Optional Instance of NotificationCenter.
6868
# @param event_processor - Optional Responds to process.
6969
# @param default_decide_options: Optional default decision options.
70+
# @param event_processor_options: Optional hash of options to be passed to the default batch event processor.
7071
# @param settings: Optional instance of OptimizelySdkSettings for sdk configuration.
7172

7273
def initialize( # rubocop:disable Metrics/ParameterLists
@@ -81,6 +82,7 @@ def initialize( # rubocop:disable Metrics/ParameterLists
8182
notification_center = nil,
8283
event_processor = nil,
8384
default_decide_options = [],
85+
event_processor_options = {},
8486
settings = nil
8587
)
8688
@logger = logger || NoOpLogger.new
@@ -97,6 +99,11 @@ def initialize( # rubocop:disable Metrics/ParameterLists
9799
@default_decide_options = []
98100
end
99101

102+
unless event_processor_options.is_a? Hash
103+
@logger.log(Logger::DEBUG, 'Provided event processor options is not a hash.')
104+
event_processor_options = {}
105+
end
106+
100107
begin
101108
validate_instantiation_options
102109
rescue InvalidInputError => e
@@ -128,7 +135,13 @@ def initialize( # rubocop:disable Metrics/ParameterLists
128135
@event_processor = if event_processor.respond_to?(:process)
129136
event_processor
130137
else
131-
ForwardingEventProcessor.new(@event_dispatcher, @logger, @notification_center)
138+
BatchEventProcessor.new(
139+
event_dispatcher: @event_dispatcher,
140+
logger: @logger,
141+
notification_center: @notification_center,
142+
batch_size: event_processor_options[:batch_size] || BatchEventProcessor::DEFAULT_BATCH_SIZE,
143+
flush_interval: event_processor_options[:flush_interval] || BatchEventProcessor::DEFAULT_BATCH_INTERVAL
144+
)
132145
end
133146
end
134147

lib/optimizely/odp/odp_event_manager.rb

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@
2121

2222
module Optimizely
2323
class OdpEventManager
24-
# BatchEventProcessor is a batched implementation of the Interface EventProcessor.
25-
# Events passed to the BatchEventProcessor are immediately added to an EventQueue.
26-
# The BatchEventProcessor maintains a single consumer thread that pulls events off of
24+
# Events passed to the OdpEventManager are immediately added to an EventQueue.
25+
# The OdpEventManager maintains a single consumer thread that pulls events off of
2726
# the BlockingQueue and buffers them for either a configured batch size or for a
28-
# maximum duration before the resulting LogEvent is sent to the NotificationCenter.
27+
# maximum duration before the resulting OdpEvent is sent to Odp.
2928

3029
attr_reader :batch_size, :api_manager, :logger
3130
attr_accessor :odp_config
@@ -37,8 +36,6 @@ def initialize(
3736
request_timeout: nil,
3837
flush_interval: nil
3938
)
40-
super()
41-
4239
@odp_config = nil
4340
@api_host = nil
4441
@api_key = nil

lib/optimizely/optimizely_factory.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ def self.custom_instance( # rubocop:disable Metrics/ParameterLists
178178
notification_center,
179179
event_processor,
180180
[],
181+
{},
181182
settings
182183
)
183184
end

spec/optimizely_user_context_spec.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
let(:error_handler) { Optimizely::RaiseErrorHandler.new }
2929
let(:spy_logger) { spy('logger') }
3030
let(:project_instance) { Optimizely::Project.new(config_body_JSON, nil, spy_logger, error_handler) }
31-
let(:forced_decision_project_instance) { Optimizely::Project.new(forced_decision_JSON, nil, spy_logger, error_handler) }
31+
let(:forced_decision_project_instance) { Optimizely::Project.new(forced_decision_JSON, nil, spy_logger, error_handler, false, nil, nil, nil, nil, nil, [], {batch_size: 1}) }
3232
let(:integration_project_instance) { Optimizely::Project.new(integration_JSON, nil, spy_logger, error_handler) }
3333
let(:impression_log_url) { 'https://logx.optimizely.com/v1/events' }
3434
let(:good_response_data) do
@@ -258,6 +258,10 @@
258258
forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('3324490562')
259259
user_context_obj.set_forced_decision(context, forced_decision)
260260
decision = user_context_obj.decide(feature_key)
261+
262+
# wait for batch processing thread to send event
263+
sleep 0.1 until forced_decision_project_instance.event_processor.event_queue.empty?
264+
261265
expect(forced_decision_project_instance.event_dispatcher).to have_received(:dispatch_event).with(Optimizely::Event.new(:post, impression_log_url, expected_params, post_headers))
262266
expect(decision.variation_key).to eq('3324490562')
263267
expect(decision.rule_key).to be_nil
@@ -350,6 +354,10 @@
350354
forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('b')
351355
user_context_obj.set_forced_decision(context, forced_decision)
352356
decision = user_context_obj.decide(feature_key, [Optimizely::Decide::OptimizelyDecideOption::INCLUDE_REASONS])
357+
358+
# wait for batch processing thread to send event
359+
sleep 0.1 until forced_decision_project_instance.event_processor.event_queue.empty?
360+
353361
expect(forced_decision_project_instance.event_dispatcher).to have_received(:dispatch_event).with(Optimizely::Event.new(:post, impression_log_url, expected_params, post_headers))
354362
expect(decision.variation_key).to eq('b')
355363
expect(decision.rule_key).to eq('exp_with_audience')
@@ -471,6 +479,10 @@
471479
user_context_obj.remove_forced_decision(context_with_rule)
472480
# decision should be based on flag forced decision
473481
decision = user_context_obj.decide(feature_key)
482+
483+
# wait for batch processing thread to send event
484+
sleep 0.1 until forced_decision_project_instance.event_processor.event_queue.empty?
485+
474486
expect(forced_decision_project_instance.event_dispatcher).to have_received(:dispatch_event).with(Optimizely::Event.new(:post, impression_log_url, expected_params, post_headers))
475487
expect(decision.variation_key).to eq('3324490562')
476488
expect(decision.rule_key).to be_nil

0 commit comments

Comments
 (0)