splitclient-rb 6.3.0 → 8.11.0
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/.github/CODEOWNERS +1 -0
- data/.github/pull_request_template.md +9 -0
- data/.github/workflows/ci.yml +90 -0
- data/.github/workflows/update-license-year.yml +45 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +46 -3
- data/CHANGES.txt +158 -11
- data/CONTRIBUTORS-GUIDE.md +49 -0
- data/LICENSE +169 -13
- data/NOTICE.txt +5 -0
- data/README.md +67 -27
- data/Rakefile +1 -8
- data/ext/murmurhash/3_x64_128.c +117 -0
- data/ext/murmurhash/murmurhash.c +5 -1
- data/lib/murmurhash/murmurhash.jar +0 -0
- data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +3 -3
- data/lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb +4 -0
- data/lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb +7 -0
- data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +12 -4
- data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +83 -0
- data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +70 -0
- data/lib/splitclient-rb/cache/filter/bloom_filter.rb +67 -0
- data/lib/splitclient-rb/cache/filter/filter_adapter.rb +32 -0
- data/lib/splitclient-rb/cache/filter/flag_set_filter.rb +40 -0
- data/lib/splitclient-rb/cache/hashers/impression_hasher.rb +34 -0
- data/lib/splitclient-rb/cache/observers/impression_observer.rb +22 -0
- data/lib/splitclient-rb/cache/observers/noop_impression_observer.rb +10 -0
- data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +26 -14
- data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +9 -14
- data/lib/splitclient-rb/cache/repositories/events_repository.rb +31 -10
- data/lib/splitclient-rb/cache/repositories/flag_sets/memory_repository.rb +40 -0
- data/lib/splitclient-rb/cache/repositories/flag_sets/redis_repository.rb +49 -0
- data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +22 -23
- data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +15 -22
- data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +6 -31
- data/lib/splitclient-rb/cache/repositories/repository.rb +6 -5
- data/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +136 -0
- data/lib/splitclient-rb/cache/repositories/segments_repository.rb +46 -6
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +232 -43
- data/lib/splitclient-rb/cache/routers/impression_router.rb +24 -22
- data/lib/splitclient-rb/cache/senders/events_sender.rb +12 -29
- data/lib/splitclient-rb/cache/senders/impressions_adapter/memory_sender.rb +71 -0
- data/lib/splitclient-rb/cache/senders/impressions_adapter/redis_sender.rb +69 -0
- data/lib/splitclient-rb/cache/senders/impressions_count_sender.rb +43 -0
- data/lib/splitclient-rb/cache/senders/impressions_formatter.rb +27 -13
- data/lib/splitclient-rb/cache/senders/impressions_sender.rb +11 -25
- data/lib/splitclient-rb/cache/senders/impressions_sender_adapter.rb +21 -0
- data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +47 -0
- data/lib/splitclient-rb/cache/stores/localhost_split_builder.rb +95 -0
- data/lib/splitclient-rb/cache/stores/localhost_split_store.rb +110 -0
- data/lib/splitclient-rb/cache/stores/store_utils.rb +13 -0
- data/lib/splitclient-rb/clients/split_client.rb +385 -138
- data/lib/splitclient-rb/constants.rb +16 -0
- data/lib/splitclient-rb/engine/api/client.rb +38 -43
- data/lib/splitclient-rb/engine/api/events.rb +19 -11
- data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +1 -0
- data/lib/splitclient-rb/engine/api/impressions.rb +49 -14
- data/lib/splitclient-rb/engine/api/segments.rb +31 -24
- data/lib/splitclient-rb/engine/api/splits.rb +108 -33
- data/lib/splitclient-rb/engine/api/telemetry_api.rb +47 -0
- data/lib/splitclient-rb/engine/auth_api_client.rb +96 -0
- data/lib/splitclient-rb/engine/back_off.rb +26 -0
- data/lib/splitclient-rb/engine/common/impressions_counter.rb +45 -0
- data/lib/splitclient-rb/engine/common/impressions_manager.rb +165 -0
- data/lib/splitclient-rb/engine/common/noop_impressions_counter.rb +27 -0
- data/lib/splitclient-rb/engine/events/events_delivery.rb +20 -0
- data/lib/splitclient-rb/engine/events/events_manager.rb +194 -0
- data/lib/splitclient-rb/engine/events/events_manager_config.rb +96 -0
- data/lib/splitclient-rb/engine/events/events_task.rb +50 -0
- data/lib/splitclient-rb/engine/events/noop_events_queue.rb +13 -0
- data/lib/splitclient-rb/engine/fallback_treatment_calculator.rb +48 -0
- data/lib/splitclient-rb/engine/impressions/noop_unique_keys_tracker.rb +17 -0
- data/lib/splitclient-rb/engine/impressions/unique_keys_tracker.rb +144 -0
- data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +1 -1
- data/lib/splitclient-rb/engine/matchers/between_matcher.rb +7 -5
- data/lib/splitclient-rb/engine/matchers/between_semver_matcher.rb +33 -0
- data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +10 -8
- data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +2 -6
- data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +1 -5
- data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +7 -5
- data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +6 -5
- data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +5 -4
- data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +6 -4
- data/lib/splitclient-rb/engine/matchers/equal_to_semver_matcher.rb +28 -0
- data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +1 -5
- data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +6 -4
- data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher.rb +28 -0
- data/lib/splitclient-rb/engine/matchers/in_list_semver_matcher.rb +36 -0
- data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +6 -4
- data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher.rb +28 -0
- data/lib/splitclient-rb/engine/matchers/matcher.rb +22 -0
- data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +2 -6
- data/lib/splitclient-rb/engine/matchers/prerequisites_matcher.rb +31 -0
- data/lib/splitclient-rb/engine/matchers/rule_based_segment_matcher.rb +78 -0
- data/lib/splitclient-rb/engine/matchers/semver.rb +201 -0
- data/lib/splitclient-rb/engine/matchers/set_matcher.rb +2 -1
- data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +4 -3
- data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +7 -5
- data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +3 -65
- data/lib/splitclient-rb/engine/models/evaluation_options.rb +9 -0
- data/lib/splitclient-rb/engine/models/event_active_subscriptions.rb +14 -0
- data/lib/splitclient-rb/engine/models/events_metadata.rb +10 -0
- data/lib/splitclient-rb/engine/models/fallback_treatment.rb +11 -0
- data/lib/splitclient-rb/engine/models/fallback_treatments_configuration.rb +36 -0
- data/lib/splitclient-rb/engine/models/label.rb +3 -0
- data/lib/splitclient-rb/engine/models/sdk_event.rb +4 -0
- data/lib/splitclient-rb/engine/models/sdk_event_type.rb +4 -0
- data/lib/splitclient-rb/engine/models/sdk_internal_event.rb +8 -0
- data/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb +14 -0
- data/lib/splitclient-rb/engine/models/segment_type.rb +4 -0
- data/lib/splitclient-rb/engine/models/split_http_response.rb +19 -0
- data/lib/splitclient-rb/engine/models/valid_sdk_event.rb +14 -0
- data/lib/splitclient-rb/engine/parser/condition.rb +81 -20
- data/lib/splitclient-rb/engine/parser/evaluator.rb +40 -51
- data/lib/splitclient-rb/engine/push_manager.rb +66 -0
- data/lib/splitclient-rb/engine/status_manager.rb +39 -0
- data/lib/splitclient-rb/engine/sync_manager.rb +180 -0
- data/lib/splitclient-rb/engine/synchronizer.rb +231 -0
- data/lib/splitclient-rb/exceptions.rb +20 -1
- data/lib/splitclient-rb/helpers/decryption_helper.rb +25 -0
- data/lib/splitclient-rb/helpers/evaluator_helper.rb +37 -0
- data/lib/splitclient-rb/helpers/repository_helper.rb +61 -0
- data/lib/splitclient-rb/helpers/thread_helper.rb +24 -0
- data/lib/splitclient-rb/helpers/util.rb +26 -0
- data/lib/splitclient-rb/managers/split_manager.rb +58 -20
- data/lib/splitclient-rb/spec.rb +9 -0
- data/lib/splitclient-rb/split_config.rb +336 -54
- data/lib/splitclient-rb/split_factory.rb +219 -33
- data/lib/splitclient-rb/split_factory_builder.rb +1 -22
- data/lib/splitclient-rb/split_factory_registry.rb +63 -0
- data/lib/splitclient-rb/split_logger.rb +9 -10
- data/lib/splitclient-rb/sse/event_source/client.rb +263 -0
- data/lib/splitclient-rb/sse/event_source/event_parser.rb +65 -0
- data/lib/splitclient-rb/sse/event_source/event_types.rb +15 -0
- data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
- data/lib/splitclient-rb/sse/notification_manager_keeper.rb +84 -0
- data/lib/splitclient-rb/sse/notification_processor.rb +48 -0
- data/lib/splitclient-rb/sse/sse_handler.rb +44 -0
- data/lib/splitclient-rb/sse/workers/segments_worker.rb +62 -0
- data/lib/splitclient-rb/sse/workers/splits_worker.rb +149 -0
- data/lib/splitclient-rb/telemetry/domain/constants.rb +48 -0
- data/lib/splitclient-rb/telemetry/domain/structs.rb +35 -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 +119 -0
- data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +87 -0
- data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +213 -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 +27 -0
- data/lib/splitclient-rb/telemetry/runtime_consumer.rb +25 -0
- data/lib/splitclient-rb/telemetry/runtime_producer.rb +25 -0
- data/lib/splitclient-rb/telemetry/storages/memory.rb +159 -0
- data/lib/splitclient-rb/telemetry/sync_task.rb +36 -0
- data/lib/splitclient-rb/telemetry/synchronizer.rb +33 -0
- data/lib/splitclient-rb/utilitites.rb +8 -0
- data/lib/splitclient-rb/validators.rb +142 -38
- data/lib/splitclient-rb/version.rb +1 -1
- data/lib/splitclient-rb.rb +101 -16
- data/sonar-project.properties +6 -0
- data/splitclient-rb.gemspec +28 -23
- metadata +262 -82
- data/.travis.yml +0 -11
- data/Appraisals +0 -10
- data/Detailed-README.md +0 -588
- data/NEWS +0 -141
- data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +0 -127
- data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +0 -96
- data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +0 -21
- data/lib/splitclient-rb/cache/senders/metrics_sender.rb +0 -56
- data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +0 -46
- data/lib/splitclient-rb/cache/stores/segment_store.rb +0 -81
- data/lib/splitclient-rb/cache/stores/split_store.rb +0 -102
- data/lib/splitclient-rb/clients/localhost_split_client.rb +0 -183
- data/lib/splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent.rb +0 -46
- data/lib/splitclient-rb/engine/api/metrics.rb +0 -60
- data/lib/splitclient-rb/engine/metrics/metrics.rb +0 -80
- data/lib/splitclient-rb/engine/parser/split_adapter.rb +0 -81
- data/lib/splitclient-rb/localhost_split_factory.rb +0 -13
- data/lib/splitclient-rb/localhost_utils.rb +0 -59
- data/lib/splitclient-rb/managers/localhost_split_manager.rb +0 -60
|
@@ -2,15 +2,6 @@ require 'logger'
|
|
|
2
2
|
require 'socket'
|
|
3
3
|
|
|
4
4
|
module SplitIoClient
|
|
5
|
-
|
|
6
|
-
class << self
|
|
7
|
-
attr_accessor :configuration
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def self.configure(opts={})
|
|
11
|
-
self.configuration ||= SplitConfig.new(opts)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
5
|
#
|
|
15
6
|
# This class manages configuration options for the split client library.
|
|
16
7
|
# If not custom configuration is required the default configuration values will be used
|
|
@@ -26,7 +17,6 @@ module SplitIoClient
|
|
|
26
17
|
# @option opts [Int] :connection_timeout (2) The connect timeout for network connections in seconds.
|
|
27
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.
|
|
28
19
|
# @option opts [Int] :segments_refresh_rate
|
|
29
|
-
# @option opts [Int] :metrics_refresh_rate
|
|
30
20
|
# @option opts [Int] :impressions_refresh_rate
|
|
31
21
|
# @option opts [Object] :logger a logger to user for messages from the client. Defaults to stdout
|
|
32
22
|
# @option opts [Boolean] :debug_enabled (false) The value for the debug flag
|
|
@@ -41,39 +31,44 @@ module SplitIoClient
|
|
|
41
31
|
@events_uri = (opts[:events_uri] || SplitConfig.default_events_uri).chomp('/')
|
|
42
32
|
@mode = opts[:mode] || SplitConfig.default_mode
|
|
43
33
|
@redis_url = opts[:redis_url] || SplitConfig.default_redis_url
|
|
44
|
-
@redis_namespace = opts[:redis_namespace] ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
|
|
34
|
+
@redis_namespace = opts[:redis_namespace] && opts[:redis_namespace].to_s.length > 0 ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
|
|
45
35
|
@cache_adapter = SplitConfig.init_cache_adapter(
|
|
46
36
|
opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
|
|
47
37
|
)
|
|
48
38
|
@connection_timeout = opts[:connection_timeout] || SplitConfig.default_connection_timeout
|
|
49
39
|
@read_timeout = opts[:read_timeout] || SplitConfig.default_read_timeout
|
|
50
|
-
|
|
40
|
+
|
|
41
|
+
@logger = opts[:logger] || SplitConfig.default_logger
|
|
42
|
+
|
|
43
|
+
if(opts[:reload_rate])
|
|
44
|
+
@features_refresh_rate = opts[:reload_rate]
|
|
45
|
+
@logger.warn('Localhost mode: reload_rate will be deprecated soon in favor of ' \
|
|
46
|
+
'features_refresh_rate. Take a look in our documentation.'
|
|
47
|
+
)
|
|
48
|
+
else
|
|
49
|
+
@features_refresh_rate = opts[:features_refresh_rate] || SplitConfig.default_features_refresh_rate
|
|
50
|
+
end
|
|
51
|
+
|
|
51
52
|
@segments_refresh_rate = opts[:segments_refresh_rate] || SplitConfig.default_segments_refresh_rate
|
|
52
|
-
@metrics_refresh_rate = opts[:metrics_refresh_rate] || SplitConfig.default_metrics_refresh_rate
|
|
53
53
|
|
|
54
|
-
@
|
|
54
|
+
@impressions_mode = init_impressions_mode(opts[:impressions_mode], opts[:cache_adapter])
|
|
55
|
+
|
|
56
|
+
@impressions_refresh_rate = SplitConfig.init_impressions_refresh_rate(@impressions_mode, opts[:impressions_refresh_rate], SplitConfig.default_impressions_refresh_rate)
|
|
55
57
|
@impressions_queue_size = opts[:impressions_queue_size] || SplitConfig.default_impressions_queue_size
|
|
56
58
|
@impressions_adapter = SplitConfig.init_cache_adapter(
|
|
57
59
|
opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @impressions_queue_size, @redis_url
|
|
58
60
|
)
|
|
59
61
|
#Safeguard for users of older SDK versions.
|
|
60
|
-
@disable_impressions = @impressions_queue_size == -1
|
|
61
|
-
#Safeguard for users of older SDK versions.
|
|
62
62
|
@impressions_bulk_size = opts[:impressions_bulk_size] || @impressions_queue_size > 0 ? @impressions_queue_size : 0
|
|
63
63
|
|
|
64
|
-
@metrics_adapter = SplitConfig.init_cache_adapter(
|
|
65
|
-
opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
@logger = opts[:logger] || SplitConfig.default_logger
|
|
69
64
|
@debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
|
|
70
65
|
@transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
|
|
71
|
-
@block_until_ready =
|
|
66
|
+
@block_until_ready = SplitConfig.default_block_until_ready
|
|
72
67
|
|
|
73
|
-
@
|
|
68
|
+
@ip_addresses_enabled = opts[:ip_addresses_enabled].nil? ? SplitConfig.default_ip_addresses_enabled : opts[:ip_addresses_enabled]
|
|
74
69
|
|
|
75
|
-
@machine_name = opts[:machine_name] || SplitConfig.
|
|
76
|
-
@machine_ip = opts[:machine_ip] || SplitConfig.
|
|
70
|
+
@machine_name = SplitConfig.machine_hostname(@ip_addresses_enabled, opts[:machine_name], opts[:cache_adapter] || SplitConfig.default_cache_adapter)
|
|
71
|
+
@machine_ip = SplitConfig.machine_ip(@ip_addresses_enabled, opts[:machine_ip], opts[:cache_adapter] || SplitConfig.default_cache_adapter)
|
|
77
72
|
|
|
78
73
|
@cache_ttl = opts[:cache_ttl] || SplitConfig.cache_ttl
|
|
79
74
|
@max_cache_size = opts[:max_cache_size] || SplitConfig.max_cache_size
|
|
@@ -95,8 +90,41 @@ module SplitIoClient
|
|
|
95
90
|
@events_adapter = SplitConfig.init_cache_adapter(
|
|
96
91
|
opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @events_queue_size, @redis_url
|
|
97
92
|
)
|
|
93
|
+
|
|
94
|
+
@telemetry_adapter = SplitConfig.init_telemetry_adapter(
|
|
95
|
+
opts[:cache_adapter] || SplitConfig.default_cache_adapter, @redis_url
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
@split_file = opts[:split_file] || SplitConfig.default_split_file
|
|
99
|
+
|
|
98
100
|
@valid_mode = true
|
|
101
|
+
@split_logger = SplitIoClient::SplitLogger.new(self)
|
|
102
|
+
@split_validator = SplitIoClient::Validators.new(self)
|
|
103
|
+
@localhost_mode = opts[:localhost_mode]
|
|
104
|
+
|
|
105
|
+
@streaming_enabled = consumer? ? false : (opts[:streaming_enabled].nil? ? SplitConfig.default_streaming_enabled : opts[:streaming_enabled])
|
|
106
|
+
@streaming_service_url = opts[:streaming_service_url] || SplitConfig.default_streaming_service_url
|
|
107
|
+
@auth_service_url = opts[:auth_service_url] || SplitConfig.default_auth_service_url
|
|
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)
|
|
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)
|
|
99
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
|
+
@unique_keys_refresh_rate = SplitConfig.default_unique_keys_refresh_rate(@cache_adapter)
|
|
115
|
+
# @unique_keys_cache_max_size = SplitConfig.default_unique_keys_cache_max_size
|
|
116
|
+
@unique_keys_bulk_size = SplitConfig.default_unique_keys_bulk_size(@cache_adapter)
|
|
117
|
+
|
|
118
|
+
@counter_refresh_rate = SplitConfig.default_counter_refresh_rate(@cache_adapter)
|
|
119
|
+
|
|
120
|
+
@sdk_start_time = Time.now.to_f
|
|
121
|
+
|
|
122
|
+
@on_demand_fetch_retry_delay_seconds = SplitConfig.default_on_demand_fetch_retry_delay_seconds
|
|
123
|
+
@on_demand_fetch_max_retries = SplitConfig.default_on_demand_fetch_max_retries
|
|
124
|
+
|
|
125
|
+
@flag_sets_filter = SplitConfig.sanitize_flag_set_filter(opts[:flag_sets_filter], @split_validator, opts[:cache_adapter], @logger)
|
|
126
|
+
|
|
127
|
+
@fallback_treatments_configuration = SplitConfig.sanitize_fallback_config(opts[:fallback_treatments], @split_validator, @logger)
|
|
100
128
|
startup_log
|
|
101
129
|
end
|
|
102
130
|
|
|
@@ -135,12 +163,6 @@ module SplitIoClient
|
|
|
135
163
|
# @return [Object] Impressions adapter instance
|
|
136
164
|
attr_accessor :impressions_adapter
|
|
137
165
|
|
|
138
|
-
#
|
|
139
|
-
# The cache adapter to store metrics in
|
|
140
|
-
#
|
|
141
|
-
# @return [Symbol] Metrics adapter
|
|
142
|
-
attr_accessor :metrics_adapter
|
|
143
|
-
|
|
144
166
|
#
|
|
145
167
|
# The cache adapter to store events in
|
|
146
168
|
#
|
|
@@ -160,6 +182,20 @@ module SplitIoClient
|
|
|
160
182
|
# @return [Logger] The configured logger
|
|
161
183
|
attr_accessor :logger
|
|
162
184
|
|
|
185
|
+
#
|
|
186
|
+
# The split logger. The client library uses the split logger
|
|
187
|
+
# to use common functions around the logger
|
|
188
|
+
#
|
|
189
|
+
# @return [SplitLogger] The configured logger
|
|
190
|
+
attr_accessor :split_logger
|
|
191
|
+
|
|
192
|
+
#
|
|
193
|
+
# The split validator. The client library uses the split validator
|
|
194
|
+
# to validate inputs accross the sdk
|
|
195
|
+
#
|
|
196
|
+
# @return [SplitValidator] The validator
|
|
197
|
+
attr_accessor :split_validator
|
|
198
|
+
|
|
163
199
|
#
|
|
164
200
|
# The boolean that represents the state of the debug log level
|
|
165
201
|
#
|
|
@@ -197,19 +233,17 @@ module SplitIoClient
|
|
|
197
233
|
|
|
198
234
|
attr_accessor :features_refresh_rate
|
|
199
235
|
attr_accessor :segments_refresh_rate
|
|
200
|
-
attr_accessor :metrics_refresh_rate
|
|
201
236
|
attr_accessor :impressions_refresh_rate
|
|
202
237
|
|
|
203
238
|
attr_accessor :impression_listener
|
|
204
239
|
attr_accessor :impression_listener_refresh_rate
|
|
205
240
|
|
|
206
241
|
#
|
|
207
|
-
# How big the impressions queue is before dropping impressions
|
|
242
|
+
# How big the impressions queue is before dropping impressions
|
|
208
243
|
#
|
|
209
244
|
# @return [Integer]
|
|
210
245
|
attr_accessor :impressions_queue_size
|
|
211
246
|
attr_accessor :impressions_bulk_size
|
|
212
|
-
attr_accessor :disable_impressions
|
|
213
247
|
|
|
214
248
|
attr_accessor :redis_url
|
|
215
249
|
attr_accessor :redis_namespace
|
|
@@ -230,6 +264,118 @@ module SplitIoClient
|
|
|
230
264
|
# @return [Integer]
|
|
231
265
|
attr_accessor :events_queue_size
|
|
232
266
|
|
|
267
|
+
attr_accessor :split_file
|
|
268
|
+
|
|
269
|
+
attr_accessor :localhost_mode
|
|
270
|
+
|
|
271
|
+
attr_accessor :ip_addresses_enabled
|
|
272
|
+
|
|
273
|
+
attr_accessor :auth_service_url
|
|
274
|
+
|
|
275
|
+
attr_accessor :auth_retry_back_off_base
|
|
276
|
+
|
|
277
|
+
attr_accessor :streaming_service_url
|
|
278
|
+
|
|
279
|
+
attr_accessor :streaming_reconnect_back_off_base
|
|
280
|
+
|
|
281
|
+
attr_accessor :streaming_enabled
|
|
282
|
+
|
|
283
|
+
attr_accessor :impressions_mode
|
|
284
|
+
|
|
285
|
+
attr_accessor :telemetry_adapter
|
|
286
|
+
|
|
287
|
+
attr_accessor :telemetry_refresh_rate
|
|
288
|
+
|
|
289
|
+
attr_accessor :telemetry_service_url
|
|
290
|
+
|
|
291
|
+
attr_accessor :sdk_start_time
|
|
292
|
+
|
|
293
|
+
attr_accessor :on_demand_fetch_retry_delay_seconds
|
|
294
|
+
attr_accessor :on_demand_fetch_max_retries
|
|
295
|
+
|
|
296
|
+
attr_accessor :unique_keys_refresh_rate
|
|
297
|
+
#attr_accessor :unique_keys_cache_max_size
|
|
298
|
+
attr_accessor :unique_keys_bulk_size
|
|
299
|
+
|
|
300
|
+
attr_accessor :counter_refresh_rate
|
|
301
|
+
|
|
302
|
+
#
|
|
303
|
+
# Flagsets filter
|
|
304
|
+
#
|
|
305
|
+
# @return [Array]
|
|
306
|
+
attr_accessor :flag_sets_filter
|
|
307
|
+
|
|
308
|
+
attr_accessor :fallback_treatments_configuration
|
|
309
|
+
|
|
310
|
+
def self.default_counter_refresh_rate(adapter)
|
|
311
|
+
return 300 if adapter == :redis # Send bulk impressions count - Refresh rate: 5 min.
|
|
312
|
+
|
|
313
|
+
1800 # Send bulk impressions count - Refresh rate: 30 min.
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def self.default_on_demand_fetch_retry_delay_seconds
|
|
317
|
+
0.05
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def self.default_on_demand_fetch_max_retries
|
|
321
|
+
10
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def init_impressions_mode(impressions_mode, adapter)
|
|
325
|
+
case impressions_mode
|
|
326
|
+
when :optimized
|
|
327
|
+
return :optimized
|
|
328
|
+
when :none
|
|
329
|
+
return :none
|
|
330
|
+
when :debug
|
|
331
|
+
return :debug
|
|
332
|
+
else
|
|
333
|
+
default = adapter == :redis ? :debug : :optimized
|
|
334
|
+
@logger.error("You passed an invalid impressions_mode, impressions_mode should be one of the following values: :debug, :optimized or :none. Defaulting to #{default} mode") unless impressions_mode.nil?
|
|
335
|
+
return default
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def self.init_impressions_refresh_rate(impressions_mode, refresh_rate, default_rate)
|
|
340
|
+
return (refresh_rate.nil? || refresh_rate <= 0 ? default_rate : refresh_rate) if impressions_mode == :debug
|
|
341
|
+
|
|
342
|
+
return refresh_rate.nil? || refresh_rate <= 0 ? SplitConfig.default_impressions_refresh_rate_optimized : [default_rate, refresh_rate].max
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def self.init_telemetry_refresh_rate(refresh_rate)
|
|
346
|
+
return SplitConfig.default_telemetry_refresh_rate if refresh_rate.nil? || refresh_rate < 60
|
|
347
|
+
|
|
348
|
+
refresh_rate
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def self.default_streaming_enabled
|
|
352
|
+
true
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def self.default_streaming_service_url
|
|
356
|
+
'https://streaming.split.io/event-stream'
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def self.default_auth_service_url
|
|
360
|
+
'https://auth.split.io/api/v2/auth'
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def self.default_auth_retry_back_off_base
|
|
364
|
+
1
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def self.default_streaming_reconnect_back_off_base
|
|
368
|
+
1
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def self.init_auth_retry_back_off(auth_retry_back_off)
|
|
372
|
+
auth_retry_back_off < 1 ? SplitConfig.default_auth_retry_back_off_base : auth_retry_back_off
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def self.init_streaming_reconnect_back_off(streaming_reconnect_back_off)
|
|
376
|
+
streaming_reconnect_back_off < 1 ? SplitConfig.default_streaming_reconnect_back_off_base : streaming_reconnect_back_off
|
|
377
|
+
end
|
|
378
|
+
|
|
233
379
|
#
|
|
234
380
|
# The default split client configuration
|
|
235
381
|
#
|
|
@@ -265,6 +411,21 @@ module SplitIoClient
|
|
|
265
411
|
end
|
|
266
412
|
end
|
|
267
413
|
|
|
414
|
+
def self.init_telemetry_adapter(adapter, redis_url)
|
|
415
|
+
case adapter
|
|
416
|
+
when :memory
|
|
417
|
+
Telemetry::Storages::Memory.new
|
|
418
|
+
when :redis
|
|
419
|
+
begin
|
|
420
|
+
require 'redis'
|
|
421
|
+
rescue LoadError
|
|
422
|
+
fail StandardError, 'To use Redis as a cache adapter you must include it in your Gemfile'
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
SplitIoClient::Cache::Adapters::RedisAdapter.new(redis_url)
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
|
|
268
429
|
def self.map_memory_adapter(name, queue_size)
|
|
269
430
|
case name
|
|
270
431
|
when :map_adapter
|
|
@@ -283,10 +444,6 @@ module SplitIoClient
|
|
|
283
444
|
:memory
|
|
284
445
|
end
|
|
285
446
|
|
|
286
|
-
def self.default_metrics_adapter
|
|
287
|
-
:memory
|
|
288
|
-
end
|
|
289
|
-
|
|
290
447
|
#
|
|
291
448
|
# The default read timeout value
|
|
292
449
|
#
|
|
@@ -304,19 +461,19 @@ module SplitIoClient
|
|
|
304
461
|
end
|
|
305
462
|
|
|
306
463
|
def self.default_features_refresh_rate
|
|
307
|
-
|
|
464
|
+
60
|
|
308
465
|
end
|
|
309
466
|
|
|
310
467
|
def self.default_segments_refresh_rate
|
|
311
468
|
60
|
|
312
469
|
end
|
|
313
470
|
|
|
314
|
-
def self.
|
|
471
|
+
def self.default_impressions_refresh_rate
|
|
315
472
|
60
|
|
316
473
|
end
|
|
317
474
|
|
|
318
|
-
def self.
|
|
319
|
-
|
|
475
|
+
def self.default_impressions_refresh_rate_optimized
|
|
476
|
+
300
|
|
320
477
|
end
|
|
321
478
|
|
|
322
479
|
def self.default_impression_listener_refresh_rate
|
|
@@ -335,6 +492,47 @@ module SplitIoClient
|
|
|
335
492
|
500
|
|
336
493
|
end
|
|
337
494
|
|
|
495
|
+
def self.default_telemetry_refresh_rate
|
|
496
|
+
3600
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
def self.default_unique_keys_refresh_rate(adapter)
|
|
500
|
+
return 300 if adapter == :redis
|
|
501
|
+
|
|
502
|
+
900
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
# def self.default_unique_keys_cache_max_size
|
|
506
|
+
# 30000
|
|
507
|
+
# end
|
|
508
|
+
|
|
509
|
+
def self.default_unique_keys_bulk_size(adapter)
|
|
510
|
+
return 2000 if adapter == :redis
|
|
511
|
+
|
|
512
|
+
5000
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
def self.default_telemetry_service_url
|
|
516
|
+
'https://telemetry.split.io/api/v1'
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
def self.default_split_file
|
|
520
|
+
File.join(Dir.home, '.split')
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
def self.default_offline_refresh_rate
|
|
524
|
+
5
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
def self.sanitize_flag_set_filter(flag_sets, validator, adapter, logger)
|
|
528
|
+
return [] if flag_sets.nil?
|
|
529
|
+
if adapter == :redis
|
|
530
|
+
logger.warn("config: : flag_sets_filter is not applicable for Consumer modes where the SDK does not keep rollout data in sync. FlagSet filter was discarded")
|
|
531
|
+
return []
|
|
532
|
+
end
|
|
533
|
+
return validator.valid_flag_sets(:config, flag_sets)
|
|
534
|
+
end
|
|
535
|
+
|
|
338
536
|
#
|
|
339
537
|
# The default logger object
|
|
340
538
|
#
|
|
@@ -343,14 +541,12 @@ module SplitIoClient
|
|
|
343
541
|
if defined?(Rails) && Rails.logger
|
|
344
542
|
Rails.logger
|
|
345
543
|
elsif ENV['SPLITCLIENT_ENV'] == 'test'
|
|
346
|
-
Logger.new('/dev/null')
|
|
544
|
+
Logger.new('/dev/null')
|
|
347
545
|
else
|
|
348
546
|
Logger.new($stdout)
|
|
349
547
|
end
|
|
350
548
|
end
|
|
351
549
|
|
|
352
|
-
|
|
353
|
-
|
|
354
550
|
#
|
|
355
551
|
# The default debug value
|
|
356
552
|
#
|
|
@@ -375,6 +571,22 @@ module SplitIoClient
|
|
|
375
571
|
'SPLITIO'
|
|
376
572
|
end
|
|
377
573
|
|
|
574
|
+
#
|
|
575
|
+
# The default block until ready value
|
|
576
|
+
#
|
|
577
|
+
# @return [int]
|
|
578
|
+
def self.default_block_until_ready
|
|
579
|
+
15
|
|
580
|
+
end
|
|
581
|
+
|
|
582
|
+
#
|
|
583
|
+
# The default ip addresses enabled value
|
|
584
|
+
#
|
|
585
|
+
# @return [boolean]
|
|
586
|
+
def self.default_ip_addresses_enabled
|
|
587
|
+
true
|
|
588
|
+
end
|
|
589
|
+
|
|
378
590
|
#
|
|
379
591
|
# The default transport_debug_enabled value
|
|
380
592
|
#
|
|
@@ -429,27 +641,97 @@ module SplitIoClient
|
|
|
429
641
|
@logger.info("Loaded cache class: #{@cache_adapter.class}")
|
|
430
642
|
end
|
|
431
643
|
|
|
644
|
+
def standalone?
|
|
645
|
+
@mode.equal?(:standalone)
|
|
646
|
+
end
|
|
647
|
+
|
|
648
|
+
def consumer?
|
|
649
|
+
@mode.equal?(:consumer)
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
def sdk_url_overriden?
|
|
653
|
+
return @base_uri != SplitConfig.default_base_uri
|
|
654
|
+
end
|
|
655
|
+
|
|
432
656
|
#
|
|
433
657
|
# gets the hostname where the sdk gem is running
|
|
434
658
|
#
|
|
435
659
|
# @return [string]
|
|
436
|
-
def self.machine_hostname
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
660
|
+
def self.machine_hostname(ip_addresses_enabled, machine_name, adapter)
|
|
661
|
+
if ip_addresses_enabled
|
|
662
|
+
begin
|
|
663
|
+
return machine_name || Socket.gethostname
|
|
664
|
+
rescue
|
|
665
|
+
return 'unknown'.freeze
|
|
666
|
+
end
|
|
667
|
+
else
|
|
668
|
+
case adapter
|
|
669
|
+
when :redis
|
|
670
|
+
return 'NA'.freeze
|
|
671
|
+
end
|
|
672
|
+
end
|
|
673
|
+
|
|
674
|
+
return ''.freeze
|
|
440
675
|
end
|
|
441
676
|
|
|
442
677
|
#
|
|
443
678
|
# gets the ip where the sdk gem is running
|
|
444
679
|
#
|
|
445
680
|
# @return [string]
|
|
446
|
-
def self.machine_ip
|
|
447
|
-
|
|
448
|
-
|
|
681
|
+
def self.machine_ip(ip_addresses_enabled, ip, adapter)
|
|
682
|
+
if ip_addresses_enabled
|
|
683
|
+
begin
|
|
684
|
+
return ip unless ip.nil? || ip.to_s.empty?
|
|
449
685
|
|
|
450
|
-
|
|
686
|
+
loopback_ip = Socket.ip_address_list.find { |ip| ip.ipv4_loopback? }
|
|
687
|
+
private_ip = Socket.ip_address_list.find { |ip| ip.ipv4_private? }
|
|
688
|
+
|
|
689
|
+
addr_info = private_ip || loopback_ip
|
|
690
|
+
|
|
691
|
+
return addr_info.ip_address
|
|
692
|
+
rescue
|
|
693
|
+
return 'unknown'.freeze
|
|
694
|
+
end
|
|
695
|
+
else
|
|
696
|
+
case adapter
|
|
697
|
+
when :redis
|
|
698
|
+
return 'NA'.freeze
|
|
699
|
+
end
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
return ''.freeze
|
|
703
|
+
end
|
|
704
|
+
|
|
705
|
+
def self.sanitize_fallback_config(fallback_config, validator, logger)
|
|
706
|
+
return fallback_config if fallback_config.nil?
|
|
707
|
+
|
|
708
|
+
processed = Engine::Models::FallbackTreatmentsConfiguration.new
|
|
709
|
+
if !fallback_config.is_a?(Engine::Models::FallbackTreatmentsConfiguration)
|
|
710
|
+
logger.warn('Config: fallbackTreatments parameter should be of `FallbackTreatmentsConfiguration` class.')
|
|
711
|
+
return processed
|
|
712
|
+
end
|
|
713
|
+
|
|
714
|
+
sanitized_global_fallback_treatment = fallback_config.global_fallback_treatment
|
|
715
|
+
if !fallback_config.global_fallback_treatment.nil? && !validator.validate_fallback_treatment('Config', fallback_config.global_fallback_treatment)
|
|
716
|
+
logger.warn('Config: global fallbacktreatment parameter is discarded.')
|
|
717
|
+
sanitized_global_fallback_treatment = nil
|
|
718
|
+
end
|
|
719
|
+
|
|
720
|
+
sanitized_flag_fallback_treatments = nil
|
|
721
|
+
if !fallback_config.by_flag_fallback_treatment.nil? && fallback_config.by_flag_fallback_treatment.is_a?(Hash)
|
|
722
|
+
sanitized_flag_fallback_treatments = Hash.new
|
|
723
|
+
for feature_name in fallback_config.by_flag_fallback_treatment.keys()
|
|
724
|
+
if !validator.valid_split_name?('Config', feature_name) || !validator.validate_fallback_treatment('Config', fallback_config.by_flag_fallback_treatment[feature_name])
|
|
725
|
+
logger.warn("Config: fallback treatment parameter for feature flag #{feature_name} is discarded.")
|
|
726
|
+
next
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
sanitized_flag_fallback_treatments[feature_name] = fallback_config.by_flag_fallback_treatment[feature_name]
|
|
730
|
+
end
|
|
731
|
+
end
|
|
732
|
+
processed = Engine::Models::FallbackTreatmentsConfiguration.new(sanitized_global_fallback_treatment, sanitized_flag_fallback_treatments)
|
|
451
733
|
|
|
452
|
-
|
|
734
|
+
processed
|
|
453
735
|
end
|
|
454
736
|
end
|
|
455
737
|
end
|