splitclient-rb 4.5.1-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.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +45 -0
  3. data/CHANGES.txt +147 -0
  4. data/Detailed-README.md +571 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +13 -0
  7. data/NEWS +75 -0
  8. data/README.md +43 -0
  9. data/Rakefile +24 -0
  10. data/exe/splitio +96 -0
  11. data/ext/murmurhash/MurmurHash3.java +162 -0
  12. data/lib/murmurhash/base.rb +58 -0
  13. data/lib/murmurhash/murmurhash.jar +0 -0
  14. data/lib/murmurhash/murmurhash_mri.rb +3 -0
  15. data/lib/splitclient-rb.rb +90 -0
  16. data/lib/splitclient-rb/cache/adapters/memory_adapter.rb +12 -0
  17. data/lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb +133 -0
  18. data/lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb +44 -0
  19. data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +165 -0
  20. data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +30 -0
  21. data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +29 -0
  22. data/lib/splitclient-rb/cache/repositories/events_repository.rb +41 -0
  23. data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +49 -0
  24. data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +78 -0
  25. data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +21 -0
  26. data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +129 -0
  27. data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +98 -0
  28. data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +22 -0
  29. data/lib/splitclient-rb/cache/repositories/repository.rb +23 -0
  30. data/lib/splitclient-rb/cache/repositories/segments_repository.rb +82 -0
  31. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +106 -0
  32. data/lib/splitclient-rb/cache/routers/impression_router.rb +52 -0
  33. data/lib/splitclient-rb/cache/senders/events_sender.rb +47 -0
  34. data/lib/splitclient-rb/cache/senders/impressions_formatter.rb +73 -0
  35. data/lib/splitclient-rb/cache/senders/impressions_sender.rb +67 -0
  36. data/lib/splitclient-rb/cache/senders/metrics_sender.rb +49 -0
  37. data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +48 -0
  38. data/lib/splitclient-rb/cache/stores/segment_store.rb +82 -0
  39. data/lib/splitclient-rb/cache/stores/split_store.rb +97 -0
  40. data/lib/splitclient-rb/clients/localhost_split_client.rb +92 -0
  41. data/lib/splitclient-rb/clients/split_client.rb +214 -0
  42. data/lib/splitclient-rb/engine/api/client.rb +74 -0
  43. data/lib/splitclient-rb/engine/api/events.rb +48 -0
  44. data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +55 -0
  45. data/lib/splitclient-rb/engine/api/impressions.rb +42 -0
  46. data/lib/splitclient-rb/engine/api/metrics.rb +61 -0
  47. data/lib/splitclient-rb/engine/api/segments.rb +62 -0
  48. data/lib/splitclient-rb/engine/api/splits.rb +60 -0
  49. data/lib/splitclient-rb/engine/evaluator/splitter.rb +123 -0
  50. data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +46 -0
  51. data/lib/splitclient-rb/engine/matchers/between_matcher.rb +56 -0
  52. data/lib/splitclient-rb/engine/matchers/combiners.rb +9 -0
  53. data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +86 -0
  54. data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +21 -0
  55. data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +19 -0
  56. data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +30 -0
  57. data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +20 -0
  58. data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +26 -0
  59. data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +27 -0
  60. data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +54 -0
  61. data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +19 -0
  62. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +53 -0
  63. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +53 -0
  64. data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +24 -0
  65. data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +60 -0
  66. data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +23 -0
  67. data/lib/splitclient-rb/engine/matchers/set_matcher.rb +20 -0
  68. data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +26 -0
  69. data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +45 -0
  70. data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +66 -0
  71. data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +128 -0
  72. data/lib/splitclient-rb/engine/metrics/metrics.rb +83 -0
  73. data/lib/splitclient-rb/engine/models/label.rb +8 -0
  74. data/lib/splitclient-rb/engine/models/split.rb +17 -0
  75. data/lib/splitclient-rb/engine/models/treatment.rb +3 -0
  76. data/lib/splitclient-rb/engine/parser/condition.rb +210 -0
  77. data/lib/splitclient-rb/engine/parser/evaluator.rb +118 -0
  78. data/lib/splitclient-rb/engine/parser/partition.rb +35 -0
  79. data/lib/splitclient-rb/engine/parser/split_adapter.rb +88 -0
  80. data/lib/splitclient-rb/exceptions/impressions_shutdown_exception.rb +4 -0
  81. data/lib/splitclient-rb/exceptions/sdk_blocker_timeout_expired_exception.rb +4 -0
  82. data/lib/splitclient-rb/localhost_split_factory.rb +13 -0
  83. data/lib/splitclient-rb/localhost_utils.rb +36 -0
  84. data/lib/splitclient-rb/managers/localhost_split_manager.rb +45 -0
  85. data/lib/splitclient-rb/managers/split_manager.rb +77 -0
  86. data/lib/splitclient-rb/split_config.rb +391 -0
  87. data/lib/splitclient-rb/split_factory.rb +35 -0
  88. data/lib/splitclient-rb/split_factory_builder.rb +16 -0
  89. data/lib/splitclient-rb/utilitites.rb +41 -0
  90. data/lib/splitclient-rb/version.rb +3 -0
  91. data/splitclient-rb.gemspec +50 -0
  92. data/splitio.yml.example +7 -0
  93. data/tasks/benchmark_get_treatment.rake +43 -0
  94. data/tasks/irb.rake +4 -0
  95. data/tasks/rspec.rake +3 -0
  96. metadata +321 -0
@@ -0,0 +1,88 @@
1
+ require 'json'
2
+ require 'thread'
3
+
4
+ include SplitIoClient::Cache::Stores
5
+ include SplitIoClient::Cache::Senders
6
+
7
+ module SplitIoClient
8
+ #
9
+ # acts as an api adapater to connect to split endpoints
10
+ # uses a configuration object that can be modified when creating the client instance
11
+ # also, uses safe threads to execute fetches and post give the time execution values from the config
12
+ #
13
+ class SplitAdapter < NoMethodError
14
+ attr_reader :splits_repository, :segments_repository, :impressions_repository, :metrics
15
+
16
+ #
17
+ # Creates a new split api adapter instance that consumes split api endpoints
18
+ #
19
+ # @param api_key [String] the API key for your split account
20
+ # @param config [SplitConfig] SplitConfig instance
21
+ # @param splits_repository [SplitsRepository] SplitsRepository instance to store splits in
22
+ # @param segments_repository [SegmentsRepository] SegmentsRepository instance to store segments in
23
+ # @param impressions_repository [ImpressionsRepository] ImpressionsRepository instance to store impressions in
24
+ # @param metrics_repository [MetricsRepository] SplitsRepository instance to store metrics in
25
+ # @param sdk_blocker [SDKBlocker] SDKBlocker instance which blocks splits_repository/segments_repository
26
+ #
27
+ # @return [SplitIoClient] split.io client instance
28
+ def initialize(api_key, config, splits_repository, segments_repository, impressions_repository, metrics_repository, events_repository, sdk_blocker)
29
+ @api_key = api_key
30
+ @config = config
31
+ @splits_repository = splits_repository
32
+ @segments_repository = segments_repository
33
+ @impressions_repository = impressions_repository
34
+ @metrics_repository = metrics_repository
35
+ @events_repository = events_repository
36
+ @metrics = Metrics.new(100, @config, @metrics_repository)
37
+ @sdk_blocker = sdk_blocker
38
+
39
+ start_based_on_mode(@config.mode)
40
+ end
41
+
42
+ def start_based_on_mode(mode)
43
+ case mode
44
+ when :standalone
45
+ split_store
46
+ segment_store
47
+ metrics_sender
48
+ impressions_sender
49
+ events_sender
50
+ when :consumer
51
+ # Do nothing in background
52
+ when :producer
53
+ split_store
54
+ segment_store
55
+ impressions_sender
56
+ metrics_sender
57
+ events_sender
58
+
59
+ sleep unless ENV['SPLITCLIENT_ENV'] == 'test'
60
+ end
61
+ end
62
+
63
+ # Starts thread which loops constantly and stores splits in the splits_repository of choice
64
+ def split_store
65
+ SplitStore.new(@splits_repository, @config, @api_key, @metrics, @sdk_blocker).call
66
+ end
67
+
68
+ # Starts thread which loops constantly and stores segments in the segments_repository of choice
69
+ def segment_store
70
+ SegmentStore.new(@segments_repository, @config, @api_key, @metrics, @sdk_blocker).call
71
+ end
72
+
73
+ # Starts thread which loops constantly and sends impressions to the Split API
74
+ def impressions_sender
75
+ ImpressionsSender.new(@impressions_repository, @config, @api_key).call
76
+ end
77
+
78
+ # Starts thread which loops constantly and sends metrics to the Split API
79
+ def metrics_sender
80
+ MetricsSender.new(@metrics_repository, @config, @api_key).call
81
+ end
82
+
83
+ # Starts thread which loops constantly and sends events to the Split API
84
+ def events_sender
85
+ EventsSender.new(@events_repository, @config, @api_key).call
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,4 @@
1
+ module SplitIoClient
2
+ class ImpressionShutdownException < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module SplitIoClient
2
+ class SDKBlockerTimeoutExpiredException < StandardError
3
+ end
4
+ end
@@ -0,0 +1,13 @@
1
+ module SplitIoClient
2
+ class LocalhostSplitFactory
3
+ attr_reader :client, :manager
4
+
5
+ def initialize(splits_file, reload_rate = nil)
6
+ @splits_file = splits_file
7
+ @reload_rate = reload_rate
8
+
9
+ @client = LocalhostSplitClient.new(@splits_file, @reload_rate)
10
+ @manager = LocalhostSplitManager.new(@splits_file, @reload_rate)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,36 @@
1
+ module SplitIoClient
2
+ module LocalhostUtils
3
+ #
4
+ # method to set localhost mode features by reading the given .splits
5
+ #
6
+ # @param splits_file [File] the .split file that contains the splits
7
+ # @param reload_rate [Integer] the number of seconds to reload splits_file
8
+ # @return nil
9
+ def load_localhost_mode_features(splits_file, reload_rate = nil)
10
+ return @localhost_mode_features unless File.exists?(splits_file)
11
+
12
+ store_features(splits_file)
13
+
14
+ return unless reload_rate
15
+
16
+ Thread.new do
17
+ loop do
18
+ @localhost_mode_features = []
19
+ store_features(splits_file)
20
+
21
+ sleep(SplitIoClient::Utilities.randomize_interval(reload_rate))
22
+ end
23
+ end
24
+ end
25
+
26
+ def store_features(splits_file)
27
+ File.open(splits_file).each do |line|
28
+ feature, treatment = line.strip.split(' ')
29
+
30
+ next if line.start_with?('#') || line.strip.empty?
31
+
32
+ @localhost_mode_features << { feature: feature, treatment: treatment }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,45 @@
1
+ module SplitIoClient
2
+ class LocalhostSplitManager
3
+ include SplitIoClient::LocalhostUtils
4
+
5
+ #
6
+ # Creates a new split manager instance that holds the splits from a given file
7
+ #
8
+ # @param splits_file [File] the .split file that contains the splits
9
+ # @param reload_rate [Integer] the number of seconds to reload splits_file
10
+ #
11
+ # @return [LocalhostSplitIoManager] split.io localhost manager instance
12
+ def initialize(splits_file, reload_rate = nil)
13
+ @localhost_mode = true
14
+ @localhost_mode_features = []
15
+
16
+ load_localhost_mode_features(splits_file, reload_rate)
17
+ end
18
+
19
+ #
20
+ # method to get a split view
21
+ #
22
+ # @returns a split view
23
+ def split(split_name)
24
+ @localhost_mode_features.find { |x| x[:feature] == split_name }
25
+ end
26
+
27
+ #
28
+ # method to get the split list from the client
29
+ #
30
+ # @returns [object] array of splits
31
+ def splits
32
+ @localhost_mode_features
33
+ end
34
+
35
+ #
36
+ # method to get the list of just split names. Ideal for ietrating and calling client.get_treatment
37
+ #
38
+ # @returns [object] array of split names (String)
39
+ def split_names
40
+ @localhost_mode_features.each_with_object([]) do |split, memo|
41
+ memo << split[:feature]
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,77 @@
1
+ module SplitIoClient
2
+ class SplitManager
3
+ #
4
+ # Creates a new split manager instance that connects to split.io API.
5
+ #
6
+ # @param api_key [String] the API key for your split account
7
+ #
8
+ # @return [SplitIoManager] split.io client instance
9
+ def initialize(api_key, config = {}, adapter = nil, splits_repository = nil)
10
+ @localhost_mode_features = []
11
+ @config = config
12
+ @splits_repository = splits_repository
13
+ @adapter = adapter
14
+ end
15
+
16
+ #
17
+ # method to get the split list from the client
18
+ #
19
+ # @returns [object] array of splits
20
+ def splits
21
+ return if @splits_repository.nil?
22
+
23
+ @splits_repository.splits.each_with_object([]) do |(name, split), memo|
24
+ split_view = build_split_view(name, split)
25
+
26
+ next if split_view[:name] == nil
27
+
28
+ memo << split_view unless Engine::Models::Split.archived?(split)
29
+ end
30
+ end
31
+
32
+ #
33
+ # method to get the list of just split names. Ideal for ietrating and calling client.get_treatment
34
+ #
35
+ # @returns [object] array of split names (String)
36
+ def split_names
37
+ return if @splits_repository.nil?
38
+
39
+ @splits_repository.split_names
40
+ end
41
+
42
+ #
43
+ # method to get a split view
44
+ #
45
+ # @returns a split view
46
+ def split(split_name)
47
+ return unless @splits_repository
48
+
49
+ split = @splits_repository.get_split(split_name)
50
+
51
+ return if split.nil? || Engine::Models::Split.archived?(split)
52
+
53
+ build_split_view(split_name, split)
54
+ end
55
+
56
+ def build_split_view(name, split)
57
+ return {} unless split
58
+
59
+ begin
60
+ treatments = split[:conditions]
61
+ .detect { |c| c[:conditionType] == 'ROLLOUT' }[:partitions]
62
+ .map { |partition| partition[:treatment] }
63
+ rescue StandardError
64
+ treatments = []
65
+ end
66
+
67
+
68
+ {
69
+ name: name,
70
+ traffic_type_name: split[:trafficTypeName],
71
+ killed: split[:killed],
72
+ treatments: treatments,
73
+ change_number: split[:changeNumber]
74
+ }
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,391 @@
1
+ require 'logger'
2
+ require 'socket'
3
+
4
+ module SplitIoClient
5
+ #
6
+ # This class manages configuration options for the split client library.
7
+ # If not custom configuration is required the default configuration values will be used
8
+ #
9
+ class SplitConfig
10
+ #
11
+ # Constructor for creating custom split client config
12
+ #
13
+ # @param opts [Hash] optional hash with configuration options
14
+ # @option opts [String] :base_uri ("https://sdk.split.io/api/") The base URL for split API end points
15
+ # @option opts [String] :events_uri ("https://events.split.io/api/") The events URL for events end points
16
+ # @option opts [Int] :read_timeout (10) The read timeout for network connections in seconds.
17
+ # @option opts [Int] :connection_timeout (2) The connect timeout for network connections in seconds.
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
+ # @option opts [Int] :segments_refresh_rate
20
+ # @option opts [Int] :metrics_refresh_rate
21
+ # @option opts [Int] :impressions_refresh_rate
22
+ # @option opts [Object] :logger a logger to user for messages from the client. Defaults to stdout
23
+ # @option opts [Boolean] :debug_enabled (false) The value for the debug flag
24
+ # @option opts [Int] :impressions_queue_size how big the impressions queue is before dropping impressions. -1 to disable it.
25
+ #
26
+ # @return [type] SplitConfig with configuration options
27
+ def initialize(opts = {})
28
+ @base_uri = (opts[:base_uri] || SplitConfig.default_base_uri).chomp('/')
29
+ @events_uri = (opts[:events_uri] || SplitConfig.default_events_uri).chomp('/')
30
+ @mode = opts[:mode] || SplitConfig.default_mode
31
+ @redis_url = opts[:redis_url] || SplitConfig.default_redis_url
32
+ @redis_namespace = opts[:redis_namespace] ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
33
+ @cache_adapter = SplitConfig.init_cache_adapter(
34
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, @redis_url, false
35
+ )
36
+ @connection_timeout = opts[:connection_timeout] || SplitConfig.default_connection_timeout
37
+ @read_timeout = opts[:read_timeout] || SplitConfig.default_read_timeout
38
+ @features_refresh_rate = opts[:features_refresh_rate] || SplitConfig.default_features_refresh_rate
39
+ @segments_refresh_rate = opts[:segments_refresh_rate] || SplitConfig.default_segments_refresh_rate
40
+ @metrics_refresh_rate = opts[:metrics_refresh_rate] || SplitConfig.default_metrics_refresh_rate
41
+
42
+ @impressions_refresh_rate = opts[:impressions_refresh_rate] || SplitConfig.default_impressions_refresh_rate
43
+ @impressions_queue_size = opts[:impressions_queue_size] || SplitConfig.default_impressions_queue_size
44
+ @impressions_adapter = SplitConfig.init_cache_adapter(
45
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @redis_url, @impressions_queue_size
46
+ )
47
+
48
+ @metrics_adapter = SplitConfig.init_cache_adapter(
49
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, @redis_url, false
50
+ )
51
+
52
+ @logger = opts[:logger] || SplitConfig.default_logger
53
+ @debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
54
+ @transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
55
+ @block_until_ready = opts[:ready] || opts[:block_until_ready] || 0
56
+ @machine_name = opts[:machine_name] || SplitConfig.machine_hostname
57
+ @machine_ip = opts[:machine_ip] || SplitConfig.machine_ip
58
+
59
+ @language = opts[:language] || 'ruby'
60
+ @version = opts[:version] || SplitIoClient::VERSION
61
+
62
+ @labels_enabled = opts[:labels_enabled].nil? ? SplitConfig.default_labels_logging : opts[:labels_enabled]
63
+
64
+ @impression_listener = opts[:impression_listener]
65
+ @impression_listener_refresh_rate = opts[:impression_listener_refresh_rate] || SplitConfig.default_impression_listener_refresh_rate
66
+
67
+ @threads = {}
68
+
69
+ @events_push_rate = opts[:events_push_rate] || SplitConfig.default_events_push_rate
70
+ @events_queue_size = opts[:events_queue_size] || SplitConfig.default_events_queue_size
71
+ @events_adapter = SplitConfig.init_cache_adapter(
72
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @redis_url, @events_queue_size
73
+ )
74
+
75
+ startup_log
76
+ end
77
+
78
+ #
79
+ # The base URL for split API end points
80
+ #
81
+ # @return [String] The configured base URL for the split API end points
82
+ attr_reader :base_uri
83
+
84
+ #
85
+ # The base URL for split events API end points
86
+ #
87
+ # @return [String] The configured URL for the events API end points
88
+ attr_reader :events_uri
89
+
90
+ #
91
+ # The mode SDK will run
92
+ #
93
+ # @return [Symbol] One of the available SDK modes: standalone, consumer, producer
94
+ attr_reader :mode
95
+
96
+ # The read timeout for network connections in seconds.
97
+ #
98
+ # @return [Int] The timeout in seconds.
99
+ attr_reader :read_timeout
100
+
101
+ #
102
+ # The cache adapter to store splits/segments in
103
+ #
104
+ # @return [Object] Cache adapter instance
105
+ attr_reader :cache_adapter
106
+
107
+ #
108
+ # The cache adapter to store impressions in
109
+ #
110
+ # @return [Object] Impressions adapter instance
111
+ attr_reader :impressions_adapter
112
+
113
+ #
114
+ # The cache adapter to store metrics in
115
+ #
116
+ # @return [Symbol] Metrics adapter
117
+ attr_reader :metrics_adapter
118
+
119
+ #
120
+ # The cache adapter to store events in
121
+ #
122
+ # @return [Object] Metrics adapter
123
+ attr_reader :events_adapter
124
+
125
+ #
126
+ # The connection timeout for network connections in seconds.
127
+ #
128
+ # @return [Int] The connect timeout in seconds.
129
+ attr_reader :connection_timeout
130
+
131
+ #
132
+ # The configured logger. The client library uses the log to
133
+ # print warning and error messages.
134
+ #
135
+ # @return [Logger] The configured logger
136
+ attr_reader :logger
137
+
138
+ #
139
+ # The boolean that represents the state of the debug log level
140
+ #
141
+ # @return [Boolean] The value for the debug flag
142
+ attr_reader :debug_enabled
143
+
144
+ #
145
+ # Enable to log the content retrieved from endpoints
146
+ #
147
+ # @return [Boolean] The value for the debug flag
148
+ attr_reader :transport_debug_enabled
149
+
150
+ #
151
+ # Enable logging labels and sending potentially sensitive information
152
+ #
153
+ # @return [Boolean] The value for the labels enabled flag
154
+ attr_reader :labels_enabled
155
+
156
+ #
157
+ # The number of seconds to wait for SDK readiness
158
+ # or false to disable waiting
159
+ # @return [Integer]/[FalseClass]
160
+ attr_reader :block_until_ready
161
+
162
+ attr_reader :machine_ip
163
+ attr_reader :machine_name
164
+
165
+ attr_reader :language
166
+ attr_reader :version
167
+
168
+ attr_reader :features_refresh_rate
169
+ attr_reader :segments_refresh_rate
170
+ attr_reader :metrics_refresh_rate
171
+ attr_reader :impressions_refresh_rate
172
+
173
+ attr_reader :impression_listener
174
+ attr_reader :impression_listener_refresh_rate
175
+
176
+ #
177
+ # How big the impressions queue is before dropping impressions. -1 to disable it.
178
+ #
179
+ # @return [Integer]
180
+ attr_reader :impressions_queue_size
181
+
182
+ attr_reader :redis_url
183
+ attr_reader :redis_namespace
184
+
185
+ attr_accessor :threads
186
+
187
+ #
188
+ # The schedule time for events flush after the first one
189
+ #
190
+ # @return [Integer]
191
+ attr_reader :events_push_rate
192
+
193
+ #
194
+ # The max size of the events queue
195
+ #
196
+ # @return [Integer]
197
+ attr_reader :events_queue_size
198
+
199
+ #
200
+ # The default split client configuration
201
+ #
202
+ # @return [Config] The default split client configuration.
203
+ def self.default
204
+ SplitConfig.new
205
+ end
206
+
207
+ #
208
+ # The default base uri for api calls
209
+ #
210
+ # @return [string] The default base uri
211
+ def self.default_base_uri
212
+ 'https://sdk.split.io/api/'
213
+ end
214
+
215
+ def self.default_events_uri
216
+ 'https://events.split.io/api/'
217
+ end
218
+
219
+ def self.init_cache_adapter(adapter, data_structure, redis_url = nil, queue_size = nil)
220
+ case adapter
221
+ when :memory
222
+ SplitIoClient::Cache::Adapters::MemoryAdapter.new(map_memory_adapter(data_structure, queue_size))
223
+ when :redis
224
+ begin
225
+ require 'redis'
226
+ rescue LoadError
227
+ fail StandardError, 'To use Redis as a cache adapter you must include it in your Gemfile'
228
+ end
229
+
230
+ SplitIoClient::Cache::Adapters::RedisAdapter.new(redis_url)
231
+ end
232
+ end
233
+
234
+ def self.map_memory_adapter(name, queue_size)
235
+ case name
236
+ when :map_adapter
237
+ SplitIoClient::Cache::Adapters::MemoryAdapters::MapAdapter.new
238
+ when :queue_adapter
239
+ SplitIoClient::Cache::Adapters::MemoryAdapters::QueueAdapter.new(queue_size)
240
+ end
241
+ end
242
+
243
+ def self.default_mode
244
+ :standalone
245
+ end
246
+
247
+ # @return [LocalStore] configuration value for local cache store
248
+ def self.default_cache_adapter
249
+ :memory
250
+ end
251
+
252
+ def self.default_metrics_adapter
253
+ :memory
254
+ end
255
+
256
+ #
257
+ # The default read timeout value
258
+ #
259
+ # @return [int]
260
+ def self.default_read_timeout
261
+ 5
262
+ end
263
+
264
+ #
265
+ # The default connection timeout value
266
+ #
267
+ # @return [int]
268
+ def self.default_connection_timeout
269
+ 5
270
+ end
271
+
272
+ def self.default_features_refresh_rate
273
+ 30
274
+ end
275
+
276
+ def self.default_segments_refresh_rate
277
+ 60
278
+ end
279
+
280
+ def self.default_metrics_refresh_rate
281
+ 60
282
+ end
283
+
284
+ def self.default_impressions_refresh_rate
285
+ 60
286
+ end
287
+
288
+ def self.default_impression_listener_refresh_rate
289
+ 0
290
+ end
291
+
292
+ def self.default_impressions_queue_size
293
+ 5000
294
+ end
295
+
296
+ def self.default_events_push_rate
297
+ 60
298
+ end
299
+
300
+ def self.default_events_queue_size
301
+ 500
302
+ end
303
+
304
+ #
305
+ # The default logger object
306
+ #
307
+ # @return [object]
308
+ def self.default_logger
309
+ (defined?(Rails) && Rails.logger) ? Rails.logger : Logger.new($stdout)
310
+ end
311
+
312
+ #
313
+ # The default debug value
314
+ #
315
+ # @return [boolean]
316
+ def self.default_debug
317
+ false
318
+ end
319
+
320
+ #
321
+ # The default labels logging value
322
+ #
323
+ # @return [boolean]
324
+ def self.default_labels_logging
325
+ true
326
+ end
327
+
328
+ def self.default_redis_url
329
+ 'redis://127.0.0.1:6379/0'
330
+ end
331
+
332
+ def self.default_redis_namespace
333
+ 'SPLITIO'
334
+ end
335
+
336
+ #
337
+ # The default transport_debug_enabled value
338
+ #
339
+ # @return [boolean]
340
+ def self.transport_debug
341
+ false
342
+ end
343
+
344
+ #
345
+ # custom logger of exceptions
346
+ #
347
+ # @return [void]
348
+ def log_found_exception(caller, error)
349
+ message = ''
350
+
351
+ message << "[splitclient-rb] Unexpected exception in #{caller}: #{error.inspect} #{error}"
352
+ message << "\n\t#{error.backtrace.join("\n\t")}" if @debug_enabled
353
+
354
+ @logger.warn(message)
355
+ end
356
+
357
+ #
358
+ # log which cache class was loaded and SDK mode
359
+ #
360
+ # @return [void]
361
+ def startup_log
362
+ return if ENV['SPLITCLIENT_ENV'] == 'test'
363
+
364
+ @logger.info("Loaded Ruby SDK v#{VERSION} in the #{@mode} mode")
365
+ @logger.info("Loaded cache class: #{@cache_adapter.class}")
366
+ end
367
+
368
+ #
369
+ # gets the hostname where the sdk gem is running
370
+ #
371
+ # @return [string]
372
+ def self.machine_hostname
373
+ Socket.gethostname
374
+ rescue
375
+ 'localhost'.freeze
376
+ end
377
+
378
+ #
379
+ # gets the ip where the sdk gem is running
380
+ #
381
+ # @return [string]
382
+ def self.machine_ip
383
+ loopback_ip = Socket.ip_address_list.find { |ip| ip.ipv4_loopback? }
384
+ private_ip = Socket.ip_address_list.find { |ip| ip.ipv4_private? }
385
+
386
+ addr_info = private_ip || loopback_ip
387
+
388
+ addr_info.ip_address
389
+ end
390
+ end
391
+ end