Skip to content

Commit 41904f5

Browse files
Merge pull request #720 from splitio/FME-8356-Errors
[FME-8356] - Events - Errors Metadata
2 parents 4263d1a + e6d87a5 commit 41904f5

16 files changed

+398
-170
lines changed

Split/Api/DefaultSplitClient.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ extension DefaultSplitClient {
9494
Logger.w("A handler was added for \(event.toString()) on the SDK, which has already fired and won’t be emitted again. The callback won’t be executed.")
9595
return
9696
}
97-
eventsManager.register(event: SplitEventWithMetadata(type: event, metadata: nil), task: task)
97+
eventsManager.register(event: event, task: task)
9898
}
9999

100100
// MARK: Listeners with Metadata

Split/Events/EventsManagerCoordinator.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator {
2121
private let queue = DispatchQueue(label: "split-event-manager-coordinator")
2222
private let eventsToHandle: Set<SplitInternalEvent> = Set(
2323
[.splitsLoadedFromCache,
24-
.splitsUpdated,
25-
.splitKilledNotification]
24+
.splitsUpdated,
25+
.splitKilledNotification,
26+
.sdkError]
2627
)
2728

2829
func notifyInternalEvent(_ event: SplitInternalEvent) {
29-
notifyInternalEventWithMetadata(SplitInternalEventWithMetadata(event, metadata: nil))
30+
notifyInternalEvent(SplitInternalEventWithMetadata(event, metadata: nil))
3031
}
3132

32-
func notifyInternalEventWithMetadata(_ event: SplitInternalEventWithMetadata) {
33+
func notifyInternalEvent(_ event: SplitInternalEventWithMetadata) {
3334
if !eventsToHandle.contains(event.type) {
3435
return
3536
}
@@ -38,7 +39,7 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator {
3839

3940
self.triggered.insert(event.type)
4041
self.managers.forEach { _, manager in
41-
manager.notifyInternalEvent(event.type)
42+
manager.notifyInternalEvent(event)
4243
}
4344
}
4445
}

Split/Events/SplitEvent.swift

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Foundation
1111
let type: SplitEvent
1212
let metadata: EventMetadata?
1313

14-
@objc public init(type: SplitEvent, metadata: EventMetadata? = nil) {
14+
@objc public init(_ type: SplitEvent, metadata: EventMetadata? = nil) {
1515
self.type = type
1616
self.metadata = metadata
1717
}
@@ -22,17 +22,20 @@ import Foundation
2222
case sdkReadyTimedOut
2323
case sdkReadyFromCache
2424
case sdkUpdated
25+
case sdkError
2526

2627
public func toString() -> String {
2728
switch self {
28-
case .sdkReady:
29-
return "SDK_READY"
30-
case .sdkUpdated:
31-
return "SDK_UPDATE"
32-
case .sdkReadyTimedOut:
33-
return "SDK_READY_TIMED_OUT"
34-
case .sdkReadyFromCache:
35-
return "SDK_READY_FROM_CACHE"
29+
case .sdkReady:
30+
return "SDK_READY"
31+
case .sdkUpdated:
32+
return "SDK_UPDATE"
33+
case .sdkReadyTimedOut:
34+
return "SDK_READY_TIMED_OUT"
35+
case .sdkReadyFromCache:
36+
return "SDK_READY_FROM_CACHE"
37+
case .sdkError:
38+
return "SDK_ERROR"
3639
}
3740
}
3841
}

Split/Events/SplitEventsManager.swift

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ import Foundation
1010

1111
protocol SplitEventsManager: AnyObject {
1212
func register(event: SplitEvent, task: SplitEventTask)
13-
func register(event: SplitEventWithMetadata, task: SplitEventTask)
1413
func notifyInternalEvent(_ event: SplitInternalEvent)
14+
func notifyInternalEvent(_ event: SplitInternalEventWithMetadata)
1515
func start()
1616
func stop()
1717
func eventAlreadyTriggered(event: SplitEvent) -> Bool
1818
}
1919

2020
class DefaultSplitEventsManager: SplitEventsManager {
21+
2122
private let readingRefreshTime: Int
2223

2324
private var sdkReadyTimeStart: Int64
@@ -41,11 +42,12 @@ class DefaultSplitEventsManager: SplitEventsManager {
4142
self.executionTimes = [String: Int]()
4243
registerMaxAllowedExecutionTimesPerEvent()
4344

45+
// SDK Timeout Event
4446
if config.sdkReadyTimeOut > 0 {
4547
let readyTimedoutQueue = DispatchQueue(label: "split-event-timedout")
4648
readyTimedoutQueue.asyncAfter(deadline: .now() + .milliseconds(config.sdkReadyTimeOut)) { [weak self] in
4749
guard let self = self else { return }
48-
self.notifyInternalEvent(SplitInternalEvent.sdkReadyTimeoutReached)
50+
self.notifyInternalEvent(.sdkReadyTimeoutReached)
4951
}
5052
}
5153
}
@@ -62,21 +64,17 @@ class DefaultSplitEventsManager: SplitEventsManager {
6264
func notifyInternalEvent(_ event: SplitInternalEvent) {
6365
notifyInternalEvent(SplitInternalEventWithMetadata(event, metadata: nil))
6466
}
65-
66-
func register(event: SplitEvent, task: SplitEventTask) {
67-
register(event: SplitEventWithMetadata(type: event, metadata: nil), task: task)
68-
}
6967

70-
func register(event: SplitEventWithMetadata, task: SplitEventTask) {
71-
let eventName = event.type.toString()
68+
func register(event: SplitEvent, task: SplitEventTask) {
69+
let eventName = event.toString()
7270
processQueue.async { [weak self] in
7371
guard let self = self else { return }
7472
// If event is already triggered, execute the task
7573
if let times = self.executionTimes(for: eventName), times == 0 {
7674
self.executeTask(event: event, task: task)
7775
return
7876
}
79-
self.subscribe(task: task, to: event.type)
77+
self.subscribe(task: task, to: event)
8078
}
8179
}
8280

@@ -111,7 +109,6 @@ class DefaultSplitEventsManager: SplitEventsManager {
111109
self.eventsQueue.stop()
112110
self.eventsQueue.stop()
113111
}
114-
115112
}
116113
}
117114

@@ -125,6 +122,7 @@ class DefaultSplitEventsManager: SplitEventsManager {
125122

126123
executionTimes = [ SplitEvent.sdkReady.toString(): 1,
127124
SplitEvent.sdkUpdated.toString(): -1,
125+
SplitEvent.sdkError.toString(): -1,
128126
SplitEvent.sdkReadyFromCache.toString(): 1,
129127
SplitEvent.sdkReadyTimedOut.toString(): 1]
130128
}
@@ -159,7 +157,7 @@ class DefaultSplitEventsManager: SplitEventsManager {
159157
switch event.type {
160158
case .splitsUpdated, .mySegmentsUpdated, .myLargeSegmentsUpdated:
161159
if isTriggered(external: .sdkReady) {
162-
trigger(event: SplitEventWithMetadata(type: .sdkUpdated, metadata: event.metadata))
160+
trigger(event: .sdkUpdated)
163161
continue
164162
}
165163
triggerSdkReadyIfNeeded()
@@ -181,6 +179,9 @@ class DefaultSplitEventsManager: SplitEventsManager {
181179
if !isTriggered(external: .sdkReady) {
182180
trigger(event: .sdkReadyTimedOut)
183181
}
182+
case .sdkError:
183+
let eventWithMetadata = SplitEventWithMetadata(.sdkError, metadata: event.metadata)
184+
trigger(event: eventWithMetadata)
184185
}
185186
}
186187
}
@@ -211,7 +212,7 @@ class DefaultSplitEventsManager: SplitEventsManager {
211212
}
212213

213214
private func trigger(event: SplitEvent) {
214-
trigger(event: SplitEventWithMetadata(type: event, metadata: nil))
215+
trigger(event: SplitEventWithMetadata(event, metadata: nil))
215216
}
216217

217218
private func trigger(event: SplitEventWithMetadata) {
@@ -237,13 +238,14 @@ class DefaultSplitEventsManager: SplitEventsManager {
237238
}
238239

239240
private func executeTask(event: SplitEvent, task: SplitEventTask) {
240-
executeTask(event: SplitEventWithMetadata(type: event, metadata: nil), task: task)
241+
executeTask(event: SplitEventWithMetadata(event, metadata: nil), task: task)
241242
}
242243

243244
private func executeTask(event: SplitEventWithMetadata, task: SplitEventTask) {
244245

245246
let eventName = task.event.toString()
246247

248+
// RUN IN BG & RETURN
247249
if task.runInBackground {
248250
TimeChecker.logInterval("Previous to run \(eventName) in Background")
249251

@@ -255,6 +257,7 @@ class DefaultSplitEventsManager: SplitEventsManager {
255257
return
256258
}
257259

260+
// OR RUN ON MAIN
258261
DispatchQueue.main.async {
259262
TimeChecker.logInterval("Running event on main: \(eventName)")
260263
// UI Updates

Split/Events/SplitInternalEvent.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ struct SplitInternalEventWithMetadata {
3030
}
3131

3232
enum EventMetadataType: Int {
33-
case FEATURE_FLAGS_SYNC_ERROR
34-
case SEGMENTS_SYNC_ERROR
33+
case featureFlagsSyncError
34+
case segmentsSyncError
3535

3636
public func toString() -> String {
3737
switch self {
38-
case .FEATURE_FLAGS_SYNC_ERROR:
38+
case .featureFlagsSyncError:
3939
return "FEATURE_FLAGS_SYNC_ERROR"
40-
case .SEGMENTS_SYNC_ERROR:
40+
case .segmentsSyncError:
4141
return "SEGMENTS_SYNC_ERROR"
4242
}
4343
}
@@ -53,4 +53,5 @@ enum SplitInternalEvent {
5353
case attributesLoadedFromCache
5454
case sdkReadyTimeoutReached
5555
case splitKilledNotification
56+
case sdkError
5657
}

Split/FetcherEngine/Refresh/PeriodicSyncWorker.swift

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,13 @@ class BasePeriodicSyncWorker: PeriodicSyncWorker {
130130
Logger.i("Fetch from remote not implemented")
131131
}
132132

133-
func notifyUpdate(_ events: [SplitInternalEvent]) {
134-
events.forEach {
135-
eventsManager.notifyInternalEvent($0)
136-
}
133+
func notifyUpdate(_ event: SplitInternalEvent) {
134+
let withMetadata = SplitInternalEventWithMetadata(event, metadata: nil)
135+
notifyUpdate(withMetadata)
136+
}
137+
138+
func notifyUpdate(_ event: SplitInternalEventWithMetadata) {
139+
eventsManager.notifyInternalEvent(event)
137140
}
138141
}
139142

@@ -181,10 +184,18 @@ class PeriodicSplitsSyncWorker: BasePeriodicSyncWorker {
181184
let changeNumber = splitsStorage.changeNumber
182185
let rbChangeNumber: Int64 = ruleBasedSegmentsStorage.changeNumber
183186
guard let result = try? syncHelper.sync(since: changeNumber, rbSince: rbChangeNumber) else {
187+
let event = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .segmentsSyncError, data: []))
188+
notifyUpdate(event)
184189
return
185190
}
191+
186192
if result.success, result.featureFlagsUpdated || result.rbsUpdated {
187-
notifyUpdate([.splitsUpdated])
193+
// Success
194+
notifyUpdate(.splitsUpdated)
195+
} else if !result.success {
196+
// Fail
197+
let event = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .featureFlagsSyncError, data: []))
198+
notifyUpdate(event)
188199
}
189200
}
190201
}
@@ -225,10 +236,17 @@ class PeriodicMySegmentsSyncWorker: BasePeriodicSyncWorker {
225236
if result.success {
226237
if result.msUpdated || result.mlsUpdated {
227238
// For now is not necessary specify which entity was updated
228-
notifyUpdate([.mySegmentsUpdated])
239+
notifyUpdate(.mySegmentsUpdated)
229240
}
241+
} else {
242+
// Fail
243+
let event = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .segmentsSyncError, data: []))
244+
notifyUpdate(event)
230245
}
231246
} catch {
247+
// Fail
248+
let event = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .segmentsSyncError, data: []))
249+
notifyUpdate(event)
232250
Logger.e("Problem fetching segments: %@", error.localizedDescription)
233251
}
234252
}

Split/FetcherEngine/Refresh/RetryableSegmentsSyncWorker.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,23 @@ class RetryableMySegmentsSyncWorker: BaseRetryableSyncWorker {
4646
if result.success {
4747
if !isSdkReadyTriggered() {
4848
// Notifying both to trigger SDK Ready
49-
notifyUpdate([.mySegmentsUpdated])
50-
notifyUpdate([.myLargeSegmentsUpdated])
49+
notifyUpdate(.mySegmentsUpdated)
50+
notifyUpdate(.myLargeSegmentsUpdated)
5151
} else if result.msUpdated || result.mlsUpdated {
5252
// For now is not necessary specify which entity was updated
53-
notifyUpdate([.mySegmentsUpdated])
53+
notifyUpdate(.mySegmentsUpdated)
5454
}
5555
return true
56+
} else {
57+
// Fail
58+
let event = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .segmentsSyncError, data: []))
59+
notifyUpdate(event)
5660
}
5761
} catch {
62+
// Fail
5863
Logger.e("Error while fetching segments in method: \(error.localizedDescription)")
64+
let event = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .segmentsSyncError, data: []))
65+
notifyUpdate(event)
5966
errorHandler?(error)
6067
}
6168
return false

Split/FetcherEngine/Refresh/RetryableSyncWorker.swift

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,12 @@ class BaseRetryableSyncWorker: RetryableSyncWorker {
7979
}
8080
}
8181

82-
func notifyUpdate(_ events: [SplitInternalEvent]) {
83-
events.forEach {
84-
eventsManager.notifyInternalEvent($0)
85-
}
82+
func notifyUpdate(_ event: SplitInternalEvent) {
83+
notifyUpdate(SplitInternalEventWithMetadata(event, metadata: nil))
84+
}
85+
86+
func notifyUpdate(_ event: SplitInternalEventWithMetadata) {
87+
eventsManager.notifyInternalEvent(event)
8688
}
8789

8890
func isSdkReadyTriggered() -> Bool {
@@ -141,15 +143,23 @@ class RetryableSplitsSyncWorker: BaseRetryableSyncWorker {
141143
let rbChangeNumber = ruleBasedSegmentsStorage.changeNumber
142144
let result = try syncHelper.sync(since: changeNumber, rbSince: rbChangeNumber, clearBeforeUpdate: false)
143145
if result.success {
146+
// Success
144147
if !isSdkReadyTriggered() ||
145148
result.featureFlagsUpdated {
146-
notifyUpdate([.splitsUpdated])
149+
notifyUpdate(.splitsUpdated)
147150
}
148151
resetBackoffCounter()
149152
return true
153+
} else {
154+
// Fail
155+
let eventWithMetadata = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .featureFlagsSyncError, data: []))
156+
notifyUpdate(eventWithMetadata)
150157
}
151158
} catch {
159+
// Fail
152160
Logger.e("Error while fetching splits in method: \(error.localizedDescription)")
161+
let eventWithMetadata = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .featureFlagsSyncError, data: []))
162+
notifyUpdate(eventWithMetadata)
153163
errorHandler?(error)
154164
}
155165
return false
@@ -217,14 +227,22 @@ class RetryableSplitsUpdateWorker: BaseRetryableSyncWorker {
217227
clearBeforeUpdate: false,
218228
headers: ServiceConstants.controlNoCacheHeader)
219229
if result.success {
230+
// Success
220231
if result.featureFlagsUpdated {
221-
notifyUpdate([.splitsUpdated])
232+
notifyUpdate(.splitsUpdated)
222233
}
223234
resetBackoffCounter()
224235
return true
236+
} else {
237+
// Fail
238+
let eventWithMetadata = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .featureFlagsSyncError, data: []))
239+
notifyUpdate(eventWithMetadata)
225240
}
226241
} catch {
242+
// Fail
227243
Logger.e("Error while fetching splits in method \(#function): \(error.localizedDescription)")
244+
let eventWithMetadata = SplitInternalEventWithMetadata(.sdkError, metadata: EventMetadata(type: .featureFlagsSyncError, data: []))
245+
notifyUpdate(eventWithMetadata)
228246
errorHandler?(error)
229247
}
230248
Logger.d("Feature flag changes are not updated yet")

0 commit comments

Comments
 (0)