Class: SplitIoClient::SplitConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/splitclient-rb/split_config.rb

Overview

This class manages configuration options for the split client library. If not custom configuration is required the default configuration values will be used

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ type

Constructor for creating custom split client config

Parameters:

  • opts (Hash) (defaults to: {})

    optional hash with configuration options

Options Hash (opts):

  • :base_uri (String) — default: "https://sdk.split.io/api/"

    The base URL for split API end points

  • :events_uri (String) — default: "https://events.split.io/api/"

    The events URL for events end points

  • :read_timeout (Int) — default: 10

    The read timeout for network connections in seconds.

  • :connection_timeout (Int) — default: 2

    The connect timeout for network connections in seconds.

  • :features_refresh_rate (Int)

    The SDK polls Split servers for changes to feature roll-out plans. This parameter controls this polling period in seconds.

  • :segments_refresh_rate (Int)
  • :metrics_refresh_rate (Int)
  • :impressions_refresh_rate (Int)
  • :logger (Object)

    a logger to user for messages from the client. Defaults to stdout

  • :debug_enabled (Boolean) — default: false

    The value for the debug flag

  • :impressions_queue_size (Int)

    Size of the impressions queue in the memory repository. Once reached, newer impressions will be dropped

  • :impressions_bulk_size (Int)

    Max number of impressions to be sent to the backend on each post

  • :impression_listener (#log)

    this object will capture all impressions and process them through #log



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/splitclient-rb/split_config.rb', line 37

def initialize(opts = {})
  @base_uri = (opts[:base_uri] || SplitConfig.default_base_uri).chomp('/')
  @events_uri = (opts[:events_uri] || SplitConfig.default_events_uri).chomp('/')
  @mode = opts[:mode] || SplitConfig.default_mode
  @redis_url = opts[:redis_url] || SplitConfig.default_redis_url
  @redis_namespace = opts[:redis_namespace] ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
  @cache_adapter = SplitConfig.init_cache_adapter(
    opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter
  )
  @connection_timeout = opts[:connection_timeout] || SplitConfig.default_connection_timeout
  @read_timeout = opts[:read_timeout] || SplitConfig.default_read_timeout
  @features_refresh_rate = opts[:features_refresh_rate] || SplitConfig.default_features_refresh_rate
  @segments_refresh_rate = opts[:segments_refresh_rate] || SplitConfig.default_segments_refresh_rate
  @metrics_refresh_rate = opts[:metrics_refresh_rate] || SplitConfig.default_metrics_refresh_rate

  @impressions_refresh_rate = opts[:impressions_refresh_rate] || SplitConfig.default_impressions_refresh_rate
  @impressions_queue_size = opts[:impressions_queue_size] || SplitConfig.default_impressions_queue_size
  @impressions_adapter = SplitConfig.init_cache_adapter(
    opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @impressions_queue_size
  )
  #Safeguard for users of older SDK versions.
  @disable_impressions = @impressions_queue_size == -1
  #Safeguard for users of older SDK versions.
  @impressions_bulk_size = opts[:impressions_bulk_size] || @impressions_queue_size > 0 ? @impressions_queue_size : 0

  @metrics_adapter = SplitConfig.init_cache_adapter(
    opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter
  )

  @logger = opts[:logger] || SplitConfig.default_logger
  @debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
  @transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
  @block_until_ready = opts[:ready] || opts[:block_until_ready] || 0
  @machine_name = opts[:machine_name] || SplitConfig.machine_hostname
  @machine_ip = opts[:machine_ip] || SplitConfig.machine_ip

  @language = opts[:language] || 'ruby'
  @version = opts[:version] || SplitIoClient::VERSION

  @labels_enabled = opts[:labels_enabled].nil? ? SplitConfig.default_labels_logging : opts[:labels_enabled]

  @impression_listener = opts[:impression_listener]
  @impression_listener_refresh_rate = opts[:impression_listener_refresh_rate] || SplitConfig.default_impression_listener_refresh_rate

  @threads = {}

  @events_push_rate = opts[:events_push_rate] || SplitConfig.default_events_push_rate
  @events_queue_size = opts[:events_queue_size] || SplitConfig.default_events_queue_size
  @events_adapter = SplitConfig.init_cache_adapter(
    opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @events_queue_size
  )

  startup_log
end

Instance Attribute Details

#base_uriString

The base URL for split API end points

Returns:

  • (String)

    The configured base URL for the split API end points



96
97
98
# File 'lib/splitclient-rb/split_config.rb', line 96

def base_uri
  @base_uri
end

#block_until_readyInteger

The number of seconds to wait for SDK readiness or false to disable waiting

Returns:

  • (Integer)

    /[FalseClass]



174
175
176
# File 'lib/splitclient-rb/split_config.rb', line 174

def block_until_ready
  @block_until_ready
end

#cache_adapterObject

The cache adapter to store splits/segments in

Returns:

  • (Object)

    Cache adapter instance



119
120
121
# File 'lib/splitclient-rb/split_config.rb', line 119

def cache_adapter
  @cache_adapter
end

#connection_timeoutInt

The connection timeout for network connections in seconds.

Returns:

  • (Int)

    The connect timeout in seconds.



143
144
145
# File 'lib/splitclient-rb/split_config.rb', line 143

def connection_timeout
  @connection_timeout
end

#debug_enabledBoolean

The boolean that represents the state of the debug log level

Returns:

  • (Boolean)

    The value for the debug flag



156
157
158
# File 'lib/splitclient-rb/split_config.rb', line 156

def debug_enabled
  @debug_enabled
end

#disable_impressionsObject

Returns the value of attribute disable_impressions.



196
197
198
# File 'lib/splitclient-rb/split_config.rb', line 196

def disable_impressions
  @disable_impressions
end

#events_adapterObject

The cache adapter to store events in

Returns:

  • (Object)

    Metrics adapter



137
138
139
# File 'lib/splitclient-rb/split_config.rb', line 137

def events_adapter
  @events_adapter
end

#events_push_rateInteger

The schedule time for events flush after the first one

Returns:

  • (Integer)


207
208
209
# File 'lib/splitclient-rb/split_config.rb', line 207

def events_push_rate
  @events_push_rate
end

#events_queue_sizeInteger

The max size of the events queue

Returns:

  • (Integer)


213
214
215
# File 'lib/splitclient-rb/split_config.rb', line 213

def events_queue_size
  @events_queue_size
end

#events_uriString

The base URL for split events API end points

Returns:

  • (String)

    The configured URL for the events API end points



102
103
104
# File 'lib/splitclient-rb/split_config.rb', line 102

def events_uri
  @events_uri
end

#features_refresh_rateObject

Returns the value of attribute features_refresh_rate.



182
183
184
# File 'lib/splitclient-rb/split_config.rb', line 182

def features_refresh_rate
  @features_refresh_rate
end

#impression_listenerObject

Returns the value of attribute impression_listener.



187
188
189
# File 'lib/splitclient-rb/split_config.rb', line 187

def impression_listener
  @impression_listener
end

#impression_listener_refresh_rateObject

Returns the value of attribute impression_listener_refresh_rate.



188
189
190
# File 'lib/splitclient-rb/split_config.rb', line 188

def impression_listener_refresh_rate
  @impression_listener_refresh_rate
end

#impressions_adapterObject

The cache adapter to store impressions in

Returns:

  • (Object)

    Impressions adapter instance



125
126
127
# File 'lib/splitclient-rb/split_config.rb', line 125

def impressions_adapter
  @impressions_adapter
end

#impressions_bulk_sizeObject

Returns the value of attribute impressions_bulk_size.



195
196
197
# File 'lib/splitclient-rb/split_config.rb', line 195

def impressions_bulk_size
  @impressions_bulk_size
end

#impressions_queue_sizeInteger

How big the impressions queue is before dropping impressions. -1 to disable it.

Returns:

  • (Integer)


194
195
196
# File 'lib/splitclient-rb/split_config.rb', line 194

def impressions_queue_size
  @impressions_queue_size
end

#impressions_refresh_rateObject

Returns the value of attribute impressions_refresh_rate.



185
186
187
# File 'lib/splitclient-rb/split_config.rb', line 185

def impressions_refresh_rate
  @impressions_refresh_rate
end

#labels_enabledBoolean

Enable logging labels and sending potentially sensitive information

Returns:

  • (Boolean)

    The value for the labels enabled flag



168
169
170
# File 'lib/splitclient-rb/split_config.rb', line 168

def labels_enabled
  @labels_enabled
end

#languageObject

Returns the value of attribute language.



179
180
181
# File 'lib/splitclient-rb/split_config.rb', line 179

def language
  @language
end

#loggerLogger

The configured logger. The client library uses the log to print warning and error messages.

Returns:

  • (Logger)

    The configured logger



150
151
152
# File 'lib/splitclient-rb/split_config.rb', line 150

def logger
  @logger
end

#machine_ipObject

Returns the value of attribute machine_ip.



176
177
178
# File 'lib/splitclient-rb/split_config.rb', line 176

def machine_ip
  @machine_ip
end

#machine_nameObject

Returns the value of attribute machine_name.



177
178
179
# File 'lib/splitclient-rb/split_config.rb', line 177

def machine_name
  @machine_name
end

#metrics_adapterSymbol

The cache adapter to store metrics in

Returns:

  • (Symbol)

    Metrics adapter



131
132
133
# File 'lib/splitclient-rb/split_config.rb', line 131

def metrics_adapter
  @metrics_adapter
end

#metrics_refresh_rateObject

Returns the value of attribute metrics_refresh_rate.



184
185
186
# File 'lib/splitclient-rb/split_config.rb', line 184

def metrics_refresh_rate
  @metrics_refresh_rate
end

#modeSymbol

The mode SDK will run

Returns:

  • (Symbol)

    One of the available SDK modes: standalone, consumer, producer



108
109
110
# File 'lib/splitclient-rb/split_config.rb', line 108

def mode
  @mode
end

#read_timeoutInt

The read timeout for network connections in seconds.

Returns:

  • (Int)

    The timeout in seconds.



113
114
115
# File 'lib/splitclient-rb/split_config.rb', line 113

def read_timeout
  @read_timeout
end

#redis_namespaceObject

Returns the value of attribute redis_namespace.



199
200
201
# File 'lib/splitclient-rb/split_config.rb', line 199

def redis_namespace
  @redis_namespace
end

#redis_urlObject

Returns the value of attribute redis_url.



198
199
200
# File 'lib/splitclient-rb/split_config.rb', line 198

def redis_url
  @redis_url
end

#segments_refresh_rateObject

Returns the value of attribute segments_refresh_rate.



183
184
185
# File 'lib/splitclient-rb/split_config.rb', line 183

def segments_refresh_rate
  @segments_refresh_rate
end

#threadsObject

Returns the value of attribute threads.



201
202
203
# File 'lib/splitclient-rb/split_config.rb', line 201

def threads
  @threads
end

#transport_debug_enabledBoolean

Enable to log the content retrieved from endpoints

Returns:

  • (Boolean)

    The value for the debug flag



162
163
164
# File 'lib/splitclient-rb/split_config.rb', line 162

def transport_debug_enabled
  @transport_debug_enabled
end

#versionObject

Returns the value of attribute version.



180
181
182
# File 'lib/splitclient-rb/split_config.rb', line 180

def version
  @version
end

Class Method Details

.defaultConfig

The default split client configuration

Returns:

  • (Config)

    The default split client configuration.



219
220
221
# File 'lib/splitclient-rb/split_config.rb', line 219

def self.default
  SplitConfig.new
end

.default_base_uristring

The default base uri for api calls

Returns:

  • (string)

    The default base uri



227
228
229
# File 'lib/splitclient-rb/split_config.rb', line 227

def self.default_base_uri
  'https://sdk.split.io/api/'
end

.default_cache_adapterLocalStore

Returns configuration value for local cache store.

Returns:

  • (LocalStore)

    configuration value for local cache store



264
265
266
# File 'lib/splitclient-rb/split_config.rb', line 264

def self.default_cache_adapter
  :memory
end

.default_connection_timeoutint

The default connection timeout value

Returns:

  • (int)


284
285
286
# File 'lib/splitclient-rb/split_config.rb', line 284

def self.default_connection_timeout
  5
end

.default_debugboolean

The default debug value

Returns:

  • (boolean)


332
333
334
# File 'lib/splitclient-rb/split_config.rb', line 332

def self.default_debug
  false
end

.default_events_push_rateObject



312
313
314
# File 'lib/splitclient-rb/split_config.rb', line 312

def self.default_events_push_rate
  60
end

.default_events_queue_sizeObject



316
317
318
# File 'lib/splitclient-rb/split_config.rb', line 316

def self.default_events_queue_size
  500
end

.default_events_uriObject



231
232
233
# File 'lib/splitclient-rb/split_config.rb', line 231

def self.default_events_uri
  'https://events.split.io/api/'
end

.default_features_refresh_rateObject



288
289
290
# File 'lib/splitclient-rb/split_config.rb', line 288

def self.default_features_refresh_rate
  30
end

.default_impression_listener_refresh_rateObject



304
305
306
# File 'lib/splitclient-rb/split_config.rb', line 304

def self.default_impression_listener_refresh_rate
  0
end

.default_impressions_queue_sizeObject



308
309
310
# File 'lib/splitclient-rb/split_config.rb', line 308

def self.default_impressions_queue_size
  5000
end

.default_impressions_refresh_rateObject



300
301
302
# File 'lib/splitclient-rb/split_config.rb', line 300

def self.default_impressions_refresh_rate
  60
end

.default_labels_loggingboolean

The default labels logging value

Returns:

  • (boolean)


340
341
342
# File 'lib/splitclient-rb/split_config.rb', line 340

def self.default_labels_logging
  true
end

.default_loggerobject

The default logger object

Returns:

  • (object)


324
325
326
# File 'lib/splitclient-rb/split_config.rb', line 324

def self.default_logger
  (defined?(Rails) && Rails.logger) ? Rails.logger : Logger.new($stdout)
end

.default_metrics_adapterObject



268
269
270
# File 'lib/splitclient-rb/split_config.rb', line 268

def self.default_metrics_adapter
  :memory
end

.default_metrics_refresh_rateObject



296
297
298
# File 'lib/splitclient-rb/split_config.rb', line 296

def self.default_metrics_refresh_rate
  60
end

.default_modeObject



259
260
261
# File 'lib/splitclient-rb/split_config.rb', line 259

def self.default_mode
  :standalone
end

.default_read_timeoutint

The default read timeout value

Returns:

  • (int)


276
277
278
# File 'lib/splitclient-rb/split_config.rb', line 276

def self.default_read_timeout
  5
end

.default_redis_namespaceObject



348
349
350
# File 'lib/splitclient-rb/split_config.rb', line 348

def self.default_redis_namespace
  'SPLITIO'
end

.default_redis_urlObject



344
345
346
# File 'lib/splitclient-rb/split_config.rb', line 344

def self.default_redis_url
  'redis://127.0.0.1:6379/0'
end

.default_segments_refresh_rateObject



292
293
294
# File 'lib/splitclient-rb/split_config.rb', line 292

def self.default_segments_refresh_rate
  60
end

.init_cache_adapter(adapter, data_structure, queue_size = nil) ⇒ Object



235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/splitclient-rb/split_config.rb', line 235

def self.init_cache_adapter(adapter, data_structure, queue_size = nil)
  case adapter
  when :memory
    SplitIoClient::Cache::Adapters::MemoryAdapter.new(map_memory_adapter(data_structure, queue_size))
  when :redis
    begin
      require 'redis'
    rescue LoadError
      fail StandardError, 'To use Redis as a cache adapter you must include it in your Gemfile'
    end

    SplitIoClient::Cache::Adapters::RedisAdapter.new(@redis_url)
  end
end

.machine_hostnamestring

gets the hostname where the sdk gem is running

Returns:

  • (string)


388
389
390
391
392
# File 'lib/splitclient-rb/split_config.rb', line 388

def self.machine_hostname
  Socket.gethostname
rescue
  'localhost'.freeze
end

.machine_ipstring

gets the ip where the sdk gem is running

Returns:

  • (string)


398
399
400
401
402
403
404
405
# File 'lib/splitclient-rb/split_config.rb', line 398

def self.machine_ip
  loopback_ip = Socket.ip_address_list.find { |ip| ip.ipv4_loopback? }
  private_ip = Socket.ip_address_list.find { |ip| ip.ipv4_private? }

  addr_info = private_ip || loopback_ip

  addr_info.ip_address
end

.map_memory_adapter(name, queue_size) ⇒ Object



250
251
252
253
254
255
256
257
# File 'lib/splitclient-rb/split_config.rb', line 250

def self.map_memory_adapter(name, queue_size)
  case name
  when :map_adapter
    SplitIoClient::Cache::Adapters::MemoryAdapters::MapAdapter.new
  when :queue_adapter
    SplitIoClient::Cache::Adapters::MemoryAdapters::QueueAdapter.new(queue_size)
  end
end

.transport_debugboolean

The default transport_debug_enabled value

Returns:

  • (boolean)


356
357
358
# File 'lib/splitclient-rb/split_config.rb', line 356

def self.transport_debug
  false
end

Instance Method Details

#log_found_exception(caller, error) ⇒ void

This method returns an undefined value.

custom logger of exceptions



364
365
366
367
368
369
370
371
# File 'lib/splitclient-rb/split_config.rb', line 364

def log_found_exception(caller, error)
  message = ''

  message << "[splitclient-rb] Unexpected exception in #{caller}: #{error.inspect} #{error}"
  message << "\n\t#{error.backtrace.join("\n\t")}" if @debug_enabled

  @logger.warn(message)
end

#startup_logvoid

This method returns an undefined value.

log which cache class was loaded and SDK mode



377
378
379
380
381
382
# File 'lib/splitclient-rb/split_config.rb', line 377

def startup_log
  return if ENV['SPLITCLIENT_ENV'] == 'test'

  @logger.info("Loaded Ruby SDK v#{VERSION} in the #{@mode} mode")
  @logger.info("Loaded cache class: #{@cache_adapter.class}")
end