@rudderjs/horizon 4.1.0 → 6.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 +3 -2
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +11 -5
- package/dist/api/routes.js.map +1 -1
- package/dist/collectors/job.d.ts +15 -3
- package/dist/collectors/job.d.ts.map +1 -1
- package/dist/collectors/job.js +68 -69
- package/dist/collectors/job.js.map +1 -1
- package/dist/collectors/worker.d.ts.map +1 -1
- package/dist/collectors/worker.js +6 -0
- package/dist/collectors/worker.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -6
- package/dist/index.js.map +1 -1
- package/dist/routes.js +3 -3
- package/dist/routes.js.map +1 -1
- package/dist/storage.d.ts +47 -7
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +391 -25
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +23 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/views/vanilla/_jobTable.d.ts.map +1 -1
- package/dist/views/vanilla/_jobTable.js +9 -7
- package/dist/views/vanilla/_jobTable.js.map +1 -1
- package/package.json +6 -4
package/dist/types.d.ts
CHANGED
|
@@ -35,14 +35,18 @@ export interface WorkerInfo {
|
|
|
35
35
|
export interface HorizonStorage {
|
|
36
36
|
/** Record a job event (dispatch, start, complete, fail) */
|
|
37
37
|
recordJob(job: HorizonJob): void | Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Update an existing job record. Records are keyed by `(queue, id)` because
|
|
40
|
+
* BullMQ assigns ids per-queue starting at 1 — `default:1` and `priority:1`
|
|
41
|
+
* collide on id alone.
|
|
42
|
+
*/
|
|
43
|
+
updateJob(queue: string, id: string, updates: Partial<HorizonJob>): void | Promise<void>;
|
|
40
44
|
/** List recent jobs */
|
|
41
45
|
recentJobs(options?: JobListOptions): HorizonJob[] | Promise<HorizonJob[]>;
|
|
42
46
|
/** List failed jobs */
|
|
43
47
|
failedJobs(options?: JobListOptions): HorizonJob[] | Promise<HorizonJob[]>;
|
|
44
|
-
/** Get a single job by
|
|
45
|
-
findJob(id: string): HorizonJob | null | Promise<HorizonJob | null>;
|
|
48
|
+
/** Get a single job by `(queue, id)` */
|
|
49
|
+
findJob(queue: string, id: string): HorizonJob | null | Promise<HorizonJob | null>;
|
|
46
50
|
/** Record a per-minute metric snapshot for a queue */
|
|
47
51
|
recordMetric(metric: QueueMetric): void | Promise<void>;
|
|
48
52
|
/** Get metric history for a queue */
|
|
@@ -53,8 +57,8 @@ export interface HorizonStorage {
|
|
|
53
57
|
recordWorker(worker: WorkerInfo): void | Promise<void>;
|
|
54
58
|
/** List all known workers */
|
|
55
59
|
workers(): WorkerInfo[] | Promise<WorkerInfo[]>;
|
|
56
|
-
/** Delete a
|
|
57
|
-
deleteJob(id: string): void | Promise<void>;
|
|
60
|
+
/** Delete a job record by `(queue, id)` */
|
|
61
|
+
deleteJob(queue: string, id: string): void | Promise<void>;
|
|
58
62
|
/** Delete all data older than date */
|
|
59
63
|
pruneOlderThan(date: Date): void | Promise<void>;
|
|
60
64
|
/** Count jobs by status */
|
|
@@ -67,11 +71,22 @@ export interface JobListOptions {
|
|
|
67
71
|
search?: string | undefined;
|
|
68
72
|
status?: JobStatus | undefined;
|
|
69
73
|
}
|
|
74
|
+
export interface HorizonRedisConfig {
|
|
75
|
+
/** Redis URL: redis://[:password@]host[:port][/db] */
|
|
76
|
+
url?: string | undefined;
|
|
77
|
+
host?: string | undefined;
|
|
78
|
+
port?: number | undefined;
|
|
79
|
+
password?: string | undefined;
|
|
80
|
+
/** Key prefix — default: 'rudderjs' */
|
|
81
|
+
prefix?: string | undefined;
|
|
82
|
+
}
|
|
70
83
|
export interface HorizonConfig {
|
|
71
84
|
enabled?: boolean | undefined;
|
|
72
85
|
path?: string | undefined;
|
|
73
|
-
storage?: 'memory' | 'sqlite' | undefined;
|
|
86
|
+
storage?: 'memory' | 'sqlite' | 'redis' | undefined;
|
|
74
87
|
sqlitePath?: string | undefined;
|
|
88
|
+
/** Redis connection used by `storage: 'redis'`. Reuses BullMQ field shape. */
|
|
89
|
+
redis?: HorizonRedisConfig | undefined;
|
|
75
90
|
maxJobs?: number | undefined;
|
|
76
91
|
pruneAfterHours?: number | undefined;
|
|
77
92
|
metricsIntervalMs?: number | undefined;
|
|
@@ -82,6 +97,7 @@ export declare const defaultConfig: {
|
|
|
82
97
|
path: string;
|
|
83
98
|
storage: "memory";
|
|
84
99
|
sqlitePath: string;
|
|
100
|
+
redis: HorizonRedisConfig;
|
|
85
101
|
maxJobs: number;
|
|
86
102
|
pruneAfterHours: number;
|
|
87
103
|
metricsIntervalMs: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEzE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAY,MAAM,CAAA;IACpB,IAAI,EAAU,MAAM,CAAA;IACpB,KAAK,EAAS,MAAM,CAAA;IACpB,MAAM,EAAQ,SAAS,CAAA;IACvB,OAAO,EAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,QAAQ,EAAM,MAAM,CAAA;IACpB,SAAS,EAAK,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,IAAI,CAAA;IAClB,SAAS,EAAK,IAAI,GAAG,IAAI,CAAA;IACzB,WAAW,EAAG,IAAI,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAM,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,EAAU,MAAM,EAAE,CAAA;CACvB;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAQ,MAAM,CAAA;IACnB,UAAU,EAAG,MAAM,CAAA;IACnB,QAAQ,EAAK,MAAM,CAAA;IACnB,OAAO,EAAM,MAAM,CAAA;IACnB,OAAO,EAAM,MAAM,CAAA;IACnB,MAAM,EAAO,MAAM,CAAA;IACnB,SAAS,EAAI,MAAM,CAAA;IACnB,MAAM,EAAO,MAAM,CAAA;CACpB;AAID,MAAM,WAAW,UAAU;IACzB,EAAE,EAAS,MAAM,CAAA;IACjB,KAAK,EAAM,MAAM,CAAA;IACjB,MAAM,EAAK,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;IACvC,OAAO,EAAI,MAAM,CAAA;IACjB,QAAQ,EAAG,MAAM,CAAA;IACjB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;CACvB;AAID,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8DAA8D;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAqH9D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAY,IAAI;IACvB,IAAI,EAAe,SAAS;IAC5B,OAAO,EAAY,QAAiB;IACpC,UAAU,EAAS,aAAa;IAChC,KAAK,EAAc,EAAwB;IAC3C,OAAO,EAAY,IAAI;IACvB,eAAe,EAAI,EAAE;IACrB,iBAAiB,EAAE,MAAM;IACzB,IAAI,EAAe,IAA6D;CACjF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_jobTable.d.ts","sourceRoot":"","sources":["../../../src/views/vanilla/_jobTable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,QAAQ,IAAI,MAAM,CA+CjC;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"_jobTable.d.ts","sourceRoot":"","sources":["../../../src/views/vanilla/_jobTable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,QAAQ,IAAI,MAAM,CA+CjC;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiCnD"}
|
|
@@ -21,7 +21,7 @@ export function jobTable() {
|
|
|
21
21
|
</tr>
|
|
22
22
|
</thead>
|
|
23
23
|
<tbody class="divide-y divide-gray-100">
|
|
24
|
-
<template x-for="job in jobs" :key="job.id">
|
|
24
|
+
<template x-for="job in jobs" :key="job.queue + ':' + job.id">
|
|
25
25
|
<tr class="hover:bg-gray-50">
|
|
26
26
|
<td class="px-4 py-3 font-mono text-xs" x-text="job.name"></td>
|
|
27
27
|
<td class="px-4 py-3" x-text="job.queue"></td>
|
|
@@ -33,9 +33,9 @@ export function jobTable() {
|
|
|
33
33
|
<td class="px-4 py-3 text-right" x-text="job.duration ? job.duration + 'ms' : '—'"></td>
|
|
34
34
|
<td class="px-4 py-3 text-right text-gray-400 text-xs" x-text="ago(job.dispatchedAt)"></td>
|
|
35
35
|
<td class="px-4 py-3 text-right">
|
|
36
|
-
<button x-show="job.status === 'failed'" @click="retry(job
|
|
36
|
+
<button x-show="job.status === 'failed'" @click="retry(job)"
|
|
37
37
|
class="text-xs text-teal-600 hover:text-teal-800 mr-2">Retry</button>
|
|
38
|
-
<button @click="remove(job
|
|
38
|
+
<button @click="remove(job)"
|
|
39
39
|
class="text-xs text-red-500 hover:text-red-700">Delete</button>
|
|
40
40
|
</td>
|
|
41
41
|
</tr>
|
|
@@ -67,12 +67,14 @@ export function jobScript(apiPrefix) {
|
|
|
67
67
|
this.jobs = data.data || []
|
|
68
68
|
this.meta = data.meta || { total: 0 }
|
|
69
69
|
},
|
|
70
|
-
async retry(
|
|
71
|
-
|
|
70
|
+
async retry(job) {
|
|
71
|
+
const path = encodeURIComponent(job.queue) + '/' + encodeURIComponent(job.id)
|
|
72
|
+
await fetch('${apiPrefix}/jobs/' + path + '/retry', { method: 'POST' })
|
|
72
73
|
this.load()
|
|
73
74
|
},
|
|
74
|
-
async remove(
|
|
75
|
-
|
|
75
|
+
async remove(job) {
|
|
76
|
+
const path = encodeURIComponent(job.queue) + '/' + encodeURIComponent(job.id)
|
|
77
|
+
await fetch('${apiPrefix}/jobs/' + path, { method: 'DELETE' })
|
|
76
78
|
this.load()
|
|
77
79
|
},
|
|
78
80
|
ago(dateStr) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_jobTable.js","sourceRoot":"","sources":["../../../src/views/vanilla/_jobTable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,QAAQ;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6CI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,OAAO;;;;;;;;wCAQ+B,SAAS
|
|
1
|
+
{"version":3,"file":"_jobTable.js","sourceRoot":"","sources":["../../../src/views/vanilla/_jobTable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,QAAQ;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6CI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,OAAO;;;;;;;;wCAQ+B,SAAS;;;;;;2BAMtB,SAAS;;;;;2BAKT,SAAS;;;;;;;;;;;;cAYtB,CAAA;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rudderjs/horizon",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"rudderjs": {
|
|
5
5
|
"provider": "HorizonProvider",
|
|
6
6
|
"stage": "monitoring"
|
|
@@ -26,19 +26,21 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@rudderjs/core": "^1.0.0",
|
|
29
|
-
"@rudderjs/
|
|
30
|
-
"@rudderjs/
|
|
29
|
+
"@rudderjs/queue": "^4.1.0",
|
|
30
|
+
"@rudderjs/contracts": "^1.1.0"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"@rudderjs/router": "^1.0.0",
|
|
34
34
|
"@rudderjs/middleware": "^1.0.0"
|
|
35
35
|
},
|
|
36
36
|
"optionalDependencies": {
|
|
37
|
-
"better-sqlite3": "^11.0.0"
|
|
37
|
+
"better-sqlite3": "^11.0.0",
|
|
38
|
+
"ioredis": "^5.3.0"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
41
|
"@types/node": "^20.0.0",
|
|
41
42
|
"@types/better-sqlite3": "^7.6.0",
|
|
43
|
+
"ioredis": "^5.3.0",
|
|
42
44
|
"typescript": "^5.4.0"
|
|
43
45
|
},
|
|
44
46
|
"author": "Suleiman Shahbari",
|