@@ -71,7 +71,7 @@ public class Telemetry: Subscriber {
7171
7272 internal var session : any HTTPSession
7373 internal var host : String = HTTPClient . getDefaultAPIHost ( )
74- var sampleRate : Double = 1.0 // inital sample rate should be 1.0, will be downsampled on start
74+ @ Atomic var sampleRate : Double = 1.0 // inital sample rate should be 1.0, will be downsampled on start
7575 private var flushTimer : Int = 30
7676 internal var maxQueueSize : Int = 20
7777 var errorLogSizeMax : Int = 4000
@@ -85,27 +85,27 @@ public class Telemetry: Subscriber {
8585
8686 internal var queue = [ RemoteMetric] ( )
8787 private var queueBytes = 0
88- internal var started = false
89- private var rateLimitEndTime : TimeInterval = 0
90- internal var flushFirstError = true
88+ @ Atomic internal var started = false
89+ @ Atomic private var rateLimitEndTime : TimeInterval = 0
90+ @ Atomic internal var flushFirstError = true
9191 private var telemetryQueue = DispatchQueue ( label: " telemetryQueue " )
9292 private var updateQueue = DispatchQueue ( label: " updateQueue " )
9393 private var telemetryTimer : QueueTimer ?
9494
9595 /// Starts the Telemetry send loop. Requires both `enable` to be set and a configuration to be retrieved from Segment.
9696 func start( ) {
9797 guard enable, !started, sampleRate > 0.0 && sampleRate <= 1.0 else { return }
98- started = true
98+ _started . set ( true )
9999
100100 // Queue contents were sampled at the default 100%
101101 // the values on flush will be adjusted in the send function
102102 if Double . random ( in: 0 ... 1 ) > sampleRate {
103103 resetQueue ( )
104104 }
105105
106- self . telemetryTimer = QueueTimer ( interval: . seconds( self . flushTimer) , queue: . main ) { [ weak self] in
106+ self . telemetryTimer = QueueTimer ( interval: . seconds( self . flushTimer) , queue: updateQueue ) { [ weak self] in
107107 if ( !( self ? . enable ?? false ) ) {
108- self ? . started = false
108+ self ? . _started . set ( false )
109109 self ? . telemetryTimer? . suspend ( )
110110 }
111111 self ? . flush ( )
@@ -116,8 +116,8 @@ public class Telemetry: Subscriber {
116116 func reset( ) {
117117 telemetryTimer? . suspend ( )
118118 resetQueue ( )
119- started = false
120- rateLimitEndTime = 0
119+ _started . set ( false )
120+ _rateLimitEndTime . set ( 0 )
121121 }
122122
123123 /// Increments a metric with the provided tags.
@@ -161,7 +161,7 @@ public class Telemetry: Subscriber {
161161 addRemoteMetric ( metric: metric, tags: filteredTags, log: logData)
162162
163163 if ( flushFirstError) {
164- flushFirstError = false
164+ _flushFirstError . set ( false )
165165 flush ( )
166166 }
167167 }
@@ -175,14 +175,14 @@ public class Telemetry: Subscriber {
175175 if rateLimitEndTime > Date ( ) . timeIntervalSince1970 {
176176 return
177177 }
178- rateLimitEndTime = 0
178+ _rateLimitEndTime . set ( 0 )
179179
180180 do {
181181 try send ( )
182182 queueBytes = 0
183183 } catch {
184184 errorHandler ? ( error)
185- sampleRate = 0.0
185+ _sampleRate . set ( 0.0 )
186186 }
187187 }
188188 }
@@ -210,7 +210,7 @@ public class Telemetry: Subscriber {
210210
211211 if let httpResponse = response as? HTTPURLResponse , httpResponse. statusCode == 429 {
212212 if let retryAfter = httpResponse. allHeaderFields [ " Retry-After " ] as? String , let retryAfterSeconds = TimeInterval ( retryAfter) {
213- self . rateLimitEndTime = retryAfterSeconds + Date( ) . timeIntervalSince1970
213+ self . _rateLimitEndTime . set ( retryAfterSeconds + Date( ) . timeIntervalSince1970)
214214 }
215215 }
216216 }
@@ -280,7 +280,7 @@ public class Telemetry: Subscriber {
280280
281281 private func systemUpdate( system: System ) {
282282 if let settings = system. settings, let sampleRate = settings. metrics ? [ " sampleRate " ] ? . doubleValue {
283- self . sampleRate = sampleRate
283+ self . _sampleRate . set ( sampleRate)
284284 start ( )
285285 }
286286 }
0 commit comments