Skip to content

Commit 4dba546

Browse files
Firehedtomerd
authored andcommitted
Fix conversion factor in timer metrics (#8)
* Fix conversion factor in timer * Add tests for timers with various conversion factors
1 parent 04919f4 commit 4dba546

File tree

4 files changed

+93
-6
lines changed

4 files changed

+93
-6
lines changed

Sources/StatsdClient/StatsdClient.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ private final class StatsdTimer: TimerHandler, Equatable {
226226
// https://github.com/b/statsd_spec#timers
227227
// A timer is a measure of the number of milliseconds elapsed between a start and end time, for example the time to complete rendering of a web page for a user.
228228
// Valid timer values are in the range [0, 2^64^).
229-
let value = Swift.max(0, duration / 1000)
229+
let value = Swift.max(0.0, Double(duration) / 1_000_000.0)
230230
_ = self.client.emit(Metric(name: self.id, value: value, type: .timer))
231231
}
232232

Tests/StatsdClientTests/StatsdClientTests+XCTest.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ extension StatsdClientTests {
2727
return [
2828
("testCounter", testCounter),
2929
("testCounterOverflow", testCounterOverflow),
30-
("testTimer", testTimer),
30+
("testTimerNanoseconds", testTimerNanoseconds),
31+
("testTimerMicroseconds", testTimerMicroseconds),
32+
("testTimerMilliseconds", testTimerMilliseconds),
33+
("testTimerSeconds", testTimerSeconds),
3134
("testGaugeInteger", testGaugeInteger),
3235
("testGaugeDouble", testGaugeDouble),
3336
("testRecorderInteger", testRecorderInteger),

Tests/StatsdClientTests/StatsdClientTests.swift

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ class StatsdClientTests: XCTestCase {
104104
try! server.shutdown()
105105
}
106106

107-
func testTimer() {
107+
func testTimerNanoseconds() {
108108
let id = NSUUID().uuidString
109-
let value = Int64.random(in: 1000 ... 1_000_000)
109+
let value = 1_234_567
110110

111111
let server = TestServer(host: host, port: port)
112112
try! server.connect().wait()
@@ -115,7 +115,7 @@ class StatsdClientTests: XCTestCase {
115115
group.enter()
116116
server.onData { data in
117117
defer { group.leave() }
118-
XCTAssertEqual(data, "\(id):\(value / 1000)|ms", "expected entries to match")
118+
XCTAssertEqual(data, "\(id):1.234567|ms", "expected entries to match")
119119
}
120120

121121
let timer = Timer(label: id)
@@ -131,6 +131,87 @@ class StatsdClientTests: XCTestCase {
131131
try! server.shutdown()
132132
}
133133

134+
func testTimerMicroseconds() {
135+
let id = NSUUID().uuidString
136+
let value = 1234
137+
138+
let server = TestServer(host: host, port: port)
139+
try! server.connect().wait()
140+
141+
let group = DispatchGroup()
142+
group.enter()
143+
server.onData { data in
144+
defer { group.leave() }
145+
XCTAssertEqual(data, "\(id):1.234|ms", "expected entries to match")
146+
}
147+
148+
let timer = Timer(label: id)
149+
timer.recordMicroseconds(value)
150+
151+
switch group.wait(timeout: DispatchTime.now() + .seconds(1)) {
152+
case .timedOut:
153+
XCTFail("timeout")
154+
case .success:
155+
break
156+
}
157+
158+
try! server.shutdown()
159+
}
160+
161+
func testTimerMilliseconds() {
162+
let id = NSUUID().uuidString
163+
let value = 1.234
164+
165+
let server = TestServer(host: host, port: port)
166+
try! server.connect().wait()
167+
168+
let group = DispatchGroup()
169+
group.enter()
170+
server.onData { data in
171+
defer { group.leave() }
172+
XCTAssertEqual(data, "\(id):1.234|ms", "expected entries to match")
173+
}
174+
175+
let timer = Timer(label: id)
176+
timer.recordMilliseconds(value)
177+
178+
switch group.wait(timeout: DispatchTime.now() + .seconds(1)) {
179+
case .timedOut:
180+
XCTFail("timeout")
181+
case .success:
182+
break
183+
}
184+
185+
try! server.shutdown()
186+
}
187+
188+
func testTimerSeconds() {
189+
let id = NSUUID().uuidString
190+
let value = 1.234
191+
192+
let server = TestServer(host: host, port: port)
193+
try! server.connect().wait()
194+
195+
let group = DispatchGroup()
196+
group.enter()
197+
server.onData { data in
198+
defer { group.leave() }
199+
XCTAssertEqual(data, "\(id):1234|ms", "expected entries to match")
200+
}
201+
202+
let timer = Timer(label: id)
203+
timer.recordSeconds(value)
204+
205+
switch group.wait(timeout: DispatchTime.now() + .seconds(1)) {
206+
case .timedOut:
207+
XCTFail("timeout")
208+
case .success:
209+
break
210+
}
211+
212+
try! server.shutdown()
213+
}
214+
134215
func testGaugeInteger() {
135216
let id = NSUUID().uuidString
136217
let value = Int64.random(in: 0 ... 1000)

Tests/StatsdClientTests/XCTestManifests.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ extension StatsdClientTests {
2727
("testGaugeInteger", testGaugeInteger),
2828
("testRecorderDouble", testRecorderDouble),
2929
("testRecorderInteger", testRecorderInteger),
30-
("testTimer", testTimer),
30+
("testTimerMicroseconds", testTimerMicroseconds),
31+
("testTimerMilliseconds", testTimerMilliseconds),
32+
("testTimerNanoseconds", testTimerNanoseconds),
33+
("testTimerSeconds", testTimerSeconds),
3134
]
3235
}
3336

0 commit comments

Comments
 (0)