splitclient-rb 7.2.2.pre.rc1-java → 7.3.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +15 -0
  3. data/CHANGES.txt +10 -0
  4. data/LICENSE +1 -1
  5. data/README.md +1 -1
  6. data/lib/splitclient-rb.rb +24 -9
  7. data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +4 -0
  8. data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +21 -9
  9. data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +10 -9
  10. data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +6 -3
  11. data/lib/splitclient-rb/cache/repositories/events_repository.rb +4 -3
  12. data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +8 -0
  13. data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +2 -0
  14. data/lib/splitclient-rb/cache/repositories/repository.rb +0 -4
  15. data/lib/splitclient-rb/cache/repositories/segments_repository.rb +20 -0
  16. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +4 -0
  17. data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +1 -3
  18. data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +9 -0
  19. data/lib/splitclient-rb/clients/split_client.rb +59 -25
  20. data/lib/splitclient-rb/constants.rb +6 -1
  21. data/lib/splitclient-rb/engine/api/client.rb +3 -2
  22. data/lib/splitclient-rb/engine/api/events.rb +10 -1
  23. data/lib/splitclient-rb/engine/api/impressions.rb +19 -2
  24. data/lib/splitclient-rb/engine/api/segments.rb +20 -18
  25. data/lib/splitclient-rb/engine/api/splits.rb +10 -10
  26. data/lib/splitclient-rb/engine/api/telemetry_api.rb +39 -0
  27. data/lib/splitclient-rb/engine/auth_api_client.rb +21 -8
  28. data/lib/splitclient-rb/engine/common/impressions_manager.rb +27 -3
  29. data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +3 -65
  30. data/lib/splitclient-rb/engine/push_manager.rb +12 -3
  31. data/lib/splitclient-rb/engine/sync_manager.rb +85 -46
  32. data/lib/splitclient-rb/engine/synchronizer.rb +14 -22
  33. data/lib/splitclient-rb/split_config.rb +46 -21
  34. data/lib/splitclient-rb/split_factory.rb +31 -13
  35. data/lib/splitclient-rb/split_factory_registry.rb +12 -0
  36. data/lib/splitclient-rb/sse/event_source/client.rb +53 -28
  37. data/lib/splitclient-rb/sse/event_source/event_parser.rb +10 -1
  38. data/lib/splitclient-rb/sse/notification_manager_keeper.rb +45 -26
  39. data/lib/splitclient-rb/sse/sse_handler.rb +16 -21
  40. data/lib/splitclient-rb/sse/workers/segments_worker.rb +5 -4
  41. data/lib/splitclient-rb/sse/workers/splits_worker.rb +6 -3
  42. data/lib/splitclient-rb/telemetry/domain/constants.rb +42 -0
  43. data/lib/splitclient-rb/telemetry/domain/structs.rb +31 -0
  44. data/lib/splitclient-rb/telemetry/evaluation_consumer.rb +14 -0
  45. data/lib/splitclient-rb/telemetry/evaluation_producer.rb +21 -0
  46. data/lib/splitclient-rb/telemetry/init_consumer.rb +14 -0
  47. data/lib/splitclient-rb/telemetry/init_producer.rb +19 -0
  48. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_consumer.rb +32 -0
  49. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_producer.rb +24 -0
  50. data/lib/splitclient-rb/telemetry/memory/memory_init_consumer.rb +28 -0
  51. data/lib/splitclient-rb/telemetry/memory/memory_init_producer.rb +34 -0
  52. data/lib/splitclient-rb/telemetry/memory/memory_runtime_consumer.rb +112 -0
  53. data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +81 -0
  54. data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +192 -0
  55. data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +38 -0
  56. data/lib/splitclient-rb/telemetry/redis/redis_init_producer.rb +37 -0
  57. data/lib/splitclient-rb/telemetry/redis/redis_synchronizer.rb +28 -0
  58. data/lib/splitclient-rb/telemetry/runtime_consumer.rb +24 -0
  59. data/lib/splitclient-rb/telemetry/runtime_producer.rb +24 -0
  60. data/lib/splitclient-rb/telemetry/storages/memory.rb +139 -0
  61. data/lib/splitclient-rb/telemetry/sync_task.rb +38 -0
  62. data/lib/splitclient-rb/telemetry/synchronizer.rb +29 -0
  63. data/lib/splitclient-rb/version.rb +1 -1
  64. metadata +26 -11
  65. data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +0 -163
  66. data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +0 -131
  67. data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +0 -23
  68. data/lib/splitclient-rb/cache/senders/metrics_sender.rb +0 -55
  69. data/lib/splitclient-rb/engine/api/metrics.rb +0 -61
  70. data/lib/splitclient-rb/engine/metrics/metrics.rb +0 -80
  71. data/lib/splitclient-rb/redis_metrics_fixer.rb +0 -36
@@ -4,6 +4,8 @@ module SplitIoClient
4
4
  module SSE
5
5
  module EventSource
6
6
  class EventParser
7
+ BAD_REQUEST_CODE = 400
8
+
7
9
  def initialize(config)
8
10
  @config = config
9
11
  end
@@ -27,10 +29,17 @@ module SplitIoClient
27
29
 
28
30
  events
29
31
  rescue StandardError => e
30
- @config.logger.error("Error during parsing a event: #{e.inspect}")
32
+ @config.logger.debug("Error during parsing a event: #{e.inspect}")
31
33
  []
32
34
  end
33
35
 
36
+ def first_event(raw_data)
37
+ raw_data.split("\n")[0].split(' ')[1].to_i
38
+ rescue StandardError => e
39
+ @config.logger.debug("Error parsing first event: #{e.inspect}")
40
+ BAD_REQUEST_CODE
41
+ end
42
+
34
43
  private
35
44
 
36
45
  def parse_event_data(data, type)
@@ -1,14 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/atomics'
3
+ require 'concurrent'
4
4
 
5
5
  module SplitIoClient
6
6
  module SSE
7
7
  class NotificationManagerKeeper
8
- def initialize(config)
8
+ DISABLED = 0
9
+ ENABLED = 1
10
+ PAUSED = 2
11
+
12
+ def initialize(config, telemetry_runtime_producer)
9
13
  @config = config
10
14
  @publisher_available = Concurrent::AtomicBoolean.new(true)
11
- @on = { occupancy: ->(_) {}, push_shutdown: ->(_) {} }
15
+ @publishers_pri = Concurrent::AtomicFixnum.new
16
+ @publishers_sec = Concurrent::AtomicFixnum.new
17
+ @on = { action: ->(_) {} }
18
+ @telemetry_runtime_producer = telemetry_runtime_producer
12
19
 
13
20
  yield self if block_given?
14
21
  end
@@ -16,19 +23,16 @@ module SplitIoClient
16
23
  def handle_incoming_occupancy_event(event)
17
24
  if event.data['type'] == 'CONTROL'
18
25
  process_event_control(event.data['controlType'])
19
- elsif event.channel == SplitIoClient::Constants::CONTROL_PRI
20
- process_event_occupancy(event.data['metrics']['publishers'])
26
+ else
27
+ process_event_occupancy(event.channel, event.data['metrics']['publishers'])
21
28
  end
22
29
  rescue StandardError => e
30
+ p e
23
31
  @config.logger.error(e)
24
32
  end
25
33
 
26
- def on_occupancy(&action)
27
- @on[:occupancy] = action
28
- end
29
-
30
- def on_push_shutdown(&action)
31
- @on[:push_shutdown] = action
34
+ def on_action(&action)
35
+ @on[:action] = action
32
36
  end
33
37
 
34
38
  private
@@ -36,35 +40,50 @@ module SplitIoClient
36
40
  def process_event_control(type)
37
41
  case type
38
42
  when 'STREAMING_PAUSED'
39
- dispatch_occupancy_event(false)
43
+ @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::STREAMING_STATUS, PAUSED)
44
+ dispatch_action(Constants::PUSH_SUBSYSTEM_DOWN)
40
45
  when 'STREAMING_RESUMED'
41
- dispatch_occupancy_event(true) if @publisher_available.value
46
+ @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::STREAMING_STATUS, ENABLED)
47
+ dispatch_action(Constants::PUSH_SUBSYSTEM_READY) if @publisher_available.value
42
48
  when 'STREAMING_DISABLED'
43
- dispatch_push_shutdown
49
+ @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::STREAMING_STATUS, DISABLED)
50
+ dispatch_action(Constants::PUSH_SUBSYSTEM_OFF)
44
51
  else
45
52
  @config.logger.error("Incorrect event type: #{incoming_notification}")
46
53
  end
47
54
  end
48
55
 
49
- def process_event_occupancy(publishers)
50
- @config.logger.debug("Occupancy process event with #{publishers} publishers") if @config.debug_enabled
51
- if publishers <= 0 && @publisher_available.value
56
+ def process_event_occupancy(channel, publishers)
57
+ @config.logger.debug("Processed occupancy event with #{publishers} publishers. Channel: #{channel}")
58
+
59
+ update_publishers(channel, publishers)
60
+
61
+ if !are_publishers_available? && @publisher_available.value
52
62
  @publisher_available.make_false
53
- dispatch_occupancy_event(false)
54
- elsif publishers >= 1 && !@publisher_available.value
63
+ dispatch_action(Constants::PUSH_SUBSYSTEM_DOWN)
64
+ elsif are_publishers_available? && !@publisher_available.value
55
65
  @publisher_available.make_true
56
- dispatch_occupancy_event(true)
66
+ dispatch_action(Constants::PUSH_SUBSYSTEM_READY)
67
+ end
68
+ end
69
+
70
+ def update_publishers(channel, publishers)
71
+ if channel == Constants::CONTROL_PRI
72
+ @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::OCCUPANCY_PRI, publishers)
73
+ @publishers_pri.value = publishers
74
+ elsif channel == Constants::CONTROL_SEC
75
+ @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::OCCUPANCY_SEC, publishers)
76
+ @publishers_sec.value = publishers
57
77
  end
58
78
  end
59
79
 
60
- def dispatch_occupancy_event(push_enable)
61
- @config.logger.debug("Dispatching occupancy event with publisher avaliable: #{push_enable}")
62
- @on[:occupancy].call(push_enable)
80
+ def are_publishers_available?
81
+ @publishers_pri.value.positive? || @publishers_sec.value.positive?
63
82
  end
64
83
 
65
- def dispatch_push_shutdown
66
- @config.logger.debug('Dispatching push shutdown')
67
- @on[:push_shutdown].call
84
+ def dispatch_action(action)
85
+ @config.logger.debug("Dispatching action: #{action}")
86
+ @on[:action].call(action)
68
87
  end
69
88
  end
70
89
  end
@@ -5,19 +5,22 @@ module SplitIoClient
5
5
  class SSEHandler
6
6
  attr_reader :sse_client
7
7
 
8
- def initialize(config, synchronizer, splits_repository, segments_repository, notification_manager_keeper)
9
- @config = config
8
+ def initialize(metadata,
9
+ synchronizer,
10
+ repositories,
11
+ notification_manager_keeper,
12
+ telemetry_runtime_producer)
13
+ @config = metadata[:config]
10
14
  @notification_manager_keeper = notification_manager_keeper
11
- @splits_worker = SplitIoClient::SSE::Workers::SplitsWorker.new(synchronizer, config, splits_repository)
12
- @segments_worker = SplitIoClient::SSE::Workers::SegmentsWorker.new(synchronizer, config, segments_repository)
13
- @notification_processor = SplitIoClient::SSE::NotificationProcessor.new(config, @splits_worker, @segments_worker)
14
- @sse_client = SSE::EventSource::Client.new(@config) do |client|
15
+ @splits_worker = SplitIoClient::SSE::Workers::SplitsWorker.new(synchronizer, @config, repositories[:splits])
16
+ @segments_worker = SplitIoClient::SSE::Workers::SegmentsWorker.new(synchronizer, @config, repositories[:segments])
17
+ @notification_processor = SplitIoClient::SSE::NotificationProcessor.new(@config, @splits_worker, @segments_worker)
18
+ @sse_client = SSE::EventSource::Client.new(@config, metadata[:api_key], telemetry_runtime_producer) do |client|
15
19
  client.on_event { |event| handle_incoming_message(event) }
16
- client.on_connected { process_connected }
17
- client.on_disconnect { |reconnect| process_disconnect(reconnect) }
20
+ client.on_action { |action| process_action(action) }
18
21
  end
19
22
 
20
- @on = { connected: ->(_) {}, disconnect: ->(_) {} }
23
+ @on = { action: ->(_) {} }
21
24
 
22
25
  yield self if block_given?
23
26
  end
@@ -48,22 +51,14 @@ module SplitIoClient
48
51
  @segments_worker.stop
49
52
  end
50
53
 
51
- def on_connected(&action)
52
- @on[:connected] = action
53
- end
54
-
55
- def on_disconnect(&action)
56
- @on[:disconnect] = action
57
- end
58
-
59
- def process_disconnect(reconnect)
60
- @on[:disconnect].call(reconnect)
54
+ def on_action(&action)
55
+ @on[:action] = action
61
56
  end
62
57
 
63
58
  private
64
59
 
65
- def process_connected
66
- @on[:connected].call
60
+ def process_action(action)
61
+ @on[:action].call(action)
67
62
  end
68
63
 
69
64
  def handle_incoming_message(notification)
@@ -48,12 +48,13 @@ module SplitIoClient
48
48
  def perform
49
49
  while (item = @queue.pop)
50
50
  segment_name = item[:segment_name]
51
- change_number = item[:change_number]
52
- since = @segments_repository.get_change_number(segment_name)
51
+ cn = item[:change_number]
52
+ @config.logger.debug("SegmentsWorker change_number dequeue #{segment_name}, #{cn}")
53
53
 
54
- unless since >= change_number
55
- @config.logger.debug("SegmentsWorker fetch_segment with #{since}")
54
+ attempt = 0
55
+ while cn > @segments_repository.get_change_number(segment_name).to_i && attempt <= Workers::MAX_RETRIES_ALLOWED
56
56
  @synchronizer.fetch_segment(segment_name)
57
+ attempt += 1
57
58
  end
58
59
  end
59
60
  end
@@ -3,6 +3,8 @@
3
3
  module SplitIoClient
4
4
  module SSE
5
5
  module Workers
6
+ MAX_RETRIES_ALLOWED = 10
7
+
6
8
  class SplitsWorker
7
9
  def initialize(synchronizer, config, splits_repository)
8
10
  @synchronizer = synchronizer
@@ -59,11 +61,12 @@ module SplitIoClient
59
61
 
60
62
  def perform
61
63
  while (change_number = @queue.pop)
62
- since = @splits_repository.get_change_number
64
+ @config.logger.debug("SplitsWorker change_number dequeue #{change_number}")
63
65
 
64
- unless since.to_i >= change_number
65
- @config.logger.debug("SplitsWorker fetch_splits with #{since}")
66
+ attempt = 0
67
+ while change_number > @splits_repository.get_change_number.to_i && attempt <= Workers::MAX_RETRIES_ALLOWED
66
68
  @synchronizer.fetch_splits
69
+ attempt += 1
67
70
  end
68
71
  end
69
72
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ module Domain
6
+ class Constants
7
+ BUR_TIMEOUT = 'bur_timeout'
8
+ NON_READY_USAGES = 'non_ready_usages'
9
+
10
+ IMPRESSIONS_DROPPED = 'impressions_dropped'
11
+ IMPRESSIONS_DEDUPE = 'impressions_deduped'
12
+ IMPRESSIONS_QUEUED = 'impressions_queued'
13
+
14
+ EVENTS_DROPPED = 'events_dropped'
15
+ EVENTS_QUEUED = 'events_queued'
16
+
17
+ SPLIT_SYNC = 'split_sync'
18
+ SEGMENT_SYNC = 'segment_sync'
19
+ IMPRESSIONS_SYNC = 'impressions_sync'
20
+ IMPRESSION_COUNT_SYNC = 'impression_count_sync'
21
+ EVENT_SYNC = 'event_sync'
22
+ TELEMETRY_SYNC = 'telemetry_sync'
23
+ TOKEN_SYNC = 'token_sync'
24
+
25
+ SSE_CONNECTION_ESTABLISHED = 0
26
+ OCCUPANCY_PRI = 10
27
+ OCCUPANCY_SEC = 20
28
+ STREAMING_STATUS = 30
29
+ CONNECTION_ERROR = 40
30
+ TOKEN_REFRESH = 50
31
+ ABLY_ERROR = 60
32
+ SYNC_MODE = 70
33
+
34
+ TREATMENT = 'treatment'
35
+ TREATMENTS = 'treatments'
36
+ TREATMENT_WITH_CONFIG = 'treatment_with_config'
37
+ TREATMENTS_WITH_CONFIG = 'treatments_with_config'
38
+ TRACK = 'track'
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ # sp: splits, se: segments, im: impressions, ic:impression count, ev: events, te: telemetry, to: token.
6
+ LastSynchronization = Struct.new(:sp, :se, :im, :ic, :ev, :te, :to)
7
+ HttpErrors = Struct.new(:sp, :se, :im, :ic, :ev, :te, :to)
8
+ HttpLatencies = Struct.new(:sp, :se, :im, :ic, :ev, :te, :to)
9
+
10
+ # sp: splits, se: segmentos, im: impressions, ev: events, t: telemetry
11
+ Rates = Struct.new(:sp, :se, :im, :ev, :te)
12
+
13
+ # s: sdkUrl, e: eventsUrl, a: authUrl, st: streamUrl, t: telemetryUrl
14
+ UrlOverrides = Struct.new(:s, :e, :a, :st, :t)
15
+
16
+ # om: operationMode, se: streamingEnabled, st: storage, rr: refreshRate, uo: urlOverrides, iq: impressionsQueueSize,
17
+ # eq: eventsQueueSize, im: impressionsMode, il: impressionListenerEnabled, hp: httpProxyDetected, af: activeFactories,
18
+ # rf: redundantActiveFactories, tr: timeUntilSdkReady, bt: burTimeouts, nr: sdkNotReadyUsage, t: tags, i: integrations
19
+ ConfigInit = Struct.new(:om, :st, :af, :rf, :t, :se, :rr, :uo, :iq, :eq, :im, :il, :hp, :tr, :bt, :nr, :i)
20
+
21
+ # ls: lastSynchronization, ml: clientMethodLatencies, me: clientMethodExceptions, he: httpErros, hl: httpLatencies,
22
+ # tr: tokenRefreshes, ar: authRejections, iq: impressionsQueued, ide: impressionsDeduped, idr: impressionsDropped,
23
+ # spc: splitsCount, sec: segmentCount, skc: segmentKeyCount, sl: sessionLengthMs, eq: eventsQueued, ed: eventsDropped,
24
+ # se: streamingEvents, t: tags
25
+ Usage = Struct.new(:ls, :ml, :me, :he, :hl, :tr, :ar, :iq, :ide, :idr, :spc, :sec, :skc, :sl, :eq, :ed, :se, :t)
26
+
27
+ # t: treatment, ts: treatments, tc: treatmentWithConfig, tcs: treatmentsWithConfig, tr: track
28
+ ClientMethodLatencies = Struct.new(:t, :ts, :tc, :tcs, :tr)
29
+ ClientMethodExceptions = Struct.new(:t, :ts, :tc, :tcs, :tr)
30
+ end
31
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class EvaluationConsumer
6
+ extend Forwardable
7
+ def_delegators :@evaluation, :pop_latencies, :pop_exceptions
8
+
9
+ def initialize(config)
10
+ @evaluation = SplitIoClient::Telemetry::MemoryEvaluationConsumer.new(config)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class EvaluationProducer
6
+ extend Forwardable
7
+ def_delegators :@evaluation,
8
+ :record_latency,
9
+ :record_exception
10
+
11
+ def initialize(config)
12
+ @evaluation = case config.telemetry_adapter.class.to_s
13
+ when 'SplitIoClient::Cache::Adapters::RedisAdapter'
14
+ SplitIoClient::Telemetry::RedisEvaluationProducer.new(config)
15
+ else
16
+ SplitIoClient::Telemetry::MemoryEvaluationProducer.new(config)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class InitConsumer
6
+ extend Forwardable
7
+ def_delegators :@init, :non_ready_usages, :bur_timeouts
8
+
9
+ def initialize(config)
10
+ @init = SplitIoClient::Telemetry::MemoryInitConsumer.new(config)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class InitProducer
6
+ extend Forwardable
7
+ def_delegators :@init, :record_config, :record_non_ready_usages, :record_bur_timeout
8
+
9
+ def initialize(config)
10
+ @init = case config.telemetry_adapter.class.to_s
11
+ when 'SplitIoClient::Cache::Adapters::RedisAdapter'
12
+ SplitIoClient::Telemetry::RedisInitProducer.new(config)
13
+ else
14
+ SplitIoClient::Telemetry::MemoryInitProducer.new(config)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class MemoryEvaluationConsumer < EvaluationConsumer
6
+ def initialize(config)
7
+ @config = config
8
+ @adapter = config.telemetry_adapter
9
+ end
10
+
11
+ def pop_latencies
12
+ to_return = @adapter.latencies.each_with_object({}) do |latency, memo|
13
+ memo[latency[:method]] = latency[:latencies]
14
+ end
15
+
16
+ @adapter.init_latencies
17
+
18
+ to_return
19
+ end
20
+
21
+ def pop_exceptions
22
+ to_return = @adapter.exceptions.each_with_object({}) do |exception, memo|
23
+ memo[exception[:method]] = exception[:exceptions].value
24
+ end
25
+
26
+ @adapter.init_exceptions
27
+
28
+ to_return
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class MemoryEvaluationProducer < EvaluationProducer
6
+ def initialize(config)
7
+ @config = config
8
+ @adapter = config.telemetry_adapter
9
+ end
10
+
11
+ def record_latency(method, bucket)
12
+ @adapter.latencies.find { |l| l[:method] == method }[:latencies][bucket] += 1
13
+ rescue StandardError => error
14
+ @config.log_found_exception(__method__.to_s, error)
15
+ end
16
+
17
+ def record_exception(method)
18
+ @adapter.exceptions.find { |l| l[:method] == method }[:exceptions].increment
19
+ rescue StandardError => error
20
+ @config.log_found_exception(__method__.to_s, error)
21
+ end
22
+ end
23
+ end
24
+ end