splitclient-rb 7.2.3.pre.rc2-java → 7.3.0.pre.rc1-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/CHANGES.txt +6 -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 +8 -7
- data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +7 -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 +24 -9
- 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
@@ -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
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SplitIoClient
|
4
|
+
module Telemetry
|
5
|
+
class MemoryInitProducer < InitProducer
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
@adapter = config.telemetry_adapter
|
9
|
+
end
|
10
|
+
|
11
|
+
def record_config
|
12
|
+
# no op
|
13
|
+
end
|
14
|
+
|
15
|
+
def record_bur_timeout
|
16
|
+
find_factory_counters(Domain::Constants::BUR_TIMEOUT)[:counts].increment
|
17
|
+
rescue StandardError => error
|
18
|
+
@config.log_found_exception(__method__.to_s, error)
|
19
|
+
end
|
20
|
+
|
21
|
+
def record_non_ready_usages
|
22
|
+
find_factory_counters(Domain::Constants::NON_READY_USAGES)[:counts].increment
|
23
|
+
rescue StandardError => error
|
24
|
+
@config.log_found_exception(__method__.to_s, error)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def find_factory_counters(action)
|
30
|
+
@adapter.factory_counters.find { |l| l[:action] == action }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SplitIoClient
|
4
|
+
module Telemetry
|
5
|
+
class MemoryRuntimeConsumer < RuntimeConsumer
|
6
|
+
DEFAULT_VALUE = 0
|
7
|
+
|
8
|
+
def initialize(config)
|
9
|
+
@config = config
|
10
|
+
@adapter = config.telemetry_adapter
|
11
|
+
end
|
12
|
+
|
13
|
+
def pop_tags
|
14
|
+
to_return = @adapter.tags
|
15
|
+
|
16
|
+
@adapter.init_tags
|
17
|
+
|
18
|
+
to_return
|
19
|
+
end
|
20
|
+
|
21
|
+
def impressions_stats(type)
|
22
|
+
@adapter.impressions_data_records.find { |l| l[:type] == type }[:value].value
|
23
|
+
end
|
24
|
+
|
25
|
+
def events_stats(type)
|
26
|
+
@adapter.events_data_records.find { |l| l[:type] == type }[:value].value
|
27
|
+
end
|
28
|
+
|
29
|
+
def last_synchronizations
|
30
|
+
splits = find_last_synchronization(Domain::Constants::SPLIT_SYNC)
|
31
|
+
segments = find_last_synchronization(Domain::Constants::SEGMENT_SYNC)
|
32
|
+
impressions = find_last_synchronization(Domain::Constants::IMPRESSIONS_SYNC)
|
33
|
+
imp_count = find_last_synchronization(Domain::Constants::IMPRESSION_COUNT_SYNC)
|
34
|
+
events = find_last_synchronization(Domain::Constants::EVENT_SYNC)
|
35
|
+
telemetry = find_last_synchronization(Domain::Constants::TELEMETRY_SYNC)
|
36
|
+
token = find_last_synchronization(Domain::Constants::TOKEN_SYNC)
|
37
|
+
|
38
|
+
LastSynchronization.new(splits, segments, impressions, imp_count, events, telemetry, token)
|
39
|
+
end
|
40
|
+
|
41
|
+
def pop_http_errors
|
42
|
+
splits = find_http_errors(Domain::Constants::SPLIT_SYNC)
|
43
|
+
segments = find_http_errors(Domain::Constants::SEGMENT_SYNC)
|
44
|
+
impressions = find_http_errors(Domain::Constants::IMPRESSIONS_SYNC)
|
45
|
+
imp_count = find_http_errors(Domain::Constants::IMPRESSION_COUNT_SYNC)
|
46
|
+
events = find_http_errors(Domain::Constants::EVENT_SYNC)
|
47
|
+
telemetry = find_http_errors(Domain::Constants::TELEMETRY_SYNC)
|
48
|
+
token = find_http_errors(Domain::Constants::TOKEN_SYNC)
|
49
|
+
|
50
|
+
@adapter.init_http_errors
|
51
|
+
|
52
|
+
HttpErrors.new(splits, segments, impressions, imp_count, events, telemetry, token)
|
53
|
+
end
|
54
|
+
|
55
|
+
def pop_http_latencies
|
56
|
+
splits = find_http_latencies(Domain::Constants::SPLIT_SYNC)
|
57
|
+
segments = find_http_latencies(Domain::Constants::SEGMENT_SYNC)
|
58
|
+
impressions = find_http_latencies(Domain::Constants::IMPRESSIONS_SYNC)
|
59
|
+
imp_count = find_http_latencies(Domain::Constants::IMPRESSION_COUNT_SYNC)
|
60
|
+
events = find_http_latencies(Domain::Constants::EVENT_SYNC)
|
61
|
+
telemetry = find_http_latencies(Domain::Constants::TELEMETRY_SYNC)
|
62
|
+
token = find_http_latencies(Domain::Constants::TOKEN_SYNC)
|
63
|
+
|
64
|
+
@adapter.init_http_latencies
|
65
|
+
|
66
|
+
HttpLatencies.new(splits, segments, impressions, imp_count, events, telemetry, token)
|
67
|
+
end
|
68
|
+
|
69
|
+
def pop_auth_rejections
|
70
|
+
to_return = @adapter.auth_rejections
|
71
|
+
|
72
|
+
@adapter.init_auth_rejections
|
73
|
+
|
74
|
+
to_return.value
|
75
|
+
end
|
76
|
+
|
77
|
+
def pop_token_refreshes
|
78
|
+
to_return = @adapter.token_refreshes
|
79
|
+
|
80
|
+
@adapter.init_token_refreshes
|
81
|
+
|
82
|
+
to_return.value
|
83
|
+
end
|
84
|
+
|
85
|
+
def pop_streaming_events
|
86
|
+
events = @adapter.streaming_events
|
87
|
+
|
88
|
+
@adapter.init_streaming_events.map
|
89
|
+
|
90
|
+
events
|
91
|
+
end
|
92
|
+
|
93
|
+
def session_length
|
94
|
+
@adapter.session_length.value
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def find_last_synchronization(type)
|
100
|
+
@adapter.last_synchronization.find { |l| l[:type] == type }[:value].value
|
101
|
+
end
|
102
|
+
|
103
|
+
def find_http_errors(type)
|
104
|
+
@adapter.http_errors.find { |l| l[:type] == type }[:value]
|
105
|
+
end
|
106
|
+
|
107
|
+
def find_http_latencies(type)
|
108
|
+
@adapter.http_latencies.find { |l| l[:type] == type }[:value]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|