Class: Statsig::StatsigLogger

Inherits:
Object
  • Object
show all
Defined in:
lib/statsig_logger.rb

Instance Method Summary collapse

Constructor Details

#initialize(network, options) ⇒ StatsigLogger

Returns a new instance of StatsigLogger.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/statsig_logger.rb', line 10

def initialize(network, options)
  @network = network
  @events = []
  @options = options

  @logging_pool = Concurrent::ThreadPoolExecutor.new(
    min_threads: [2, Concurrent.processor_count].min,
    max_threads: [2, Concurrent.processor_count].max,
    # max jobs pending before we start dropping
    max_queue:   [2, Concurrent.processor_count].max * 5,
    fallback_policy: :discard,
  )

  @background_flush = periodic_flush
end

Instance Method Details

#flushObject



109
110
111
112
113
114
115
116
117
118
# File 'lib/statsig_logger.rb', line 109

def flush
  if @events.length == 0
    return
  end
  events_clone = @events
  @events = []
  flush_events = events_clone.map { |e| e.serialize }

  @network.post_logs(flush_events)
end

#flush_asyncObject



103
104
105
106
107
# File 'lib/statsig_logger.rb', line 103

def flush_async
  @logging_pool.post do
    flush
  end
end

#log_config_exposure(user, config_name, rule_id, secondary_exposures, eval_details) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/statsig_logger.rb', line 48

def log_config_exposure(user, config_name, rule_id, secondary_exposures, eval_details)
  event = StatsigEvent.new($config_exposure_event)
  event.user = user
  event. = {
    'config' => config_name,
    'ruleID' => rule_id,
  }
  event. = Statsig.
  event.secondary_exposures = secondary_exposures.is_a?(Array) ? secondary_exposures : []

  safe_add_eval_details(eval_details, event)
  log_event(event)
end

#log_event(event) ⇒ Object



26
27
28
29
30
31
# File 'lib/statsig_logger.rb', line 26

def log_event(event)
  @events.push(event)
  if @events.length >= @options.logging_max_buffer_size
    flush_async
  end
end

#log_gate_exposure(user, gate_name, value, rule_id, secondary_exposures, eval_details) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/statsig_logger.rb', line 33

def log_gate_exposure(user, gate_name, value, rule_id, secondary_exposures, eval_details)
  event = StatsigEvent.new($gate_exposure_event)
  event.user = user
  event. = {
    'gate' => gate_name,
    'gateValue' => value.to_s,
    'ruleID' => rule_id,
  }
  event. = Statsig.
  event.secondary_exposures = secondary_exposures.is_a?(Array) ? secondary_exposures : []

  safe_add_eval_details(eval_details, event)
  log_event(event)
end

#log_layer_exposure(user, layer, parameter_name, config_evaluation) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/statsig_logger.rb', line 62

def log_layer_exposure(user, layer, parameter_name, config_evaluation)
  exposures = config_evaluation.undelegated_sec_exps
  allocated_experiment = ''
  is_explicit = (config_evaluation.explicit_parameters&.include? parameter_name) || false
  if is_explicit
    allocated_experiment = config_evaluation.config_delegate
    exposures = config_evaluation.secondary_exposures
  end

  event = StatsigEvent.new($layer_exposure_event)
  event.user = user
  event. = {
    'config' => layer.name,
    'ruleID' => layer.rule_id,
    'allocatedExperiment' => allocated_experiment,
    'parameterName' => parameter_name,
    'isExplicitParameter' => String(is_explicit),
  }
  event. = Statsig.
  event.secondary_exposures = exposures.is_a?(Array) ? exposures : []

  safe_add_eval_details(config_evaluation.evaluation_details, event)
  log_event(event)
end

#periodic_flushObject



87
88
89
90
91
92
93
94
# File 'lib/statsig_logger.rb', line 87

def periodic_flush
  Thread.new do
    loop do
      sleep @options.logging_interval_seconds
      flush
    end
  end
end

#shutdownObject



96
97
98
99
100
101
# File 'lib/statsig_logger.rb', line 96

def shutdown
  @background_flush&.exit
  @logging_pool.shutdown
  @logging_pool.wait_for_termination(timeout = 3)
  flush
end