Skip to content

Commit 3cb0d68

Browse files
authored
Merge pull request #440 from splitio/development
[8.1.0] Development into master
2 parents 554b6c3 + 1fba21e commit 3cb0d68

10 files changed

Lines changed: 67 additions & 34 deletions

File tree

CHANGES.txt

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

3+
8.1.0 (Oct 5, 2022)
4+
- Added a new impressions mode for the SDK called NONE , to be used in factory when there is no desire to capture impressions on an SDK factory to feed Split's analytics engine. Running NONE mode, the SDK will only capture unique keys evaluated for a particular feature flag instead of full blown impressions.
5+
36
8.0.1 (Jul 20, 2022)
47
- Updated dependencies to support faraday > 2.0
58

@@ -49,9 +52,10 @@ CHANGES
4952
- Updated ably error handling.
5053

5154
7.2.0 (Sep 25, 2020)
52-
- Added deduplication logic for impressions data.
53-
- Now there are two modes for Impressions when the SDK is in standalone mode, OPTIMIZED (default) that only ships unique impressions and DEBUG for times where you need to send ALL impressions to debug an integration.
54-
- Impression listener remains unchanged and will still get all impressions.
55+
- Added impressions dedupe logic to avoid sending duplicated impressions:
56+
- Added `OPTIMIZED` and `DEBUG` modes in order to enabling/disabling how impressions are going to be sent into Split servers,
57+
- `OPTIMIZED`: will send unique impressions in a timeframe in order to reduce how many times impressions are posted to Split.
58+
- `DEBUG`: will send every impression generated to Split.
5559

5660
7.1.3 (Jul 31, 2020)
5761
- Updated rake development dependency to ~> 12.3.3.

lib/splitclient-rb/cache/senders/impressions_adapter/redis_sender.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ def initialize(config)
1212
end
1313

1414
def record_uniques_key(uniques)
15-
formatted = uniques_formatter(uniques)
15+
return if uniques.nil? || uniques == {}
16+
17+
formatted = uniques_formatter(uniques).to_json
1618

1719
unless formatted.nil?
1820
size = @adapter.add_to_queue(unique_keys_key, formatted)

lib/splitclient-rb/engine/common/impressions_manager.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ def build_impression(matching_key, bucketing_key, split_name, treatment, params
3030
@unique_keys_tracker.track(split_name, matching_key)
3131
else # In OPTIMIZED mode we should track the total amount of evaluations and deduplicate the impressions.
3232
impression_data[:pt] = @impression_observer.test_and_set(impression_data)
33-
@impression_counter.inc(split_name, impression_data[:m])
33+
34+
@impression_counter.inc(split_name, impression_data[:m]) unless impression_data[:pt].nil?
3435
end
3536
rescue StandardError => e
3637
@config.log_found_exception(__method__.to_s, e)

lib/splitclient-rb/split_config.rb

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -310,23 +310,18 @@ def self.default_on_demand_fetch_max_retries
310310
10
311311
end
312312

313-
def self.default_impressions_mode
314-
:optimized
315-
end
316-
317313
def init_impressions_mode(impressions_mode, adapter)
318-
impressions_mode ||= SplitConfig.default_impressions_mode
319-
320-
return :debug if adapter == :redis
321-
322314
case impressions_mode
315+
when :optimized
316+
return :optimized
317+
when :none
318+
return :none
323319
when :debug
324320
return :debug
325-
# when :none // we not support :none impression mode yet. Defaulting to :optimized mode
326-
# return :none
327321
else
328-
@logger.error('You passed an invalid impressions_mode, impressions_mode should be one of the following values: :debug or :optimized. Defaulting to :optimized mode') unless impressions_mode == :optimized
329-
return :optimized
322+
default = adapter == :redis ? :debug : :optimized
323+
@logger.error("You passed an invalid impressions_mode, impressions_mode should be one of the following values: :debug, :optimized or :none. Defaulting to #{default} mode")
324+
return default
330325
end
331326
end
332327

@@ -455,7 +450,7 @@ def self.default_connection_timeout
455450
end
456451

457452
def self.default_features_refresh_rate
458-
5
453+
60
459454
end
460455

461456
def self.default_segments_refresh_rate

lib/splitclient-rb/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module SplitIoClient
2-
VERSION = '8.0.1'
2+
VERSION = '8.1.0'
33
end

spec/cache/senders/impressions_sender_adapter_spec.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,18 @@
2222
sender.record_uniques_key(uniques)
2323

2424
result = config.cache_adapter.get_from_queue(unique_keys_key, 0)
25-
expect(result.size).to eq(3)
26-
expect(result[0]).to eq('{:f=>"feature-name-1", :k=>["key-1", "key-2", "key-3", "key-4"]}')
27-
expect(result[1]).to eq('{:f=>"feature-name-2", :k=>["key-1", "key-2", "key-3", "key-4"]}')
28-
expect(result[2]).to eq('{:f=>"feature-name-3", :k=>["key-1", "key-2", "key-3", "key-4"]}')
25+
26+
expect(result.size).to eq(1)
27+
data = JSON.parse(result[0], symbolize_names: true)
28+
29+
expect(data[0][:f]).to eq('feature-name-1')
30+
expect(data[0][:k].to_s).to eq('["key-1", "key-2", "key-3", "key-4"]')
31+
32+
expect(data[1][:f]).to eq('feature-name-2')
33+
expect(data[1][:k].to_s).to eq('["key-1", "key-2", "key-3", "key-4"]')
34+
35+
expect(data[2][:f]).to eq('feature-name-3')
36+
expect(data[2][:k].to_s).to eq('["key-1", "key-2", "key-3", "key-4"]')
2937
end
3038

3139
it 'record_uniques_key when uniques is nil or empty' do

spec/engine/impressions/redis_unique_keys_tracker_spec.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@
3535
expect(tracker.track("feature-test-#{i}", 'key_test-2')).to eq(true)
3636
end
3737

38-
expect(config.cache_adapter.get_from_queue(key, 0).size).to eq(20)
38+
result = config.cache_adapter.get_from_queue(key, 0)
39+
expect(result.size).to eq(10)
40+
41+
10.times do |i|
42+
data = JSON.parse(result[i], symbolize_names: true)
43+
expect(data.size).to eq(2)
44+
end
3945

4046
cache.clear
4147
end
@@ -56,7 +62,13 @@
5662

5763
sleep 1
5864

59-
expect(config.cache_adapter.get_from_queue(key, 0).size).to eq(10)
65+
result = config.cache_adapter.get_from_queue(key, 0)
66+
expect(result.size).to eq(1)
67+
68+
10.times do |i|
69+
data = JSON.parse(result[0], symbolize_names: true)
70+
expect(data.size).to eq(10)
71+
end
6072

6173
cache.clear
6274
end

spec/integrations/dedupe_impression_spec.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@
9898
.with(
9999
body: {
100100
pf: [
101-
{ f: 'FACUNDO_TEST', m: time_frame, rc: 3 },
102-
{ f: 'Test_Save_1', m: time_frame, rc: 2 }
101+
{ f: 'FACUNDO_TEST', m: time_frame, rc: 1 },
102+
{ f: 'Test_Save_1', m: time_frame, rc: 1 }
103103
]
104104
}.to_json
105105
)).to have_been_made
@@ -120,6 +120,7 @@
120120
client.get_treatments('admin', %w[FACUNDO_TEST MAURO_TEST Test_Save_1])
121121
client.get_treatments('maldo', %w[FACUNDO_TEST Test_Save_1])
122122
client.get_treatments('nico_test', %w[FACUNDO_TEST MAURO_TEST Test_Save_1])
123+
client.get_treatments('nico_test', %w[FACUNDO_TEST MAURO_TEST Test_Save_1])
123124

124125
time_frame = SplitIoClient::Engine::Common::ImpressionCounter.truncate_time_frame((Time.now.to_f * 1000.0).to_i)
125126

@@ -130,9 +131,9 @@
130131
.with(
131132
body: {
132133
pf: [
133-
{ f: 'FACUNDO_TEST', m: time_frame, rc: 4 },
134-
{ f: 'MAURO_TEST', m: time_frame, rc: 3 },
135-
{ f: 'Test_Save_1', m: time_frame, rc: 4 }
134+
{ f: 'FACUNDO_TEST', m: time_frame, rc: 2 },
135+
{ f: 'MAURO_TEST', m: time_frame, rc: 2 },
136+
{ f: 'Test_Save_1', m: time_frame, rc: 2 }
136137
]
137138
}.to_json
138139
)).to have_been_made

spec/splitclient/split_config_spec.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
expect(configs.connection_timeout).to eq 5
5656
expect(configs.read_timeout).to eq 5
57-
expect(configs.features_refresh_rate).to eq 5
57+
expect(configs.features_refresh_rate).to eq 60
5858
expect(configs.segments_refresh_rate).to eq 60
5959
expect(configs.impressions_refresh_rate).to eq 300
6060
expect(configs.impressions_queue_size).to eq 5000
@@ -65,7 +65,7 @@
6565

6666
expect(configs.connection_timeout).to eq 5
6767
expect(configs.read_timeout).to eq 5
68-
expect(configs.features_refresh_rate).to eq 5
68+
expect(configs.features_refresh_rate).to eq 60
6969
expect(configs.segments_refresh_rate).to eq 60
7070
expect(configs.impressions_refresh_rate).to eq 60
7171
expect(configs.impressions_queue_size).to eq 5000
@@ -113,6 +113,16 @@
113113
configs3 = SplitIoClient::SplitConfig.new(options3)
114114

115115
expect(configs3.impressions_mode).to eq(:optimized)
116+
117+
options4 = { impressions_mode: :sarasa, cache_adapter: :redis }
118+
configs4 = SplitIoClient::SplitConfig.new(options4)
119+
120+
expect(configs4.impressions_mode).to eq(:debug)
121+
122+
options5 = { impressions_mode: :optimized, cache_adapter: :redis }
123+
configs5 = SplitIoClient::SplitConfig.new(options5)
124+
125+
expect(configs5.impressions_mode).to eq(:optimized)
116126
end
117127

118128
it 'set impressions refresh rate with impressions optimized mode' do

spec/telemetry/synchronizer_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
let(:body_usage) { "{\"lS\":{\"sp\":111111222,\"se\":111111222,\"im\":111111222,\"ic\":111111222,\"ev\":111111222,\"te\":111111222,\"to\":111111222},\"mL\":{\"t\":[0,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"ts\":[0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"tc\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"tcs\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"tr\":[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},\"mE\":{\"t\":2,\"ts\":1,\"tc\":1,\"tcs\":0,\"tr\":1},\"hE\":{\"sp\":{},\"se\":{\"400\":1},\"im\":{},\"ic\":{},\"ev\":{\"500\":2,\"501\":1},\"te\":{},\"to\":{}},\"hL\":{\"sp\":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"se\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"im\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"ic\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"ev\":[0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"te\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"to\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},\"tR\":1,\"aR\":1,\"iQ\":3,\"iDe\":1,\"iDr\":2,\"spC\":3,\"seC\":3,\"skC\":7,\"sL\":444555,\"eQ\":4,\"eD\":1,\"sE\":[{\"e\":50,\"d\":222222333,\"t\":222222333},{\"e\":70,\"d\":0,\"t\":222222333},{\"e\":70,\"d\":1,\"t\":222222333}],\"t\":[\"tag-1\",\"tag-2\"]}" }
4646
let(:empty_body_usage) { "{\"lS\":{\"sp\":0,\"se\":0,\"im\":0,\"ic\":0,\"ev\":0,\"te\":0,\"to\":0},\"mL\":{\"t\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"ts\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"tc\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"tcs\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"tr\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},\"mE\":{\"t\":0,\"ts\":0,\"tc\":0,\"tcs\":0,\"tr\":0},\"hE\":{\"sp\":{},\"se\":{},\"im\":{},\"ic\":{},\"ev\":{},\"te\":{},\"to\":{}},\"hL\":{\"sp\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"se\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"im\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"ic\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"ev\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"te\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"to\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},\"tR\":0,\"aR\":0,\"iQ\":0,\"iDe\":0,\"iDr\":0,\"spC\":0,\"seC\":0,\"skC\":0,\"sL\":0,\"eQ\":0,\"eD\":0,\"sE\":[],\"t\":[]}" }
4747
let(:body_custom_config) { "{\"oM\":0,\"sE\":true,\"st\":\"memory\",\"rR\":{\"sp\":100,\"se\":110,\"im\":120,\"ev\":130,\"te\":140},\"iQ\":5000,\"eQ\":500,\"iM\":0,\"uO\":{\"s\":true,\"e\":true,\"a\":true,\"st\":false,\"t\":false},\"iL\":false,\"hP\":false,\"aF\":1,\"rF\":1,\"tR\":100,\"bT\":2,\"nR\":1,\"t\":[],\"i\":null}" }
48-
let(:body_default_config) { "{\"oM\":0,\"sE\":true,\"st\":\"memory\",\"rR\":{\"sp\":5,\"se\":60,\"im\":300,\"ev\":60,\"te\":3600},\"iQ\":5000,\"eQ\":500,\"iM\":0,\"uO\":{\"s\":false,\"e\":false,\"a\":false,\"st\":false,\"t\":false},\"iL\":false,\"hP\":false,\"aF\":1,\"rF\":1,\"tR\":500,\"bT\":0,\"nR\":0,\"t\":[],\"i\":null}" }
49-
let(:body_proxy_config) { "{\"oM\":0,\"sE\":true,\"st\":\"memory\",\"rR\":{\"sp\":5,\"se\":60,\"im\":300,\"ev\":60,\"te\":3600},\"iQ\":5000,\"eQ\":500,\"iM\":0,\"uO\":{\"s\":false,\"e\":false,\"a\":false,\"st\":false,\"t\":false},\"iL\":false,\"hP\":true,\"aF\":1,\"rF\":1,\"tR\":500,\"bT\":0,\"nR\":0,\"t\":[],\"i\":null}" }
48+
let(:body_default_config) { "{\"oM\":0,\"sE\":true,\"st\":\"memory\",\"rR\":{\"sp\":60,\"se\":60,\"im\":300,\"ev\":60,\"te\":3600},\"iQ\":5000,\"eQ\":500,\"iM\":0,\"uO\":{\"s\":false,\"e\":false,\"a\":false,\"st\":false,\"t\":false},\"iL\":false,\"hP\":false,\"aF\":1,\"rF\":1,\"tR\":500,\"bT\":0,\"nR\":0,\"t\":[],\"i\":null}" }
49+
let(:body_proxy_config) { "{\"oM\":0,\"sE\":true,\"st\":\"memory\",\"rR\":{\"sp\":60,\"se\":60,\"im\":300,\"ev\":60,\"te\":3600},\"iQ\":5000,\"eQ\":500,\"iM\":0,\"uO\":{\"s\":false,\"e\":false,\"a\":false,\"st\":false,\"t\":false},\"iL\":false,\"hP\":true,\"aF\":1,\"rF\":1,\"tR\":500,\"bT\":0,\"nR\":0,\"t\":[],\"i\":null}" }
5050

5151
context 'synchronize_stats' do
5252
before do

0 commit comments

Comments
 (0)