Skip to content

Commit 776413d

Browse files
authored
Merge pull request #540 from splitio/imp-toggle-client
updated client and factory classes
2 parents 647a43f + 88f5c05 commit 776413d

File tree

14 files changed

+392
-84
lines changed

14 files changed

+392
-84
lines changed

lib/splitclient-rb/clients/split_client.rb

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ def treatments(key, feature_flag_names, attributes = {}, calling_method = 'get_t
267267
to_return = Hash.new
268268
sanitized_feature_flag_names.each {|name|
269269
to_return[name.to_sym] = control_treatment_with_config
270-
impressions << @impressions_manager.build_impression(matching_key, bucketing_key, name.to_sym, control_treatment_with_config.merge({ label: Engine::Models::Label::NOT_READY }), { attributes: attributes, time: nil })
270+
impressions << { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, name.to_sym, control_treatment_with_config.merge({ :label => Engine::Models::Label::NOT_READY }), false, { attributes: attributes, time: nil }), :disabled => false }
271271
}
272272
@impressions_manager.track(impressions)
273273
return to_return
@@ -278,7 +278,6 @@ def treatments(key, feature_flag_names, attributes = {}, calling_method = 'get_t
278278
valid_feature_flag_names << feature_flag_name unless feature_flag_name.nil?
279279
}
280280
start = Time.now
281-
impressions_total = []
282281

283282
feature_flags = @splits_repository.splits(valid_feature_flag_names)
284283
treatments = Hash.new
@@ -291,15 +290,14 @@ def treatments(key, feature_flag_names, attributes = {}, calling_method = 'get_t
291290
next
292291
end
293292
treatments_labels_change_numbers, impressions = evaluate_treatment(feature_flag, key, bucketing_key, matching_key, attributes, calling_method)
294-
impressions_total.concat(impressions) unless impressions.nil?
295293
treatments[key] =
296294
{
297295
treatment: treatments_labels_change_numbers[:treatment],
298296
config: treatments_labels_change_numbers[:config]
299297
}
298+
@impressions_manager.track(impressions) unless impressions.empty?
300299
end
301300
record_latency(calling_method, start)
302-
@impressions_manager.track(impressions_total) unless impressions_total.empty?
303301

304302
treatments.merge(invalid_treatments)
305303
end
@@ -332,50 +330,50 @@ def treatment(key, feature_flag_name, attributes = {}, split_data = nil, store_i
332330
end
333331

334332
feature_flag = @splits_repository.get_split(feature_flag_name)
335-
treatments, impressions = evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple)
333+
treatments, impressions_decorator = evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple)
336334

337-
@impressions_manager.track(impressions) unless impressions.nil?
335+
@impressions_manager.track(impressions_decorator) unless impressions_decorator.nil?
338336
treatments
339337
end
340338

341339
def evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple = false)
342-
impressions = []
340+
impressions_decorator = []
343341
begin
344342
start = Time.now
345343
if feature_flag.nil? && ready?
346344
@config.logger.warn("#{calling_method}: you passed #{feature_flag_name} that " \
347345
'does not exist in this environment, please double check what feature flags exist in the Split user interface')
348-
return parsed_treatment(control_treatment.merge({ label: Engine::Models::Label::NOT_FOUND }), multiple), nil
346+
return parsed_treatment(control_treatment.merge({ :label => Engine::Models::Label::NOT_FOUND }), multiple), nil
349347
end
350-
treatment_data =
348+
351349
if !feature_flag.nil? && ready?
352-
@evaluator.evaluate_feature_flag(
350+
treatment_data = @evaluator.evaluate_feature_flag(
353351
{ bucketing_key: bucketing_key, matching_key: matching_key }, feature_flag, attributes
354352
)
353+
impressions_disabled = feature_flag[:impressionsDisabled]
355354
else
356355
@config.logger.error("#{calling_method}: the SDK is not ready, results may be incorrect for feature flag #{feature_flag_name}. Make sure to wait for SDK readiness before using this method.")
357-
control_treatment.merge({ label: Engine::Models::Label::NOT_READY })
356+
treatment_data = control_treatment.merge({ :label => Engine::Models::Label::NOT_READY })
357+
impressions_disabled = false
358358
end
359359

360360
record_latency(calling_method, start)
361-
impression = @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, treatment_data, { attributes: attributes, time: nil })
362-
impressions << impression unless impression.nil?
361+
impression_decorator = { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, treatment_data, impressions_disabled, params={ attributes: attributes, time: nil }), :disabled => impressions_disabled }
362+
impressions_decorator << impression_decorator unless impression_decorator.nil?
363363
rescue StandardError => e
364364
@config.log_found_exception(__method__.to_s, e)
365-
366365
record_exception(calling_method)
366+
impression_decorator = { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, control_treatment, false, { attributes: attributes, time: nil }), :disabled => false }
367+
impressions_decorator << impression_decorator unless impression_decorator.nil?
367368

368-
impression = @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, control_treatment, { attributes: attributes, time: nil })
369-
impressions << impression unless impression.nil?
370-
371-
return parsed_treatment(control_treatment.merge({ label: Engine::Models::Label::EXCEPTION }), multiple), impressions
369+
return parsed_treatment(control_treatment.merge({ :label => Engine::Models::Label::EXCEPTION }), multiple), impressions_decorator
372370
end
373371

374-
return parsed_treatment(treatment_data, multiple), impressions
372+
return parsed_treatment(treatment_data, multiple), impressions_decorator
375373
end
376374

377375
def control_treatment
378-
{ treatment: Engine::Models::Treatment::CONTROL }
376+
{ :treatment => Engine::Models::Treatment::CONTROL }
379377
end
380378

381379
def control_treatment_with_config

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ def initialize(config,
1818
@unique_keys_tracker = unique_keys_tracker
1919
end
2020

21-
def build_impression(matching_key, bucketing_key, split_name, treatment, impressions_disabled, params = {})
22-
impression_data = impression_data(matching_key, bucketing_key, split_name, treatment, params[:time])
21+
def build_impression(matching_key, bucketing_key, split_name, treatment_data, impressions_disabled, params = {})
22+
impression_data = impression_data(matching_key, bucketing_key, split_name, treatment_data, params[:time])
2323
begin
2424
if @config.impressions_mode == :none || impressions_disabled
2525
@impression_counter.inc(split_name, impression_data[:m])
@@ -41,10 +41,10 @@ def track(impressions_decorator)
4141
return if impressions_decorator.empty?
4242

4343
impressions_decorator.each do |impression_decorator|
44+
impression_router.add_bulk([impression_decorator[:impression]])
4445
stats = { dropped: 0, queued: 0, dedupe: 0 }
4546
begin
4647
next if @config.impressions_mode == :none || impression_decorator[:disabled]
47-
4848
if @config.impressions_mode == :debug
4949
track_debug_mode([impression_decorator[:impression]], stats)
5050
else
@@ -54,7 +54,6 @@ def track(impressions_decorator)
5454
@config.log_found_exception(__method__.to_s, e)
5555
ensure
5656
record_stats(stats)
57-
impression_router.add_bulk([impression_decorator[:impression]])
5857
end
5958
end
6059
end

lib/splitclient-rb/split_factory.rb

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -230,33 +230,22 @@ def build_telemetry_synchronizer(flag_sets, flag_sets_invalid)
230230
end
231231

232232
def build_unique_keys_tracker
233-
if @config.impressions_mode != :none
234-
@unique_keys_tracker = Engine::Impressions::NoopUniqueKeysTracker.new
235-
return
236-
end
237-
238233
bf = Cache::Filter::BloomFilter.new(30_000_000)
239234
filter_adapter = Cache::Filter::FilterAdapter.new(@config, bf)
240235
cache = Concurrent::Hash.new
241236
@unique_keys_tracker = Engine::Impressions::UniqueKeysTracker.new(@config, filter_adapter, @impressions_sender_adapter, cache)
242237
end
243238

244239
def build_impressions_observer
245-
if (@config.cache_adapter == :redis && @config.impressions_mode != :optimized) ||
246-
(@config.cache_adapter == :memory && @config.impressions_mode == :none)
240+
if (@config.cache_adapter == :redis && @config.impressions_mode != :optimized)
247241
@impression_observer = Observers::NoopImpressionObserver.new
248242
else
249243
@impression_observer = Observers::ImpressionObserver.new
250244
end
251245
end
252246

253247
def build_impression_counter
254-
case @config.impressions_mode
255-
when :debug
256-
@impression_counter = Engine::Common::NoopImpressionCounter.new
257-
else
258-
@impression_counter = Engine::Common::ImpressionCounter.new
259-
end
248+
@impression_counter = Engine::Common::ImpressionCounter.new
260249
end
261250

262251
def build_impressions_sender_adapter

spec/cache/repositories/impressions_repository_spec.rb

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@
5555
it 'adds impressions' do
5656
params = { attributes: {}, time: 1_478_113_516_002 }
5757
impressions = []
58-
impressions << impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, params)
59-
impressions << impressions_manager.build_impression('matching_key1', nil, :bar, treatment2, params)
58+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, false, params), :disabled => false }
59+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :bar, treatment2, false, params), :disabled => false }
6060
impressions_manager.track(impressions)
6161

6262
expect(repository.batch).to match_array(result)
@@ -67,8 +67,8 @@
6767
it 'adds impressions in bulk' do
6868
params = { attributes: {}, time: 1_478_113_516_002 }
6969
impressions = []
70-
impressions << impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, params)
71-
impressions << impressions_manager.build_impression('matching_key1', nil, :bar, treatment2, params)
70+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, false, params), :disabled => false }
71+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :bar, treatment2, false, params), :disabled => false }
7272
impressions_manager.track(impressions)
7373

7474
expect(repository.batch).to match_array(result)
@@ -80,7 +80,7 @@
8080
config.labels_enabled = false
8181
params = { attributes: {}, time: 1_478_113_516_002 }
8282
impressions = []
83-
impressions << impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, params)
83+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, false, params), :disabled => false }
8484
impressions_manager.track(impressions)
8585

8686
expect(repository.batch.first[:i][:r]).to be_nil
@@ -89,8 +89,8 @@
8989
it 'bulk size less than the actual queue' do
9090
params = { attributes: {}, time: 1_478_113_516_002 }
9191
impressions = []
92-
impressions << impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, params)
93-
impressions << impressions_manager.build_impression('matching_key1', nil, :foo, treatment2, params)
92+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, false, params), :disabled => false }
93+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo, treatment2, false, params), :disabled => false }
9494
impressions_manager.track(impressions)
9595

9696
config.impressions_bulk_size = 1
@@ -142,8 +142,8 @@
142142
treatment = { treatment: 'on', label: 'sample_rule', change_number: 1_533_177_602_748 }
143143
params = { attributes: {}, time: 1_478_113_516_002 }
144144
impressions = []
145-
impressions << impressions_manager.build_impression('matching_key1', nil, :foo1, treatment, params)
146-
impressions << impressions_manager.build_impression('matching_key2', nil, :foo1, treatment, params)
145+
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo1, treatment, false, params), :disabled => false }
146+
impressions << { :impression => impressions_manager.build_impression('matching_key2', nil, :foo1, treatment, false, params), :disabled => false }
147147
impressions_manager.track(impressions)
148148

149149
expect(repository.batch.size).to eq(1)
@@ -200,8 +200,8 @@
200200
expect(config.impressions_adapter).to receive(:expire).once.with(anything, 3600)
201201
params = { attributes: {}, time: 1_478_113_516_002 }
202202
impressions = []
203-
impressions << impressions_manager.build_impression('matching_key', nil, :foo1, treatment, params)
204-
impressions << impressions_manager.build_impression('matching_key', nil, :foo1, treatment, params)
203+
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
204+
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
205205
impressions_manager.track(impressions)
206206
end
207207

@@ -211,7 +211,7 @@
211211

212212
params = { attributes: {}, time: 1_478_113_516_002 }
213213
impressions = []
214-
impressions << impressions_manager.build_impression('matching_key', nil, :foo1, treatment, params)
214+
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
215215
impressions_manager.track(impressions)
216216

217217
expect(repository.batch).to eq([])
@@ -221,8 +221,8 @@
221221
other_treatment = { treatment: 'on', label: 'sample_rule_2', change_number: 1_533_177_602_748 }
222222
params = { attributes: {}, time: 1_478_113_516_002 }
223223
impressions = []
224-
impressions << impressions_manager.build_impression('matching_key', nil, :foo1, treatment, params)
225-
impressions << impressions_manager.build_impression('matching_key', nil, :foo2, other_treatment, params)
224+
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
225+
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo2, other_treatment, false, params), :disabled => false }
226226
impressions_manager.track(impressions)
227227

228228
adapter.get_from_queue('SPLITIO.impressions', 0).map do |e|
@@ -252,8 +252,8 @@
252252

253253
params = { attributes: {}, time: 1_478_113_516_002 }
254254
impressions = []
255-
impressions << custom_impressions_manager.build_impression('matching_key', nil, :foo1, treatment, params)
256-
impressions << custom_impressions_manager.build_impression('matching_key', nil, :foo2, other_treatment, params)
255+
impressions << { :impression => custom_impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
256+
impressions << { :impression => custom_impressions_manager.build_impression('matching_key', nil, :foo2, other_treatment, false, params), :disabled => false }
257257
custom_impressions_manager.track(impressions)
258258

259259
custom_adapter.get_from_queue('SPLITIO.impressions', 0).map do |e|

spec/cache/senders/impressions_formatter_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
params2 = { attributes: {}, time: 1_478_113_518_285 }
4444

4545
@impressions = []
46-
@impressions << impressions_manager.build_impression('matching_key', 'foo1', 'foo1', treatment1, params)
47-
@impressions << impressions_manager.build_impression('matching_key2', 'foo2', 'foo2', treatment2, params2)
46+
@impressions << { :impression => impressions_manager.build_impression('matching_key', 'foo1', 'foo1', treatment1, false, params), :disabled => false }
47+
@impressions << { :impression => impressions_manager.build_impression('matching_key2', 'foo2', 'foo2', treatment2, false, params2), :disabled => false }
4848
impressions_manager.track(@impressions)
4949
end
5050

@@ -75,7 +75,7 @@
7575
it 'formats multiple impressions for one key' do
7676
params = { attributes: {}, time: 1_478_113_518_900 }
7777
impressions = []
78-
impressions << impressions_manager.build_impression('matching_key3', nil, 'foo2', treatment3, params)
78+
impressions << { :impression => impressions_manager.build_impression('matching_key3', nil, 'foo2', treatment3, false, params), :disabled => false }
7979
impressions_manager.track(impressions)
8080

8181
expect(formatted_impressions.find { |i| i[:f] == :foo1 }[:i]).to match_array(

spec/cache/senders/impressions_sender_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
params = { attributes: {}, time: 1_478_113_516_002 }
4646
params2 = { attributes: {}, time: 1_478_113_518_285 }
4747
impressions = []
48-
impressions << impressions_manager.build_impression('matching_key', 'foo1', 'foo1', treatment1, params)
49-
impressions << impressions_manager.build_impression('matching_key2', 'foo2', 'foo2', treatment2, params2)
48+
impressions << { :impression => impressions_manager.build_impression('matching_key', 'foo1', 'foo1', treatment1, false, params), :disabled => false }
49+
impressions << { :impression => impressions_manager.build_impression('matching_key2', 'foo2', 'foo2', treatment2, false, params2), :disabled => false }
5050
impressions_manager.track(impressions)
5151
end
5252

spec/cache/senders/localhost_repo_cleaner_spec.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,12 @@
4646
treatment_data = { treatment: 'on', label: 'sample_rule', change_number: 1_533_177_602_748 }
4747
params = { attributes: {}, time: nil }
4848
impressions = []
49-
impressions << impressions_manager.build_impression('matching_key',
49+
impressions << { :impression => impressions_manager.build_impression('matching_key',
5050
'foo1',
5151
'foo1',
5252
treatment_data,
53-
params)
53+
false,
54+
params), :disabled => false }
5455

5556
impressions_manager.track(impressions)
5657

0 commit comments

Comments
 (0)