splitclient-rb 5.1.0 → 5.1.1.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +9 -5
- data/Detailed-README.md +1 -1
- data/exe/splitio +6 -6
- data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +3 -4
- data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +1 -2
- data/lib/splitclient-rb/cache/repositories/events_repository.rb +6 -7
- data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +6 -7
- data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +9 -10
- data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +3 -4
- data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +1 -3
- data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +1 -2
- data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +3 -4
- data/lib/splitclient-rb/cache/repositories/repository.rb +2 -2
- data/lib/splitclient-rb/cache/repositories/segments_repository.rb +1 -3
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +1 -3
- data/lib/splitclient-rb/cache/routers/impression_router.rb +4 -5
- data/lib/splitclient-rb/cache/senders/events_sender.rb +6 -7
- data/lib/splitclient-rb/cache/senders/impressions_sender.rb +8 -9
- data/lib/splitclient-rb/cache/senders/metrics_sender.rb +6 -7
- data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +3 -4
- data/lib/splitclient-rb/cache/stores/segment_store.rb +11 -12
- data/lib/splitclient-rb/cache/stores/split_store.rb +12 -13
- data/lib/splitclient-rb/clients/localhost_split_client.rb +2 -2
- data/lib/splitclient-rb/clients/split_client.rb +15 -17
- data/lib/splitclient-rb/engine/api/client.rb +22 -22
- data/lib/splitclient-rb/engine/api/events.rb +6 -8
- data/lib/splitclient-rb/engine/api/impressions.rb +5 -6
- data/lib/splitclient-rb/engine/api/metrics.rb +8 -9
- data/lib/splitclient-rb/engine/api/segments.rb +2 -3
- data/lib/splitclient-rb/engine/api/splits.rb +2 -3
- data/lib/splitclient-rb/engine/metrics/metrics.rb +1 -4
- data/lib/splitclient-rb/engine/parser/split_adapter.rb +8 -10
- data/lib/splitclient-rb/managers/split_manager.rb +1 -2
- data/lib/splitclient-rb/split_config.rb +47 -38
- data/lib/splitclient-rb/split_factory.rb +13 -14
- data/lib/splitclient-rb/split_logger.rb +3 -8
- data/lib/splitclient-rb/version.rb +1 -1
- data/splitclient-rb.gemspec +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0491f827ad5bfa50672fcb2d5562c39c09ab393b'
|
4
|
+
data.tar.gz: 80313b3db90dff3a9622ffceaa812257f585ca96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53e671060ebaca132ab4205d077b4dec7216f65a371b8c89715bbc45e59b5b8a980c3fd9629b9e97090f03798641c640632a142036eb3bf8602d13da4dc8fc35
|
7
|
+
data.tar.gz: 8fff61604c5e9aa89cc0057f4b199de34a12161305c8d806a2e9122e7fd1c0c2584b707948b3a0fafe358c5f3f5338858213f27b12e22087f051622f6b69ab16
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -5,11 +5,15 @@ Metrics/LineLength:
|
|
5
5
|
Max: 121
|
6
6
|
|
7
7
|
Metrics/BlockLength:
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
Exclude:
|
9
|
+
- spec/**/*
|
10
|
+
- splitclient-rb.gemspec
|
11
|
+
- exe/splitio
|
12
|
+
|
13
|
+
Naming/FileName:
|
14
|
+
Exclude:
|
15
|
+
- splitclient-rb.gemspec
|
12
16
|
|
13
17
|
AllCops:
|
14
18
|
Exclude:
|
15
|
-
|
19
|
+
- lib/**/* #TODO Apply rubocop to the library
|
data/Detailed-README.md
CHANGED
@@ -468,7 +468,7 @@ The gem uses `rspec` for unit testing. You can find the files for the unit tests
|
|
468
468
|
To run all the specs in the `spec` folder, use the provided rake task (_make sure Redis is running in localhost_):
|
469
469
|
|
470
470
|
```bash
|
471
|
-
|
471
|
+
bundle exec rspec
|
472
472
|
```
|
473
473
|
|
474
474
|
`Simplecov` is used for coverage reporting. Upon executing the rake task it will store the reports in the `/coverage` folder.
|
data/exe/splitio
CHANGED
@@ -78,12 +78,12 @@ opt_parser = OptionParser.new do |opts|
|
|
78
78
|
end
|
79
79
|
|
80
80
|
begin
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
81
|
+
opt_parser.parse!(ARGV)
|
82
|
+
rescue OptionParser::InvalidOption => e
|
83
|
+
puts e
|
84
|
+
puts opt_parser
|
85
|
+
exit(1)
|
86
|
+
end
|
87
87
|
|
88
88
|
config = config_path != '' ? YAML.load_file(config_path) : {}
|
89
89
|
config
|
@@ -5,16 +5,15 @@ module SplitIoClient
|
|
5
5
|
class MemoryRepository < EventsRepository
|
6
6
|
EVENTS_SLICE = 100
|
7
7
|
|
8
|
-
def initialize(adapter
|
8
|
+
def initialize(adapter)
|
9
9
|
@adapter = adapter
|
10
|
-
@config = config
|
11
10
|
end
|
12
11
|
|
13
12
|
def add(key, traffic_type, event_type, time, value)
|
14
13
|
@adapter.add_to_queue(m: metadata, e: event(key, traffic_type, event_type, time, value))
|
15
14
|
rescue ThreadError # queue is full
|
16
|
-
if
|
17
|
-
|
15
|
+
if SplitIoClient.configuration.debug_enabled
|
16
|
+
SplitIoClient.configuration.logger.warn("Dropping events. Current size is #{SplitIoClient.configuration.events_queue_size}. " \
|
18
17
|
"Consider increasing events_queue_size")
|
19
18
|
end
|
20
19
|
@adapter.clear
|
@@ -6,13 +6,12 @@ module SplitIoClient
|
|
6
6
|
extend Forwardable
|
7
7
|
def_delegators :@adapter, :add, :clear
|
8
8
|
|
9
|
-
def initialize(adapter
|
10
|
-
@config = config
|
9
|
+
def initialize(adapter)
|
11
10
|
@adapter = case adapter.class.to_s
|
12
11
|
when 'SplitIoClient::Cache::Adapters::MemoryAdapter'
|
13
|
-
Repositories::Events::MemoryRepository.new(adapter
|
12
|
+
Repositories::Events::MemoryRepository.new(adapter)
|
14
13
|
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
|
15
|
-
Repositories::Events::RedisRepository.new(adapter
|
14
|
+
Repositories::Events::RedisRepository.new(adapter)
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
@@ -20,9 +19,9 @@ module SplitIoClient
|
|
20
19
|
|
21
20
|
def metadata
|
22
21
|
{
|
23
|
-
s: "#{
|
24
|
-
i:
|
25
|
-
n:
|
22
|
+
s: "#{SplitIoClient.configuration.language}-#{SplitIoClient.configuration.version}",
|
23
|
+
i: SplitIoClient.configuration.machine_ip,
|
24
|
+
n: SplitIoClient.configuration.machine_name
|
26
25
|
}
|
27
26
|
end
|
28
27
|
|
@@ -4,9 +4,8 @@ module SplitIoClient
|
|
4
4
|
module Impressions
|
5
5
|
class MemoryRepository
|
6
6
|
|
7
|
-
def initialize(adapter
|
7
|
+
def initialize(adapter)
|
8
8
|
@adapter = adapter
|
9
|
-
@config = config
|
10
9
|
end
|
11
10
|
|
12
11
|
# Store impression data in the selected adapter
|
@@ -14,7 +13,7 @@ module SplitIoClient
|
|
14
13
|
@adapter.add_to_queue(feature: split_name, impressions: data)
|
15
14
|
rescue ThreadError # queue is full
|
16
15
|
if random_sampler.rand(1..1000) <= 2 # log only 0.2 % of the time
|
17
|
-
|
16
|
+
SplitIoClient.configuration.logger.warn("Dropping impressions. Current size is #{SplitIoClient.configuration.impressions_queue_size}. " \
|
18
17
|
"Consider increasing impressions_queue_size")
|
19
18
|
end
|
20
19
|
end
|
@@ -26,7 +25,7 @@ module SplitIoClient
|
|
26
25
|
'keyName' => key,
|
27
26
|
'bucketingKey' => bucketing_key,
|
28
27
|
'treatment' => treatment[:treatment],
|
29
|
-
'label' =>
|
28
|
+
'label' => SplitIoClient.configuration.labels_enabled ? treatment[:label] : nil,
|
30
29
|
'changeNumber' => treatment[:change_number],
|
31
30
|
'time' => time
|
32
31
|
)
|
@@ -34,9 +33,9 @@ module SplitIoClient
|
|
34
33
|
end
|
35
34
|
|
36
35
|
def get_batch
|
37
|
-
return [] if
|
38
|
-
@adapter.get_batch(
|
39
|
-
impression.update(ip:
|
36
|
+
return [] if SplitIoClient.configuration.impressions_bulk_size == 0
|
37
|
+
@adapter.get_batch(SplitIoClient.configuration.impressions_bulk_size).map do |impression|
|
38
|
+
impression.update(ip: SplitIoClient.configuration.machine_ip)
|
40
39
|
end
|
41
40
|
end
|
42
41
|
|
@@ -4,9 +4,8 @@ module SplitIoClient
|
|
4
4
|
module Impressions
|
5
5
|
class RedisRepository < Repository
|
6
6
|
|
7
|
-
def initialize(adapter
|
7
|
+
def initialize(adapter)
|
8
8
|
@adapter = adapter
|
9
|
-
@config = config
|
10
9
|
end
|
11
10
|
|
12
11
|
# Store impression data in Redis
|
@@ -24,24 +23,24 @@ module SplitIoClient
|
|
24
23
|
'keyName' => key,
|
25
24
|
'bucketingKey' => bucketing_key,
|
26
25
|
'treatment' => treatment[:treatment],
|
27
|
-
'label' =>
|
26
|
+
'label' => SplitIoClient.configuration.labels_enabled ? treatment[:label] : nil,
|
28
27
|
'changeNumber' => treatment[:change_number],
|
29
28
|
'time' => time)
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
34
|
-
# Get random impressions from redis in batches of size
|
33
|
+
# Get random impressions from redis in batches of size SplitIoClient.configuration.impressions_bulk_size,
|
35
34
|
# delete fetched impressions afterwards
|
36
35
|
def get_batch
|
37
36
|
impressions = impression_keys.each_with_object([]) do |key, memo|
|
38
37
|
ip = key.split('/')[-2] # 'prefix/sdk_lang/ip/impressions.name' -> ip
|
39
38
|
if ip.nil?
|
40
|
-
|
39
|
+
SplitIoClient.configuration.logger.warn("Impressions IP parse error for key: #{key}")
|
41
40
|
next
|
42
41
|
end
|
43
42
|
split_name = key.split('.').last
|
44
|
-
members = @adapter.random_set_elements(key,
|
43
|
+
members = @adapter.random_set_elements(key, SplitIoClient.configuration.impressions_bulk_size)
|
45
44
|
members.each do |impression|
|
46
45
|
parsed_impression = JSON.parse(impression)
|
47
46
|
|
@@ -53,11 +52,11 @@ module SplitIoClient
|
|
53
52
|
end
|
54
53
|
|
55
54
|
@adapter.delete_from_set(key, members)
|
56
|
-
end
|
57
55
|
|
56
|
+
end
|
58
57
|
impressions
|
59
58
|
rescue StandardError => e
|
60
|
-
|
59
|
+
SplitIoClient.configuration.logger.error("Exception while clearing impressions cache: #{e}")
|
61
60
|
|
62
61
|
[]
|
63
62
|
end
|
@@ -66,9 +65,9 @@ module SplitIoClient
|
|
66
65
|
|
67
66
|
# Get all sets by prefix
|
68
67
|
def impression_keys
|
69
|
-
@adapter.find_sets_by_prefix("#{
|
68
|
+
@adapter.find_sets_by_prefix("#{SplitIoClient.configuration.redis_namespace}/*/impressions.*")
|
70
69
|
rescue StandardError => e
|
71
|
-
|
70
|
+
SplitIoClient.configuration.logger.error("Exception while fetching impression_keys: #{e}")
|
72
71
|
|
73
72
|
[]
|
74
73
|
end
|
@@ -6,13 +6,12 @@ module SplitIoClient
|
|
6
6
|
extend Forwardable
|
7
7
|
def_delegators :@adapter, :add, :add_bulk, :get_batch, :empty?
|
8
8
|
|
9
|
-
def initialize(adapter
|
10
|
-
@config = config
|
9
|
+
def initialize(adapter)
|
11
10
|
@adapter = case adapter.class.to_s
|
12
11
|
when 'SplitIoClient::Cache::Adapters::MemoryAdapter'
|
13
|
-
Repositories::Impressions::MemoryRepository.new(adapter
|
12
|
+
Repositories::Impressions::MemoryRepository.new(adapter)
|
14
13
|
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
|
15
|
-
Repositories::Impressions::RedisRepository.new(adapter
|
14
|
+
Repositories::Impressions::RedisRepository.new(adapter)
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|
@@ -3,12 +3,10 @@ module SplitIoClient
|
|
3
3
|
module Repositories
|
4
4
|
module Metrics
|
5
5
|
class MemoryRepository
|
6
|
-
def initialize(_ = nil, adapter
|
6
|
+
def initialize(_ = nil, adapter)
|
7
7
|
@counts = []
|
8
8
|
@latencies = []
|
9
9
|
@gauges = []
|
10
|
-
|
11
|
-
@config = config
|
12
10
|
end
|
13
11
|
|
14
12
|
def add_count(counter, delta)
|
@@ -7,13 +7,12 @@ module SplitIoClient
|
|
7
7
|
def_delegators :@adapter, :add_count, :add_latency, :add_gauge, :counts, :latencies, :gauges,
|
8
8
|
:clear_counts, :clear_latencies, :clear_gauges, :clear
|
9
9
|
|
10
|
-
def initialize(adapter
|
11
|
-
@config = config
|
10
|
+
def initialize(adapter)
|
12
11
|
@adapter = case adapter.class.to_s
|
13
12
|
when 'SplitIoClient::Cache::Adapters::MemoryAdapter'
|
14
|
-
Repositories::Metrics::MemoryRepository.new(adapter
|
13
|
+
Repositories::Metrics::MemoryRepository.new(adapter)
|
15
14
|
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
|
16
|
-
Repositories::Metrics::RedisRepository.new(adapter
|
15
|
+
Repositories::Metrics::RedisRepository.new(adapter)
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
@@ -12,11 +12,11 @@ module SplitIoClient
|
|
12
12
|
protected
|
13
13
|
|
14
14
|
def namespace_key(key = '')
|
15
|
-
"#{
|
15
|
+
"#{SplitIoClient.configuration.redis_namespace}#{key}"
|
16
16
|
end
|
17
17
|
|
18
18
|
def impressions_metrics_key(key)
|
19
|
-
namespace_key("/#{
|
19
|
+
namespace_key("/#{SplitIoClient.configuration.language}-#{SplitIoClient.configuration.version}/#{SplitIoClient.configuration.machine_ip}/#{key}")
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -8,10 +8,8 @@ module SplitIoClient
|
|
8
8
|
|
9
9
|
attr_reader :adapter
|
10
10
|
|
11
|
-
def initialize(adapter
|
11
|
+
def initialize(adapter)
|
12
12
|
@adapter = adapter
|
13
|
-
@config = config
|
14
|
-
|
15
13
|
@adapter.set_string(namespace_key('.splits.till'), '-1')
|
16
14
|
@adapter.initialize_map(namespace_key('.segments.registered'))
|
17
15
|
end
|
@@ -2,9 +2,8 @@ module SplitIoClient
|
|
2
2
|
class ImpressionRouter
|
3
3
|
attr_reader :router_thread
|
4
4
|
|
5
|
-
def initialize
|
6
|
-
@
|
7
|
-
@listener = config.impression_listener
|
5
|
+
def initialize
|
6
|
+
@listener = SplitIoClient.configuration.impression_listener
|
8
7
|
|
9
8
|
return unless @listener
|
10
9
|
|
@@ -45,12 +44,12 @@ module SplitIoClient
|
|
45
44
|
end
|
46
45
|
|
47
46
|
def router_thread
|
48
|
-
|
47
|
+
SplitIoClient.configuration.threads[:impression_router] = Thread.new do
|
49
48
|
loop do
|
50
49
|
begin
|
51
50
|
@listener.log(@queue.pop)
|
52
51
|
rescue StandardError => error
|
53
|
-
|
52
|
+
SplitIoClient.configuration.log_found_exception(__method__.to_s, error)
|
54
53
|
end
|
55
54
|
end
|
56
55
|
end
|
@@ -2,9 +2,8 @@ module SplitIoClient
|
|
2
2
|
module Cache
|
3
3
|
module Senders
|
4
4
|
class EventsSender
|
5
|
-
def initialize(events_repository,
|
5
|
+
def initialize(events_repository, api_key)
|
6
6
|
@events_repository = events_repository
|
7
|
-
@config = config
|
8
7
|
@api_key = api_key
|
9
8
|
end
|
10
9
|
|
@@ -25,21 +24,21 @@ module SplitIoClient
|
|
25
24
|
private
|
26
25
|
|
27
26
|
def events_thread
|
28
|
-
|
29
|
-
|
27
|
+
SplitIoClient.configuration.threads[:events_sender] = Thread.new do
|
28
|
+
SplitIoClient.configuration.logger.info('Starting events service')
|
30
29
|
|
31
30
|
loop do
|
32
31
|
post_events
|
33
32
|
|
34
|
-
sleep(SplitIoClient::Utilities.randomize_interval(
|
33
|
+
sleep(SplitIoClient::Utilities.randomize_interval(SplitIoClient.configuration.events_push_rate))
|
35
34
|
end
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
38
|
def post_events
|
40
|
-
SplitIoClient::Api::Events.new(@api_key, @
|
39
|
+
SplitIoClient::Api::Events.new(@api_key, @events_repository.clear).post
|
41
40
|
rescue StandardError => error
|
42
|
-
|
41
|
+
SplitIoClient.configuration.log_found_exception(__method__.to_s, error)
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
@@ -2,15 +2,14 @@ module SplitIoClient
|
|
2
2
|
module Cache
|
3
3
|
module Senders
|
4
4
|
class ImpressionsSender
|
5
|
-
def initialize(impressions_repository,
|
5
|
+
def initialize(impressions_repository, api_key)
|
6
6
|
@impressions_repository = impressions_repository
|
7
|
-
@config = config
|
8
7
|
@api_key = api_key
|
9
8
|
end
|
10
9
|
|
11
10
|
def call
|
12
|
-
if
|
13
|
-
|
11
|
+
if SplitIoClient.configuration.disable_impressions
|
12
|
+
SplitIoClient.configuration.logger.info('Disabling impressions service by config')
|
14
13
|
return
|
15
14
|
end
|
16
15
|
|
@@ -30,14 +29,14 @@ module SplitIoClient
|
|
30
29
|
private
|
31
30
|
|
32
31
|
def impressions_thread
|
33
|
-
|
32
|
+
SplitIoClient.configuration.threads[:impressions_sender] = Thread.new do
|
34
33
|
begin
|
35
|
-
|
34
|
+
SplitIoClient.configuration.logger.info('Starting impressions service')
|
36
35
|
|
37
36
|
loop do
|
38
37
|
post_impressions
|
39
38
|
|
40
|
-
sleep(SplitIoClient::Utilities.randomize_interval(
|
39
|
+
sleep(SplitIoClient::Utilities.randomize_interval(SplitIoClient.configuration.impressions_refresh_rate))
|
41
40
|
end
|
42
41
|
rescue SplitIoClient::ImpressionShutdownException
|
43
42
|
post_impressions
|
@@ -50,7 +49,7 @@ module SplitIoClient
|
|
50
49
|
def post_impressions
|
51
50
|
impressions_client.post
|
52
51
|
rescue StandardError => error
|
53
|
-
|
52
|
+
SplitIoClient.configuration.log_found_exception(__method__.to_s, error)
|
54
53
|
end
|
55
54
|
|
56
55
|
def formatted_impressions(raw_impressions = nil)
|
@@ -58,7 +57,7 @@ module SplitIoClient
|
|
58
57
|
end
|
59
58
|
|
60
59
|
def impressions_client
|
61
|
-
SplitIoClient::Api::Impressions.new(@api_key,
|
60
|
+
SplitIoClient::Api::Impressions.new(@api_key, formatted_impressions)
|
62
61
|
end
|
63
62
|
end
|
64
63
|
end
|