From e8bced74bc6d747745935e469f45d03f048d6cbd Mon Sep 17 00:00:00 2001 From: Gustavo Cairo Date: Wed, 1 Feb 2023 19:42:39 +0000 Subject: [PATCH] Propagate displayUnit when using MultiplexMetricsHandler (#122) --- Sources/CoreMetrics/Metrics.swift | 4 ++ .../CoreMetricsTests+XCTest.swift | 4 +- Tests/MetricsTests/CoreMetricsTests.swift | 44 +++++++++++++++++-- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/Sources/CoreMetrics/Metrics.swift b/Sources/CoreMetrics/Metrics.swift index f0fe6ab..fed496a 100644 --- a/Sources/CoreMetrics/Metrics.swift +++ b/Sources/CoreMetrics/Metrics.swift @@ -907,6 +907,10 @@ public final class MultiplexMetricsHandler: MetricsFactory { func recordNanoseconds(_ duration: Int64) { self.timers.forEach { $0.recordNanoseconds(duration) } } + + func preferDisplayUnit(_ unit: TimeUnit) { + self.timers.forEach { $0.preferDisplayUnit(unit) } + } } } diff --git a/Tests/MetricsTests/CoreMetricsTests+XCTest.swift b/Tests/MetricsTests/CoreMetricsTests+XCTest.swift index 26cfbfd..ecada42 100644 --- a/Tests/MetricsTests/CoreMetricsTests+XCTest.swift +++ b/Tests/MetricsTests/CoreMetricsTests+XCTest.swift @@ -44,7 +44,9 @@ extension MetricsTests { ("testTimerHandlesUnsignedOverflow", testTimerHandlesUnsignedOverflow), ("testGauge", testGauge), ("testGaugeBlock", testGaugeBlock), - ("testMUX", testMUX), + ("testMUX_Counter", testMUX_Counter), + ("testMUX_Recorder", testMUX_Recorder), + ("testMUX_Timer", testMUX_Timer), ("testCustomFactory", testCustomFactory), ("testDestroyingGauge", testDestroyingGauge), ("testDestroyingCounter", testDestroyingCounter), diff --git a/Tests/MetricsTests/CoreMetricsTests.swift b/Tests/MetricsTests/CoreMetricsTests.swift index 44c315a..68a333b 100644 --- a/Tests/MetricsTests/CoreMetricsTests.swift +++ b/Tests/MetricsTests/CoreMetricsTests.swift @@ -361,28 +361,64 @@ class MetricsTests: XCTestCase { XCTAssertEqual(recorder.values[0].1, value, "expected value to match") } - func testMUX() throws { + func testMUX_Counter() throws { // bootstrap with our test metrics let factories = [TestMetrics(), TestMetrics(), TestMetrics()] MetricsSystem.bootstrapInternal(MultiplexMetricsHandler(factories: factories)) // run the test let name = NSUUID().uuidString let value = Int.random(in: Int.min ... Int.max) - let mux = Counter(label: name) - mux.increment(by: value) + let muxCounter = Counter(label: name) + muxCounter.increment(by: value) factories.forEach { factory in let counter = factory.counters.first?.1 as! TestCounter XCTAssertEqual(counter.label, name, "expected label to match") XCTAssertEqual(counter.values.count, 1, "expected number of entries to match") XCTAssertEqual(counter.values[0].1, Int64(value), "expected value to match") } - mux.reset() + muxCounter.reset() factories.forEach { factory in let counter = factory.counters.first?.1 as! TestCounter XCTAssertEqual(counter.values.count, 0, "expected number of entries to match") } } + func testMUX_Recorder() throws { + // bootstrap with our test metrics + let factories = [TestMetrics(), TestMetrics(), TestMetrics()] + MetricsSystem.bootstrapInternal(MultiplexMetricsHandler(factories: factories)) + // run the test + let name = NSUUID().uuidString + let value = Double.random(in: 0 ... 1) + let muxRecorder = Recorder(label: name) + muxRecorder.record(value) + factories.forEach { factory in + let recorder = factory.recorders.first?.1 as! TestRecorder + XCTAssertEqual(recorder.label, name, "expected label to match") + XCTAssertEqual(recorder.values.count, 1, "expected number of entries to match") + XCTAssertEqual(recorder.values[0].1, value, "expected value to match") + } + } + + func testMUX_Timer() throws { + // bootstrap with our test metrics + let factories = [TestMetrics(), TestMetrics(), TestMetrics()] + MetricsSystem.bootstrapInternal(MultiplexMetricsHandler(factories: factories)) + // run the test + let name = NSUUID().uuidString + let seconds = Int.random(in: 1 ... 10) + let muxTimer = Timer(label: name, preferredDisplayUnit: .minutes) + muxTimer.recordSeconds(seconds) + factories.forEach { factory in + let timer = factory.timers.first?.1 as! TestTimer + XCTAssertEqual(timer.label, name, "expected label to match") + XCTAssertEqual(timer.values.count, 1, "expected number of entries to match") + XCTAssertEqual(timer.values[0].1, Int64(seconds * 1_000_000_000), "expected value to match") + XCTAssertEqual(timer.displayUnit, .minutes, "expected value to match") + XCTAssertEqual(timer.retrieveValueInPreferredUnit(atIndex: 0), Double(seconds) / 60.0, "seconds should be returned as minutes") + } + } + func testCustomFactory() { final class CustomHandler: CounterHandler { func increment(by: DataType) where DataType: BinaryInteger {}