Skip to content

Commit 342452f

Browse files
authored
Fixed empty exemplar data and fixed reservoir cells sizing (#752)
1 parent 4eb6d59 commit 342452f

File tree

4 files changed

+32
-14
lines changed

4 files changed

+32
-14
lines changed

Sources/OpenTelemetrySdk/Metrics/Stable/Exemplar/ExemplarReservoir.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public class FixedSizedExemplarReservoir: ExemplarReservoir {
5151
self.reservoirCellSelector = reservoirCellSelector
5252
self.mapAndResetCell = mapAndResetCell
5353

54-
for _ in 0 ... size {
54+
for _ in 0 ..< size {
5555
storage.append(ReservoirCell(clock: clock))
5656
}
5757
}

Sources/OpenTelemetrySdk/Metrics/Stable/Exemplar/ReservoirCell.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,19 @@ public class ReservoirCell {
3737
}
3838
}
3939

40-
func getAndResetLong(pointAttributes: [String: AttributeValue]) -> LongExemplarData {
40+
func getAndResetLong(pointAttributes: [String: AttributeValue]) -> LongExemplarData? {
41+
if attributes.isEmpty {
42+
return nil
43+
}
4144
let result = LongExemplarData(value: longValue, epochNanos: recordTime, filteredAttributes: filtered(attributes, pointAttributes), spanContext: spanContext)
4245
reset()
4346
return result
4447
}
4548

46-
func getAndResetDouble(pointAttributes: [String: AttributeValue]) -> DoubleExemplarData {
49+
func getAndResetDouble(pointAttributes: [String: AttributeValue]) -> DoubleExemplarData? {
50+
if attributes.isEmpty {
51+
return nil
52+
}
4753
let result = DoubleExemplarData(value: doubleValue, epochNanos: recordTime, filteredAttributes: filtered(attributes, pointAttributes), spanContext: spanContext)
4854
reset()
4955
return result

Tests/OpenTelemetrySdkTests/Metrics/StableMetrics/Exemplar/ExemplarReservoirTests.swift

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ class FixedSizedExemplarReservoirTests: XCTestCase {
3232

3333
override func setUp() {
3434
super.setUp()
35-
reservoir = FixedSizedExemplarReservoir(clock: clock, size: 3, reservoirCellSelector: selector, mapAndResetCell: { _, _ in nil })
35+
reservoir = FixedSizedExemplarReservoir(clock: clock, size: 4, reservoirCellSelector: selector, mapAndResetCell: { cell,attributes in cell.getAndResetDouble(pointAttributes: attributes)
36+
})
3637
}
3738

3839
func testOfferLongMeasurement() {
@@ -59,15 +60,26 @@ class FixedSizedExemplarReservoirTests: XCTestCase {
5960
XCTAssertTrue(reservoir.storage.contains { $0.doubleValue == 4.4 })
6061
}
6162

63+
64+
func testPartiallyFullReservoir(){
65+
reservoir.offerDoubleMeasurement(value: 1.1, attributes: attributes)
66+
let result = reservoir.collectAndReset(attribute: attributes)
67+
XCTAssertEqual(result.count, 1)
68+
XCTAssertTrue(result.contains(where: { exemplarData in
69+
(exemplarData as! DoubleExemplarData).value == 1.1
70+
}))
71+
XCTAssertFalse(reservoir.storage.contains { $0.doubleValue == 1.1 })
72+
}
73+
6274
func testCollectAndReset() {
6375
let clock = TestClock()
64-
let reservoirSize = 5
76+
let reservoirSize = 6
6577
let reservoirCellSelector = ReservoirCellSelectorMock()
6678

6779
// Create the reservoir
6880
let reservoir = FixedSizedExemplarReservoir(clock: clock, size: reservoirSize, reservoirCellSelector: reservoirCellSelector, mapAndResetCell: { cell, attributes in
6981
let exemplar = cell.getAndResetLong(pointAttributes: attributes)
70-
return exemplar.value > 0 ? exemplar : nil
82+
return exemplar?.value ?? 0 > 0 ? exemplar : nil
7183
})
7284

7385
// Offer measurements

Tests/OpenTelemetrySdkTests/Metrics/StableMetrics/Exemplar/ReservoirCellTests.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ class ReservoirCellTests: XCTestCase {
4141
reservoirCell.recordLongValue(value: 10, attributes: attributes)
4242

4343
let result = reservoirCell.getAndResetLong(pointAttributes: pointAttributes)
44-
XCTAssertEqual(result.value, 10)
45-
XCTAssertEqual(result.epochNanos, mockClock.nanoTime)
46-
XCTAssertEqual(result.filteredAttributes, attributes)
47-
XCTAssertEqual(result.spanContext, nil)
44+
XCTAssertEqual(result?.value, 10)
45+
XCTAssertEqual(result?.epochNanos, mockClock.nanoTime)
46+
XCTAssertEqual(result?.filteredAttributes, attributes)
47+
XCTAssertEqual(result?.spanContext, nil)
4848

4949
XCTAssertEqual(reservoirCell.attributes, [:])
5050
XCTAssertEqual(reservoirCell.longValue, 0)
@@ -58,10 +58,10 @@ class ReservoirCellTests: XCTestCase {
5858
reservoirCell.recordDoubleValue(value: 3.14, attributes: attributes)
5959

6060
let result = reservoirCell.getAndResetDouble(pointAttributes: pointAttributes)
61-
XCTAssertEqual(result.value, 3.14)
62-
XCTAssertEqual(result.epochNanos, mockClock.nanoTime)
63-
XCTAssertEqual(result.filteredAttributes, attributes)
64-
XCTAssertEqual(result.spanContext, nil)
61+
XCTAssertEqual(result?.value, 3.14)
62+
XCTAssertEqual(result?.epochNanos, mockClock.nanoTime)
63+
XCTAssertEqual(result?.filteredAttributes, attributes)
64+
XCTAssertEqual(result?.spanContext, nil)
6565

6666
XCTAssertEqual(reservoirCell.attributes, [:])
6767
XCTAssertEqual(reservoirCell.doubleValue, 0)

0 commit comments

Comments
 (0)