splitclient-rb 5.0.2 → 5.0.3.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0bb4acbfa69102bcb33b4c28f3459450d508c7d8
4
- data.tar.gz: beadf92c41e0df352f12952dcacd1d68ddbb83dc
3
+ metadata.gz: 96c04f6c8f1f039d2e44eaf73b22ef85ae185159
4
+ data.tar.gz: 6be836b37a412f8cc5fe8065601685da71a9d7ea
5
5
  SHA512:
6
- metadata.gz: 46987aa37212ce9d6ae6983fcd3863e0f49a38c5c4fad2a47e7ca10c3ba7eba861badaf4e48500cc951f2c6211be231281a9cef449bc433806650214e31f1515
7
- data.tar.gz: 2b5561d235e39ac852b63d88ffee096893a61e9d29bd1f9ba4e6875b555235688e84bd89a85ecc24f3a60a98ae0c581582af8ee659238c80cac76b055233b5cb
6
+ metadata.gz: 30ef29cf085ba8ab284115dc2adaed00d6ec9400f0326d93e454cf0630f4a43231974968d78238c62d5e22c11af856cb080903c246aa72e7c7419e2830b777a4
7
+ data.tar.gz: c940e12c425db431769f12193544473e90aa956ea02b6e76288038a4c515b4573e480c4aebcf115107508cd115a67668d834eeb2d0680965f4c21bea56611487
data/Detailed-README.md CHANGED
@@ -136,7 +136,9 @@ split_client.get_treatment('user_id','feature_name', attr: 'val')
136
136
 
137
137
  **impressions_refresh_rate** : The SDK sends information on who got what treatment at what time back to Split servers to power analytics. This parameter controls how often this data is sent to Split servers in seconds
138
138
 
139
- **impressions_queue_size** : The size of the impressions queue in case of `cache_adapter == :memory` and the size impressions batch to be fetched from Redis in case of `cache_adapter == :redis`. Use `-1` to disable impressions.
139
+ **impressions_queue_size** : The size of the impressions queue in case of `cache_adapter == :memory`.
140
+
141
+ **impressions_bulk_size** : Max number of impressions to be sent to the backend on each post. Defaults to `impressions_queue_size`.
140
142
 
141
143
  *default value* = `60`
142
144
 
@@ -24,19 +24,21 @@ module SplitIoClient
24
24
  @current_size.increment
25
25
  end
26
26
 
27
- # Get all items from the queue
28
27
  def clear
29
- items = []
28
+ get_batch(@current_size.value)
29
+ end
30
30
 
31
- loop do
31
+ def get_batch(size)
32
+ items = []
33
+ size.times do
32
34
  items << @queue.pop(true)
33
-
34
35
  @current_size.decrement
35
36
  end
36
-
37
- rescue ThreadError
37
+ items
38
+ rescue ThreadError
38
39
  items
39
40
  end
41
+
40
42
  end
41
43
  end
42
44
  end
@@ -3,6 +3,7 @@ module SplitIoClient
3
3
  module Repositories
4
4
  module Impressions
5
5
  class MemoryRepository
6
+
6
7
  def initialize(adapter, config)
7
8
  @adapter = adapter
8
9
  @config = config
@@ -18,23 +19,25 @@ module SplitIoClient
18
19
  end
19
20
  end
20
21
 
21
- def add_bulk(key, bucketing_key, treatments_labels_change_numbers, time)
22
- treatments_labels_change_numbers.each do |split_name, treatment_label_number|
22
+ def add_bulk(key, bucketing_key, treatments, time)
23
+ treatments.each do |split_name, treatment|
23
24
  add(
24
25
  split_name,
25
26
  'keyName' => key,
26
27
  'bucketingKey' => bucketing_key,
27
- 'treatment' => treatment_label_number[:treatment],
28
- 'label' => @config.labels_enabled ? treatment_label_number[:label] : nil,
29
- 'changeNumber' => treatment_label_number[:change_number],
28
+ 'treatment' => treatment[:treatment],
29
+ 'label' => @config.labels_enabled ? treatment[:label] : nil,
30
+ 'changeNumber' => treatment[:change_number],
30
31
  'time' => time
31
32
  )
32
33
  end
33
34
  end
34
35
 
35
- # Get everything from the queue and leave it empty
36
- def clear
37
- @adapter.clear.map { |impression| impression.update(ip: @config.machine_ip) }
36
+ def get_batch
37
+ return [] if @config.impressions_bulk_size == 0
38
+ @adapter.get_batch(@config.impressions_bulk_size).map do |impression|
39
+ impression.update(ip: @config.machine_ip)
40
+ end
38
41
  end
39
42
 
40
43
  private
@@ -3,7 +3,6 @@ module SplitIoClient
3
3
  module Repositories
4
4
  module Impressions
5
5
  class RedisRepository < Repository
6
- IMPRESSIONS_SLICE = 1000
7
6
 
8
7
  def initialize(adapter, config)
9
8
  @adapter = adapter
@@ -18,25 +17,23 @@ module SplitIoClient
18
17
  )
19
18
  end
20
19
 
21
- def add_bulk(key, bucketing_key, treatments_labels_change_numbers, time)
20
+ def add_bulk(key, bucketing_key, treatments, time)
22
21
  @adapter.redis.pipelined do
23
- treatments_labels_change_numbers.each_slice(IMPRESSIONS_SLICE) do |treatments_labels_change_numbers_slice|
24
- treatments_labels_change_numbers_slice.each do |split_name, treatment_label_change_number|
25
- add(split_name,
26
- 'keyName' => key,
27
- 'bucketingKey' => bucketing_key,
28
- 'treatment' => treatment_label_change_number[:treatment],
29
- 'label' => @config.labels_enabled ? treatment_label_change_number[:label] : nil,
30
- 'changeNumber' => treatment_label_change_number[:change_number],
31
- 'time' => time)
32
- end
22
+ treatments.each do |split_name, treatment|
23
+ add(split_name,
24
+ 'keyName' => key,
25
+ 'bucketingKey' => bucketing_key,
26
+ 'treatment' => treatment[:treatment],
27
+ 'label' => @config.labels_enabled ? treatment[:label] : nil,
28
+ 'changeNumber' => treatment[:change_number],
29
+ 'time' => time)
33
30
  end
34
31
  end
35
32
  end
36
33
 
37
- # Get random impressions from redis in batches of size @config.impressions_queue_size,
34
+ # Get random impressions from redis in batches of size @config.impressions_bulk_size,
38
35
  # delete fetched impressions afterwards
39
- def clear
36
+ def get_batch
40
37
  impressions = impression_keys.each_with_object([]) do |key, memo|
41
38
  ip = key.split('/')[-2] # 'prefix/sdk_lang/ip/impressions.name' -> ip
42
39
  if ip.nil?
@@ -44,7 +41,7 @@ module SplitIoClient
44
41
  next
45
42
  end
46
43
  split_name = key.split('.').last
47
- members = @adapter.random_set_elements(key, @config.impressions_queue_size)
44
+ members = @adapter.random_set_elements(key, @config.impressions_bulk_size)
48
45
  members.each do |impression|
49
46
  parsed_impression = JSON.parse(impression)
50
47
 
@@ -61,6 +58,8 @@ module SplitIoClient
61
58
  impressions
62
59
  rescue StandardError => e
63
60
  @config.logger.error("Exception while clearing impressions cache: #{e}")
61
+
62
+ []
64
63
  end
65
64
 
66
65
  private
@@ -70,6 +69,8 @@ module SplitIoClient
70
69
  @adapter.find_sets_by_prefix("#{@config.redis_namespace}/*/impressions.*")
71
70
  rescue StandardError => e
72
71
  @config.logger.error("Exception while fetching impression_keys: #{e}")
72
+
73
+ []
73
74
  end
74
75
  end
75
76
  end
@@ -4,7 +4,7 @@ module SplitIoClient
4
4
  # Repository which forwards impressions interface to the selected adapter
5
5
  class ImpressionsRepository < Repository
6
6
  extend Forwardable
7
- def_delegators :@adapter, :add, :add_bulk, :clear, :empty?
7
+ def_delegators :@adapter, :add, :add_bulk, :get_batch, :empty?
8
8
 
9
9
  def initialize(adapter, config)
10
10
  @config = config
@@ -7,7 +7,7 @@ module SplitIoClient
7
7
  end
8
8
 
9
9
  def call(raw_impressions)
10
- impressions = raw_impressions ? raw_impressions : @impressions_repository.clear
10
+ impressions = raw_impressions ? raw_impressions : @impressions_repository.get_batch
11
11
  formatted_impressions = []
12
12
  filtered_impressions = filter_impressions(impressions)
13
13
 
@@ -9,8 +9,7 @@ module SplitIoClient
9
9
  end
10
10
 
11
11
  def call
12
- # Disable impressions if @config.impressions_queue_size == -1
13
- if @config.impressions_queue_size < 0
12
+ if @config.disable_impressions
14
13
  @config.logger.info('Disabling impressions service by config')
15
14
  return
16
15
  end
@@ -27,7 +27,7 @@ module SplitIoClient
27
27
  memo.merge!(name => get_treatment(key, name, attributes, data, false, true, evaluator))
28
28
  end
29
29
 
30
- if @config.impressions_queue_size > 0
30
+ unless @config.disable_impressions
31
31
  time = (Time.now.to_f * 1000.0).to_i
32
32
  @impressions_repository.add_bulk(
33
33
  matching_key, bucketing_key, treatments_labels_change_numbers, time
@@ -103,7 +103,6 @@ module SplitIoClient
103
103
 
104
104
  begin
105
105
  latency = (Time.now - start) * 1000.0
106
- # Disable impressions if @config.impressions_queue_size == -1
107
106
  split && store_impression(split_name, matching_key, bucketing_key, treatment_data, store_impressions, attributes)
108
107
 
109
108
  # Measure
@@ -145,7 +144,7 @@ module SplitIoClient
145
144
  def store_impression(split_name, matching_key, bucketing_key, treatment, store_impressions, attributes)
146
145
  time = (Time.now.to_f * 1000.0).to_i
147
146
 
148
- return unless @config.impressions_queue_size > 0 && store_impressions
147
+ return if @config.disable_impressions || !store_impressions
149
148
 
150
149
  @impressions_repository.add(split_name,
151
150
  'keyName' => matching_key,
@@ -21,9 +21,9 @@ module SplitIoClient
21
21
  # @option opts [Int] :impressions_refresh_rate
22
22
  # @option opts [Object] :logger a logger to user for messages from the client. Defaults to stdout
23
23
  # @option opts [Boolean] :debug_enabled (false) The value for the debug flag
24
- # @option opts [Int] :impressions_queue_size how big the impressions queue is before dropping impressions. -1 to disable it.
24
+ # @option opts [Int] :impressions_queue_size Size of the impressions queue in the memory repository. Once reached, newer impressions will be dropped
25
+ # @option opts [Int] :impressions_bulk_size Max number of impressions to be sent to the backend on each post
25
26
  # @option opts [#log] :impression_listener this object will capture all impressions and process them through `#log`
26
- #
27
27
  # @return [type] SplitConfig with configuration options
28
28
  def initialize(opts = {})
29
29
  @base_uri = (opts[:base_uri] || SplitConfig.default_base_uri).chomp('/')
@@ -45,6 +45,10 @@ module SplitIoClient
45
45
  @impressions_adapter = SplitConfig.init_cache_adapter(
46
46
  opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @redis_url, @impressions_queue_size
47
47
  )
48
+ #Safeguard for users of older SDK versions.
49
+ @disable_impressions = @impressions_queue_size == -1
50
+ #Safeguard for users of older SDK versions.
51
+ @impressions_bulk_size = opts[:impressions_bulk_size] || @impressions_queue_size > 0 ? @impressions_queue_size : 0
48
52
 
49
53
  @metrics_adapter = SplitConfig.init_cache_adapter(
50
54
  opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, @redis_url, false
@@ -179,6 +183,8 @@ module SplitIoClient
179
183
  #
180
184
  # @return [Integer]
181
185
  attr_reader :impressions_queue_size
186
+ attr_reader :impressions_bulk_size
187
+ attr_reader :disable_impressions
182
188
 
183
189
  attr_reader :redis_url
184
190
  attr_reader :redis_namespace
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '5.0.2'
2
+ VERSION = '5.0.3.pre.rc1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splitclient-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.2
4
+ version: 5.0.3.pre.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-01 00:00:00.000000000 Z
11
+ date: 2018-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -313,12 +313,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
313
313
  version: '0'
314
314
  required_rubygems_version: !ruby/object:Gem::Requirement
315
315
  requirements:
316
- - - ">="
316
+ - - ">"
317
317
  - !ruby/object:Gem::Version
318
- version: '0'
318
+ version: 1.3.1
319
319
  requirements: []
320
320
  rubyforge_project:
321
- rubygems_version: 2.6.8
321
+ rubygems_version: 2.5.2.3
322
322
  signing_key:
323
323
  specification_version: 4
324
324
  summary: Ruby client for split SDK.