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
@@ -3,12 +3,13 @@
|
|
3
3
|
module SplitIoClient
|
4
4
|
module Engine
|
5
5
|
class PushManager
|
6
|
-
def initialize(config, sse_handler, api_key)
|
6
|
+
def initialize(config, sse_handler, api_key, telemetry_runtime_producer)
|
7
7
|
@config = config
|
8
8
|
@sse_handler = sse_handler
|
9
|
-
@auth_api_client = AuthApiClient.new(@config)
|
9
|
+
@auth_api_client = AuthApiClient.new(@config, telemetry_runtime_producer)
|
10
10
|
@api_key = api_key
|
11
11
|
@back_off = SplitIoClient::SSE::EventSource::BackOff.new(@config.auth_retry_back_off_base, 1)
|
12
|
+
@telemetry_runtime_producer = telemetry_runtime_producer
|
12
13
|
end
|
13
14
|
|
14
15
|
def start_sse
|
@@ -19,6 +20,8 @@ module SplitIoClient
|
|
19
20
|
if response[:push_enabled] && @sse_handler.start(response[:token], response[:channels])
|
20
21
|
schedule_next_token_refresh(response[:exp])
|
21
22
|
@back_off.reset
|
23
|
+
record_telemetry(response[:exp])
|
24
|
+
|
22
25
|
return true
|
23
26
|
end
|
24
27
|
|
@@ -51,6 +54,11 @@ module SplitIoClient
|
|
51
54
|
end
|
52
55
|
end
|
53
56
|
end
|
57
|
+
|
58
|
+
def record_telemetry(time)
|
59
|
+
data = (Time.now.to_f * 1000.0).to_i + (time * 1000.0).to_i
|
60
|
+
@telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::TOKEN_REFRESH, data)
|
61
|
+
end
|
54
62
|
end
|
55
63
|
end
|
56
64
|
end
|
@@ -3,29 +3,38 @@
|
|
3
3
|
module SplitIoClient
|
4
4
|
module Engine
|
5
5
|
class SyncManager
|
6
|
+
SYNC_MODE_STREAMING = 0
|
7
|
+
SYNC_MODE_POLLING = 1
|
8
|
+
|
6
9
|
def initialize(
|
7
10
|
repositories,
|
8
11
|
api_key,
|
9
12
|
config,
|
10
|
-
synchronizer
|
13
|
+
synchronizer,
|
14
|
+
telemetry_runtime_producer,
|
15
|
+
sdk_blocker,
|
16
|
+
telemetry_synchronizer
|
11
17
|
)
|
12
18
|
@synchronizer = synchronizer
|
13
|
-
notification_manager_keeper =
|
19
|
+
notification_manager_keeper = SSE::NotificationManagerKeeper.new(config, telemetry_runtime_producer) do |manager|
|
14
20
|
manager.on_action { |action| process_action(action) }
|
15
21
|
end
|
16
|
-
@sse_handler =
|
17
|
-
config,
|
22
|
+
@sse_handler = SSE::SSEHandler.new(
|
23
|
+
{ config: config, api_key: api_key },
|
18
24
|
@synchronizer,
|
19
|
-
repositories
|
20
|
-
|
21
|
-
|
25
|
+
repositories,
|
26
|
+
notification_manager_keeper,
|
27
|
+
telemetry_runtime_producer
|
22
28
|
) do |handler|
|
23
29
|
handler.on_action { |action| process_action(action) }
|
24
30
|
end
|
25
31
|
|
26
|
-
@push_manager = PushManager.new(config, @sse_handler, api_key)
|
32
|
+
@push_manager = PushManager.new(config, @sse_handler, api_key, telemetry_runtime_producer)
|
27
33
|
@sse_connected = Concurrent::AtomicBoolean.new(false)
|
28
34
|
@config = config
|
35
|
+
@telemetry_runtime_producer = telemetry_runtime_producer
|
36
|
+
@sdk_blocker = sdk_blocker
|
37
|
+
@telemetry_synchronizer = telemetry_synchronizer
|
29
38
|
end
|
30
39
|
|
31
40
|
def start
|
@@ -35,6 +44,8 @@ module SplitIoClient
|
|
35
44
|
elsif @config.standalone?
|
36
45
|
start_poll
|
37
46
|
end
|
47
|
+
|
48
|
+
synchronize_telemetry_config
|
38
49
|
end
|
39
50
|
|
40
51
|
private
|
@@ -42,7 +53,7 @@ module SplitIoClient
|
|
42
53
|
# Starts tasks if stream is enabled.
|
43
54
|
def start_stream
|
44
55
|
@config.logger.debug('Starting push mode ...')
|
45
|
-
|
56
|
+
@synchronizer.sync_all
|
46
57
|
@synchronizer.start_periodic_data_recording
|
47
58
|
|
48
59
|
start_sse_connection_thread
|
@@ -52,21 +63,11 @@ module SplitIoClient
|
|
52
63
|
@config.logger.debug('Starting polling mode ...')
|
53
64
|
@synchronizer.start_periodic_fetch
|
54
65
|
@synchronizer.start_periodic_data_recording
|
66
|
+
record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_POLLING)
|
55
67
|
rescue StandardError => e
|
56
68
|
@config.logger.error("start_poll error : #{e.inspect}")
|
57
69
|
end
|
58
70
|
|
59
|
-
# Starts thread which fetch splits and segments once and trigger task to periodic data recording.
|
60
|
-
def sync_all_thread
|
61
|
-
@config.threads[:sync_manager_start_stream] = Thread.new do
|
62
|
-
begin
|
63
|
-
@synchronizer.sync_all
|
64
|
-
rescue StandardError => e
|
65
|
-
@config.logger.error("sync_all_thread error : #{e.inspect}")
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
71
|
# Starts thread which connect to sse and after that fetch splits and segments once.
|
71
72
|
def start_sse_connection_thread
|
72
73
|
@config.threads[:sync_manager_start_sse] = Thread.new do
|
@@ -108,17 +109,20 @@ module SplitIoClient
|
|
108
109
|
@synchronizer.stop_periodic_fetch
|
109
110
|
@synchronizer.sync_all
|
110
111
|
@sse_handler.start_workers
|
112
|
+
record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_STREAMING)
|
111
113
|
end
|
112
114
|
|
113
115
|
def process_subsystem_down
|
114
116
|
@sse_handler.stop_workers
|
115
117
|
@synchronizer.start_periodic_fetch
|
118
|
+
record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_POLLING)
|
116
119
|
end
|
117
120
|
|
118
121
|
def process_push_shutdown
|
119
122
|
@push_manager.stop_sse
|
120
123
|
@sse_handler.stop_workers
|
121
124
|
@synchronizer.start_periodic_fetch
|
125
|
+
record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_POLLING)
|
122
126
|
rescue StandardError => e
|
123
127
|
@config.logger.error("process_push_shutdown error: #{e.inspect}")
|
124
128
|
end
|
@@ -133,6 +137,7 @@ module SplitIoClient
|
|
133
137
|
@synchronizer.stop_periodic_fetch
|
134
138
|
@synchronizer.sync_all
|
135
139
|
@sse_handler.start_workers
|
140
|
+
record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_STREAMING)
|
136
141
|
rescue StandardError => e
|
137
142
|
@config.logger.error("process_connected error: #{e.inspect}")
|
138
143
|
end
|
@@ -146,6 +151,7 @@ module SplitIoClient
|
|
146
151
|
@sse_connected.make_false
|
147
152
|
@sse_handler.stop_workers
|
148
153
|
@synchronizer.start_periodic_fetch
|
154
|
+
record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_POLLING)
|
149
155
|
|
150
156
|
if reconnect
|
151
157
|
@synchronizer.sync_all
|
@@ -154,6 +160,22 @@ module SplitIoClient
|
|
154
160
|
rescue StandardError => e
|
155
161
|
@config.logger.error("process_disconnect error: #{e.inspect}")
|
156
162
|
end
|
163
|
+
|
164
|
+
def record_telemetry(type, data)
|
165
|
+
@telemetry_runtime_producer.record_streaming_event(type, data)
|
166
|
+
end
|
167
|
+
|
168
|
+
def synchronize_telemetry_config
|
169
|
+
@config.threads[:telemetry_config_sender] = Thread.new do
|
170
|
+
begin
|
171
|
+
@sdk_blocker.wait_unitil_internal_ready unless @config.consumer?
|
172
|
+
@telemetry_synchronizer.synchronize_config
|
173
|
+
rescue SplitIoClient::SDKShutdownException
|
174
|
+
@telemetry_synchronizer.synchronize_config
|
175
|
+
@config.logger.info('Posting Telemetry config due to shutdown')
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
157
179
|
end
|
158
180
|
end
|
159
181
|
end
|
@@ -6,6 +6,8 @@ module SplitIoClient
|
|
6
6
|
include SplitIoClient::Cache::Fetchers
|
7
7
|
include SplitIoClient::Cache::Senders
|
8
8
|
|
9
|
+
FORCE_CACHE_CONTROL_HEADERS = true
|
10
|
+
|
9
11
|
def initialize(
|
10
12
|
repositories,
|
11
13
|
api_key,
|
@@ -16,30 +18,30 @@ module SplitIoClient
|
|
16
18
|
@splits_repository = repositories[:splits]
|
17
19
|
@segments_repository = repositories[:segments]
|
18
20
|
@impressions_repository = repositories[:impressions]
|
19
|
-
@metrics_repository = repositories[:metrics]
|
20
21
|
@events_repository = repositories[:events]
|
21
22
|
@api_key = api_key
|
22
23
|
@config = config
|
23
24
|
@sdk_blocker = sdk_blocker
|
24
25
|
@split_fetcher = params[:split_fetcher]
|
25
26
|
@segment_fetcher = params[:segment_fetcher]
|
26
|
-
@impressions_api = SplitIoClient::Api::Impressions.new(@api_key, @config)
|
27
|
+
@impressions_api = SplitIoClient::Api::Impressions.new(@api_key, @config, params[:telemetry_runtime_producer])
|
27
28
|
@impression_counter = params[:imp_counter]
|
29
|
+
@telemetry_synchronizer = params[:telemetry_synchronizer]
|
28
30
|
end
|
29
31
|
|
30
32
|
def sync_all
|
31
33
|
@config.threads[:sync_all_thread] = Thread.new do
|
32
34
|
@config.logger.debug('Synchronizing Splits and Segments ...') if @config.debug_enabled
|
33
35
|
@split_fetcher.fetch_splits
|
34
|
-
fetch_segments
|
36
|
+
@segment_fetcher.fetch_segments
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
40
|
def start_periodic_data_recording
|
39
41
|
impressions_sender
|
40
|
-
metrics_sender
|
41
42
|
events_sender
|
42
43
|
impressions_count_sender
|
44
|
+
start_telemetry_sync_task
|
43
45
|
end
|
44
46
|
|
45
47
|
def start_periodic_fetch
|
@@ -53,12 +55,12 @@ module SplitIoClient
|
|
53
55
|
end
|
54
56
|
|
55
57
|
def fetch_splits
|
56
|
-
segment_names = @split_fetcher.fetch_splits
|
57
|
-
@segment_fetcher.fetch_segments_if_not_exists(segment_names) unless segment_names.empty?
|
58
|
+
segment_names = @split_fetcher.fetch_splits(FORCE_CACHE_CONTROL_HEADERS)
|
59
|
+
@segment_fetcher.fetch_segments_if_not_exists(segment_names, FORCE_CACHE_CONTROL_HEADERS) unless segment_names.empty?
|
58
60
|
end
|
59
61
|
|
60
62
|
def fetch_segment(name)
|
61
|
-
@segment_fetcher.fetch_segment(name)
|
63
|
+
@segment_fetcher.fetch_segment(name, FORCE_CACHE_CONTROL_HEADERS)
|
62
64
|
end
|
63
65
|
|
64
66
|
private
|
@@ -72,11 +74,6 @@ module SplitIoClient
|
|
72
74
|
ImpressionsSender.new(@impressions_repository, @config, @impressions_api).call
|
73
75
|
end
|
74
76
|
|
75
|
-
# Starts thread which loops constantly and sends metrics to the Split API
|
76
|
-
def metrics_sender
|
77
|
-
MetricsSender.new(@metrics_repository, @api_key, @config).call
|
78
|
-
end
|
79
|
-
|
80
77
|
# Starts thread which loops constantly and sends events to the Split API
|
81
78
|
def events_sender
|
82
79
|
EventsSender.new(@events_repository, @config).call
|
@@ -86,6 +83,10 @@ module SplitIoClient
|
|
86
83
|
def impressions_count_sender
|
87
84
|
ImpressionsCountSender.new(@config, @impression_counter, @impressions_api).call
|
88
85
|
end
|
86
|
+
|
87
|
+
def start_telemetry_sync_task
|
88
|
+
Telemetry::SyncTask.new(@config, @telemetry_synchronizer).call
|
89
|
+
end
|
89
90
|
end
|
90
91
|
end
|
91
92
|
end
|
@@ -17,7 +17,6 @@ module SplitIoClient
|
|
17
17
|
# @option opts [Int] :connection_timeout (2) The connect timeout for network connections in seconds.
|
18
18
|
# @option opts [Int] :features_refresh_rate The SDK polls Split servers for changes to feature roll-out plans. This parameter controls this polling period in seconds.
|
19
19
|
# @option opts [Int] :segments_refresh_rate
|
20
|
-
# @option opts [Int] :metrics_refresh_rate
|
21
20
|
# @option opts [Int] :impressions_refresh_rate
|
22
21
|
# @option opts [Object] :logger a logger to user for messages from the client. Defaults to stdout
|
23
22
|
# @option opts [Boolean] :debug_enabled (false) The value for the debug flag
|
@@ -51,7 +50,6 @@ module SplitIoClient
|
|
51
50
|
end
|
52
51
|
|
53
52
|
@segments_refresh_rate = opts[:segments_refresh_rate] || SplitConfig.default_segments_refresh_rate
|
54
|
-
@metrics_refresh_rate = opts[:metrics_refresh_rate] || SplitConfig.default_metrics_refresh_rate
|
55
53
|
|
56
54
|
@impressions_mode = init_impressions_mode(opts[:impressions_mode])
|
57
55
|
|
@@ -63,10 +61,6 @@ module SplitIoClient
|
|
63
61
|
#Safeguard for users of older SDK versions.
|
64
62
|
@impressions_bulk_size = opts[:impressions_bulk_size] || @impressions_queue_size > 0 ? @impressions_queue_size : 0
|
65
63
|
|
66
|
-
@metrics_adapter = SplitConfig.init_cache_adapter(
|
67
|
-
opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
|
68
|
-
)
|
69
|
-
|
70
64
|
@debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
|
71
65
|
@transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
|
72
66
|
@block_until_ready = SplitConfig.default_block_until_ready
|
@@ -97,6 +91,10 @@ module SplitIoClient
|
|
97
91
|
opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @events_queue_size, @redis_url
|
98
92
|
)
|
99
93
|
|
94
|
+
@telemetry_adapter = SplitConfig.init_telemetry_adapter(
|
95
|
+
opts[:cache_adapter] || SplitConfig.default_cache_adapter, @redis_url
|
96
|
+
)
|
97
|
+
|
100
98
|
@split_file = opts[:split_file] || SplitConfig.default_split_file
|
101
99
|
|
102
100
|
@valid_mode = true
|
@@ -110,6 +108,11 @@ module SplitIoClient
|
|
110
108
|
@auth_retry_back_off_base = SplitConfig.init_auth_retry_back_off(opts[:auth_retry_back_off_base] || SplitConfig.default_auth_retry_back_off_base)
|
111
109
|
@streaming_reconnect_back_off_base = SplitConfig.init_streaming_reconnect_back_off(opts[:streaming_reconnect_back_off_base] || SplitConfig.default_streaming_reconnect_back_off_base)
|
112
110
|
|
111
|
+
@telemetry_refresh_rate = SplitConfig.init_telemetry_refresh_rate(opts[:telemetry_refresh_rate])
|
112
|
+
@telemetry_service_url = opts[:telemetry_service_url] || SplitConfig.default_telemetry_service_url
|
113
|
+
|
114
|
+
@sdk_start_time = Time.now
|
115
|
+
|
113
116
|
startup_log
|
114
117
|
end
|
115
118
|
|
@@ -148,12 +151,6 @@ module SplitIoClient
|
|
148
151
|
# @return [Object] Impressions adapter instance
|
149
152
|
attr_accessor :impressions_adapter
|
150
153
|
|
151
|
-
#
|
152
|
-
# The cache adapter to store metrics in
|
153
|
-
#
|
154
|
-
# @return [Symbol] Metrics adapter
|
155
|
-
attr_accessor :metrics_adapter
|
156
|
-
|
157
154
|
#
|
158
155
|
# The cache adapter to store events in
|
159
156
|
#
|
@@ -224,7 +221,6 @@ module SplitIoClient
|
|
224
221
|
|
225
222
|
attr_accessor :features_refresh_rate
|
226
223
|
attr_accessor :segments_refresh_rate
|
227
|
-
attr_accessor :metrics_refresh_rate
|
228
224
|
attr_accessor :impressions_refresh_rate
|
229
225
|
|
230
226
|
attr_accessor :impression_listener
|
@@ -274,6 +270,14 @@ module SplitIoClient
|
|
274
270
|
|
275
271
|
attr_accessor :impressions_mode
|
276
272
|
|
273
|
+
attr_accessor :telemetry_adapter
|
274
|
+
|
275
|
+
attr_accessor :telemetry_refresh_rate
|
276
|
+
|
277
|
+
attr_accessor :telemetry_service_url
|
278
|
+
|
279
|
+
attr_accessor :sdk_start_time
|
280
|
+
|
277
281
|
def self.default_impressions_mode
|
278
282
|
:optimized
|
279
283
|
end
|
@@ -296,6 +300,12 @@ module SplitIoClient
|
|
296
300
|
return refresh_rate.nil? || refresh_rate <= 0 ? SplitConfig.default_impressions_refresh_rate_optimized : [default_rate, refresh_rate].max
|
297
301
|
end
|
298
302
|
|
303
|
+
def self.init_telemetry_refresh_rate(refresh_rate)
|
304
|
+
return SplitConfig.default_telemetry_refresh_rate if refresh_rate.nil? || refresh_rate < 60
|
305
|
+
|
306
|
+
refresh_rate
|
307
|
+
end
|
308
|
+
|
299
309
|
def self.default_streaming_enabled
|
300
310
|
true
|
301
311
|
end
|
@@ -359,6 +369,21 @@ module SplitIoClient
|
|
359
369
|
end
|
360
370
|
end
|
361
371
|
|
372
|
+
def self.init_telemetry_adapter(adapter, redis_url)
|
373
|
+
case adapter
|
374
|
+
when :memory
|
375
|
+
Telemetry::Storages::Memory.new
|
376
|
+
when :redis
|
377
|
+
begin
|
378
|
+
require 'redis'
|
379
|
+
rescue LoadError
|
380
|
+
fail StandardError, 'To use Redis as a cache adapter you must include it in your Gemfile'
|
381
|
+
end
|
382
|
+
|
383
|
+
SplitIoClient::Cache::Adapters::RedisAdapter.new(redis_url)
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
362
387
|
def self.map_memory_adapter(name, queue_size)
|
363
388
|
case name
|
364
389
|
when :map_adapter
|
@@ -377,10 +402,6 @@ module SplitIoClient
|
|
377
402
|
:memory
|
378
403
|
end
|
379
404
|
|
380
|
-
def self.default_metrics_adapter
|
381
|
-
:memory
|
382
|
-
end
|
383
|
-
|
384
405
|
#
|
385
406
|
# The default read timeout value
|
386
407
|
#
|
@@ -405,10 +426,6 @@ module SplitIoClient
|
|
405
426
|
60
|
406
427
|
end
|
407
428
|
|
408
|
-
def self.default_metrics_refresh_rate
|
409
|
-
60
|
410
|
-
end
|
411
|
-
|
412
429
|
def self.default_impressions_refresh_rate
|
413
430
|
60
|
414
431
|
end
|
@@ -433,6 +450,14 @@ module SplitIoClient
|
|
433
450
|
500
|
434
451
|
end
|
435
452
|
|
453
|
+
def self.default_telemetry_refresh_rate
|
454
|
+
3600
|
455
|
+
end
|
456
|
+
|
457
|
+
def self.default_telemetry_service_url
|
458
|
+
'https://telemetry.split.io/api/v1'
|
459
|
+
end
|
460
|
+
|
436
461
|
def self.default_split_file
|
437
462
|
File.join(Dir.home, '.split')
|
438
463
|
end
|
@@ -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
|