Skip to content

Commit 58dd366

Browse files
authored
Merge pull request #375 from splitio/development
[7.3.0] Development into master
2 parents 1f5816a + daaadf4 commit 58dd366

105 files changed

Lines changed: 2715 additions & 1582 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.rubocop.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,34 @@ Documentation:
33

44
Metrics/AbcSize:
55
Max: 26
6+
Exclude:
7+
- lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb
68

79
Metrics/MethodLength:
810
Max: 20
11+
Exclude:
12+
- lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb
913

1014
Metrics/ClassLength:
1115
Max: 150
16+
Exclude:
17+
- lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb
1218

1319
Metrics/CyclomaticComplexity:
1420
Max: 8
1521

22+
Metrics/ParameterLists:
23+
Exclude:
24+
- lib/splitclient-rb/engine/sync_manager.rb
25+
1626
Metrics/LineLength:
1727
Max: 130
1828
Exclude:
1929
- spec/sse/**/*
2030
- spec/integrations/**/*
2131
- spec/engine/sync_manager_spec.rb
2232
- spec/engine/auth_api_client_spec.rb
33+
- spec/telemetry/synchronizer_spec.rb
2334

2435
Style/BracesAroundHashParameters:
2536
Exclude:
@@ -50,3 +61,4 @@ AllCops:
5061
- lib/splitclient-rb/engine/metrics/**/*
5162
- lib/splitclient-rb/engine/models/**/*
5263
- lib/splitclient-rb/engine/parser/**/*
64+
- spec/telemetry/synchronizer_spec.rb

CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
CHANGES
22

3+
7.3.0 (Jul 12, 2021)
4+
- Updated SDK telemetry storage, metrics and updater to be more effective and send less often.
5+
- Fixed high cpu usage when api key is wrong.
6+
37
7.2.3 (Feb 24, 2021)
48
- Fixed missing segment fetch after an SPLIT_UPDATE.
59
- Updated streaming logic to support multiregion.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ Split has built and maintains SDKs for:
6363
* Java [Github](https://github.com/splitio/java-client) [Docs](https://help.split.io/hc/en-us/articles/360020405151-Java-SDK)
6464
* Javascript [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020448791-JavaScript-SDK)
6565
* Node [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020564931-Node-js-SDK)
66-
* .NET [Github](https://github.com/splitio/.net-core-client) [Docs](https://help.split.io/hc/en-us/articles/360020240172--NET-SDK)
66+
* .NET [Github](https://github.com/splitio/dotnet-client) [Docs](https://help.split.io/hc/en-us/articles/360020240172--NET-SDK)
6767
* Ruby [Github](https://github.com/splitio/ruby-client) [Docs](https://help.split.io/hc/en-us/articles/360020673251-Ruby-SDK)
6868
* PHP [Github](https://github.com/splitio/php-client) [Docs](https://help.split.io/hc/en-us/articles/360020350372-PHP-SDK)
6969
* Python [Github](https://github.com/splitio/python-client) [Docs](https://help.split.io/hc/en-us/articles/360020359652-Python-SDK)

lib/splitclient-rb.rb

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,8 @@
2323
require 'splitclient-rb/cache/repositories/events/redis_repository'
2424
require 'splitclient-rb/cache/repositories/impressions/memory_repository'
2525
require 'splitclient-rb/cache/repositories/impressions/redis_repository'
26-
require 'splitclient-rb/cache/repositories/metrics_repository'
27-
require 'splitclient-rb/cache/repositories/metrics/memory_repository'
28-
require 'splitclient-rb/cache/repositories/metrics/redis_repository'
2926
require 'splitclient-rb/cache/senders/impressions_formatter'
3027
require 'splitclient-rb/cache/senders/impressions_sender'
31-
require 'splitclient-rb/cache/senders/metrics_sender'
3228
require 'splitclient-rb/cache/senders/events_sender'
3329
require 'splitclient-rb/cache/senders/impressions_count_sender'
3430
require 'splitclient-rb/cache/senders/localhost_repo_cleaner'
@@ -51,10 +47,10 @@
5147
require 'splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent'
5248
require 'splitclient-rb/engine/api/client'
5349
require 'splitclient-rb/engine/api/impressions'
54-
require 'splitclient-rb/engine/api/metrics'
5550
require 'splitclient-rb/engine/api/segments'
5651
require 'splitclient-rb/engine/api/splits'
5752
require 'splitclient-rb/engine/api/events'
53+
require 'splitclient-rb/engine/api/telemetry_api'
5854
require 'splitclient-rb/engine/common/impressions_counter'
5955
require 'splitclient-rb/engine/common/impressions_manager'
6056
require 'splitclient-rb/engine/parser/condition'
@@ -84,7 +80,6 @@
8480
require 'splitclient-rb/engine/matchers/equal_to_matcher'
8581
require 'splitclient-rb/engine/matchers/matches_string_matcher'
8682
require 'splitclient-rb/engine/evaluator/splitter'
87-
require 'splitclient-rb/engine/metrics/metrics'
8883
require 'splitclient-rb/engine/metrics/binary_search_latency_tracker'
8984
require 'splitclient-rb/engine/models/split'
9085
require 'splitclient-rb/engine/models/label'
@@ -95,9 +90,6 @@
9590
require 'splitclient-rb/engine/synchronizer'
9691
require 'splitclient-rb/utilitites'
9792

98-
# redis metrics fixer
99-
require 'splitclient-rb/redis_metrics_fixer'
100-
10193
# SSE
10294
require 'splitclient-rb/sse/event_source/back_off'
10395
require 'splitclient-rb/sse/event_source/client'
@@ -110,6 +102,29 @@
110102
require 'splitclient-rb/sse/notification_processor'
111103
require 'splitclient-rb/sse/sse_handler'
112104

105+
# Telemetry
106+
require 'splitclient-rb/telemetry/domain/constants'
107+
require 'splitclient-rb/telemetry/domain/structs'
108+
require 'splitclient-rb/telemetry/storages/memory'
109+
require 'splitclient-rb/telemetry/evaluation_consumer'
110+
require 'splitclient-rb/telemetry/evaluation_producer'
111+
require 'splitclient-rb/telemetry/init_consumer'
112+
require 'splitclient-rb/telemetry/init_producer'
113+
require 'splitclient-rb/telemetry/runtime_consumer'
114+
require 'splitclient-rb/telemetry/runtime_producer'
115+
require 'splitclient-rb/telemetry/sync_task'
116+
require 'splitclient-rb/telemetry/synchronizer'
117+
require 'splitclient-rb/telemetry/memory/memory_evaluation_consumer'
118+
require 'splitclient-rb/telemetry/memory/memory_evaluation_producer'
119+
require 'splitclient-rb/telemetry/memory/memory_init_consumer'
120+
require 'splitclient-rb/telemetry/memory/memory_init_producer'
121+
require 'splitclient-rb/telemetry/memory/memory_runtime_consumer'
122+
require 'splitclient-rb/telemetry/memory/memory_runtime_producer'
123+
require 'splitclient-rb/telemetry/memory/memory_synchronizer'
124+
require 'splitclient-rb/telemetry/redis/redis_evaluation_producer'
125+
require 'splitclient-rb/telemetry/redis/redis_init_producer'
126+
require 'splitclient-rb/telemetry/redis/redis_synchronizer'
127+
113128
# C extension
114129
require 'murmurhash/murmurhash_mri'
115130

lib/splitclient-rb/cache/adapters/redis_adapter.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ def initialize(redis_url)
1717
@redis = Redis.new(connection)
1818
end
1919

20+
def hincrby(key, field, increment)
21+
@redis.hincrby(key, field, increment)
22+
end
23+
2024
# Map
2125
def initialize_map(key)
2226
# No need to initialize hash/map in Redis

lib/splitclient-rb/cache/fetchers/segment_fetcher.rb

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ module Fetchers
44
class SegmentFetcher
55
attr_reader :segments_repository
66

7-
def initialize(segments_repository, api_key, metrics, config, sdk_blocker = nil)
7+
def initialize(segments_repository, api_key, config, sdk_blocker, telemetry_runtime_producer)
88
@segments_repository = segments_repository
99
@api_key = api_key
10-
@metrics = metrics
1110
@config = config
1211
@sdk_blocker = sdk_blocker
1312
@semaphore = Mutex.new
13+
@telemetry_runtime_producer = telemetry_runtime_producer
1414
end
1515

1616
def call
@@ -27,19 +27,19 @@ def call
2727
end
2828
end
2929

30-
def fetch_segments_if_not_exists(names)
30+
def fetch_segments_if_not_exists(names, cache_control_headers = false)
3131
names.each do |name|
3232
change_number = @segments_repository.get_change_number(name)
3333

34-
fetch_segment(name) if change_number == -1
34+
fetch_segment(name, cache_control_headers) if change_number == -1
3535
end
3636
rescue StandardError => error
3737
@config.log_found_exception(__method__.to_s, error)
3838
end
3939

40-
def fetch_segment(name)
40+
def fetch_segment(name, cache_control_headers = false)
4141
@semaphore.synchronize do
42-
segments_api.fetch_segments_by_names([name])
42+
segments_api.fetch_segments_by_names([name], cache_control_headers)
4343
end
4444
rescue StandardError => error
4545
@config.log_found_exception(__method__.to_s, error)
@@ -50,6 +50,7 @@ def fetch_segments
5050
segments_api.fetch_segments_by_names(@segments_repository.used_segment_names)
5151

5252
@sdk_blocker.segments_ready!
53+
@sdk_blocker.sdk_internal_ready
5354
end
5455
rescue StandardError => error
5556
@config.log_found_exception(__method__.to_s, error)
@@ -66,7 +67,10 @@ def segments_thread
6667
@config.logger.info('Starting segments fetcher service') if @config.debug_enabled
6768

6869
loop do
69-
next unless @sdk_blocker.splits_repository.ready?
70+
unless @sdk_blocker.splits_repository.ready?
71+
sleep 0.2
72+
next
73+
end
7074

7175
fetch_segments
7276
@config.logger.debug("Segment names: #{@segments_repository.used_segment_names.to_a}") if @config.debug_enabled
@@ -76,10 +80,10 @@ def segments_thread
7680
sleep(sleep_for)
7781
end
7882
end
79-
end
83+
end
8084

8185
def segments_api
82-
@segments_api ||= SplitIoClient::Api::Segments.new(@api_key, @metrics, @segments_repository, @config)
86+
@segments_api ||= SplitIoClient::Api::Segments.new(@api_key, @segments_repository, @config, @telemetry_runtime_producer)
8387
end
8488
end
8589
end

lib/splitclient-rb/cache/fetchers/split_fetcher.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ module Fetchers
44
class SplitFetcher
55
attr_reader :splits_repository
66

7-
def initialize(splits_repository, api_key, metrics, config, sdk_blocker = nil)
7+
def initialize(splits_repository, api_key, config, sdk_blocker, telemetry_runtime_producer)
88
@splits_repository = splits_repository
99
@api_key = api_key
10-
@metrics = metrics
1110
@config = config
1211
@sdk_blocker = sdk_blocker
1312
@semaphore = Mutex.new
13+
@telemetry_runtime_producer = telemetry_runtime_producer
1414
end
1515

1616
def call
@@ -27,9 +27,9 @@ def call
2727
end
2828
end
2929

30-
def fetch_splits
30+
def fetch_splits(cache_control_headers = false)
3131
@semaphore.synchronize do
32-
data = splits_since(@splits_repository.get_change_number)
32+
data = splits_since(@splits_repository.get_change_number, cache_control_headers)
3333

3434
data[:splits] && data[:splits].each do |split|
3535
add_split_unless_archived(split)
@@ -46,6 +46,7 @@ def fetch_splits
4646
end
4747
rescue StandardError => error
4848
@config.log_found_exception(__method__.to_s, error)
49+
[]
4950
end
5051

5152
def stop_splits_thread
@@ -67,8 +68,8 @@ def splits_thread
6768
end
6869
end
6970

70-
def splits_since(since)
71-
splits_api.since(since)
71+
def splits_since(since, cache_control_headers = false)
72+
splits_api.since(since, cache_control_headers)
7273
end
7374

7475
def add_split_unless_archived(split)
@@ -94,7 +95,7 @@ def store_split(split)
9495
end
9596

9697
def splits_api
97-
@splits_api ||= SplitIoClient::Api::Splits.new(@api_key, @metrics, @config)
98+
@splits_api ||= SplitIoClient::Api::Splits.new(@api_key, @config, @telemetry_runtime_producer)
9899
end
99100
end
100101
end

lib/splitclient-rb/cache/repositories/events/memory_repository.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ module Events
55
class MemoryRepository < EventsRepository
66
EVENTS_MAX_SIZE_BYTES = 5242880
77

8-
def initialize(config)
8+
def initialize(config, telemetry_runtime_producer)
99
@config = config
1010
@adapter = @config.events_adapter
1111
@size = 0
12+
@telemetry_runtime_producer = telemetry_runtime_producer
1213
end
1314

1415
def add(key, traffic_type, event_type, time, value, properties, event_size)
@@ -17,8 +18,10 @@ def add(key, traffic_type, event_type, time, value, properties, event_size)
1718

1819
post_events if @size >= EVENTS_MAX_SIZE_BYTES || @adapter.length == @config.events_queue_size
1920

20-
rescue StandardError => error
21-
@config.log_found_exception(__method__.to_s, error)
21+
@telemetry_runtime_producer.record_events_stats(Telemetry::Domain::Constants::EVENTS_QUEUED, 1)
22+
rescue StandardError => error
23+
@config.log_found_exception(__method__.to_s, error)
24+
@telemetry_runtime_producer.record_events_stats(Telemetry::Domain::Constants::EVENTS_DROPPED, 1)
2225
end
2326

2427
def clear

lib/splitclient-rb/cache/repositories/events_repository.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@ class EventsRepository < Repository
66
extend Forwardable
77
def_delegators :@repository, :add, :clear, :batch
88

9-
def initialize(config, api_key)
9+
def initialize(config, api_key, telemetry_runtime_producer)
1010
super(config)
1111
@repository = case @config.events_adapter.class.to_s
1212
when 'SplitIoClient::Cache::Adapters::MemoryAdapter'
13-
Repositories::Events::MemoryRepository.new(@config)
13+
Repositories::Events::MemoryRepository.new(@config, telemetry_runtime_producer)
1414
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
1515
Repositories::Events::RedisRepository.new(@config)
1616
end
1717

1818
@api_key = api_key
19+
@telemetry_runtime_producer = telemetry_runtime_producer
1920
end
2021

2122
def post_events
@@ -48,7 +49,7 @@ def event(key, traffic_type, event_type, time, value, properties)
4849
private
4950

5051
def events_api
51-
@events_api ||= SplitIoClient::Api::Events.new(@api_key, @config)
52+
@events_api ||= SplitIoClient::Api::Events.new(@api_key, @config, @telemetry_runtime_producer)
5253
end
5354
end
5455
end

lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,23 @@ def initialize(config)
1111
end
1212

1313
def add_bulk(impressions)
14+
return 0 if impressions.nil?
15+
16+
count = 0
1417
impressions.each do |impression|
1518
@adapter.add_to_queue(impression)
19+
count += 1
1620
end
21+
22+
0
1723
rescue ThreadError # queue is full
1824
if random_sampler.rand(1..1000) <= 2 # log only 0.2 % of the time
1925
@config.logger.warn("Dropping impressions. Current size is \
2026
#{@config.impressions_queue_size}. " \
2127
'Consider increasing impressions_queue_size')
2228
end
29+
30+
impressions.length - count
2331
end
2432

2533
def batch

0 commit comments

Comments
 (0)