@worker-manager/metrics 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -0
- package/dist/HistoryAdmin.d.ts +134 -0
- package/dist/HistoryAdmin.js +345 -0
- package/dist/HistoryAdmin.js.map +1 -0
- package/dist/HistoryStore.d.ts +37 -0
- package/dist/HistoryStore.js +140 -0
- package/dist/HistoryStore.js.map +1 -0
- package/dist/LatencySampler.d.ts +88 -0
- package/dist/LatencySampler.js +285 -0
- package/dist/LatencySampler.js.map +1 -0
- package/dist/LatencyStore.d.ts +21 -0
- package/dist/LatencyStore.js +218 -0
- package/dist/LatencyStore.js.map +1 -0
- package/dist/MetricsRecorder.d.ts +92 -0
- package/dist/MetricsRecorder.js +148 -0
- package/dist/MetricsRecorder.js.map +1 -0
- package/dist/RedisMetricsHistoryProvider.d.ts +28 -0
- package/dist/RedisMetricsHistoryProvider.js +147 -0
- package/dist/RedisMetricsHistoryProvider.js.map +1 -0
- package/dist/connection.d.ts +10 -0
- package/dist/connection.js +26 -0
- package/dist/connection.js.map +1 -0
- package/dist/dataMapping.d.ts +13 -0
- package/dist/dataMapping.js +31 -0
- package/dist/dataMapping.js.map +1 -0
- package/dist/histogram.d.ts +27 -0
- package/dist/histogram.js +101 -0
- package/dist/histogram.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/keys.d.ts +21 -0
- package/dist/keys.js +76 -0
- package/dist/keys.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisMetricsHistoryProvider.js","sourceRoot":"","sources":["../src/RedisMetricsHistoryProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Redis, type Cluster, type RedisOptions } from 'ioredis';
|
|
2
|
+
export type MetricsClient = Redis | Cluster;
|
|
3
|
+
export type MetricsConnection = MetricsClient | RedisOptions;
|
|
4
|
+
export declare function isClient(connection: MetricsConnection): connection is MetricsClient;
|
|
5
|
+
export declare function isCluster(connection: MetricsConnection): connection is Cluster;
|
|
6
|
+
export declare function scanTargets(client: MetricsClient): MetricsClient[];
|
|
7
|
+
export declare function resolveClient(connection: MetricsConnection): {
|
|
8
|
+
client: MetricsClient;
|
|
9
|
+
owned: boolean;
|
|
10
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isClient = isClient;
|
|
4
|
+
exports.isCluster = isCluster;
|
|
5
|
+
exports.scanTargets = scanTargets;
|
|
6
|
+
exports.resolveClient = resolveClient;
|
|
7
|
+
const ioredis_1 = require("ioredis");
|
|
8
|
+
function isClient(connection) {
|
|
9
|
+
return typeof (connection === null || connection === void 0 ? void 0 : connection.hgetall) === 'function';
|
|
10
|
+
}
|
|
11
|
+
function isCluster(connection) {
|
|
12
|
+
return typeof (connection === null || connection === void 0 ? void 0 : connection.nodes) === 'function';
|
|
13
|
+
}
|
|
14
|
+
function scanTargets(client) {
|
|
15
|
+
return isCluster(client) ? client.nodes('master') : [client];
|
|
16
|
+
}
|
|
17
|
+
function resolveClient(connection) {
|
|
18
|
+
if (isClient(connection)) {
|
|
19
|
+
return { client: connection, owned: false };
|
|
20
|
+
}
|
|
21
|
+
// Default to RESP2 (ioredis v6 enables RESP3 by default). Keeps exact v5 wire parity and
|
|
22
|
+
// support for Redis < 6.0, whose `HELLO 3` handshake fails. Spread order lets an explicit
|
|
23
|
+
// caller `protocol` win. Only on the options path -- an injected client's protocol is its own.
|
|
24
|
+
return { client: new ioredis_1.Redis({ protocol: 2, ...connection }), owned: true };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":";;AAKA,4BAEC;AAED,8BAEC;AAED,kCAEC;AAED,sCAWC;AA5BD,qCAAiE;AAKjE,SAAgB,QAAQ,CAAC,UAA6B;IACpD,OAAO,OAAO,CAAC,UAA6B,aAA7B,UAAU,uBAAV,UAAU,CAAqB,OAAO,CAAA,KAAK,UAAU,CAAC;AACvE,CAAC;AAED,SAAgB,SAAS,CAAC,UAA6B;IACrD,OAAO,OAAO,CAAC,UAA+B,aAA/B,UAAU,uBAAV,UAAU,CAAuB,KAAK,CAAA,KAAK,UAAU,CAAC;AACvE,CAAC;AAED,SAAgB,WAAW,CAAC,MAAqB;IAC/C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,aAAa,CAAC,UAA6B;IAIzD,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IACD,yFAAyF;IACzF,0FAA0F;IAC1F,+FAA+F;IAC/F,OAAO,EAAE,MAAM,EAAE,IAAI,eAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { QueueMetrics } from '@worker-manager/api/typings/app';
|
|
2
|
+
export interface MinutePoint {
|
|
3
|
+
/** Absolute minute index: Math.floor(timestampMs / 60000). */
|
|
4
|
+
minute: number;
|
|
5
|
+
value: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Maps BullMQ's getMetrics() data (newest-first) to (minute, value) points.
|
|
9
|
+
* data[i] -> minute index floor(prevTS/60000) - 1 - i. The in-progress current
|
|
10
|
+
* minute is never present in data, so every point returned here is immutable.
|
|
11
|
+
* BullMQ's PostgreSQL backend reports prevTS as 0, which leaves the points undatable.
|
|
12
|
+
*/
|
|
13
|
+
export declare function metricsToMinutePoints(metrics: QueueMetrics | null | undefined): MinutePoint[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.metricsToMinutePoints = metricsToMinutePoints;
|
|
4
|
+
const MS_PER_MINUTE = 60000;
|
|
5
|
+
/**
|
|
6
|
+
* Maps BullMQ's getMetrics() data (newest-first) to (minute, value) points.
|
|
7
|
+
* data[i] -> minute index floor(prevTS/60000) - 1 - i. The in-progress current
|
|
8
|
+
* minute is never present in data, so every point returned here is immutable.
|
|
9
|
+
* BullMQ's PostgreSQL backend reports prevTS as 0, which leaves the points undatable.
|
|
10
|
+
*/
|
|
11
|
+
function metricsToMinutePoints(metrics) {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
if (!metrics || !metrics.data || metrics.data.length === 0) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const prevTS = (_b = (_a = metrics.meta) === null || _a === void 0 ? void 0 : _a.prevTS) !== null && _b !== void 0 ? _b : 0;
|
|
17
|
+
if (prevTS <= 0) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
const newestMinute = Math.floor(prevTS / MS_PER_MINUTE) - 1;
|
|
21
|
+
const points = [];
|
|
22
|
+
for (let i = 0; i < metrics.data.length; i++) {
|
|
23
|
+
const minute = newestMinute - i;
|
|
24
|
+
if (minute < 0) {
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
points.push({ minute, value: Number(metrics.data[i]) || 0 });
|
|
28
|
+
}
|
|
29
|
+
return points;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=dataMapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataMapping.js","sourceRoot":"","sources":["../src/dataMapping.ts"],"names":[],"mappings":";;AAgBA,sDAmBC;AA3BD,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,OAAwC;;IAC5E,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,MAAM,mCAAI,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed bucket boundaries in milliseconds, roughly 2-3x steps. Fixed rather than
|
|
3
|
+
* configurable because two ranges holding different layouts cannot be merged into one
|
|
4
|
+
* percentile without layout versioning, and the merge is what makes multi-day queries work.
|
|
5
|
+
*
|
|
6
|
+
* The tail past 10 minutes exists for wait time, where a stalled queue genuinely sits for
|
|
7
|
+
* hours. Without it p99 wait collapses to "over 10 minutes" exactly when it needs to be
|
|
8
|
+
* actionable.
|
|
9
|
+
*/
|
|
10
|
+
export declare const BUCKET_BOUNDS: number[];
|
|
11
|
+
/** One bucket per bound, plus a final overflow bucket for anything past the last bound. */
|
|
12
|
+
export declare const BUCKET_COUNT: number;
|
|
13
|
+
export declare function bucketIndex(ms: number): number;
|
|
14
|
+
export declare function emptyVector(): number[];
|
|
15
|
+
export declare function packVector(vector: number[]): string;
|
|
16
|
+
export declare function unpackVector(raw: string | null): number[];
|
|
17
|
+
export declare function mergeVectors(a: number[], b: number[]): number[];
|
|
18
|
+
export declare function vectorTotal(vector: number[]): number;
|
|
19
|
+
/**
|
|
20
|
+
* Prometheus-style histogram_quantile: find the bucket holding the rank, then interpolate
|
|
21
|
+
* linearly across that bucket's span. The result is an estimate bounded by bucket width,
|
|
22
|
+
* never more precise than the layout allows.
|
|
23
|
+
*
|
|
24
|
+
* Samples in the overflow bucket have no upper bound to interpolate towards, so they report
|
|
25
|
+
* the last finite bound rather than inventing a ceiling.
|
|
26
|
+
*/
|
|
27
|
+
export declare function quantile(vector: number[], p: number): number;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUCKET_COUNT = exports.BUCKET_BOUNDS = void 0;
|
|
4
|
+
exports.bucketIndex = bucketIndex;
|
|
5
|
+
exports.emptyVector = emptyVector;
|
|
6
|
+
exports.packVector = packVector;
|
|
7
|
+
exports.unpackVector = unpackVector;
|
|
8
|
+
exports.mergeVectors = mergeVectors;
|
|
9
|
+
exports.vectorTotal = vectorTotal;
|
|
10
|
+
exports.quantile = quantile;
|
|
11
|
+
/**
|
|
12
|
+
* Fixed bucket boundaries in milliseconds, roughly 2-3x steps. Fixed rather than
|
|
13
|
+
* configurable because two ranges holding different layouts cannot be merged into one
|
|
14
|
+
* percentile without layout versioning, and the merge is what makes multi-day queries work.
|
|
15
|
+
*
|
|
16
|
+
* The tail past 10 minutes exists for wait time, where a stalled queue genuinely sits for
|
|
17
|
+
* hours. Without it p99 wait collapses to "over 10 minutes" exactly when it needs to be
|
|
18
|
+
* actionable.
|
|
19
|
+
*/
|
|
20
|
+
exports.BUCKET_BOUNDS = [
|
|
21
|
+
10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000, 60000, 300000, 600000,
|
|
22
|
+
1800000, 3600000, 21600000,
|
|
23
|
+
];
|
|
24
|
+
/** One bucket per bound, plus a final overflow bucket for anything past the last bound. */
|
|
25
|
+
exports.BUCKET_COUNT = exports.BUCKET_BOUNDS.length + 1;
|
|
26
|
+
function bucketIndex(ms) {
|
|
27
|
+
for (let i = 0; i < exports.BUCKET_BOUNDS.length; i++) {
|
|
28
|
+
if (ms <= exports.BUCKET_BOUNDS[i]) {
|
|
29
|
+
return i;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return exports.BUCKET_COUNT - 1;
|
|
33
|
+
}
|
|
34
|
+
function emptyVector() {
|
|
35
|
+
return new Array(exports.BUCKET_COUNT).fill(0);
|
|
36
|
+
}
|
|
37
|
+
function packVector(vector) {
|
|
38
|
+
return vector.join(',');
|
|
39
|
+
}
|
|
40
|
+
function unpackVector(raw) {
|
|
41
|
+
const out = emptyVector();
|
|
42
|
+
if (!raw) {
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
const parts = raw.split(',');
|
|
46
|
+
for (let i = 0; i < exports.BUCKET_COUNT && i < parts.length; i++) {
|
|
47
|
+
out[i] = Number(parts[i]) || 0;
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
function mergeVectors(a, b) {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
const out = emptyVector();
|
|
54
|
+
for (let i = 0; i < exports.BUCKET_COUNT; i++) {
|
|
55
|
+
out[i] = ((_a = a[i]) !== null && _a !== void 0 ? _a : 0) + ((_b = b[i]) !== null && _b !== void 0 ? _b : 0);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
function vectorTotal(vector) {
|
|
60
|
+
var _a;
|
|
61
|
+
let total = 0;
|
|
62
|
+
for (let i = 0; i < exports.BUCKET_COUNT; i++) {
|
|
63
|
+
total += (_a = vector[i]) !== null && _a !== void 0 ? _a : 0;
|
|
64
|
+
}
|
|
65
|
+
return total;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Prometheus-style histogram_quantile: find the bucket holding the rank, then interpolate
|
|
69
|
+
* linearly across that bucket's span. The result is an estimate bounded by bucket width,
|
|
70
|
+
* never more precise than the layout allows.
|
|
71
|
+
*
|
|
72
|
+
* Samples in the overflow bucket have no upper bound to interpolate towards, so they report
|
|
73
|
+
* the last finite bound rather than inventing a ceiling.
|
|
74
|
+
*/
|
|
75
|
+
function quantile(vector, p) {
|
|
76
|
+
var _a;
|
|
77
|
+
const total = vectorTotal(vector);
|
|
78
|
+
if (total === 0) {
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
const target = (p / 100) * total;
|
|
82
|
+
let cumulative = 0;
|
|
83
|
+
for (let i = 0; i < exports.BUCKET_COUNT; i++) {
|
|
84
|
+
const count = (_a = vector[i]) !== null && _a !== void 0 ? _a : 0;
|
|
85
|
+
if (count === 0) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (cumulative + count >= target) {
|
|
89
|
+
if (i === exports.BUCKET_COUNT - 1) {
|
|
90
|
+
return exports.BUCKET_BOUNDS[exports.BUCKET_BOUNDS.length - 1];
|
|
91
|
+
}
|
|
92
|
+
const lower = i === 0 ? 0 : exports.BUCKET_BOUNDS[i - 1];
|
|
93
|
+
const upper = exports.BUCKET_BOUNDS[i];
|
|
94
|
+
const withinBucket = (target - cumulative) / count;
|
|
95
|
+
return Math.round(lower + (upper - lower) * withinBucket);
|
|
96
|
+
}
|
|
97
|
+
cumulative += count;
|
|
98
|
+
}
|
|
99
|
+
return exports.BUCKET_BOUNDS[exports.BUCKET_BOUNDS.length - 1];
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=histogram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.js","sourceRoot":"","sources":["../src/histogram.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { MetricsHistoryAdmin } from './HistoryAdmin';
|
|
2
|
+
export type { HistoryQueueStats, HistoryStats, MetricsHistoryAdminOptions, PurgeOptions, PurgeResult, } from './HistoryAdmin';
|
|
3
|
+
export { MetricsRecorder } from './MetricsRecorder';
|
|
4
|
+
export type { MetricsRecorderOptions } from './MetricsRecorder';
|
|
5
|
+
export type { Retention } from './HistoryStore';
|
|
6
|
+
export { RedisMetricsHistoryProvider } from './RedisMetricsHistoryProvider';
|
|
7
|
+
export type { RedisMetricsHistoryProviderOptions } from './RedisMetricsHistoryProvider';
|
|
8
|
+
export { LatencySampler } from './LatencySampler';
|
|
9
|
+
export type { LatencySamplerOptions } from './LatencySampler';
|
|
10
|
+
export { LatencyStore, QUEUE_AGE_METRIC } from './LatencyStore';
|
|
11
|
+
export type { LatencyMetric } from './LatencyStore';
|
|
12
|
+
export { BUCKET_BOUNDS, BUCKET_COUNT, quantile } from './histogram';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.quantile = exports.BUCKET_COUNT = exports.BUCKET_BOUNDS = exports.QUEUE_AGE_METRIC = exports.LatencyStore = exports.LatencySampler = exports.RedisMetricsHistoryProvider = exports.MetricsRecorder = exports.MetricsHistoryAdmin = void 0;
|
|
4
|
+
var HistoryAdmin_1 = require("./HistoryAdmin");
|
|
5
|
+
Object.defineProperty(exports, "MetricsHistoryAdmin", { enumerable: true, get: function () { return HistoryAdmin_1.MetricsHistoryAdmin; } });
|
|
6
|
+
var MetricsRecorder_1 = require("./MetricsRecorder");
|
|
7
|
+
Object.defineProperty(exports, "MetricsRecorder", { enumerable: true, get: function () { return MetricsRecorder_1.MetricsRecorder; } });
|
|
8
|
+
var RedisMetricsHistoryProvider_1 = require("./RedisMetricsHistoryProvider");
|
|
9
|
+
Object.defineProperty(exports, "RedisMetricsHistoryProvider", { enumerable: true, get: function () { return RedisMetricsHistoryProvider_1.RedisMetricsHistoryProvider; } });
|
|
10
|
+
var LatencySampler_1 = require("./LatencySampler");
|
|
11
|
+
Object.defineProperty(exports, "LatencySampler", { enumerable: true, get: function () { return LatencySampler_1.LatencySampler; } });
|
|
12
|
+
var LatencyStore_1 = require("./LatencyStore");
|
|
13
|
+
Object.defineProperty(exports, "LatencyStore", { enumerable: true, get: function () { return LatencyStore_1.LatencyStore; } });
|
|
14
|
+
Object.defineProperty(exports, "QUEUE_AGE_METRIC", { enumerable: true, get: function () { return LatencyStore_1.QUEUE_AGE_METRIC; } });
|
|
15
|
+
var histogram_1 = require("./histogram");
|
|
16
|
+
Object.defineProperty(exports, "BUCKET_BOUNDS", { enumerable: true, get: function () { return histogram_1.BUCKET_BOUNDS; } });
|
|
17
|
+
Object.defineProperty(exports, "BUCKET_COUNT", { enumerable: true, get: function () { return histogram_1.BUCKET_COUNT; } });
|
|
18
|
+
Object.defineProperty(exports, "quantile", { enumerable: true, get: function () { return histogram_1.quantile; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAAqD;AAA5C,mHAAA,mBAAmB,OAAA;AAQ5B,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AAGxB,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AAEpC,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AAEvB,+CAAgE;AAAvD,4GAAA,YAAY,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAEvC,yCAAoE;AAA3D,0GAAA,aAAa,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,qGAAA,QAAQ,OAAA"}
|
package/dist/keys.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const DEFAULT_NAMESPACE = "bull-board:metrics";
|
|
2
|
+
export declare const GLOBAL_QUEUE = "__global__";
|
|
3
|
+
/** Marks the hourly rollup key so it can't be mistaken for a minute-level day hash. */
|
|
4
|
+
export declare const HOUR_TIER = "hour";
|
|
5
|
+
export declare function minuteToDay(minute: number): string;
|
|
6
|
+
/** Absolute hour index, the hourly counterpart of the absolute minute index. */
|
|
7
|
+
export declare function minuteToHour(minute: number): number;
|
|
8
|
+
export declare function shiftDay(day: string, offsetDays: number): string;
|
|
9
|
+
export declare function dayToStartMs(day: string): number;
|
|
10
|
+
export declare function dayRange(fromMs: number, toMs: number): string[];
|
|
11
|
+
export declare function resolveNamespace(prefix: string | undefined, clustered: boolean): string;
|
|
12
|
+
export interface MetricsKeys {
|
|
13
|
+
namespace: string;
|
|
14
|
+
day(queue: string, metric: string, day: string): string;
|
|
15
|
+
hour(queue: string, metric: string, day: string): string;
|
|
16
|
+
totals(queue: string, metric: string): string;
|
|
17
|
+
lease(queue: string): string;
|
|
18
|
+
watermark(queue: string): string;
|
|
19
|
+
scanPattern: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function metricsKeys(namespace: string): MetricsKeys;
|
package/dist/keys.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HOUR_TIER = exports.GLOBAL_QUEUE = exports.DEFAULT_NAMESPACE = void 0;
|
|
4
|
+
exports.minuteToDay = minuteToDay;
|
|
5
|
+
exports.minuteToHour = minuteToHour;
|
|
6
|
+
exports.shiftDay = shiftDay;
|
|
7
|
+
exports.dayToStartMs = dayToStartMs;
|
|
8
|
+
exports.dayRange = dayRange;
|
|
9
|
+
exports.resolveNamespace = resolveNamespace;
|
|
10
|
+
exports.metricsKeys = metricsKeys;
|
|
11
|
+
exports.DEFAULT_NAMESPACE = 'bull-board:metrics';
|
|
12
|
+
exports.GLOBAL_QUEUE = '__global__';
|
|
13
|
+
/** Marks the hourly rollup key so it can't be mistaken for a minute-level day hash. */
|
|
14
|
+
exports.HOUR_TIER = 'hour';
|
|
15
|
+
const MS_PER_MINUTE = 60000;
|
|
16
|
+
const MS_PER_DAY = 86400000;
|
|
17
|
+
const MINUTES_PER_HOUR = 60;
|
|
18
|
+
function pad(n) {
|
|
19
|
+
return n < 10 ? `0${n}` : String(n);
|
|
20
|
+
}
|
|
21
|
+
function msToDay(ms) {
|
|
22
|
+
const d = new Date(ms);
|
|
23
|
+
return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;
|
|
24
|
+
}
|
|
25
|
+
function minuteToDay(minute) {
|
|
26
|
+
return msToDay(minute * MS_PER_MINUTE);
|
|
27
|
+
}
|
|
28
|
+
/** Absolute hour index, the hourly counterpart of the absolute minute index. */
|
|
29
|
+
function minuteToHour(minute) {
|
|
30
|
+
return Math.floor(minute / MINUTES_PER_HOUR);
|
|
31
|
+
}
|
|
32
|
+
function shiftDay(day, offsetDays) {
|
|
33
|
+
return msToDay(dayToStartMs(day) + offsetDays * MS_PER_DAY);
|
|
34
|
+
}
|
|
35
|
+
function dayToStartMs(day) {
|
|
36
|
+
const [y, m, d] = day.split('-').map(Number);
|
|
37
|
+
return Date.UTC(y, m - 1, d);
|
|
38
|
+
}
|
|
39
|
+
function dayRange(fromMs, toMs) {
|
|
40
|
+
const days = [];
|
|
41
|
+
let cursor = Date.UTC(new Date(fromMs).getUTCFullYear(), new Date(fromMs).getUTCMonth(), new Date(fromMs).getUTCDate());
|
|
42
|
+
const end = toMs;
|
|
43
|
+
while (cursor <= end) {
|
|
44
|
+
days.push(msToDay(cursor));
|
|
45
|
+
cursor += MS_PER_DAY;
|
|
46
|
+
}
|
|
47
|
+
return days;
|
|
48
|
+
}
|
|
49
|
+
function hasHashTag(value) {
|
|
50
|
+
const open = value.indexOf('{');
|
|
51
|
+
return open !== -1 && value.indexOf('}', open + 1) > open + 1;
|
|
52
|
+
}
|
|
53
|
+
function trimTrailingColons(value) {
|
|
54
|
+
let end = value.length;
|
|
55
|
+
while (end > 0 && value[end - 1] === ':') {
|
|
56
|
+
end -= 1;
|
|
57
|
+
}
|
|
58
|
+
return value.slice(0, end);
|
|
59
|
+
}
|
|
60
|
+
// The braces are a Redis hash tag: one EVAL writes queue and `__global__` keys together.
|
|
61
|
+
function resolveNamespace(prefix, clustered) {
|
|
62
|
+
const base = trimTrailingColons(prefix !== null && prefix !== void 0 ? prefix : exports.DEFAULT_NAMESPACE) || exports.DEFAULT_NAMESPACE;
|
|
63
|
+
return clustered && !hasHashTag(base) ? `{${base}}` : base;
|
|
64
|
+
}
|
|
65
|
+
function metricsKeys(namespace) {
|
|
66
|
+
return {
|
|
67
|
+
namespace,
|
|
68
|
+
day: (queue, metric, day) => `${namespace}:${queue}:${metric}:${day}`,
|
|
69
|
+
hour: (queue, metric, day) => `${namespace}:${queue}:${metric}:${exports.HOUR_TIER}:${day}`,
|
|
70
|
+
totals: (queue, metric) => `${namespace}:${queue}:${metric}:totals`,
|
|
71
|
+
lease: (queue) => `${namespace}:${queue}:latency:lease`,
|
|
72
|
+
watermark: (queue) => `${namespace}:${queue}:latency:watermark`,
|
|
73
|
+
scanPattern: `${namespace}:*`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=keys.js.map
|
package/dist/keys.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@worker-manager/metrics",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Opt-in long-retention historical job metrics recorder and provider for Worker Manager.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"bull",
|
|
7
|
+
"bullmq",
|
|
8
|
+
"dashboard",
|
|
9
|
+
"history",
|
|
10
|
+
"metrics",
|
|
11
|
+
"queue",
|
|
12
|
+
"redis"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"author": "naldomadeira",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/naldomadeira/worker-manager.git",
|
|
19
|
+
"directory": "packages/metrics"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"main": "dist/index.js",
|
|
25
|
+
"types": "dist/index.d.ts",
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "yarn clean && tsc",
|
|
31
|
+
"clean": "rm -rf dist",
|
|
32
|
+
"test": "jest"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@worker-manager/api": "1.0.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/jest": "^30.0.0",
|
|
39
|
+
"@types/node": "^22.20.1",
|
|
40
|
+
"bullmq": "^5.81.3",
|
|
41
|
+
"bullmq-v6": "npm:bullmq@^6",
|
|
42
|
+
"ioredis": "^6.0.0",
|
|
43
|
+
"jest": "^30.4.2",
|
|
44
|
+
"ts-jest": "^29.4.12",
|
|
45
|
+
"typescript": "^5.9.3"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"ioredis": "^5.0.0 || ^6.0.0"
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=20"
|
|
52
|
+
}
|
|
53
|
+
}
|