Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion lib/splitclient-rb/engine/api/impressions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 17 additions & 5 deletions lib/splitclient-rb/split_config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions spec/cache/senders/impressions_sender_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
24 changes: 21 additions & 3 deletions spec/engine/api/impressions_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,32 @@
'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')

impressions_api.post(impressions)
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)
Expand Down Expand Up @@ -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'])

Expand All @@ -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')

Expand Down
116 changes: 116 additions & 0 deletions spec/integrations/in_memory_client_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
44 changes: 40 additions & 4 deletions spec/splitclient/split_config_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)

Expand All @@ -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