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

  • :cache_ttl (Int)

    Time to live in seconds for the memory cache values when using Redis.

  • :max_cache_size (Int)

    Max number of items to be held in the memory cache before prunning when using Redis.



30
31
32
33
34
35
36
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
91
# File 'lib/splitclient-rb/split_config.rb', line 30

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].to_s.length > 0 ? "#{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, nil, @redis_url
  )
  @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, @redis_url
  )
  #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, nil, @redis_url
  )

  @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 = SplitConfig.default_block_until_ready

  @machine_name = opts[:machine_name] || SplitConfig.machine_hostname
  @machine_ip = opts[:machine_ip] || SplitConfig.machine_ip

  @cache_ttl = opts[:cache_ttl] || SplitConfig.cache_ttl
  @max_cache_size = opts[:max_cache_size] || SplitConfig.max_cache_size

  @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

  @max_key_size = SplitConfig.max_key_size

  @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, @redis_url
  )
  @valid_mode = true
  @split_logger = SplitIoClient::SplitLogger.new(self)
  @split_validator = SplitIoClient::Validators.new(self)
  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



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

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]



190
191
192
# File 'lib/splitclient-rb/split_config.rb', line 190

def block_until_ready
  @block_until_ready
end

#cache_adapterObject

The cache adapter to store splits/segments in

Returns:

  • (Object)

    Cache adapter instance



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

def cache_adapter
  @cache_adapter
end

#cache_ttlObject

Returns the value of attribute cache_ttl.



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

def cache_ttl
  @cache_ttl
end

#connection_timeoutInt

The connection timeout for network connections in seconds.

Returns:

  • (Int)

    The connect timeout in seconds.



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

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



172
173
174
# File 'lib/splitclient-rb/split_config.rb', line 172

def debug_enabled
  @debug_enabled
end

#disable_impressionsObject

Returns the value of attribute disable_impressions.



217
218
219
# File 'lib/splitclient-rb/split_config.rb', line 217

def disable_impressions
  @disable_impressions
end

#events_adapterObject

The cache adapter to store events in

Returns:

  • (Object)

    Metrics adapter



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

def events_adapter
  @events_adapter
end

#events_push_rateInteger

The schedule time for events flush after the first one

Returns:

  • (Integer)


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

def events_push_rate
  @events_push_rate
end

#events_queue_sizeInteger

The max size of the events queue

Returns:

  • (Integer)


236
237
238
# File 'lib/splitclient-rb/split_config.rb', line 236

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



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

def events_uri
  @events_uri
end

#features_refresh_rateObject

Returns the value of attribute features_refresh_rate.



203
204
205
# File 'lib/splitclient-rb/split_config.rb', line 203

def features_refresh_rate
  @features_refresh_rate
end

#impression_listenerObject

Returns the value of attribute impression_listener.



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

def impression_listener
  @impression_listener
end

#impression_listener_refresh_rateObject

Returns the value of attribute impression_listener_refresh_rate.



209
210
211
# File 'lib/splitclient-rb/split_config.rb', line 209

def impression_listener_refresh_rate
  @impression_listener_refresh_rate
end

#impressions_adapterObject

The cache adapter to store impressions in

Returns:

  • (Object)

    Impressions adapter instance



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

def impressions_adapter
  @impressions_adapter
end

#impressions_bulk_sizeObject

Returns the value of attribute impressions_bulk_size.



216
217
218
# File 'lib/splitclient-rb/split_config.rb', line 216

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)


215
216
217
# File 'lib/splitclient-rb/split_config.rb', line 215

def impressions_queue_size
  @impressions_queue_size
end

#impressions_refresh_rateObject

Returns the value of attribute impressions_refresh_rate.



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

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



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

def labels_enabled
  @labels_enabled
end

#languageObject

Returns the value of attribute language.



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

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



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

def logger
  @logger
end

#machine_ipObject

Returns the value of attribute machine_ip.



192
193
194
# File 'lib/splitclient-rb/split_config.rb', line 192

def machine_ip
  @machine_ip
end

#machine_nameObject

Returns the value of attribute machine_name.



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

def machine_name
  @machine_name
end

#max_cache_sizeObject

Returns the value of attribute max_cache_size.



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

def max_cache_size
  @max_cache_size
end

#max_key_sizeObject

Returns the value of attribute max_key_size.



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

def max_key_size
  @max_key_size
end

#metrics_adapterSymbol

The cache adapter to store metrics in

Returns:

  • (Symbol)

    Metrics adapter



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

def metrics_adapter
  @metrics_adapter
end

#metrics_refresh_rateObject

Returns the value of attribute metrics_refresh_rate.



205
206
207
# File 'lib/splitclient-rb/split_config.rb', line 205

def metrics_refresh_rate
  @metrics_refresh_rate
end

#modeSymbol

The mode SDK will run

Returns:

  • (Symbol)

    One of the available SDK modes: standalone, consumer



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

def mode
  @mode
end

#read_timeoutInt

The read timeout for network connections in seconds.

Returns:

  • (Int)

    The timeout in seconds.



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

def read_timeout
  @read_timeout
end

#redis_namespaceObject

Returns the value of attribute redis_namespace.



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

def redis_namespace
  @redis_namespace
end

#redis_urlObject

Returns the value of attribute redis_url.



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

def redis_url
  @redis_url
end

#segments_refresh_rateObject

Returns the value of attribute segments_refresh_rate.



204
205
206
# File 'lib/splitclient-rb/split_config.rb', line 204

def segments_refresh_rate
  @segments_refresh_rate
end

#split_loggerSplitLogger

The split logger. The client library uses the split logger to use common functions around the logger

Returns:



158
159
160
# File 'lib/splitclient-rb/split_config.rb', line 158

def split_logger
  @split_logger
end

#split_validatorSplitValidator

The split validator. The client library uses the split validator to validate inputs accross the sdk

Returns:

  • (SplitValidator)

    The validator



166
167
168
# File 'lib/splitclient-rb/split_config.rb', line 166

def split_validator
  @split_validator
end

#threadsObject

Returns the value of attribute threads.



222
223
224
# File 'lib/splitclient-rb/split_config.rb', line 222

def threads
  @threads
end

#transport_debug_enabledBoolean

Enable to log the content retrieved from endpoints

Returns:

  • (Boolean)

    The value for the debug flag



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

def transport_debug_enabled
  @transport_debug_enabled
end

#valid_modeObject

Returns the value of attribute valid_mode.



224
225
226
# File 'lib/splitclient-rb/split_config.rb', line 224

def valid_mode
  @valid_mode
end

#versionObject

Returns the value of attribute version.



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

def version
  @version
end

Class Method Details

.cache_ttlint

The default cache time to live

Returns:

  • (int)


403
404
405
# File 'lib/splitclient-rb/split_config.rb', line 403

def self.cache_ttl
  5
end

.defaultConfig

The default split client configuration

Returns:

  • (Config)

    The default split client configuration.



242
243
244
# File 'lib/splitclient-rb/split_config.rb', line 242

def self.default
  SplitConfig.new
end

.default_base_uristring

The default base uri for api calls

Returns:

  • (string)

    The default base uri



250
251
252
# File 'lib/splitclient-rb/split_config.rb', line 250

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

.default_block_until_readyint

The default block until ready value

Returns:

  • (int)


387
388
389
# File 'lib/splitclient-rb/split_config.rb', line 387

def self.default_block_until_ready
  15
end

.default_cache_adapterLocalStore

Returns configuration value for local cache store.

Returns:

  • (LocalStore)

    configuration value for local cache store



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

def self.default_cache_adapter
  :memory
end

.default_connection_timeoutint

The default connection timeout value

Returns:

  • (int)


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

def self.default_connection_timeout
  5
end

.default_debugboolean

The default debug value

Returns:

  • (boolean)


363
364
365
# File 'lib/splitclient-rb/split_config.rb', line 363

def self.default_debug
  false
end

.default_events_push_rateObject



335
336
337
# File 'lib/splitclient-rb/split_config.rb', line 335

def self.default_events_push_rate
  60
end

.default_events_queue_sizeObject



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

def self.default_events_queue_size
  500
end

.default_events_uriObject



254
255
256
# File 'lib/splitclient-rb/split_config.rb', line 254

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

.default_features_refresh_rateObject



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

def self.default_features_refresh_rate
  5
end

.default_impression_listener_refresh_rateObject



327
328
329
# File 'lib/splitclient-rb/split_config.rb', line 327

def self.default_impression_listener_refresh_rate
  0
end

.default_impressions_queue_sizeObject



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

def self.default_impressions_queue_size
  5000
end

.default_impressions_refresh_rateObject



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

def self.default_impressions_refresh_rate
  60
end

.default_labels_loggingboolean

The default labels logging value

Returns:

  • (boolean)


371
372
373
# File 'lib/splitclient-rb/split_config.rb', line 371

def self.default_labels_logging
  true
end

.default_loggerobject

The default logger object

Returns:

  • (object)


347
348
349
350
351
352
353
354
355
# File 'lib/splitclient-rb/split_config.rb', line 347

def self.default_logger
  if defined?(Rails) && Rails.logger
    Rails.logger
  elsif ENV['SPLITCLIENT_ENV'] == 'test'
    Logger.new('/dev/null')
  else
   Logger.new($stdout)
   end
end

.default_metrics_adapterObject



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

def self.default_metrics_adapter
  :memory
end

.default_metrics_refresh_rateObject



319
320
321
# File 'lib/splitclient-rb/split_config.rb', line 319

def self.default_metrics_refresh_rate
  60
end

.default_modeObject



282
283
284
# File 'lib/splitclient-rb/split_config.rb', line 282

def self.default_mode
  :standalone
end

.default_read_timeoutint

The default read timeout value

Returns:

  • (int)


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

def self.default_read_timeout
  5
end

.default_redis_namespaceObject



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

def self.default_redis_namespace
  'SPLITIO'
end

.default_redis_urlObject



375
376
377
# File 'lib/splitclient-rb/split_config.rb', line 375

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

.default_segments_refresh_rateObject



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

def self.default_segments_refresh_rate
  60
end

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



258
259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/splitclient-rb/split_config.rb', line 258

def self.init_cache_adapter(adapter, data_structure, queue_size = nil, redis_url = 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)


457
458
459
460
461
# File 'lib/splitclient-rb/split_config.rb', line 457

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

.machine_ipstring

gets the ip where the sdk gem is running

Returns:

  • (string)


467
468
469
470
471
472
473
474
# File 'lib/splitclient-rb/split_config.rb', line 467

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



273
274
275
276
277
278
279
280
# File 'lib/splitclient-rb/split_config.rb', line 273

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

.max_cache_sizeint

The default max cache size

Returns:

  • (int)


410
411
412
# File 'lib/splitclient-rb/split_config.rb', line 410

def self.max_cache_size
  500
end

.max_key_sizeint

The default max key size

Returns:

  • (int)


417
418
419
# File 'lib/splitclient-rb/split_config.rb', line 417

def self.max_key_size
  250
end

.transport_debugboolean

The default transport_debug_enabled value

Returns:

  • (boolean)


395
396
397
# File 'lib/splitclient-rb/split_config.rb', line 395

def self.transport_debug
  false
end

Instance Method Details

#consumer?Boolean

Returns:

  • (Boolean)


449
450
451
# File 'lib/splitclient-rb/split_config.rb', line 449

def consumer?
  @mode.equal?(:consumer)
end

#log_found_exception(caller, error) ⇒ void

This method returns an undefined value.

custom logger of exceptions



425
426
427
428
429
430
431
432
# File 'lib/splitclient-rb/split_config.rb', line 425

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

#standalone?Boolean

Returns:

  • (Boolean)


445
446
447
# File 'lib/splitclient-rb/split_config.rb', line 445

def standalone?
  @mode.equal?(:standalone)
end

#startup_logvoid

This method returns an undefined value.

log which cache class was loaded and SDK mode



438
439
440
441
442
443
# File 'lib/splitclient-rb/split_config.rb', line 438

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