statsig 1.25.2 → 1.27.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.
@@ -9,7 +9,7 @@ $diagnostics_event = 'statsig::diagnostics'
9
9
  $ignored_metadata_keys = ['serverTime', 'configSyncTime', 'initTime', 'reason']
10
10
  module Statsig
11
11
  class StatsigLogger
12
- def initialize(network, options)
12
+ def initialize(network, options, error_boundary)
13
13
  @network = network
14
14
  @events = []
15
15
  @options = options
@@ -23,9 +23,11 @@ module Statsig
23
23
  fallback_policy: :discard
24
24
  )
25
25
 
26
+ @error_boundary = error_boundary
26
27
  @background_flush = periodic_flush
27
28
  @deduper = Concurrent::Set.new()
28
29
  @interval = 0
30
+ @flush_mutex = Mutex.new
29
31
  end
30
32
 
31
33
  def log_event(event)
@@ -98,23 +100,28 @@ module Statsig
98
100
 
99
101
  def log_diagnostics_event(diagnostics, user = nil)
100
102
  return if @options.disable_diagnostics_logging
101
- return if diagnostics.nil? || diagnostics.markers.empty?
103
+ return if diagnostics.nil?
102
104
 
103
105
  event = StatsigEvent.new($diagnostics_event)
104
106
  event.user = user
105
- event.metadata = diagnostics.serialize
107
+ serialized = diagnostics.serialize_with_sampling
108
+ return if serialized[:markers].empty?
109
+
110
+ event.metadata = serialized
106
111
  log_event(event)
107
112
  diagnostics.clear_markers
108
113
  end
109
114
 
110
115
  def periodic_flush
111
116
  Thread.new do
112
- loop do
113
- sleep @options.logging_interval_seconds
114
- flush_async
115
- @interval += 1
116
- @deduper.clear if @interval % 2 == 0
117
- end
117
+ @error_boundary.capture(task: lambda {
118
+ loop do
119
+ sleep @options.logging_interval_seconds
120
+ flush_async
121
+ @interval += 1
122
+ @deduper.clear if @interval % 2 == 0
123
+ end
124
+ })
118
125
  end
119
126
  end
120
127
 
@@ -132,18 +139,20 @@ module Statsig
132
139
  end
133
140
 
134
141
  def flush
135
- if @events.length == 0
136
- return
137
- end
138
- events_clone = @events
139
- @events = []
140
- flush_events = events_clone.map { |e| e.serialize }
142
+ @flush_mutex.synchronize do
143
+ if @events.length.zero?
144
+ return
145
+ end
141
146
 
142
- @network.post_logs(flush_events)
147
+ events_clone = @events
148
+ @events = []
149
+ flush_events = events_clone.map { |e| e.serialize }
150
+ @network.post_logs(flush_events)
151
+ end
143
152
  end
144
153
 
145
154
  def maybe_restart_background_threads
146
- if @background_flush.nil? or !@background_flush.alive?
155
+ if @background_flush.nil? || !@background_flush.alive?
147
156
  @background_flush = periodic_flush
148
157
  end
149
158
  end
@@ -34,6 +34,14 @@ class StatsigOptions
34
34
  # default: 60s
35
35
  attr_accessor :idlists_sync_interval
36
36
 
37
+ # Disable background syncing for rulesets
38
+ sig { returns(T::Boolean) }
39
+ attr_accessor :disable_rulesets_sync
40
+
41
+ # Disable background syncing for id lists
42
+ sig { returns(T::Boolean) }
43
+ attr_accessor :disable_idlists_sync
44
+
37
45
  sig { returns(T.any(Float, Integer)) }
38
46
  # How often to flush logs to Statsig
39
47
  # default: 60s
@@ -105,6 +113,8 @@ class StatsigOptions
105
113
  api_url_download_config_specs: T.any(String, NilClass),
106
114
  rulesets_sync_interval: T.any(Float, Integer),
107
115
  idlists_sync_interval: T.any(Float, Integer),
116
+ disable_rulesets_sync: T::Boolean,
117
+ disable_idlists_sync: T::Boolean,
108
118
  logging_interval_seconds: T.any(Float, Integer),
109
119
  logging_max_buffer_size: Integer,
110
120
  local_mode: T::Boolean,
@@ -127,6 +137,8 @@ class StatsigOptions
127
137
  api_url_download_config_specs: nil,
128
138
  rulesets_sync_interval: 10,
129
139
  idlists_sync_interval: 60,
140
+ disable_rulesets_sync: false,
141
+ disable_idlists_sync: false,
130
142
  logging_interval_seconds: 60,
131
143
  logging_max_buffer_size: 1000,
132
144
  local_mode: false,
@@ -145,6 +157,8 @@ class StatsigOptions
145
157
  @api_url_download_config_specs = api_url_download_config_specs
146
158
  @rulesets_sync_interval = rulesets_sync_interval
147
159
  @idlists_sync_interval = idlists_sync_interval
160
+ @disable_rulesets_sync = disable_rulesets_sync
161
+ @disable_idlists_sync = disable_idlists_sync
148
162
  @logging_interval_seconds = logging_interval_seconds
149
163
  @logging_max_buffer_size = [logging_max_buffer_size, 1000].min
150
164
  @local_mode = local_mode
data/lib/ua_parser.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'user_agent_parser'
2
3
 
3
4
  module UAParser
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statsig
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.25.2
4
+ version: 1.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Statsig, Inc
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-20 00:00:00.000000000 Z
11
+ date: 2023-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 5.14.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-suite
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.0.3
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.0.3
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: spy
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -226,6 +254,26 @@ dependencies:
226
254
  - - "<"
227
255
  - !ruby/object:Gem::Version
228
256
  version: '6.0'
257
+ - !ruby/object:Gem::Dependency
258
+ name: connection_pool
259
+ requirement: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: '2.4'
264
+ - - ">="
265
+ - !ruby/object:Gem::Version
266
+ version: 2.4.1
267
+ type: :runtime
268
+ prerelease: false
269
+ version_requirements: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - "~>"
272
+ - !ruby/object:Gem::Version
273
+ version: '2.4'
274
+ - - ">="
275
+ - !ruby/object:Gem::Version
276
+ version: 2.4.1
229
277
  - !ruby/object:Gem::Dependency
230
278
  name: ip3country
231
279
  requirement: !ruby/object:Gem::Requirement
@@ -282,6 +330,7 @@ files:
282
330
  - lib/evaluation_details.rb
283
331
  - lib/evaluation_helpers.rb
284
332
  - lib/evaluator.rb
333
+ - lib/hash_utils.rb
285
334
  - lib/id_list.rb
286
335
  - lib/interfaces/data_store.rb
287
336
  - lib/layer.rb
@@ -300,7 +349,7 @@ homepage: https://rubygems.org/gems/statsig
300
349
  licenses:
301
350
  - ISC
302
351
  metadata: {}
303
- post_install_message:
352
+ post_install_message:
304
353
  rdoc_options: []
305
354
  require_paths:
306
355
  - lib
@@ -315,8 +364,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
315
364
  - !ruby/object:Gem::Version
316
365
  version: '0'
317
366
  requirements: []
318
- rubygems_version: 3.3.7
319
- signing_key:
367
+ rubygems_version: 3.2.33
368
+ signing_key:
320
369
  specification_version: 4
321
370
  summary: Statsig server SDK for Ruby
322
371
  test_files: []