statsig 1.24.5 → 1.24.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/evaluator.rb +4 -2
- data/lib/layer.rb +1 -0
- data/lib/network.rb +5 -3
- data/lib/statsig.rb +2 -2
- data/lib/statsig_driver.rb +1 -1
- data/lib/statsig_event.rb +2 -4
- data/lib/statsig_logger.rb +3 -6
- data/lib/statsig_options.rb +9 -2
- metadata +76 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29818b483f3950c841a00a05ee3007414cc759498d7656703049417c43cbbae5
|
4
|
+
data.tar.gz: 36c190613ab7fded21de40e82c238c3c8374e6efba502a6774752a15d796e07d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30e3d1941bb46e4eb21469f82d2f398e1380fc144b1076f28e521081a9de052bf96ad27821ca93c515e3e308ca8d793dff75a504435a792c008b4623effeb6a5
|
7
|
+
data.tar.gz: 80eb7090f03d1dcb2a8e78492c6d80fe33e364fea1446330ad30c17eb06dbe8486f7ab1d2776e53e9f3b058f7c4925d4d89ce1f08494e3fd814928c3ac4bd537
|
data/lib/evaluator.rb
CHANGED
@@ -447,16 +447,18 @@ module Statsig
|
|
447
447
|
ua = get_value_from_user(user, 'userAgent')
|
448
448
|
return nil unless ua.is_a?(String)
|
449
449
|
|
450
|
-
parsed = @ua_parser.parse ua
|
451
|
-
os = parsed.os
|
452
450
|
case field.downcase
|
453
451
|
when 'os_name', 'osname'
|
452
|
+
os = @ua_parser.parse_os(ua)
|
454
453
|
return os&.family
|
455
454
|
when 'os_version', 'osversion'
|
455
|
+
os = @ua_parser.parse_os(ua)
|
456
456
|
return os&.version unless os&.version.nil?
|
457
457
|
when 'browser_name', 'browsername'
|
458
|
+
parsed = @ua_parser.parse_ua(ua)
|
458
459
|
return parsed.family
|
459
460
|
when 'browser_version', 'browserversion'
|
461
|
+
parsed = @ua_parser.parse_ua(ua)
|
460
462
|
return parsed.version.to_s
|
461
463
|
else
|
462
464
|
nil
|
data/lib/layer.rb
CHANGED
data/lib/network.rb
CHANGED
@@ -33,6 +33,7 @@ module Statsig
|
|
33
33
|
@local_mode = options.local_mode
|
34
34
|
@timeout = options.network_timeout
|
35
35
|
@backoff_multiplier = backoff_mult
|
36
|
+
@post_logs_retry_limit = options.post_logs_retry_limit
|
36
37
|
@session_id = SecureRandom.uuid
|
37
38
|
end
|
38
39
|
|
@@ -57,18 +58,19 @@ module Statsig
|
|
57
58
|
if @timeout
|
58
59
|
http = http.timeout(@timeout)
|
59
60
|
end
|
61
|
+
backoff_adjusted = backoff > 10 ? backoff += Random.rand(10) : backoff # to deter overlap
|
60
62
|
begin
|
61
63
|
res = http.post(@api + endpoint, body: body)
|
62
64
|
rescue StandardError => e
|
63
65
|
## network error retry
|
64
66
|
return nil, e unless retries > 0
|
65
|
-
sleep
|
67
|
+
sleep backoff_adjusted
|
66
68
|
return post_helper(endpoint, body, retries - 1, backoff * @backoff_multiplier)
|
67
69
|
end
|
68
70
|
return res, nil if res.status.success?
|
69
71
|
return nil, NetworkError.new("Got an exception when making request to #{@api + endpoint}: #{res.to_s}", res.status.to_i) unless retries > 0 && $retry_codes.include?(res.code)
|
70
72
|
## status code retry
|
71
|
-
sleep
|
73
|
+
sleep backoff_adjusted
|
72
74
|
post_helper(endpoint, body, retries - 1, backoff * @backoff_multiplier)
|
73
75
|
end
|
74
76
|
|
@@ -97,7 +99,7 @@ module Statsig
|
|
97
99
|
def post_logs(events)
|
98
100
|
begin
|
99
101
|
json_body = JSON.generate({ 'events' => events, 'statsigMetadata' => Statsig.get_statsig_metadata })
|
100
|
-
post_helper('log_event', json_body,
|
102
|
+
post_helper('log_event', json_body, @post_logs_retry_limit)
|
101
103
|
rescue
|
102
104
|
end
|
103
105
|
end
|
data/lib/statsig.rb
CHANGED
@@ -148,7 +148,7 @@ module Statsig
|
|
148
148
|
@shared_instance&.get_layer(user, layer_name, StatsigDriver::GetLayerOptions.new(log_exposure: false))
|
149
149
|
end
|
150
150
|
|
151
|
-
sig { params(user: StatsigUser, layer_name: String, parameter_name: String).
|
151
|
+
sig { params(user: StatsigUser, layer_name: String, parameter_name: String).void }
|
152
152
|
##
|
153
153
|
# Logs an exposure event for the parameter in the given layer
|
154
154
|
#
|
@@ -227,7 +227,7 @@ module Statsig
|
|
227
227
|
def self.get_statsig_metadata
|
228
228
|
{
|
229
229
|
'sdkType' => 'ruby-server',
|
230
|
-
'sdkVersion' => '1.24.
|
230
|
+
'sdkVersion' => '1.24.6',
|
231
231
|
}
|
232
232
|
end
|
233
233
|
|
data/lib/statsig_driver.rb
CHANGED
@@ -170,7 +170,6 @@ class StatsigDriver
|
|
170
170
|
event.user = user
|
171
171
|
event.value = value
|
172
172
|
event.metadata = metadata
|
173
|
-
event.statsig_metadata = Statsig.get_statsig_metadata
|
174
173
|
@logger.log_event(event)
|
175
174
|
})
|
176
175
|
end
|
@@ -199,6 +198,7 @@ class StatsigDriver
|
|
199
198
|
# @return [Hash]
|
200
199
|
def get_client_initialize_response(user)
|
201
200
|
@err_boundary.capture(-> {
|
201
|
+
validate_user(user)
|
202
202
|
normalize_user(user)
|
203
203
|
@evaluator.get_client_initialize_response(user)
|
204
204
|
}, -> { nil })
|
data/lib/statsig_event.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
# typed: true
|
2
2
|
class StatsigEvent
|
3
|
-
attr_accessor :value
|
4
|
-
attr_accessor :metadata
|
5
|
-
attr_accessor :statsig_metadata
|
6
|
-
attr_accessor :secondary_exposures
|
3
|
+
attr_accessor :value, :metadata, :statsig_metadata, :secondary_exposures
|
7
4
|
attr_reader :user
|
8
5
|
|
9
6
|
def initialize(event_name)
|
@@ -13,6 +10,7 @@ class StatsigEvent
|
|
13
10
|
@secondary_exposures = nil
|
14
11
|
@user = nil
|
15
12
|
@time = (Time.now.to_f * 1000).to_i
|
13
|
+
@statsig_metadata = Statsig.get_statsig_metadata
|
16
14
|
end
|
17
15
|
|
18
16
|
def user=(value)
|
data/lib/statsig_logger.rb
CHANGED
@@ -16,10 +16,10 @@ module Statsig
|
|
16
16
|
|
17
17
|
@logging_pool = Concurrent::ThreadPoolExecutor.new(
|
18
18
|
min_threads: [2, Concurrent.processor_count].min,
|
19
|
-
max_threads: [
|
19
|
+
max_threads: [5, Concurrent.processor_count].min,
|
20
20
|
# max jobs pending before we start dropping
|
21
|
-
max_queue:
|
22
|
-
fallback_policy: :discard
|
21
|
+
max_queue: [5, Concurrent.processor_count].min * 5,
|
22
|
+
fallback_policy: :discard
|
23
23
|
)
|
24
24
|
|
25
25
|
@background_flush = periodic_flush
|
@@ -44,7 +44,6 @@ module Statsig
|
|
44
44
|
}
|
45
45
|
return false if not is_unique_exposure(user, $gate_exposure_event, metadata)
|
46
46
|
event.metadata = metadata
|
47
|
-
event.statsig_metadata = Statsig.get_statsig_metadata
|
48
47
|
|
49
48
|
event.secondary_exposures = secondary_exposures.is_a?(Array) ? secondary_exposures : []
|
50
49
|
|
@@ -62,7 +61,6 @@ module Statsig
|
|
62
61
|
}
|
63
62
|
return false if not is_unique_exposure(user, $config_exposure_event, metadata)
|
64
63
|
event.metadata = metadata
|
65
|
-
event.statsig_metadata = Statsig.get_statsig_metadata
|
66
64
|
event.secondary_exposures = secondary_exposures.is_a?(Array) ? secondary_exposures : []
|
67
65
|
|
68
66
|
safe_add_eval_details(eval_details, event)
|
@@ -90,7 +88,6 @@ module Statsig
|
|
90
88
|
}
|
91
89
|
return false if not is_unique_exposure(user, $layer_exposure_event, metadata)
|
92
90
|
event.metadata = metadata
|
93
|
-
event.statsig_metadata = Statsig.get_statsig_metadata
|
94
91
|
event.secondary_exposures = exposures.is_a?(Array) ? exposures : []
|
95
92
|
|
96
93
|
safe_add_eval_details(config_evaluation.evaluation_details, event)
|
data/lib/statsig_options.rb
CHANGED
@@ -79,6 +79,10 @@ class StatsigOptions
|
|
79
79
|
# Number of seconds before a network call is timed out
|
80
80
|
attr_accessor :network_timeout
|
81
81
|
|
82
|
+
sig { returns(Integer) }
|
83
|
+
# Number of times to retry sending a batch of failed log events
|
84
|
+
attr_accessor :post_logs_retry_limit
|
85
|
+
|
82
86
|
sig do
|
83
87
|
params(
|
84
88
|
environment: T.any(T::Hash[String, String], NilClass),
|
@@ -94,7 +98,8 @@ class StatsigOptions
|
|
94
98
|
idlist_threadpool_size: Integer,
|
95
99
|
disable_diagnostics_logging: T::Boolean,
|
96
100
|
disable_sorbet_logging_handlers: T::Boolean,
|
97
|
-
network_timeout: T.any(Integer, NilClass)
|
101
|
+
network_timeout: T.any(Integer, NilClass),
|
102
|
+
post_logs_retry_limit: Integer
|
98
103
|
).void
|
99
104
|
end
|
100
105
|
|
@@ -112,7 +117,8 @@ class StatsigOptions
|
|
112
117
|
idlist_threadpool_size: 3,
|
113
118
|
disable_diagnostics_logging: false,
|
114
119
|
disable_sorbet_logging_handlers: false,
|
115
|
-
network_timeout: nil
|
120
|
+
network_timeout: nil,
|
121
|
+
post_logs_retry_limit: 3)
|
116
122
|
@environment = environment.is_a?(Hash) ? environment : nil
|
117
123
|
@api_url_base = api_url_base
|
118
124
|
@rulesets_sync_interval = rulesets_sync_interval
|
@@ -127,5 +133,6 @@ class StatsigOptions
|
|
127
133
|
@disable_diagnostics_logging = disable_diagnostics_logging
|
128
134
|
@disable_sorbet_logging_handlers = disable_sorbet_logging_handlers
|
129
135
|
@network_timeout = network_timeout
|
136
|
+
@post_logs_retry_limit = post_logs_retry_limit
|
130
137
|
end
|
131
138
|
end
|
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.24.
|
4
|
+
version: 1.24.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Statsig, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.14.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 5.14.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: spy
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,19 +123,89 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '6.0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: rubocop
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.28.2
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.28.2
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: parallel_tests
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - "~>"
|
130
144
|
- !ruby/object:Gem::Version
|
131
145
|
version: '2.7'
|
132
|
-
type: :
|
146
|
+
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '2.7'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.21'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.21'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: simplecov-lcov
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.7.0
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.7.0
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: simplecov-cobertura
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '2.1'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '2.1'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: user_agent_parser
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 2.15.0
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 2.15.0
|
139
209
|
- !ruby/object:Gem::Dependency
|
140
210
|
name: http
|
141
211
|
requirement: !ruby/object:Gem::Requirement
|