Skip to content

Updated engine and sync classes #564

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 2, 2025
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
35 changes: 25 additions & 10 deletions lib/splitclient-rb/cache/senders/impressions_formatter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,30 @@ def feature_impressions(filtered_impressions, feature)
end

def current_impressions(feature_impressions)
formatted = []
feature_impressions.map do |impression|
{
k: impression[:i][:k],
t: impression[:i][:t],
m: impression[:i][:m],
b: impression[:i][:b],
r: impression[:i][:r],
c: impression[:i][:c],
pt: impression[:i][:pt]
}
if impression[:i][:properties].nil?
impression = {
k: impression[:i][:k],
t: impression[:i][:t],
m: impression[:i][:m],
b: impression[:i][:b],
r: impression[:i][:r],
c: impression[:i][:c],
pt: impression[:i][:pt]
}
else
impression = {
k: impression[:i][:k],
t: impression[:i][:t],
m: impression[:i][:m],
b: impression[:i][:b],
r: impression[:i][:r],
c: impression[:i][:c],
pt: impression[:i][:pt],
properties: impression[:i][:properties].to_json.to_s
}
end
end
end

Expand Down Expand Up @@ -73,7 +87,8 @@ def impression_hash(impression)
"#{impression[:i][:b]}:" \
"#{impression[:i][:c]}:" \
"#{impression[:i][:t]}:" \
"#{impression[:i][:pt]}"
"#{impression[:i][:pt]}" \
"#{impression[:i][:properties]}" \
end
end
end
Expand Down
15 changes: 11 additions & 4 deletions lib/splitclient-rb/engine/common/impressions_manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,20 @@ def initialize(config,
@unique_keys_tracker = unique_keys_tracker
end

def build_impression(matching_key, bucketing_key, split_name, treatment_data, impressions_disabled, params = {})
impression_data = impression_data(matching_key, bucketing_key, split_name, treatment_data, params[:time])
def build_impression(matching_key, bucketing_key, split_name, treatment_data, impressions_disabled, params = {},
properties = nil)
impression_data = impression_data(matching_key, bucketing_key, split_name, treatment_data, params[:time], properties)
begin
if @config.impressions_mode == :none || impressions_disabled
@impression_counter.inc(split_name, impression_data[:m])
@unique_keys_tracker.track(split_name, matching_key)
elsif @config.impressions_mode == :debug # In DEBUG mode we should calculate the pt only.
return impression(impression_data, params[:attributes]) unless properties.nil?

impression_data[:pt] = @impression_observer.test_and_set(impression_data)
else # In OPTIMIZED mode we should track the total amount of evaluations and deduplicate the impressions.
return impression(impression_data, params[:attributes]) unless properties.nil?

impression_data[:pt] = @impression_observer.test_and_set(impression_data)
@impression_counter.inc(split_name, impression_data[:m]) unless impression_data[:pt].nil?
end
Expand Down Expand Up @@ -79,7 +84,8 @@ def record_stats(stats)
end

# added param time for test
def impression_data(matching_key, bucketing_key, split_name, treatment, time = nil)
def impression_data(matching_key, bucketing_key, split_name, treatment, time = nil,
properties = nil)
{
k: matching_key,
b: bucketing_key,
Expand All @@ -88,7 +94,8 @@ def impression_data(matching_key, bucketing_key, split_name, treatment, time = n
r: applied_rule(treatment[:label]),
c: treatment[:change_number],
m: time || (Time.now.to_f * 1000.0).to_i,
pt: nil
pt: nil,
properties: properties
}
end

Expand Down
38 changes: 20 additions & 18 deletions spec/cache/repositories/impressions_repository_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
r: 'sample_rule',
c: 1_533_177_602_748,
m: 1_478_113_516_002,
pt: nil
pt: nil,
properties: nil
},
attributes: {}
},
Expand All @@ -39,7 +40,8 @@
r: 'sample_rule',
c: 1_533_177_602_749,
m: 1_478_113_516_002,
pt: nil
pt: nil,
properties: nil
},
attributes: {}
}
Expand All @@ -55,8 +57,8 @@
it 'adds impressions' do
params = { attributes: {}, time: 1_478_113_516_002 }
impressions = []
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :bar, treatment2, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo, treatment1, false, params, nil), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :bar, treatment2, false, params, nil), :disabled => false }
impressions_manager.track(impressions)

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

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

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

config.impressions_bulk_size = 1
Expand Down Expand Up @@ -142,8 +144,8 @@
treatment = { treatment: 'on', label: 'sample_rule', change_number: 1_533_177_602_748 }
params = { attributes: {}, time: 1_478_113_516_002 }
impressions = []
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo1, treatment, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key2', nil, :foo1, treatment, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key1', nil, :foo1, treatment, false, params, nil), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key2', nil, :foo1, treatment, false, params, nil), :disabled => false }
impressions_manager.track(impressions)

expect(repository.batch.size).to eq(1)
Expand Down Expand Up @@ -200,8 +202,8 @@
expect(config.impressions_adapter).to receive(:expire).once.with(anything, 3600)
params = { attributes: {}, time: 1_478_113_516_002 }
impressions = []
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params, nil), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params, nil), :disabled => false }
impressions_manager.track(impressions)
end

Expand All @@ -211,7 +213,7 @@

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

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

adapter.get_from_queue('SPLITIO.impressions', 0).map do |e|
Expand Down Expand Up @@ -252,8 +254,8 @@

params = { attributes: {}, time: 1_478_113_516_002 }
impressions = []
impressions << { :impression => custom_impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params), :disabled => false }
impressions << { :impression => custom_impressions_manager.build_impression('matching_key', nil, :foo2, other_treatment, false, params), :disabled => false }
impressions << { :impression => custom_impressions_manager.build_impression('matching_key', nil, :foo1, treatment, false, params, nil), :disabled => false }
impressions << { :impression => custom_impressions_manager.build_impression('matching_key', nil, :foo2, other_treatment, false, params, nil), :disabled => false }
custom_impressions_manager.track(impressions)

custom_adapter.get_from_queue('SPLITIO.impressions', 0).map do |e|
Expand Down
9 changes: 5 additions & 4 deletions spec/cache/senders/impressions_formatter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
b: 'foo1',
r: 'custom_label1',
c: 123_456,
pt: nil }]
pt: nil}]
},
{
f: :foo2,
Expand All @@ -68,14 +68,14 @@
b: 'foo2',
r: 'custom_label2',
c: 123_499,
pt: nil }]
pt: nil}]
}])
end

it 'formats multiple impressions for one key' do
params = { attributes: {}, time: 1_478_113_518_900 }
impressions = []
impressions << { :impression => impressions_manager.build_impression('matching_key3', nil, 'foo2', treatment3, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key3', nil, 'foo2', treatment3, false, params, {"prop": "val"}), :disabled => false }
impressions_manager.track(impressions)

expect(formatted_impressions.find { |i| i[:f] == :foo1 }[:i]).to match_array(
Expand Down Expand Up @@ -110,7 +110,8 @@
b: nil,
r: nil,
c: nil,
pt: nil
pt: nil,
properties: '{"prop":"val"}'
}
]
)
Expand Down
5 changes: 3 additions & 2 deletions spec/cache/senders/impressions_sender_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
params2 = { attributes: {}, time: 1_478_113_518_285 }
impressions = []
impressions << { :impression => impressions_manager.build_impression('matching_key', 'foo1', 'foo1', treatment1, false, params), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key2', 'foo2', 'foo2', treatment2, false, params2), :disabled => false }
impressions << { :impression => impressions_manager.build_impression('matching_key2', 'foo2', 'foo2', treatment2, false, params2, {:prop=>"val"}), :disabled => false }
impressions_manager.track(impressions)
end

Expand Down Expand Up @@ -89,7 +89,8 @@
b: 'foo2',
r: 'custom_label2',
c: 123_499,
pt: nil
pt: nil,
properties: '{"prop":"val"}'
}
]
}
Expand Down
14 changes: 9 additions & 5 deletions spec/engine/common/impression_manager_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@
r: 'default label',
c: 1_478_113_516_002,
m: 1_478_113_516_222,
pt: nil
pt: nil,
properties: {"prop":"val"}
},
attributes: {}
}
Expand All @@ -71,7 +72,7 @@
'split_name_test',
treatment,
false,
params)
params, {"prop":"val"})
expect(impression).to match(expected)

result_count = impression_counter.pop_all
Expand All @@ -97,7 +98,8 @@
r: 'default label',
c: 1_478_113_516_002,
m: 1_478_113_516_222,
pt: nil
pt: nil,
properties: nil
},
attributes: {}
}
Expand Down Expand Up @@ -155,7 +157,8 @@
r: 'default label',
c: 1_478_113_516_002,
m: 1_478_113_516_222,
pt: nil
pt: nil,
properties: nil
},
attributes: {}
}
Expand Down Expand Up @@ -297,7 +300,8 @@
r: 'default label',
c: 1_478_113_516_002,
m: 1_478_113_516_222,
pt: nil
pt: nil,
properties: nil
},
attributes: {}
}
Expand Down