Skip to content

Commit

Permalink
Stopping log processor
Browse files Browse the repository at this point in the history
  • Loading branch information
NachoEmbrace committed Jan 17, 2025
1 parent 80c8a3c commit 30c9c5b
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 11 deletions.
3 changes: 2 additions & 1 deletion Sources/EmbraceCore/Embrace.swift
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,8 @@ To start the SDK you first need to configure it using an `Embrace.Options` insta
let logSharedState = DefaultEmbraceLogSharedState.create(
storage: self.storage,
controller: self.logController,
exporter: options.export?.logExporter
exporter: options.export?.logExporter,
sdkStateProvider: self
)
EmbraceOTel.setup(logSharedState: logSharedState)
sessionLifecycle.setup()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import Foundation
import EmbraceOTelInternal
import EmbraceStorageInternal
import EmbraceCommonInternal
import OpenTelemetrySdk

class DefaultEmbraceLogSharedState: EmbraceLogSharedState {
Expand All @@ -31,7 +32,8 @@ extension DefaultEmbraceLogSharedState {
static func create(
storage: EmbraceStorage,
controller: LogControllable,
exporter: LogRecordExporter? = nil
exporter: LogRecordExporter? = nil,
sdkStateProvider: EmbraceSDKStateProvider
) -> DefaultEmbraceLogSharedState {
var exporters: [LogRecordExporter] = [
StorageEmbraceLogExporter(
Expand All @@ -49,7 +51,7 @@ extension DefaultEmbraceLogSharedState {

return DefaultEmbraceLogSharedState(
config: DefaultEmbraceLoggerConfig(),
processors: .default(withExporters: exporters),
processors: .default(withExporters: exporters, sdkStateProvider: sdkStateProvider),
resourceProvider: ResourceStorageExporter(storage: storage)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
//

import OpenTelemetrySdk
import EmbraceCommonInternal

public extension Array where Element == any LogRecordProcessor {
static func `default`(
withExporters exporters: [LogRecordExporter]
withExporters exporters: [LogRecordExporter],
sdkStateProvider: EmbraceSDKStateProvider
) -> [LogRecordProcessor] {
[SingleLogRecordProcessor(exporters: exporters)]
[SingleLogRecordProcessor(exporters: exporters, sdkStateProvider: sdkStateProvider)]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,34 @@

import Foundation
import OpenTelemetrySdk
import EmbraceCommonInternal

class SingleLogRecordProcessor: LogRecordProcessor {

private let exporters: [LogRecordExporter]

init(exporters: [LogRecordExporter]) {
weak var sdkStateProvider: EmbraceSDKStateProvider?

init(exporters: [LogRecordExporter], sdkStateProvider: EmbraceSDKStateProvider) {
self.exporters = exporters
self.sdkStateProvider = sdkStateProvider
}

func onEmit(logRecord: ReadableLogRecord) {
guard sdkStateProvider?.isEnabled == true else {
return
}

exporters.forEach {
_ = $0.export(logRecords: [logRecord])
}
}

func forceFlush(explicitTimeout: TimeInterval?) -> ExportResult {
guard sdkStateProvider?.isEnabled == true else {
return .failure
}

let resultSet = Set(exporters.map { $0.forceFlush() })
if let firstResult = resultSet.first {
return resultSet.count > 1 ? .failure : firstResult
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import XCTest
@testable import EmbraceOTelInternal
@testable import EmbraceStorageInternal
import OpenTelemetrySdk
import TestSupport

class DummyEmbraceResourceProvider: EmbraceResourceProvider {
func getResource() -> Resource { Resource() }
Expand All @@ -19,6 +20,8 @@ class DummyLogControllable: LogControllable {

class EmbraceLoggerSharedStateTests: XCTestCase {
private var sut: DefaultEmbraceLogSharedState!
let sdkStateProvider = MockEmbraceSDKStateProvider()


func test_default_hasDefaultEmbraceLoggerConfig() throws {
try whenInvokingDefaultEmbraceLoggerSharedState()
Expand Down Expand Up @@ -54,7 +57,11 @@ private extension EmbraceLoggerSharedStateTests {
}

func whenInvokingDefaultEmbraceLoggerSharedState() throws {
sut = try .create(storage: EmbraceStorage.createInMemoryDb(), controller: DummyLogControllable())
sut = try .create(
storage: EmbraceStorage.createInMemoryDb(),
controller: DummyLogControllable(),
sdkStateProvider: sdkStateProvider
)
}

func thenConfig(is config: any EmbraceLoggerConfig) {
Expand Down
5 changes: 4 additions & 1 deletion Tests/EmbraceOTelInternalTests/EmbraceOTelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import TestSupport

final class EmbraceOTelTests: XCTestCase {

let sdkStateProvider = MockEmbraceSDKStateProvider()

class DummyLogControllable: LogControllable {
func uploadAllPersistedLogs() {}
func batchFinished(withLogs logs: [LogRecord]) {}
Expand All @@ -23,7 +25,8 @@ final class EmbraceOTelTests: XCTestCase {
EmbraceOTel.setup(logSharedState: DefaultEmbraceLogSharedState.create(
storage: try .createInMemoryDb(),
controller: DummyLogControllable(),
exporter: logExporter
exporter: logExporter,
sdkStateProvider: sdkStateProvider
))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import OpenTelemetryApi
import OpenTelemetrySdk

final class GenericLogExporterTests: XCTestCase {

let sdkStateProvider = MockEmbraceSDKStateProvider()

class DummyLogControllable: LogControllable {
func uploadAllPersistedLogs() {}
func batchFinished(withLogs logs: [LogRecord]) {}
Expand All @@ -21,7 +24,8 @@ final class GenericLogExporterTests: XCTestCase {
let sharedState = DefaultEmbraceLogSharedState.create(
storage: try .createInMemoryDb(),
controller: DummyLogControllable(),
exporter: exporter
exporter: exporter,
sdkStateProvider: sdkStateProvider
)
EmbraceOTel.setup(logSharedState: sharedState)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ import Foundation
import XCTest
import OpenTelemetrySdk
@testable import EmbraceOTelInternal
import TestSupport

class EmbraceLogRecordProcessorArrayExtensionTests: XCTestCase {

let sdkStateProvider = MockEmbraceSDKStateProvider()

func test_onDefaultWithExporters_returnSingleLogRecordProcessorInstance() throws {
let processors: [LogRecordProcessor] = .default(withExporters: [])
let processors: [LogRecordProcessor] = .default(withExporters: [], sdkStateProvider: sdkStateProvider)
XCTAssertEqual(processors.count, 1)
XCTAssertTrue(try XCTUnwrap(processors.first) is SingleLogRecordProcessor)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,31 @@
import XCTest
import Foundation
import OpenTelemetrySdk
import TestSupport

@testable import EmbraceOTelInternal

class SingleLogRecordProcessorTests: XCTestCase {
private var sut: SingleLogRecordProcessor!
private var exporter: SpyEmbraceLogRecordExporter!
private var result: ExportResult!
private var sdkStateProvider: MockEmbraceSDKStateProvider!

func test_emit_sdkDisabled() throws {
givenProcessorWithAnExporter()
givenDisabledSDK()
whenInvokingEmit(withLog: .log(withTestId: "12345"))
thenExportDoesNotInvokeExport()
thenExporterReceivesNoLogs()
}

func test_forceFlush_sdkDisabled() throws {
givenProcessorWithAnExporter()
givenDisabledSDK()
whenInvokingForceFlush()
thenExportDoesNotInvokeForceFlush()
thenExporterReceivesNoLogs()
}

func testHavingAtLeastOneProcessor_onEmit_shouldPassLogRecordToExporterAsAnArray() throws {
givenProcessorWithAnExporter()
Expand Down Expand Up @@ -68,7 +86,12 @@ private extension SingleLogRecordProcessorTests {
}

func givenProcessor(withExporters exporters: [LogRecordExporter]) {
sut = .init(exporters: exporters)
sdkStateProvider = MockEmbraceSDKStateProvider()
sut = .init(exporters: exporters, sdkStateProvider: sdkStateProvider)
}

func givenDisabledSDK() {
sdkStateProvider.isEnabled = false
}

func whenInvokingEmit(withLog log: ReadableLogRecord) {
Expand All @@ -95,10 +118,22 @@ private extension SingleLogRecordProcessorTests {
XCTAssertTrue(exporter.didCallExport)
}

func thenExportDoesNotInvokeExport() {
XCTAssertFalse(exporter.didCallExport)
}

func thenExportDoesNotInvokeForceFlush() {
XCTAssertFalse(exporter.didCallForceFlush)
}

func thenExporterReceivesOneLog() {
XCTAssertEqual(exporter.exportLogRecordsReceivedParameter.count, 1)
}

func thenExporterReceivesNoLogs() {
XCTAssertEqual(exporter.exportLogRecordsReceivedParameter.count, 0)
}

func thenExportResult(is resultValue: ExportResult) {
XCTAssertEqual(result, resultValue)
}
Expand Down

0 comments on commit 30c9c5b

Please sign in to comment.