splitclient-rb 7.2.3-java → 7.3.0.pre.rc3-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +12 -0
- data/lib/splitclient-rb.rb +24 -9
- data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +4 -0
- data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +13 -9
- data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +8 -7
- data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +6 -3
- data/lib/splitclient-rb/cache/repositories/events_repository.rb +4 -3
- data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +8 -0
- data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +2 -0
- data/lib/splitclient-rb/cache/repositories/repository.rb +0 -4
- data/lib/splitclient-rb/cache/repositories/segments_repository.rb +20 -0
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +4 -0
- data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +1 -3
- data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +9 -0
- data/lib/splitclient-rb/clients/split_client.rb +59 -25
- data/lib/splitclient-rb/engine/api/client.rb +3 -2
- data/lib/splitclient-rb/engine/api/events.rb +10 -1
- data/lib/splitclient-rb/engine/api/impressions.rb +19 -2
- data/lib/splitclient-rb/engine/api/segments.rb +20 -18
- data/lib/splitclient-rb/engine/api/splits.rb +10 -10
- data/lib/splitclient-rb/engine/api/telemetry_api.rb +39 -0
- data/lib/splitclient-rb/engine/auth_api_client.rb +21 -8
- data/lib/splitclient-rb/engine/common/impressions_manager.rb +27 -3
- data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +3 -65
- data/lib/splitclient-rb/engine/push_manager.rb +10 -2
- data/lib/splitclient-rb/engine/sync_manager.rb +42 -20
- data/lib/splitclient-rb/engine/synchronizer.rb +13 -12
- data/lib/splitclient-rb/split_config.rb +46 -21
- data/lib/splitclient-rb/split_factory.rb +31 -13
- data/lib/splitclient-rb/split_factory_registry.rb +12 -0
- data/lib/splitclient-rb/sse/event_source/client.rb +10 -1
- data/lib/splitclient-rb/sse/notification_manager_keeper.rb +17 -3
- data/lib/splitclient-rb/sse/sse_handler.rb +10 -6
- data/lib/splitclient-rb/telemetry/domain/constants.rb +42 -0
- data/lib/splitclient-rb/telemetry/domain/structs.rb +31 -0
- data/lib/splitclient-rb/telemetry/evaluation_consumer.rb +14 -0
- data/lib/splitclient-rb/telemetry/evaluation_producer.rb +21 -0
- data/lib/splitclient-rb/telemetry/init_consumer.rb +14 -0
- data/lib/splitclient-rb/telemetry/init_producer.rb +19 -0
- data/lib/splitclient-rb/telemetry/memory/memory_evaluation_consumer.rb +32 -0
- data/lib/splitclient-rb/telemetry/memory/memory_evaluation_producer.rb +24 -0
- data/lib/splitclient-rb/telemetry/memory/memory_init_consumer.rb +28 -0
- data/lib/splitclient-rb/telemetry/memory/memory_init_producer.rb +34 -0
- data/lib/splitclient-rb/telemetry/memory/memory_runtime_consumer.rb +112 -0
- data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +81 -0
- data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +192 -0
- data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +38 -0
- data/lib/splitclient-rb/telemetry/redis/redis_init_producer.rb +37 -0
- data/lib/splitclient-rb/telemetry/redis/redis_synchronizer.rb +28 -0
- data/lib/splitclient-rb/telemetry/runtime_consumer.rb +24 -0
- data/lib/splitclient-rb/telemetry/runtime_producer.rb +24 -0
- data/lib/splitclient-rb/telemetry/storages/memory.rb +139 -0
- data/lib/splitclient-rb/telemetry/sync_task.rb +38 -0
- data/lib/splitclient-rb/telemetry/synchronizer.rb +29 -0
- data/lib/splitclient-rb/version.rb +1 -1
- metadata +26 -11
- data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +0 -163
- data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +0 -131
- data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +0 -23
- data/lib/splitclient-rb/cache/senders/metrics_sender.rb +0 -55
- data/lib/splitclient-rb/engine/api/metrics.rb +0 -61
- data/lib/splitclient-rb/engine/metrics/metrics.rb +0 -80
- data/lib/splitclient-rb/redis_metrics_fixer.rb +0 -36
@@ -28,25 +28,25 @@ module SplitIoClient
|
|
28
28
|
|
29
29
|
raise 'Invalid SDK mode' unless valid_mode
|
30
30
|
|
31
|
+
build_telemetry_components
|
32
|
+
|
31
33
|
@splits_repository = SplitsRepository.new(@config)
|
32
34
|
@segments_repository = SegmentsRepository.new(@config)
|
33
35
|
@impressions_repository = ImpressionsRepository.new(@config)
|
34
|
-
@events_repository = EventsRepository.new(@config, @api_key)
|
35
|
-
@metrics_repository = MetricsRepository.new(@config)
|
36
|
+
@events_repository = EventsRepository.new(@config, @api_key, @runtime_producer)
|
36
37
|
@sdk_blocker = SDKBlocker.new(@splits_repository, @segments_repository, @config)
|
37
|
-
@metrics = Metrics.new(100, @metrics_repository)
|
38
38
|
@impression_counter = SplitIoClient::Engine::Common::ImpressionCounter.new
|
39
|
-
@impressions_manager = SplitIoClient::Engine::Common::ImpressionManager.new(@config, @impressions_repository, @impression_counter)
|
39
|
+
@impressions_manager = SplitIoClient::Engine::Common::ImpressionManager.new(@config, @impressions_repository, @impression_counter, @runtime_producer)
|
40
|
+
@telemetry_api = SplitIoClient::Api::TelemetryApi.new(@config, @api_key, @runtime_producer)
|
41
|
+
@telemetry_synchronizer = Telemetry::Synchronizer.new(@config, @telemetry_consumers, @init_producer, repositories, @telemetry_api)
|
40
42
|
|
41
43
|
start!
|
42
44
|
|
43
|
-
@client = SplitClient.new(@api_key,
|
45
|
+
@client = SplitClient.new(@api_key, repositories, @sdk_blocker, @config, @impressions_manager, @evaluation_producer)
|
44
46
|
@manager = SplitManager.new(@splits_repository, @sdk_blocker, @config)
|
45
47
|
|
46
48
|
validate_api_key
|
47
49
|
|
48
|
-
RedisMetricsFixer.new(@metrics_repository, @config).call
|
49
|
-
|
50
50
|
register_factory
|
51
51
|
end
|
52
52
|
|
@@ -54,12 +54,18 @@ module SplitIoClient
|
|
54
54
|
if @config.localhost_mode
|
55
55
|
start_localhost_components
|
56
56
|
else
|
57
|
-
split_fetcher = SplitFetcher.new(@splits_repository, @api_key,
|
58
|
-
segment_fetcher = SegmentFetcher.new(@segments_repository, @api_key,
|
59
|
-
params = {
|
57
|
+
split_fetcher = SplitFetcher.new(@splits_repository, @api_key, config, @sdk_blocker, @runtime_producer)
|
58
|
+
segment_fetcher = SegmentFetcher.new(@segments_repository, @api_key, config, @sdk_blocker, @runtime_producer)
|
59
|
+
params = {
|
60
|
+
split_fetcher: split_fetcher,
|
61
|
+
segment_fetcher: segment_fetcher,
|
62
|
+
imp_counter: @impression_counter,
|
63
|
+
telemetry_runtime_producer: @runtime_producer,
|
64
|
+
telemetry_synchronizer: @telemetry_synchronizer
|
65
|
+
}
|
60
66
|
|
61
67
|
synchronizer = SplitIoClient::Engine::Synchronizer.new(repositories, @api_key, @config, @sdk_blocker, params)
|
62
|
-
SplitIoClient::Engine::SyncManager.new(repositories, @api_key, @config, synchronizer).start
|
68
|
+
SplitIoClient::Engine::SyncManager.new(repositories, @api_key, @config, synchronizer, @runtime_producer, @sdk_blocker, @telemetry_synchronizer).start
|
63
69
|
end
|
64
70
|
end
|
65
71
|
|
@@ -135,7 +141,6 @@ module SplitIoClient
|
|
135
141
|
segments: @segments_repository,
|
136
142
|
impressions: @impressions_repository,
|
137
143
|
events: @events_repository,
|
138
|
-
metrics: @metrics_repository
|
139
144
|
}
|
140
145
|
end
|
141
146
|
|
@@ -143,7 +148,20 @@ module SplitIoClient
|
|
143
148
|
LocalhostSplitStore.new(@splits_repository, @config, @sdk_blocker).call
|
144
149
|
|
145
150
|
# Starts thread which loops constantly and cleans up repositories to avoid memory issues in localhost mode
|
146
|
-
LocalhostRepoCleaner.new(@impressions_repository, @
|
151
|
+
LocalhostRepoCleaner.new(@impressions_repository, @events_repository, @config).call
|
147
152
|
end
|
153
|
+
|
154
|
+
def build_telemetry_components
|
155
|
+
@evaluation_consumer = Telemetry::EvaluationConsumer.new(@config)
|
156
|
+
@evaluation_producer = Telemetry::EvaluationProducer.new(@config)
|
157
|
+
|
158
|
+
@init_consumer = Telemetry::InitConsumer.new(@config)
|
159
|
+
@init_producer = Telemetry::InitProducer.new(@config)
|
160
|
+
|
161
|
+
@runtime_consumer = Telemetry::RuntimeConsumer.new(@config)
|
162
|
+
@runtime_producer = Telemetry::RuntimeProducer.new(@config)
|
163
|
+
|
164
|
+
@telemetry_consumers = { init: @init_consumer, evaluation: @evaluation_consumer, runtime: @runtime_consumer }
|
165
|
+
end
|
148
166
|
end
|
149
167
|
end
|
@@ -47,5 +47,17 @@ module SplitIoClient
|
|
47
47
|
def other_factories
|
48
48
|
return !@api_keys_hash.empty?
|
49
49
|
end
|
50
|
+
|
51
|
+
def active_factories
|
52
|
+
@api_keys_hash.length
|
53
|
+
end
|
54
|
+
|
55
|
+
def redundant_active_factories
|
56
|
+
to_return = 0
|
57
|
+
|
58
|
+
@api_keys_hash.each { |key| to_return += (key[1]-1) }
|
59
|
+
|
60
|
+
to_return
|
61
|
+
end
|
50
62
|
end
|
51
63
|
end
|
@@ -13,7 +13,7 @@ module SplitIoClient
|
|
13
13
|
KEEP_ALIVE_RESPONSE = "c\r\n:keepalive\n\n\r\n".freeze
|
14
14
|
ERROR_EVENT_TYPE = 'error'.freeze
|
15
15
|
|
16
|
-
def initialize(config, read_timeout: DEFAULT_READ_TIMEOUT)
|
16
|
+
def initialize(config, api_key, telemetry_runtime_producer, read_timeout: DEFAULT_READ_TIMEOUT)
|
17
17
|
@config = config
|
18
18
|
@read_timeout = read_timeout
|
19
19
|
@connected = Concurrent::AtomicBoolean.new(false)
|
@@ -21,6 +21,8 @@ module SplitIoClient
|
|
21
21
|
@socket = nil
|
22
22
|
@event_parser = SSE::EventSource::EventParser.new(config)
|
23
23
|
@on = { event: ->(_) {}, action: ->(_) {} }
|
24
|
+
@api_key = api_key
|
25
|
+
@telemetry_runtime_producer = telemetry_runtime_producer
|
24
26
|
|
25
27
|
yield self if block_given?
|
26
28
|
end
|
@@ -116,6 +118,7 @@ module SplitIoClient
|
|
116
118
|
|
117
119
|
if response_code == OK_CODE && !error_event
|
118
120
|
@connected.make_true
|
121
|
+
@telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::SSE_CONNECTION_ESTABLISHED, nil)
|
119
122
|
dispatch_action(Constants::PUSH_CONNECTED)
|
120
123
|
end
|
121
124
|
|
@@ -142,6 +145,10 @@ module SplitIoClient
|
|
142
145
|
req = "GET #{uri.request_uri} HTTP/1.1\r\n"
|
143
146
|
req << "Host: #{uri.host}\r\n"
|
144
147
|
req << "Accept: text/event-stream\r\n"
|
148
|
+
req << "SplitSDKVersion: #{@config.language}-#{@config.version}\r\n"
|
149
|
+
req << "SplitSDKMachineIP: #{@config.machine_ip}\r\n"
|
150
|
+
req << "SplitSDKMachineName: #{@config.machine_name}\r\n"
|
151
|
+
req << "SplitSDKClientKey: #{@api_key.split(//).last(4).join}\r\n" unless @api_key.nil?
|
145
152
|
req << "Cache-Control: no-cache\r\n\r\n"
|
146
153
|
@config.logger.debug("Request info: #{req}") if @config.debug_enabled
|
147
154
|
req
|
@@ -158,6 +165,8 @@ module SplitIoClient
|
|
158
165
|
|
159
166
|
def dispatch_error(event)
|
160
167
|
@config.logger.error("Event error: #{event.event_type}, #{event.data}")
|
168
|
+
@telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::ABLY_ERROR, event.data['code'])
|
169
|
+
|
161
170
|
if event.data['code'] >= 40_140 && event.data['code'] <= 40_149
|
162
171
|
close(Constants::PUSH_RETRYABLE_ERROR)
|
163
172
|
elsif event.data['code'] >= 40_000 && event.data['code'] <= 49_999
|
@@ -5,12 +5,17 @@ require 'concurrent'
|
|
5
5
|
module SplitIoClient
|
6
6
|
module SSE
|
7
7
|
class NotificationManagerKeeper
|
8
|
-
|
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
15
|
@publishers_pri = Concurrent::AtomicFixnum.new
|
12
16
|
@publishers_sec = Concurrent::AtomicFixnum.new
|
13
17
|
@on = { action: ->(_) {} }
|
18
|
+
@telemetry_runtime_producer = telemetry_runtime_producer
|
14
19
|
|
15
20
|
yield self if block_given?
|
16
21
|
end
|
@@ -22,6 +27,7 @@ module SplitIoClient
|
|
22
27
|
process_event_occupancy(event.channel, event.data['metrics']['publishers'])
|
23
28
|
end
|
24
29
|
rescue StandardError => e
|
30
|
+
p e
|
25
31
|
@config.logger.error(e)
|
26
32
|
end
|
27
33
|
|
@@ -34,10 +40,13 @@ module SplitIoClient
|
|
34
40
|
def process_event_control(type)
|
35
41
|
case type
|
36
42
|
when 'STREAMING_PAUSED'
|
43
|
+
@telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::STREAMING_STATUS, PAUSED)
|
37
44
|
dispatch_action(Constants::PUSH_SUBSYSTEM_DOWN)
|
38
45
|
when 'STREAMING_RESUMED'
|
46
|
+
@telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::STREAMING_STATUS, ENABLED)
|
39
47
|
dispatch_action(Constants::PUSH_SUBSYSTEM_READY) if @publisher_available.value
|
40
48
|
when 'STREAMING_DISABLED'
|
49
|
+
@telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::STREAMING_STATUS, DISABLED)
|
41
50
|
dispatch_action(Constants::PUSH_SUBSYSTEM_OFF)
|
42
51
|
else
|
43
52
|
@config.logger.error("Incorrect event type: #{incoming_notification}")
|
@@ -59,8 +68,13 @@ module SplitIoClient
|
|
59
68
|
end
|
60
69
|
|
61
70
|
def update_publishers(channel, publishers)
|
62
|
-
|
63
|
-
|
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
|
77
|
+
end
|
64
78
|
end
|
65
79
|
|
66
80
|
def are_publishers_available?
|
@@ -5,13 +5,17 @@ module SplitIoClient
|
|
5
5
|
class SSEHandler
|
6
6
|
attr_reader :sse_client
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
|
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,
|
12
|
-
@segments_worker = SplitIoClient::SSE::Workers::SegmentsWorker.new(synchronizer, config,
|
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
20
|
client.on_action { |action| process_action(action) }
|
17
21
|
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
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SplitIoClient
|
4
|
+
module Telemetry
|
5
|
+
class MemoryInitConsumer < InitConsumer
|
6
|
+
DEFAULT_VALUE = 0
|
7
|
+
|
8
|
+
def initialize(config)
|
9
|
+
@config = config
|
10
|
+
@adapter = config.telemetry_adapter
|
11
|
+
end
|
12
|
+
|
13
|
+
def non_ready_usages
|
14
|
+
find_counts(Domain::Constants::NON_READY_USAGES)
|
15
|
+
end
|
16
|
+
|
17
|
+
def bur_timeouts
|
18
|
+
find_counts(Domain::Constants::BUR_TIMEOUT)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def find_counts(action)
|
24
|
+
@adapter.factory_counters.find { |l| l[:action] == action }[:counts].value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|