diff --git a/lib/splitclient-rb/engine/api/impressions.rb b/lib/splitclient-rb/engine/api/impressions.rb index 9df9d7c9..e95df9f7 100644 --- a/lib/splitclient-rb/engine/api/impressions.rb +++ b/lib/splitclient-rb/engine/api/impressions.rb @@ -54,7 +54,7 @@ def total_impressions(impressions) def impressions_headers { - 'SplitImpressionsMode' => @config.impressions_mode.to_s + 'SplitSDKImpressionsMode' => @config.impressions_mode.to_s } end end diff --git a/lib/splitclient-rb/split_config.rb b/lib/splitclient-rb/split_config.rb index 1be5cf8e..23e41e31 100644 --- a/lib/splitclient-rb/split_config.rb +++ b/lib/splitclient-rb/split_config.rb @@ -53,7 +53,9 @@ def initialize(opts = {}) @segments_refresh_rate = opts[:segments_refresh_rate] || SplitConfig.default_segments_refresh_rate @metrics_refresh_rate = opts[:metrics_refresh_rate] || SplitConfig.default_metrics_refresh_rate - @impressions_refresh_rate = opts[:impressions_refresh_rate] || SplitConfig.default_impressions_refresh_rate + @impressions_mode = init_impressions_mode(opts[:impressions_mode]) + + @impressions_refresh_rate = SplitConfig.init_impressions_refresh_rate(@impressions_mode, opts[:impressions_refresh_rate], SplitConfig.default_impressions_refresh_rate) @impressions_queue_size = opts[:impressions_queue_size] || SplitConfig.default_impressions_queue_size @impressions_adapter = SplitConfig.init_cache_adapter( opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @impressions_queue_size, @redis_url @@ -108,8 +110,6 @@ def initialize(opts = {}) @auth_retry_back_off_base = SplitConfig.init_auth_retry_back_off(opts[:auth_retry_back_off_base] || SplitConfig.default_auth_retry_back_off_base) @streaming_reconnect_back_off_base = SplitConfig.init_streaming_reconnect_back_off(opts[:streaming_reconnect_back_off_base] || SplitConfig.default_streaming_reconnect_back_off_base) - @impressions_mode = init_impressions_mode(opts[:impressions_mode] || SplitConfig.default_impressions_mode) - startup_log end @@ -278,8 +278,10 @@ def self.default_impressions_mode :optimized end - def init_impressions_mode(impressions_mode) - case impressions_mode + def init_impressions_mode(impressions_mode) + impressions_mode ||= SplitConfig.default_impressions_mode + + case impressions_mode when :debug return :debug else @@ -288,6 +290,12 @@ def init_impressions_mode(impressions_mode) end end + def self.init_impressions_refresh_rate(impressions_mode, refresh_rate, default_rate) + return (refresh_rate.nil? || refresh_rate <= 0 ? default_rate : refresh_rate) if impressions_mode == :debug + + return refresh_rate.nil? || refresh_rate <= 0 ? SplitConfig.default_impressions_refresh_rate_optimized : [default_rate, refresh_rate].max + end + def self.default_streaming_enabled true end @@ -405,6 +413,10 @@ def self.default_impressions_refresh_rate 60 end + def self.default_impressions_refresh_rate_optimized + 300 + end + def self.default_impression_listener_refresh_rate 0 end diff --git a/spec/cache/senders/impressions_sender_spec.rb b/spec/cache/senders/impressions_sender_spec.rb index 9dd7430a..fc19e1b0 100644 --- a/spec/cache/senders/impressions_sender_spec.rb +++ b/spec/cache/senders/impressions_sender_spec.rb @@ -42,6 +42,7 @@ sleep 0.5 expect(a_request(:post, 'https://events.split.io/api/testImpressions/bulk') .with( + headers: { 'SplitSDKImpressionsMode' => config.impressions_mode.to_s }, body: [ { f: 'foo1', diff --git a/spec/engine/api/impressions_spec.rb b/spec/engine/api/impressions_spec.rb index 428c32f8..46bdf247 100644 --- a/spec/engine/api/impressions_spec.rb +++ b/spec/engine/api/impressions_spec.rb @@ -30,7 +30,7 @@ 'Content-Type' => 'application/json', 'SplitSDKMachineIP' => config.machine_ip, 'SplitSDKMachineName' => config.machine_name, - 'SplitImpressionsMode' => config.impressions_mode.to_s + 'SplitSDKImpressionsMode' => 'optimized' }) .to_return(status: 200, body: 'ok') @@ -38,6 +38,24 @@ expect(log.string).to include 'Impressions reported: 1' end + it 'post impressions with impressions_mode in debug' do + custom_config = SplitIoClient::SplitConfig.new(logger: Logger.new(log), impressions_mode: :debug) + custom_api = described_class.new('', custom_config) + + stub_request(:post, 'https://events.split.io/api/testImpressions/bulk') + .with(headers: { + 'Authorization' => 'Bearer', + 'SplitSDKVersion' => "#{config.language}-#{config.version}", + 'Content-Type' => 'application/json', + 'SplitSDKMachineIP' => config.machine_ip, + 'SplitSDKMachineName' => config.machine_name, + 'SplitSDKImpressionsMode' => 'debug' + }) + .to_return(status: 200, body: 'ok') + + custom_api.post(impressions) + end + it 'throws exception if request to post latencies returns unexpected status code' do stub_request(:post, 'https://events.split.io/api/testImpressions/bulk') .to_return(status: 404) @@ -84,7 +102,7 @@ 'Content-Type' => 'application/json', 'SplitSDKMachineIP' => config.machine_ip, 'SplitSDKMachineName' => config.machine_name, - 'SplitImpressionsMode' => config.impressions_mode.to_s + 'SplitSDKImpressionsMode' => config.impressions_mode.to_s }) .to_return(status: [500, 'Internal Server Error']) @@ -93,7 +111,7 @@ 'Authorization' => 'Bearer', 'SplitSDKVersion' => "#{config.language}-#{config.version}", 'Content-Type' => 'application/json', - 'SplitImpressionsMode' => config.impressions_mode.to_s + 'SplitSDKImpressionsMode' => config.impressions_mode.to_s }) .to_return(status: 200, body: 'ok') diff --git a/spec/integrations/in_memory_client_spec.rb b/spec/integrations/in_memory_client_spec.rb index 7bb43723..d72802ae 100644 --- a/spec/integrations/in_memory_client_spec.rb +++ b/spec/integrations/in_memory_client_spec.rb @@ -664,6 +664,122 @@ expect(events.size).to eq 0 end end + + context 'checking logic impressions - optimized mode' do + before do + stub_request(:post, 'https://events.split.io/api/testImpressions/bulk') + .to_return(status: 200, body: 'ok') + stub_request(:post, 'https://events.split.io/api/metrics/time') + .to_return(status: 200, body: 'ok') + stub_request(:post, 'https://events.split.io/api/metrics/counter') + .to_return(status: 200, body: 'ok') + stub_request(:post, 'https://events.split.io/api/testImpressions/count') + .to_return(status: 200, body: 'ok') + + @counter = SplitIoClient::Engine::Common::ImpressionCounter.new + end + + it 'get_treament should post 3 impressions' do + expect(client.get_treatment('nico_test', 'FACUNDO_TEST')).to eq 'on' + expect(client.get_treatment('nico_test', 'FACUNDO_TEST')).to eq 'on' + expect(client.get_treatment('admin', 'FACUNDO_TEST')).to eq 'off' + expect(client.get_treatment('24', 'Test_Save_1')).to eq 'off' + expect(client.get_treatment('24', 'Test_Save_1')).to eq 'off' + + time_frame = @counter.truncate_time_frame((Time.now.to_f * 1000.0).to_i) + + impressions = client.instance_variable_get(:@impressions_repository).batch + + client.destroy + + sleep 0.5 + + expect(impressions.size).to eq 3 + expect(a_request(:post, 'https://events.split.io/api/testImpressions/count') + .with( + body: { + pf: [ + { f: 'FACUNDO_TEST', m: time_frame, rc: 3 }, + { f: 'Test_Save_1', m: time_frame, rc: 2 } + ] + }.to_json + )).to have_been_made + end + + it 'get_treaments should post 8 impressions' do + client.get_treatments('nico_test', %w[FACUNDO_TEST MAURO_TEST Test_Save_1]) + client.get_treatments('admin', %w[FACUNDO_TEST MAURO_TEST Test_Save_1]) + client.get_treatments('maldo', %w[FACUNDO_TEST Test_Save_1]) + client.get_treatments('nico_test', %w[FACUNDO_TEST MAURO_TEST Test_Save_1]) + + time_frame = @counter.truncate_time_frame((Time.now.to_f * 1000.0).to_i) + + impressions = client.instance_variable_get(:@impressions_repository).batch + + client.destroy + + sleep 0.5 + + expect(impressions.size).to eq 8 + expect(a_request(:post, 'https://events.split.io/api/testImpressions/count') + .with( + body: { + pf: [ + { f: 'FACUNDO_TEST', m: time_frame, rc: 4 }, + { f: 'MAURO_TEST', m: time_frame, rc: 3 }, + { f: 'Test_Save_1', m: time_frame, rc: 4 } + ] + }.to_json + )).to have_been_made + end + end + + context 'checking logic impressions - debug mode' do + before do + stub_request(:post, 'https://events.split.io/api/testImpressions/bulk') + .to_return(status: 200, body: 'ok') + stub_request(:post, 'https://events.split.io/api/metrics/time') + .to_return(status: 200, body: 'ok') + stub_request(:post, 'https://events.split.io/api/metrics/counter') + .to_return(status: 200, body: 'ok') + + custom_factory = SplitIoClient::SplitFactory.new('test_api_key', impressions_mode: :debug) + @debug_client = custom_factory.client + + @debug_client.block_until_ready + end + + it 'get_treament should post 5 impressions' do + expect(@debug_client.get_treatment('nico_test', 'FACUNDO_TEST')).to eq 'on' + expect(@debug_client.get_treatment('nico_test', 'FACUNDO_TEST')).to eq 'on' + expect(@debug_client.get_treatment('admin', 'FACUNDO_TEST')).to eq 'off' + expect(@debug_client.get_treatment('24', 'Test_Save_1')).to eq 'off' + expect(@debug_client.get_treatment('24', 'Test_Save_1')).to eq 'off' + + impressions = @debug_client.instance_variable_get(:@impressions_repository).batch + + @debug_client.destroy + + sleep 0.5 + + expect(impressions.size).to eq 5 + end + + it 'get_treaments should post 11 impressions' do + @debug_client.get_treatments('nico_test', %w[FACUNDO_TEST MAURO_TEST Test_Save_1]) + @debug_client.get_treatments('admin', %w[FACUNDO_TEST MAURO_TEST Test_Save_1]) + @debug_client.get_treatments('maldo', %w[FACUNDO_TEST Test_Save_1]) + @debug_client.get_treatments('nico_test', %w[FACUNDO_TEST MAURO_TEST Test_Save_1]) + + impressions = @debug_client.instance_variable_get(:@impressions_repository).batch + + @debug_client.destroy + + sleep 0.5 + + expect(impressions.size).to eq 11 + end + end end private diff --git a/spec/splitclient/split_config_spec.rb b/spec/splitclient/split_config_spec.rb index 917a07e1..9b6a12fc 100644 --- a/spec/splitclient/split_config_spec.rb +++ b/spec/splitclient/split_config_spec.rb @@ -10,7 +10,7 @@ features_refresh_rate: 3, segments_refresh_rate: 4, metrics_refresh_rate: 5, - impressions_refresh_rate: 6, + impressions_refresh_rate: 65, impressions_queue_size: 20, logger: Logger.new('/dev/null'), debug_enabled: true } @@ -27,7 +27,7 @@ expect(configs.features_refresh_rate).to eq SplitIoClient::SplitConfig.default_features_refresh_rate expect(configs.segments_refresh_rate).to eq SplitIoClient::SplitConfig.default_segments_refresh_rate expect(configs.metrics_refresh_rate).to eq SplitIoClient::SplitConfig.default_metrics_refresh_rate - expect(configs.impressions_refresh_rate).to eq SplitIoClient::SplitConfig.default_impressions_refresh_rate + expect(configs.impressions_refresh_rate).to eq SplitIoClient::SplitConfig.default_impressions_refresh_rate_optimized expect(configs.impressions_queue_size).to eq SplitIoClient::SplitConfig.default_impressions_queue_size expect(configs.debug_enabled).to eq SplitIoClient::SplitConfig.default_debug expect(configs.ip_addresses_enabled).to eq default_ip @@ -50,9 +50,21 @@ expect(configs.debug_enabled).to eq custom_options[:debug_enabled] end - it 'has the current default values for timeouts and intervals' do + it 'has the current default values for timeouts and intervals, with impressions_mode in :optimized' do configs = SplitIoClient::SplitConfig.new + expect(configs.connection_timeout).to eq 5 + expect(configs.read_timeout).to eq 5 + expect(configs.features_refresh_rate).to eq 5 + expect(configs.segments_refresh_rate).to eq 60 + expect(configs.metrics_refresh_rate).to eq 60 + expect(configs.impressions_refresh_rate).to eq 300 + expect(configs.impressions_queue_size).to eq 5000 + end + + it 'has the current default values for timeouts and intervals, with impressions_mode in :debug' do + configs = SplitIoClient::SplitConfig.new(impressions_mode: :debug) + expect(configs.connection_timeout).to eq 5 expect(configs.read_timeout).to eq 5 expect(configs.features_refresh_rate).to eq 5 @@ -89,7 +101,7 @@ expect(configs.machine_ip).to eq '' end - it 'se impression mode' do + it 'set impression mode' do options1 = { impressions_mode: :debug } configs1 = SplitIoClient::SplitConfig.new(options1) @@ -105,5 +117,29 @@ expect(configs3.impressions_mode).to eq(:optimized) end + + it 'set impressions refresh rate with impressions optimized mode' do + configs = SplitIoClient::SplitConfig.new(impressions_refresh_rate: 70) + + expect(configs.impressions_refresh_rate).to eq 70 + + configs = SplitIoClient::SplitConfig.new(impressions_refresh_rate: 50) + + expect(configs.impressions_refresh_rate).to eq 60 + end + + it 'set impressions refresh rate with impressions debug mode' do + configs = SplitIoClient::SplitConfig.new(impressions_mode: :debug, impressions_refresh_rate: 0) + + expect(configs.impressions_refresh_rate).to eq 60 + + configs = SplitIoClient::SplitConfig.new(impressions_mode: :debug, impressions_refresh_rate: 1) + + expect(configs.impressions_refresh_rate).to eq 1 + + configs = SplitIoClient::SplitConfig.new(impressions_mode: :debug, impressions_refresh_rate: 40) + + expect(configs.impressions_refresh_rate).to eq 40 + end end end