statsig 1.24.3 → 1.24.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5fe02a7e436da6cb4568a0813914c9d2d31c70b7dd55497fbb77577d7792dffd
4
- data.tar.gz: 642c10f84b32af9e5065b77e9ff2dd95410fc8c8b60d497e78c814464ce157c1
3
+ metadata.gz: 34ed13d83f7fc34162c3bec12058f7c0be928bf6057a0ecdf941526c8e768ec5
4
+ data.tar.gz: 9c309e3ec1430e0269d3a085aa1f3ce54d634c6c2ff3959f9c94a26dc0a14aca
5
5
  SHA512:
6
- metadata.gz: 5c97dbcd694bc0a3b95ecf9ff2756c94421bee43e0e4029062acae707c446f0b9b88255d30feb6d7a05b4b3bcf710d8db59c079c030f2ab6cd5e946409fa5568
7
- data.tar.gz: d4431371a48f9b54deb9ea2ceb9e8ce01fb6840de9952cee26006bd900bd9981aac54cfe58a9cd5e80e05bf101ef6cbf2233320b3b0a8d6f0ae778d802faa14c
6
+ metadata.gz: cc65c21d8a98879fe5b14a63ed3558e2b114cddaa829231ac5bae1f7e5b969563b8936c6c928890cc69a611c907227285fdcba98fd8a3c6ceab27e7b6ac1ca65
7
+ data.tar.gz: ae77abf8f573ca3de37133749a77f290f7d9b087846c9e612386f708b389fd2dd44279b8d26ba291f63c87d1d866b987ebcff9a98ac9d3acb1db4be5903fcdd1
data/lib/spec_store.rb CHANGED
@@ -290,7 +290,7 @@ module Statsig
290
290
  begin
291
291
  server_id_lists = JSON.parse(response)
292
292
  process_id_lists(server_id_lists, init_diagnostics)
293
- save_id_lists_to_adapter(response)
293
+ save_id_lists_to_adapter(response.body.to_s)
294
294
  rescue
295
295
  # Ignored, will try again
296
296
  end
data/lib/statsig.rb CHANGED
@@ -227,7 +227,7 @@ module Statsig
227
227
  def self.get_statsig_metadata
228
228
  {
229
229
  'sdkType' => 'ruby-server',
230
- 'sdkVersion' => '1.24.3',
230
+ 'sdkVersion' => '1.24.4',
231
231
  }
232
232
  end
233
233
 
@@ -6,7 +6,7 @@ $gate_exposure_event = 'statsig::gate_exposure'
6
6
  $config_exposure_event = 'statsig::config_exposure'
7
7
  $layer_exposure_event = 'statsig::layer_exposure'
8
8
  $diagnostics_event = 'statsig::diagnostics'
9
-
9
+ $ignored_metadata_keys = ['serverTime', 'configSyncTime', 'initTime', 'reason']
10
10
  module Statsig
11
11
  class StatsigLogger
12
12
  def initialize(network, options)
@@ -23,6 +23,8 @@ module Statsig
23
23
  )
24
24
 
25
25
  @background_flush = periodic_flush
26
+ @deduper = Concurrent::Set.new()
27
+ @interval = 0
26
28
  end
27
29
 
28
30
  def log_event(event)
@@ -35,12 +37,15 @@ module Statsig
35
37
  def log_gate_exposure(user, gate_name, value, rule_id, secondary_exposures, eval_details, context = nil)
36
38
  event = StatsigEvent.new($gate_exposure_event)
37
39
  event.user = user
38
- event.metadata = {
40
+ metadata = {
39
41
  'gate' => gate_name,
40
42
  'gateValue' => value.to_s,
41
43
  'ruleID' => rule_id,
42
44
  }
45
+ return false if not is_unique_exposure(user, $gate_exposure_event, metadata)
46
+ event.metadata = metadata
43
47
  event.statsig_metadata = Statsig.get_statsig_metadata
48
+
44
49
  event.secondary_exposures = secondary_exposures.is_a?(Array) ? secondary_exposures : []
45
50
 
46
51
  safe_add_eval_details(eval_details, event)
@@ -51,10 +56,12 @@ module Statsig
51
56
  def log_config_exposure(user, config_name, rule_id, secondary_exposures, eval_details, context = nil)
52
57
  event = StatsigEvent.new($config_exposure_event)
53
58
  event.user = user
54
- event.metadata = {
59
+ metadata = {
55
60
  'config' => config_name,
56
61
  'ruleID' => rule_id,
57
62
  }
63
+ return false if not is_unique_exposure(user, $config_exposure_event, metadata)
64
+ event.metadata = metadata
58
65
  event.statsig_metadata = Statsig.get_statsig_metadata
59
66
  event.secondary_exposures = secondary_exposures.is_a?(Array) ? secondary_exposures : []
60
67
 
@@ -74,13 +81,15 @@ module Statsig
74
81
 
75
82
  event = StatsigEvent.new($layer_exposure_event)
76
83
  event.user = user
77
- event.metadata = {
84
+ metadata = {
78
85
  'config' => layer.name,
79
86
  'ruleID' => layer.rule_id,
80
87
  'allocatedExperiment' => allocated_experiment,
81
88
  'parameterName' => parameter_name,
82
89
  'isExplicitParameter' => String(is_explicit),
83
90
  }
91
+ return false if not is_unique_exposure(user, $layer_exposure_event, metadata)
92
+ event.metadata = metadata
84
93
  event.statsig_metadata = Statsig.get_statsig_metadata
85
94
  event.secondary_exposures = exposures.is_a?(Array) ? exposures : []
86
95
 
@@ -101,6 +110,8 @@ module Statsig
101
110
  loop do
102
111
  sleep @options.logging_interval_seconds
103
112
  flush
113
+ @interval++
114
+ @deduper.clear if @interval % 2 == 0
104
115
  end
105
116
  end
106
117
  end
@@ -157,5 +168,29 @@ module Statsig
157
168
  event.metadata['isManualExposure'] = 'true'
158
169
  end
159
170
  end
171
+
172
+ def is_unique_exposure(user, event_name, metadata)
173
+ return true if user.nil?
174
+ @deduper.clear if @deduper.size > 10000
175
+ custom_id_key = ''
176
+ if user.custom_ids.is_a?(Hash)
177
+ custom_id_key = user.custom_ids.values.join(',')
178
+ end
179
+
180
+ metadata_key = ''
181
+ if metadata.is_a?(Hash)
182
+ metadata_key = metadata.reject { |key, _| $ignored_metadata_keys.include?(key) }.values.join(',')
183
+ end
184
+
185
+ user_id_key = ''
186
+ unless user.user_id.nil?
187
+ user_id_key = user.user_id
188
+ end
189
+ key = [user_id_key, custom_id_key, event_name, metadata_key].join(',')
190
+
191
+ return false if @deduper.include?(key)
192
+ @deduper.add(key)
193
+ true
194
+ end
160
195
  end
161
196
  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.3
4
+ version: 1.24.4
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-03-24 00:00:00.000000000 Z
11
+ date: 2023-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler