Skip to content

Commit b8b60f7

Browse files
committed
adjust percentile timer record method
Add the ability to pass process.hrtime() directly to the record method, because this is the simplest way to record latency durations. This keeps the usage similar to timers.
1 parent fba3bcd commit b8b60f7

File tree

3 files changed

+48
-5
lines changed

3 files changed

+48
-5
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nflx-spectator",
3-
"version": "3.0.2",
3+
"version": "3.0.3",
44
"license": "Apache-2.0",
55
"homepage": "https://github.com/Netflix/spectator-js",
66
"author": "Netflix Telemetry Engineering <[email protected]>",

src/meter/percentile_timer.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,28 @@ export class PercentileTimer extends Meter {
1717
super(id, writer, "T");
1818
}
1919

20-
record(seconds: number): Promise<void> {
21-
if (seconds >= 0) {
22-
const line = `${this._meter_type_symbol}:${this._id.spectatord_id}:${seconds}`
20+
/**
21+
* @param {number|number[]} seconds
22+
* Number of seconds, which may be fractional, or an array of two numbers [seconds, nanoseconds],
23+
* which is the return value from process.hrtime(), and serves as a convenient means of recording
24+
* latency durations.
25+
*
26+
* start = process.hrtime();
27+
* // do work
28+
* registry.pct_timer("eventLatency").record(process.hrtime(start));
29+
*
30+
*/
31+
record(seconds: number | number[]): Promise<void> {
32+
let elapsed: number;
33+
34+
if (seconds instanceof Array) {
35+
elapsed = seconds[0] + (seconds[1] / 1e9);
36+
} else {
37+
elapsed = seconds;
38+
}
39+
40+
if (elapsed >= 0) {
41+
const line = `${this._meter_type_symbol}:${this._id.spectatord_id}:${elapsed}`;
2342
return this._writer.write(line);
2443
} else {
2544
return new Promise((resolve: (value: void | PromiseLike<void>) => void): void => {

test/meter/percentile_timer.test.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {assert} from "chai";
2-
import {Id, MemoryWriter, PercentileTimer} from "../../src/index.js";
2+
import {Id, MemoryWriter, PercentileTimer, Timer} from "../../src/index.js";
33
import {describe, it} from "node:test";
44

55
describe("PercentileTimer Tests", (): void => {
@@ -28,4 +28,28 @@ describe("PercentileTimer Tests", (): void => {
2828
t.record(0);
2929
assert.equal("T:percentile_timer:0", writer.last_line());
3030
});
31+
32+
it("record latency from hrtime", (): void => {
33+
let nanos: number = 0;
34+
let round: number = 1;
35+
const f: NodeJS.HRTime = process.hrtime;
36+
Object.defineProperty(process, "hrtime", {
37+
get(): () => [number, number] {
38+
return (): [number, number] => {
39+
nanos += round * 1e6; // 1ms lag first time, 2ms second time, etc.
40+
++round;
41+
return [0, nanos];
42+
};
43+
}
44+
});
45+
46+
const start: [number, number] = process.hrtime();
47+
48+
const t = new PercentileTimer(tid, new MemoryWriter());
49+
const writer = t.writer() as MemoryWriter;
50+
t.record(process.hrtime(start)); // two calls to hrtime = 1ms + 2ms = 3ms
51+
assert.equal("T:percentile_timer:0.003", writer.last_line());
52+
53+
Object.defineProperty(process, "hrtime", f);
54+
});
3155
});

0 commit comments

Comments
 (0)