splitclient-rb 6.4.1.pre.rc1-java → 6.4.1.pre.rc2-java

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: 0340c9f45b6fc4c14c474fbbcd5d7e0353854841
4
- data.tar.gz: b10f424f243f68d30ae2c72538fbc399c9bf2b9d
3
+ metadata.gz: dad37daa663863c2fcf4ccf32ed89e3cd9ea2990
4
+ data.tar.gz: 3ce6331c5a3db0517531e656fe1c7cb0e1ea6f0c
5
5
  SHA512:
6
- metadata.gz: 8b2e1794e636094b2d23dcd40e1b0a54669359ae3a9f7d256f75594d3eef91df3a1b3f16496244025a5eb27fdece01bcf9ab6c4771b140f2cfd0977d8a4bf9d8
7
- data.tar.gz: fa055019094a1ae9c9da286693471b27de657825183fda21dd40f7cbbbd85177fd84412b96752dba8c901605dfb0447f85d35f6604f14f6987c58b83a7c68855
6
+ metadata.gz: e6a5edb228c15ff9e18fc93e271715a7a53a0e53e49b7b79e6c4985cfaec0d0acb049533e063d1d09723dff353f6eb4f46e7fa950c2d54eaa820441cc97186ac
7
+ data.tar.gz: e465c1d4d04702c9ee4067347fd85c0fcd6e3b3136d117ef9287fa97a17dc5a7ee3d5c26c0e03652abe7444b1f2c252d777ef5df9d8bb3a879035ad2c2589670
@@ -84,6 +84,9 @@ require 'splitclient-rb/engine/models/treatment'
84
84
  require 'splitclient-rb/utilitites'
85
85
  require 'splitclient-rb/validators'
86
86
 
87
+ # redis metrics fixer
88
+ require 'splitclient-rb/redis_metrics_fixer'
89
+
87
90
  # C extension
88
91
  require 'murmurhash/murmurhash_mri'
89
92
 
@@ -56,10 +56,14 @@ module SplitIoClient
56
56
  end
57
57
 
58
58
  def find_strings_by_prefix(prefix)
59
+ find_strings_by_pattern("#{prefix}*")
60
+ end
61
+
62
+ def find_strings_by_pattern(pattern)
59
63
  memo = { items: [], cursor: 0 }
60
64
 
61
65
  loop do
62
- memo[:cursor], items = @redis.scan(memo[:cursor], match: "#{prefix}*", count: SCAN_SLICE)
66
+ memo[:cursor], items = @redis.scan(memo[:cursor], match: "#{pattern}", count: SCAN_SLICE)
63
67
 
64
68
  memo[:items].push(*items)
65
69
 
@@ -23,27 +23,14 @@ module SplitIoClient
23
23
  end
24
24
 
25
25
  def add_latency(operation, time_in_ms, binary_search)
26
- operation_hash = @latencies.find { |l| l[:operation] == operation }
27
- if operation_hash.nil?
28
- latencies_for_op = (OPERATIONS.include?(operation)) ? build_latencies_for_op(operation, binary_search.add_latency_millis(time_in_ms, true)) : [time_in_ms]
29
- @latencies << { operation: operation, latencies: latencies_for_op }
26
+ if (OPERATIONS.include?(operation))
27
+ index = binary_search.add_latency_millis(time_in_ms, true)
28
+ increase_latency_bucket(operation, index)
30
29
  else
31
- (OPERATIONS.include?(operation)) ? increase_latencies_for_op(operation_hash[:latencies], binary_search.add_latency_millis(time_in_ms, true)) : operation_hash[:latencies].push(time_in_ms)
30
+ concatenate_latency(operation, time_in_ms)
32
31
  end
33
32
  end
34
33
 
35
- def build_latencies_for_op(operation, index)
36
- latencies_array = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
37
-
38
- latencies_array[index] = 1
39
-
40
- latencies_array
41
- end
42
-
43
- def increase_latencies_for_op(operation_latencies_array, index)
44
- operation_latencies_array[index] += 1
45
- end
46
-
47
34
  def add_gauge(gauge, value)
48
35
  gauge_hash = @gauges.find { |g| g[:name] == gauge }
49
36
  if gauge_hash.nil?
@@ -71,6 +58,10 @@ module SplitIoClient
71
58
  # TODO
72
59
  end
73
60
 
61
+ def fix_latencies
62
+ # NOOP
63
+ end
64
+
74
65
  def clear_counts
75
66
  @counts = []
76
67
  end
@@ -134,6 +125,34 @@ module SplitIoClient
134
125
  @value = 0
135
126
  end
136
127
  end
128
+
129
+ private
130
+
131
+ def increase_latency_bucket(operation, index)
132
+ operation_latencies = find_operation_latencies(operation)
133
+
134
+ if (operation_latencies.nil?)
135
+ latencies_array = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
136
+ latencies_array[index] = 1
137
+ @latencies << { operation: operation, latencies: latencies_array }
138
+ else
139
+ operation_latencies[:latencies][index] += 1
140
+ end
141
+ end
142
+
143
+ def concatenate_latency(operation, time_in_ms)
144
+ operation_latencies = find_operation_latencies(operation)
145
+
146
+ if (operation_latencies.nil?)
147
+ @latencies << { operation: operation, latencies: [time_in_ms] }
148
+ else
149
+ operation_latencies[:latencies].push(time_in_ms)
150
+ end
151
+ end
152
+
153
+ def find_operation_latencies(operation)
154
+ @latencies.find { |l| l[:operation] == operation }
155
+ end
137
156
  end
138
157
  end
139
158
  end
@@ -38,30 +38,16 @@ module SplitIoClient
38
38
  keys = @adapter.find_strings_by_prefix(impressions_metrics_key('latency'))
39
39
  return [] if keys.empty?
40
40
 
41
- found_latencies = @adapter.multiple_strings(keys).map do |name, data|
42
- [name.gsub(impressions_metrics_key('latency.'), ''), data]
43
- end.to_h
44
-
45
- collected_latencies = {}
46
-
47
- found_latencies.each do |key, value|
48
- operation, bucket = key.split('.bucket.')
49
- collected_latencies[operation] = {} unless collected_latencies[operation]
50
- collected_latencies[operation].merge!({bucket => value})
51
- end
52
-
53
- latencies = {}
41
+ collected_latencies = collect_latencies(keys)
54
42
 
55
- collected_latencies.keys.each do |operation|
56
- latencies_array = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
43
+ collected_latencies.keys.each_with_object({}) do |operation, latencies|
44
+ operation_latencies = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
57
45
  collected_latencies[operation].each do |bucket, value|
58
- latencies_array[bucket.to_i] = value.to_i
46
+ operation_latencies[bucket.to_i] = value.to_i
59
47
  end
60
48
 
61
- latencies[operation] = latencies_array
49
+ latencies[operation] = operation_latencies
62
50
  end
63
-
64
- latencies
65
51
  end
66
52
 
67
53
  def gauges
@@ -78,6 +64,35 @@ module SplitIoClient
78
64
  @adapter.delete(keys)
79
65
  end
80
66
 
67
+ # introduced to fix incorrect latencies
68
+ def fix_latencies
69
+ keys =[]
70
+
71
+ 23.times do |index|
72
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix("sdk.get_treatment.#{index}"))
73
+ end
74
+
75
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('sdk.get_treatments'))
76
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('sdk.get_treatment_with_config'))
77
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('sdk.get_treatments_with_config'))
78
+
79
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('*.time'))
80
+
81
+ SplitIoClient.configuration.logger.info("Found incorrect latency keys, deleting. Keys: #{keys}") unless keys.size == 0
82
+
83
+ keys.each_slice(500) do |chunk|
84
+ @adapter.pipelined do
85
+ chunk.each do |key|
86
+ @adapter.delete key
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ def latencies_to_be_deleted_key_pattern_prefix(key)
93
+ "#{SplitIoClient.configuration.redis_namespace}/#{SplitIoClient.configuration.language}-*/latency.#{key}"
94
+ end
95
+
81
96
  def clear_gauges
82
97
  # TODO
83
98
  end
@@ -87,6 +102,22 @@ module SplitIoClient
87
102
  clear_latencies
88
103
  clear_gauges
89
104
  end
105
+
106
+ private
107
+
108
+ def find_latencies(keys)
109
+ @adapter.multiple_strings(keys).map do |name, data|
110
+ [name.gsub(impressions_metrics_key('latency.'), ''), data]
111
+ end.to_h
112
+ end
113
+
114
+ def collect_latencies(keys)
115
+ find_latencies(keys).each_with_object({}) do |(key, value), collected_latencies|
116
+ operation, bucket = key.split('.bucket.')
117
+ collected_latencies[operation] = {} unless collected_latencies[operation]
118
+ collected_latencies[operation].merge!({bucket => value})
119
+ end
120
+ end
90
121
  end
91
122
  end
92
123
  end
@@ -5,7 +5,7 @@ module SplitIoClient
5
5
  class MetricsRepository < Repository
6
6
  extend Forwardable
7
7
  def_delegators :@adapter, :add_count, :add_latency, :add_gauge, :counts, :latencies, :gauges,
8
- :clear_counts, :clear_latencies, :clear_gauges, :clear
8
+ :clear_counts, :clear_latencies, :clear_gauges, :clear, :fix_latencies
9
9
 
10
10
  def initialize(adapter)
11
11
  @adapter = case adapter.class.to_s
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ class RedisMetricsFixer
5
+ def initialize(metrics_repository)
6
+ @metrics_repository = metrics_repository
7
+ end
8
+
9
+ def call
10
+ return if ENV['SPLITCLIENT_ENV'] == 'test' || SplitIoClient.configuration.mode == :standalone
11
+
12
+ fixer_thread
13
+
14
+ if defined?(PhusionPassenger)
15
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
16
+ fixer_thread if forked
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def fixer_thread
24
+ Thread.new do
25
+ begin
26
+ SplitIoClient.configuration.logger.info('Starting redis metrics fixer')
27
+
28
+ @metrics_repository.fix_latencies
29
+ rescue StandardError => error
30
+ SplitIoClient.configuration.log_found_exception(__method__.to_s, error)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -42,6 +42,8 @@ module SplitIoClient
42
42
 
43
43
  validate_api_key
44
44
 
45
+ RedisMetricsFixer.new(@metrics_repository).call
46
+
45
47
  @sdk_blocker.block if @sdk_blocker
46
48
  end
47
49
 
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '6.4.1.pre.rc1'
2
+ VERSION = '6.4.1.pre.rc2'
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: 6.4.1.pre.rc1
4
+ version: 6.4.1.pre.rc2
5
5
  platform: java
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-24 00:00:00.000000000 Z
11
+ date: 2019-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -374,6 +374,7 @@ files:
374
374
  - lib/splitclient-rb/localhost_utils.rb
375
375
  - lib/splitclient-rb/managers/localhost_split_manager.rb
376
376
  - lib/splitclient-rb/managers/split_manager.rb
377
+ - lib/splitclient-rb/redis_metrics_fixer.rb
377
378
  - lib/splitclient-rb/split_config.rb
378
379
  - lib/splitclient-rb/split_factory.rb
379
380
  - lib/splitclient-rb/split_factory_builder.rb