pipework 0.95.0 → 0.96.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/CHANGELOG.md +10 -0
- package/dist/data/migrate/internal-definitions.d.ts.map +1 -1
- package/dist/data/migrate/internal-definitions.js +2 -1
- package/dist/data/migrate/internal-definitions.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/infra/alerts/handle.d.ts +108 -7
- package/dist/infra/alerts/handle.d.ts.map +1 -1
- package/dist/infra/alerts/handle.js +291 -26
- package/dist/infra/alerts/handle.js.map +1 -1
- package/dist/infra/alerts/http.d.ts +19 -0
- package/dist/infra/alerts/http.d.ts.map +1 -0
- package/dist/infra/alerts/http.js +172 -0
- package/dist/infra/alerts/http.js.map +1 -0
- package/dist/infra/alerts/index.d.ts +4 -2
- package/dist/infra/alerts/index.d.ts.map +1 -1
- package/dist/infra/alerts/index.js +1 -0
- package/dist/infra/alerts/index.js.map +1 -1
- package/dist/infra/alerts/namespace.d.ts +3 -0
- package/dist/infra/alerts/namespace.d.ts.map +1 -1
- package/dist/infra/alerts/namespace.js +3 -0
- package/dist/infra/alerts/namespace.js.map +1 -1
- package/dist/infra/alerts/schema.d.ts +91 -5
- package/dist/infra/alerts/schema.d.ts.map +1 -1
- package/dist/infra/alerts/schema.js +29 -3
- package/dist/infra/alerts/schema.js.map +1 -1
- package/dist/infra/alerts/sinks.d.ts +37 -3
- package/dist/infra/alerts/sinks.d.ts.map +1 -1
- package/dist/infra/alerts/sinks.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,8 +5,17 @@ import { getContext } from '../../request/context/store.js';
|
|
|
5
5
|
import { getBaseLogger } from '../../core/logging/index.js';
|
|
6
6
|
import { __flowStep } from '../../trace/runtime/flow-step.js';
|
|
7
7
|
import { auditAlert } from './audit.js';
|
|
8
|
+
import { ALERT_SEVERITIES, ALERT_STATUSES } from './schema.js';
|
|
9
|
+
import { encodeCursor, decodeCursor } from '../../request/fixture/paginate.js';
|
|
8
10
|
import { createOutbox } from '../outbox/core.js';
|
|
9
|
-
const SEVERITIES = new Set(
|
|
11
|
+
const SEVERITIES = new Set(ALERT_SEVERITIES);
|
|
12
|
+
const STATUSES = new Set(ALERT_STATUSES);
|
|
13
|
+
const DEFAULT_RETENTION_MS = 30 * 24 * 3_600_000;
|
|
14
|
+
const RETENTION_BATCH = 10_000;
|
|
15
|
+
const DEFAULT_LIMIT = 50;
|
|
16
|
+
const MAX_LIMIT = 200;
|
|
17
|
+
/** A row's time as text, UTC to the microsecond; a JS Date holds only milliseconds. */
|
|
18
|
+
const exact = (column) => sql.raw(`to_char(${column} AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"')`);
|
|
10
19
|
function toAlert(row) {
|
|
11
20
|
const date = (v) => new Date(v);
|
|
12
21
|
const dateOrNull = (v) => (v === null || v === undefined ? null : date(v));
|
|
@@ -16,11 +25,22 @@ function toAlert(row) {
|
|
|
16
25
|
severity: row['severity'],
|
|
17
26
|
message: row['message'],
|
|
18
27
|
subject: (row['subject'] ?? null),
|
|
28
|
+
owner: (row['owner'] ?? null),
|
|
29
|
+
runbook: (row['runbook'] ?? null),
|
|
30
|
+
context: (row['context'] ?? null),
|
|
19
31
|
count: Number(row['count']),
|
|
32
|
+
reopenCount: Number(row['reopen_count']),
|
|
20
33
|
firstSeenAt: date(row['first_seen_at']),
|
|
21
34
|
lastSeenAt: date(row['last_seen_at']),
|
|
22
35
|
lastSentAt: dateOrNull(row['last_sent_at']),
|
|
36
|
+
acknowledgedAt: dateOrNull(row['acknowledged_at']),
|
|
37
|
+
acknowledgedBy: (row['acknowledged_by'] ?? null),
|
|
23
38
|
resolvedAt: dateOrNull(row['resolved_at']),
|
|
39
|
+
resolvedBy: (row['resolved_by'] ?? null),
|
|
40
|
+
resolveNote: (row['resolve_note'] ?? null),
|
|
41
|
+
resolvedRelease: (row['resolved_release'] ?? null),
|
|
42
|
+
reopenedAt: dateOrNull(row['reopened_at']),
|
|
43
|
+
issueUrl: (row['issue_url'] ?? null),
|
|
24
44
|
traceIds: (row['trace_ids'] ?? []),
|
|
25
45
|
};
|
|
26
46
|
}
|
|
@@ -38,6 +58,50 @@ function toDeliveryRow(row) {
|
|
|
38
58
|
lastError: (row['last_error'] ?? null),
|
|
39
59
|
};
|
|
40
60
|
}
|
|
61
|
+
function toOccurrence(row) {
|
|
62
|
+
return {
|
|
63
|
+
id: row['id'],
|
|
64
|
+
key: row['alert_key'],
|
|
65
|
+
at: new Date(row['at']),
|
|
66
|
+
severity: row['severity'],
|
|
67
|
+
message: row['message'],
|
|
68
|
+
context: (row['context'] ?? null),
|
|
69
|
+
traceId: (row['trace_id'] ?? null),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function checkLimit(fn, limit) {
|
|
73
|
+
if (limit === undefined)
|
|
74
|
+
return DEFAULT_LIMIT;
|
|
75
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > MAX_LIMIT) {
|
|
76
|
+
throw new Error(`[pipework] alerts.${fn}: limit must be a whole number from 1 to ${String(MAX_LIMIT)}, got ${String(limit)}.`);
|
|
77
|
+
}
|
|
78
|
+
return limit;
|
|
79
|
+
}
|
|
80
|
+
/** Reads `[time, tiebreak]` from a cursor this module encoded; anything else is refused by name. */
|
|
81
|
+
function readCursor(fn, cursor) {
|
|
82
|
+
const bad = () => new Error(`[pipework] alerts.${fn}: cursor is not one this handle returned. Pass the \`next\` value unchanged.`);
|
|
83
|
+
let parts;
|
|
84
|
+
try {
|
|
85
|
+
parts = decodeCursor(cursor);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
throw bad();
|
|
89
|
+
}
|
|
90
|
+
const [at, tie] = parts;
|
|
91
|
+
if (parts.length !== 2 || typeof at !== 'string' || typeof tie !== 'string' || Number.isNaN(new Date(at).getTime()))
|
|
92
|
+
throw bad();
|
|
93
|
+
return [at, tie];
|
|
94
|
+
}
|
|
95
|
+
function pickList(fn, name, value, allowed) {
|
|
96
|
+
if (value === undefined)
|
|
97
|
+
return null;
|
|
98
|
+
const list = typeof value === 'string' ? [value] : [...value];
|
|
99
|
+
for (const v of list) {
|
|
100
|
+
if (!allowed.has(v))
|
|
101
|
+
throw new Error(`[pipework] alerts.${fn}: ${name} must be one of ${[...allowed].join(', ')}, got "${String(v)}".`);
|
|
102
|
+
}
|
|
103
|
+
return list;
|
|
104
|
+
}
|
|
41
105
|
function pgTextArray(values) {
|
|
42
106
|
return `{${values.map(v => `"${v.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`).join(',')}}`;
|
|
43
107
|
}
|
|
@@ -51,6 +115,21 @@ export function createAlerts(config) {
|
|
|
51
115
|
sinks.set(s.name, s);
|
|
52
116
|
}
|
|
53
117
|
const sinkNames = pgTextArray([...sinks.keys()]);
|
|
118
|
+
const digestEveryMs = config.digest?.everyMs ?? null;
|
|
119
|
+
if (config.digest !== undefined) {
|
|
120
|
+
if (!Number.isInteger(config.digest.everyMs) || config.digest.everyMs < 1000) {
|
|
121
|
+
throw new Error(`[pipework] alerts.create: digest.everyMs must be a whole number of at least 1000, got ${String(config.digest.everyMs)}.`);
|
|
122
|
+
}
|
|
123
|
+
for (const v of config.digest.severities ?? []) {
|
|
124
|
+
if (v === 'error' || v === 'critical')
|
|
125
|
+
throw new Error(`[pipework] alerts.create: digest.severities cannot include "${v}"; errors and critical go one at a time.`);
|
|
126
|
+
if (!SEVERITIES.has(v))
|
|
127
|
+
throw new Error(`[pipework] alerts.create: digest.severities must be from info, warning, got "${String(v)}".`);
|
|
128
|
+
}
|
|
129
|
+
if (config.digest.severities?.length === 0)
|
|
130
|
+
throw new Error('[pipework] alerts.create: digest.severities needs at least one severity, or leave it out for warning.');
|
|
131
|
+
}
|
|
132
|
+
const digestSeverities = pgTextArray(config.digest === undefined ? [] : [...new Set(config.digest.severities ?? ['warning'])]);
|
|
54
133
|
const jobType = config.jobType ?? 'pipework.alerts';
|
|
55
134
|
const maxAttempts = config.maxAttempts ?? 10;
|
|
56
135
|
const backoffMs = config.backoffMs ?? 5000;
|
|
@@ -60,11 +139,16 @@ export function createAlerts(config) {
|
|
|
60
139
|
const database = config.database;
|
|
61
140
|
const log = getBaseLogger();
|
|
62
141
|
const db = () => pipeSystem(database);
|
|
142
|
+
const retentionMs = config.occurrenceRetentionMs ?? DEFAULT_RETENTION_MS;
|
|
143
|
+
const environmentOf = () => config.environment ?? getContext()?.instance.config.environment ?? 'unknown';
|
|
63
144
|
// The alert and its deliveries move in one statement, so a crash cannot leave one without the other.
|
|
64
|
-
const payloadSql = (kind) => sql `jsonb_build_object(
|
|
145
|
+
const payloadSql = (kind, environment) => sql `jsonb_build_object(
|
|
65
146
|
'kind', ${kind}, 'key', up.key, 'severity', up.severity, 'message', up.message, 'subject', up.subject,
|
|
66
|
-
'
|
|
67
|
-
'
|
|
147
|
+
'owner', up.owner, 'runbook', up.runbook, 'context', up.context,
|
|
148
|
+
'count', up.count, 'reopenCount', up.reopen_count, 'firstSeenAt', up.first_seen_at, 'lastSeenAt', up.last_seen_at,
|
|
149
|
+
'resolvedAt', up.resolved_at, 'acknowledgedAt', up.acknowledged_at, 'acknowledgedBy', up.acknowledged_by,
|
|
150
|
+
'resolvedBy', up.resolved_by, 'resolveNote', up.resolve_note, 'resolvedRelease', up.resolved_release,
|
|
151
|
+
'issueUrl', up.issue_url, 'environment', ${environment}::text, 'traceIds', to_jsonb(up.trace_ids))`;
|
|
68
152
|
async function enqueueJob() {
|
|
69
153
|
await config.queue.enqueue(db(), { type: jobType, payload: {}, continueFlow: true });
|
|
70
154
|
}
|
|
@@ -77,21 +161,31 @@ export function createAlerts(config) {
|
|
|
77
161
|
const traceId = getContext()?.trace?.id ?? null;
|
|
78
162
|
const traceArray = traceId === null ? '{}' : pgTextArray([traceId]);
|
|
79
163
|
const subject = options.subject === undefined ? null : JSON.stringify(options.subject);
|
|
164
|
+
const context = options.context === undefined ? null : JSON.stringify(options.context);
|
|
165
|
+
const environment = environmentOf();
|
|
166
|
+
const kindSql = sql `CASE WHEN up.inserted THEN 'raise' WHEN up.reopened THEN 'reopen' ELSE 'repeat' END`;
|
|
80
167
|
const rows = await db().execute(sql `
|
|
81
168
|
WITH up AS (
|
|
82
169
|
INSERT INTO pipework_alerts AS a
|
|
83
|
-
(key, status, severity, message, subject, count, first_seen_at, last_seen_at, last_sent_at,
|
|
170
|
+
(key, status, severity, message, subject, owner, runbook, context, count, first_seen_at, last_seen_at, last_sent_at,
|
|
84
171
|
trace_ids, resend_after_ms, resolve_after_quiet_ms, updated_at)
|
|
85
|
-
SELECT ${key}, 'open', ${options.severity}, ${options.message}, ${subject}::jsonb,
|
|
172
|
+
SELECT ${key}, 'open', ${options.severity}, ${options.message}, ${subject}::jsonb,
|
|
173
|
+
${options.owner ?? null}::text, ${options.runbook ?? null}::text, ${context}::jsonb, 1, c.ts, c.ts, c.ts,
|
|
86
174
|
${traceArray}::text[], ${options.resendAfterMs ?? null}::int, ${options.resolveAfterQuietMs ?? null}::int, c.ts
|
|
87
175
|
FROM (SELECT clock_timestamp() AS ts) c
|
|
88
176
|
ON CONFLICT (key) DO UPDATE SET
|
|
89
|
-
status = 'open',
|
|
177
|
+
status = CASE WHEN a.status = 'acknowledged' THEN 'acknowledged' ELSE 'open' END,
|
|
90
178
|
severity = EXCLUDED.severity,
|
|
91
179
|
message = EXCLUDED.message,
|
|
92
180
|
subject = EXCLUDED.subject,
|
|
93
|
-
|
|
94
|
-
|
|
181
|
+
owner = EXCLUDED.owner,
|
|
182
|
+
runbook = EXCLUDED.runbook,
|
|
183
|
+
context = EXCLUDED.context,
|
|
184
|
+
count = a.count + 1,
|
|
185
|
+
reopen_count = CASE WHEN a.status = 'resolved' THEN a.reopen_count + 1 ELSE a.reopen_count END,
|
|
186
|
+
reopened_at = CASE WHEN a.status = 'resolved' THEN EXCLUDED.last_seen_at ELSE a.reopened_at END,
|
|
187
|
+
acknowledged_at = CASE WHEN a.status = 'resolved' THEN NULL ELSE a.acknowledged_at END,
|
|
188
|
+
acknowledged_by = CASE WHEN a.status = 'resolved' THEN NULL ELSE a.acknowledged_by END,
|
|
95
189
|
last_seen_at = EXCLUDED.last_seen_at,
|
|
96
190
|
resolved_at = NULL,
|
|
97
191
|
trace_ids = CASE
|
|
@@ -101,6 +195,7 @@ export function createAlerts(config) {
|
|
|
101
195
|
resend_after_ms = COALESCE(EXCLUDED.resend_after_ms, CASE WHEN a.status = 'resolved' THEN NULL ELSE a.resend_after_ms END),
|
|
102
196
|
resolve_after_quiet_ms = COALESCE(EXCLUDED.resolve_after_quiet_ms, CASE WHEN a.status = 'resolved' THEN NULL ELSE a.resolve_after_quiet_ms END),
|
|
103
197
|
last_sent_at = CASE
|
|
198
|
+
WHEN a.status = 'acknowledged' THEN a.last_sent_at
|
|
104
199
|
WHEN a.status = 'resolved' OR a.last_sent_at IS NULL THEN EXCLUDED.last_sent_at
|
|
105
200
|
WHEN COALESCE(EXCLUDED.resend_after_ms, a.resend_after_ms, ${defaultResend}::int) IS NOT NULL
|
|
106
201
|
AND EXCLUDED.last_sent_at - a.last_sent_at
|
|
@@ -108,61 +203,185 @@ export function createAlerts(config) {
|
|
|
108
203
|
THEN EXCLUDED.last_sent_at
|
|
109
204
|
ELSE a.last_sent_at END,
|
|
110
205
|
updated_at = EXCLUDED.updated_at
|
|
111
|
-
RETURNING a.*, (a.last_sent_at = a.last_seen_at) AS sent
|
|
206
|
+
RETURNING a.*, (a.last_sent_at = a.last_seen_at) AS sent, (xmax = 0) AS inserted,
|
|
207
|
+
(a.reopened_at IS NOT NULL AND a.reopened_at = a.last_seen_at) AS reopened
|
|
208
|
+
),
|
|
209
|
+
occ AS (
|
|
210
|
+
INSERT INTO pipework_alert_occurrences (alert_key, at, severity, message, context, trace_id)
|
|
211
|
+
SELECT up.key, up.last_seen_at, up.severity, up.message, up.context, ${traceId}::text FROM up
|
|
112
212
|
),
|
|
113
213
|
dels AS (
|
|
114
214
|
INSERT INTO pipework_alert_deliveries (alert_key, kind, sink, payload, created_at, next_attempt_at)
|
|
115
|
-
SELECT up.key,
|
|
116
|
-
${payloadSql(
|
|
215
|
+
SELECT up.key, ${kindSql}, s.sink,
|
|
216
|
+
${payloadSql(kindSql, environment)}, clock_timestamp(), clock_timestamp()
|
|
117
217
|
FROM up CROSS JOIN unnest(${sinkNames}::text[]) AS s(sink)
|
|
118
|
-
WHERE up.sent
|
|
218
|
+
WHERE up.sent AND NOT up.severity = ANY(${digestSeverities}::text[])
|
|
119
219
|
RETURNING id
|
|
120
220
|
)
|
|
121
221
|
SELECT up.*, (SELECT count(*) FROM dels)::int AS queued FROM up`);
|
|
122
222
|
const row = rows[0];
|
|
123
223
|
const alert = toAlert(row);
|
|
124
224
|
const sent = row['sent'] === true;
|
|
125
|
-
const status = !sent ? 'grouped' :
|
|
126
|
-
await auditAlert(status === 'opened' ? 'raise' : 'group', key, {
|
|
225
|
+
const status = !sent ? 'grouped' : row['inserted'] === true ? 'opened' : row['reopened'] === true ? 'reopened' : 'resent';
|
|
226
|
+
await auditAlert(status === 'opened' ? 'raise' : status === 'reopened' ? 'reopen' : 'group', key, {
|
|
127
227
|
status, severity: alert.severity, count: alert.count, message: alert.message,
|
|
128
228
|
}, database);
|
|
129
|
-
if (sent && enqueue)
|
|
229
|
+
if (sent && enqueue && Number(row['queued']) > 0)
|
|
130
230
|
await enqueueJob();
|
|
131
231
|
return { status };
|
|
132
232
|
}
|
|
133
|
-
async function resolveKey(key, onlyIfQuiet, enqueue = true) {
|
|
233
|
+
async function resolveKey(key, onlyIfQuiet, enqueue = true, options = {}) {
|
|
234
|
+
const notify = options.notify ?? true;
|
|
235
|
+
const environment = environmentOf();
|
|
134
236
|
const rows = await db().execute(sql `
|
|
135
237
|
WITH up AS (
|
|
136
|
-
UPDATE pipework_alerts SET status = 'resolved', resolved_at = clock_timestamp(), updated_at = clock_timestamp()
|
|
137
|
-
|
|
238
|
+
UPDATE pipework_alerts SET status = 'resolved', resolved_at = clock_timestamp(), updated_at = clock_timestamp(),
|
|
239
|
+
resolved_by = ${options.by ?? null}::text, resolve_note = ${options.note ?? null}::text,
|
|
240
|
+
resolved_release = ${options.release ?? null}::text
|
|
241
|
+
WHERE key = ${key} AND status IN ('open', 'acknowledged')
|
|
138
242
|
AND (NOT ${onlyIfQuiet} OR last_seen_at < clock_timestamp()
|
|
139
243
|
- COALESCE(resolve_after_quiet_ms, ${defaultQuiet}::int) * interval '1 millisecond')
|
|
140
244
|
RETURNING *
|
|
141
245
|
),
|
|
142
246
|
dels AS (
|
|
143
247
|
INSERT INTO pipework_alert_deliveries (alert_key, kind, sink, payload, created_at, next_attempt_at)
|
|
144
|
-
SELECT up.key, 'resolve', s.sink, ${payloadSql(sql `'resolve'
|
|
248
|
+
SELECT up.key, 'resolve', s.sink, ${payloadSql(sql `'resolve'`, environment)}, clock_timestamp(), clock_timestamp()
|
|
145
249
|
FROM up CROSS JOIN unnest(${sinkNames}::text[]) AS s(sink)
|
|
250
|
+
WHERE ${notify}::boolean AND NOT up.severity = ANY(${digestSeverities}::text[])
|
|
146
251
|
RETURNING id
|
|
147
252
|
)
|
|
148
253
|
SELECT up.*, (SELECT count(*) FROM dels)::int AS queued FROM up`);
|
|
149
254
|
if (rows.length === 0)
|
|
150
255
|
return false;
|
|
151
256
|
const alert = toAlert(rows[0]);
|
|
152
|
-
await auditAlert('resolve', key, { count: alert.count, auto: onlyIfQuiet }, database);
|
|
153
|
-
if (enqueue)
|
|
257
|
+
await auditAlert('resolve', key, { count: alert.count, auto: onlyIfQuiet, ...(options.by !== undefined ? { by: options.by } : {}) }, database);
|
|
258
|
+
if (enqueue && notify && Number(rows[0]['queued']) > 0)
|
|
154
259
|
await enqueueJob();
|
|
155
260
|
return true;
|
|
156
261
|
}
|
|
262
|
+
async function acknowledge(key, options) {
|
|
263
|
+
if (options.by.trim() === '')
|
|
264
|
+
throw new Error('[pipework] alerts.acknowledge needs a non-empty by.');
|
|
265
|
+
const rows = await db().execute(sql `
|
|
266
|
+
UPDATE pipework_alerts SET status = 'acknowledged', acknowledged_at = clock_timestamp(), acknowledged_by = ${options.by},
|
|
267
|
+
updated_at = clock_timestamp()
|
|
268
|
+
WHERE key = ${key} AND status = 'open' RETURNING key`);
|
|
269
|
+
if (rows.length === 0)
|
|
270
|
+
return false;
|
|
271
|
+
await auditAlert('acknowledge', key, { by: options.by, ...(options.note !== undefined ? { note: options.note } : {}) }, database);
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
async function link(key, url) {
|
|
275
|
+
let parsed;
|
|
276
|
+
try {
|
|
277
|
+
parsed = new URL(url);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
throw new Error(`[pipework] alerts.link: url must be an http or https URL, got "${url}".`);
|
|
281
|
+
}
|
|
282
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
283
|
+
throw new Error(`[pipework] alerts.link: url must be an http or https URL, got "${url}".`);
|
|
284
|
+
}
|
|
285
|
+
const rows = await db().execute(sql `UPDATE pipework_alerts SET issue_url = ${url}, updated_at = clock_timestamp() WHERE key = ${key} RETURNING key`);
|
|
286
|
+
if (rows.length === 0)
|
|
287
|
+
return false;
|
|
288
|
+
await auditAlert('link', key, { url }, database);
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
async function list(options = {}) {
|
|
292
|
+
const statuses = pickList('list', 'status', options.status, STATUSES);
|
|
293
|
+
const severities = pickList('list', 'severity', options.severity, SEVERITIES);
|
|
294
|
+
const limit = checkLimit('list', options.limit);
|
|
295
|
+
const cursor = options.cursor === undefined ? null : readCursor('list', options.cursor);
|
|
296
|
+
const rows = await db().execute(sql `
|
|
297
|
+
SELECT *, ${exact('last_seen_at')} AS exact_at FROM pipework_alerts
|
|
298
|
+
WHERE (${statuses === null}::boolean OR status = ANY(${pgTextArray(statuses ?? [])}::text[]))
|
|
299
|
+
AND (${severities === null}::boolean OR severity = ANY(${pgTextArray(severities ?? [])}::text[]))
|
|
300
|
+
AND (${cursor === null}::boolean OR last_seen_at < ${cursor?.[0] ?? null}::timestamptz
|
|
301
|
+
OR (last_seen_at = ${cursor?.[0] ?? null}::timestamptz AND key > ${cursor?.[1] ?? null}::text))
|
|
302
|
+
ORDER BY last_seen_at DESC, key ASC
|
|
303
|
+
LIMIT ${limit + 1}`);
|
|
304
|
+
const page = rows.slice(0, limit);
|
|
305
|
+
const last = page[page.length - 1];
|
|
306
|
+
return {
|
|
307
|
+
items: page.map(toAlert),
|
|
308
|
+
next: rows.length > limit && last !== undefined ? encodeCursor([last['exact_at'], last['key']]) : null,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
async function occurrences(key, options = {}) {
|
|
312
|
+
const limit = checkLimit('occurrences', options.limit);
|
|
313
|
+
const cursor = options.cursor === undefined ? null : readCursor('occurrences', options.cursor);
|
|
314
|
+
const rows = await db().execute(sql `
|
|
315
|
+
SELECT *, ${exact('at')} AS exact_at FROM pipework_alert_occurrences
|
|
316
|
+
WHERE alert_key = ${key}
|
|
317
|
+
AND (${cursor === null}::boolean OR at < ${cursor?.[0] ?? null}::timestamptz
|
|
318
|
+
OR (at = ${cursor?.[0] ?? null}::timestamptz AND id < ${cursor?.[1] ?? null}::uuid))
|
|
319
|
+
ORDER BY at DESC, id DESC
|
|
320
|
+
LIMIT ${limit + 1}`);
|
|
321
|
+
const page = rows.slice(0, limit);
|
|
322
|
+
const last = page[page.length - 1];
|
|
323
|
+
return {
|
|
324
|
+
items: page.map(toOccurrence),
|
|
325
|
+
next: rows.length > limit && last !== undefined ? encodeCursor([last['exact_at'], last['id']]) : null,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
async function totals() {
|
|
329
|
+
const rows = await db().execute(sql `SELECT severity, status, count(*)::int AS n FROM pipework_alerts GROUP BY severity, status`);
|
|
330
|
+
const bySeverity = {};
|
|
331
|
+
for (const sev of ALERT_SEVERITIES)
|
|
332
|
+
bySeverity[sev] = { open: 0, acknowledged: 0, resolved: 0 };
|
|
333
|
+
for (const row of rows)
|
|
334
|
+
bySeverity[row['severity']][row['status']] = Number(row['n']);
|
|
335
|
+
return { bySeverity };
|
|
336
|
+
}
|
|
337
|
+
async function health() {
|
|
338
|
+
const rows = await db().execute(sql `
|
|
339
|
+
SELECT sink,
|
|
340
|
+
count(*) FILTER (WHERE delivered_at IS NULL AND failed_at IS NULL)::int AS pending,
|
|
341
|
+
count(*) FILTER (WHERE failed_at IS NOT NULL)::int AS failed,
|
|
342
|
+
max(delivered_at) AS last_delivered_at,
|
|
343
|
+
max(failed_at) AS last_failed_at,
|
|
344
|
+
(array_agg(last_error ORDER BY COALESCE(failed_at, next_attempt_at) DESC) FILTER (WHERE last_error IS NOT NULL))[1] AS last_error
|
|
345
|
+
FROM pipework_alert_deliveries GROUP BY sink`);
|
|
346
|
+
const toDate = (v) => (v === null || v === undefined ? null : new Date(v));
|
|
347
|
+
const bySink = new Map();
|
|
348
|
+
for (const name of sinks.keys()) {
|
|
349
|
+
bySink.set(name, { sink: name, pending: 0, failed: 0, lastDeliveredAt: null, lastFailedAt: null, lastError: null });
|
|
350
|
+
}
|
|
351
|
+
let pending = 0;
|
|
352
|
+
let failed = 0;
|
|
353
|
+
let lastDeliveredAt = null;
|
|
354
|
+
let lastFailedAt = null;
|
|
355
|
+
const later = (a, b) => (a === null ? b : b === null ? a : a > b ? a : b);
|
|
356
|
+
for (const row of rows) {
|
|
357
|
+
const entry = {
|
|
358
|
+
sink: row['sink'], pending: Number(row['pending']), failed: Number(row['failed']),
|
|
359
|
+
lastDeliveredAt: toDate(row['last_delivered_at']), lastFailedAt: toDate(row['last_failed_at']),
|
|
360
|
+
lastError: (row['last_error'] ?? null),
|
|
361
|
+
};
|
|
362
|
+
bySink.set(entry.sink, entry);
|
|
363
|
+
pending += entry.pending;
|
|
364
|
+
failed += entry.failed;
|
|
365
|
+
lastDeliveredAt = later(lastDeliveredAt, entry.lastDeliveredAt);
|
|
366
|
+
lastFailedAt = later(lastFailedAt, entry.lastFailedAt);
|
|
367
|
+
}
|
|
368
|
+
return { pending, failed, lastDeliveredAt, lastFailedAt, bySink: [...bySink.values()].sort((x, y) => x.sink.localeCompare(y.sink)) };
|
|
369
|
+
}
|
|
370
|
+
async function pruneOccurrences() {
|
|
371
|
+
await db().execute(sql `
|
|
372
|
+
DELETE FROM pipework_alert_occurrences WHERE id IN (
|
|
373
|
+
SELECT id FROM pipework_alert_occurrences
|
|
374
|
+
WHERE at < clock_timestamp() - ${retentionMs}::bigint * interval '1 millisecond' LIMIT ${RETENTION_BATCH})`);
|
|
375
|
+
}
|
|
157
376
|
async function autoResolve() {
|
|
158
377
|
if (defaultQuiet === null) {
|
|
159
|
-
const any = await db().execute(sql `SELECT 1 FROM pipework_alerts WHERE status
|
|
378
|
+
const any = await db().execute(sql `SELECT 1 FROM pipework_alerts WHERE status IN ('open', 'acknowledged') AND resolve_after_quiet_ms IS NOT NULL LIMIT 1`);
|
|
160
379
|
if (any.length === 0)
|
|
161
380
|
return 0;
|
|
162
381
|
}
|
|
163
382
|
const due = await db().execute(sql `
|
|
164
383
|
SELECT key FROM pipework_alerts
|
|
165
|
-
WHERE status
|
|
384
|
+
WHERE status IN ('open', 'acknowledged')
|
|
166
385
|
AND last_seen_at < clock_timestamp() - COALESCE(resolve_after_quiet_ms, ${defaultQuiet}::int) * interval '1 millisecond'`);
|
|
167
386
|
let resolved = 0;
|
|
168
387
|
for (const row of due)
|
|
@@ -187,7 +406,7 @@ export function createAlerts(config) {
|
|
|
187
406
|
if (source.owns === undefined)
|
|
188
407
|
continue;
|
|
189
408
|
const live = new Set(conditions.map(c => c.key));
|
|
190
|
-
const opened = await db().execute(sql `SELECT key FROM pipework_alerts WHERE status
|
|
409
|
+
const opened = await db().execute(sql `SELECT key FROM pipework_alerts WHERE status IN ('open', 'acknowledged')`);
|
|
191
410
|
for (const row of opened) {
|
|
192
411
|
const key = row['key'];
|
|
193
412
|
if (source.owns(key) && !live.has(key) && await resolveKey(key, false, false))
|
|
@@ -196,6 +415,44 @@ export function createAlerts(config) {
|
|
|
196
415
|
}
|
|
197
416
|
return resolved;
|
|
198
417
|
}
|
|
418
|
+
const DIGEST_KEY = 'pipework.alerts.digest';
|
|
419
|
+
// One statement claims the window (only the handle that moves the cursor wins) and queues the digest.
|
|
420
|
+
async function sendDigest() {
|
|
421
|
+
if (digestEveryMs === null)
|
|
422
|
+
return;
|
|
423
|
+
const environment = environmentOf();
|
|
424
|
+
const rows = await db().execute(sql `
|
|
425
|
+
WITH old AS (SELECT cursor_at FROM pipework_alert_source_state WHERE name = ${DIGEST_KEY}),
|
|
426
|
+
claim AS (
|
|
427
|
+
INSERT INTO pipework_alert_source_state AS s (name, cursor_at) VALUES (${DIGEST_KEY}, statement_timestamp())
|
|
428
|
+
ON CONFLICT (name) DO UPDATE SET cursor_at = EXCLUDED.cursor_at
|
|
429
|
+
WHERE s.cursor_at <= clock_timestamp() - ${digestEveryMs}::bigint * interval '1 millisecond'
|
|
430
|
+
RETURNING cursor_at AS until
|
|
431
|
+
),
|
|
432
|
+
changed AS (
|
|
433
|
+
SELECT a.* FROM pipework_alerts a, claim
|
|
434
|
+
WHERE a.severity = ANY(${digestSeverities}::text[])
|
|
435
|
+
AND a.updated_at > COALESCE((SELECT cursor_at FROM old), statement_timestamp() - ${digestEveryMs}::bigint * interval '1 millisecond')
|
|
436
|
+
),
|
|
437
|
+
dels AS (
|
|
438
|
+
INSERT INTO pipework_alert_deliveries (alert_key, kind, sink, payload, created_at, next_attempt_at)
|
|
439
|
+
SELECT ${DIGEST_KEY}, 'digest', s.sink,
|
|
440
|
+
jsonb_build_object('kind', 'digest', 'key', ${DIGEST_KEY}::text, 'environment', ${environment}::text,
|
|
441
|
+
'since', (SELECT cursor_at FROM old), 'until', claim.until,
|
|
442
|
+
'alerts', (SELECT jsonb_agg(jsonb_build_object('key', c.key, 'severity', c.severity, 'status', c.status,
|
|
443
|
+
'message', c.message, 'owner', c.owner, 'count', c.count, 'reopenCount', c.reopen_count,
|
|
444
|
+
'lastSeenAt', c.last_seen_at) ORDER BY c.key) FROM changed c)),
|
|
445
|
+
clock_timestamp(), clock_timestamp()
|
|
446
|
+
FROM claim CROSS JOIN unnest(${sinkNames}::text[]) AS s(sink)
|
|
447
|
+
WHERE EXISTS (SELECT 1 FROM changed)
|
|
448
|
+
RETURNING id
|
|
449
|
+
)
|
|
450
|
+
SELECT (SELECT count(*) FROM claim)::int AS claimed, (SELECT count(*) FROM dels)::int AS queued,
|
|
451
|
+
(SELECT coalesce(array_agg(key ORDER BY key), '{}') FROM changed) AS keys`);
|
|
452
|
+
const row = rows[0];
|
|
453
|
+
if (Number(row['queued']) > 0)
|
|
454
|
+
await auditAlert('digest', DIGEST_KEY, { keys: row['keys'] }, database);
|
|
455
|
+
}
|
|
199
456
|
const outbox = createOutbox({
|
|
200
457
|
table: 'pipework_alert_deliveries', groupColumn: 'alert_key', database, sinks, maxAttempts, backoffMs,
|
|
201
458
|
label: 'alert delivery given up',
|
|
@@ -209,13 +466,21 @@ export function createAlerts(config) {
|
|
|
209
466
|
async function runTick() {
|
|
210
467
|
let resolved = await autoResolve();
|
|
211
468
|
resolved += await runSources();
|
|
469
|
+
await pruneOccurrences();
|
|
470
|
+
await sendDigest();
|
|
212
471
|
return { resolved, ...await outbox.drain() };
|
|
213
472
|
}
|
|
214
473
|
const tickStep = __flowStep({ ref: 'pipework/alerts:tick' }, runTick);
|
|
215
474
|
const job = fitting.use().job(jobType).fit(async () => tickStep());
|
|
216
475
|
return {
|
|
217
476
|
raise: (key, options) => raise(key, options),
|
|
218
|
-
resolve: key => resolveKey(key, false),
|
|
477
|
+
resolve: (key, options) => resolveKey(key, false, true, options),
|
|
478
|
+
acknowledge,
|
|
479
|
+
link,
|
|
480
|
+
list,
|
|
481
|
+
occurrences,
|
|
482
|
+
totals,
|
|
483
|
+
health,
|
|
219
484
|
job: job,
|
|
220
485
|
tick: () => tickStep(),
|
|
221
486
|
async open() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../../../src/infra/alerts/handle.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../../../src/infra/alerts/handle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Handler } from '../../request/di/types.js';
|
|
2
|
+
import type { Alerts } from './handle.js';
|
|
3
|
+
export interface AlertsHttpOptions {
|
|
4
|
+
/** Route prefix, e.g. '/ops/alerts'. No trailing slash. */
|
|
5
|
+
readonly path: string;
|
|
6
|
+
/** Service credentials, name -> secret. A request sends `Authorization: Bearer <secret>`; the matching name is the default `by`. At least one; secrets at least 32 chars. */
|
|
7
|
+
readonly credentials: Readonly<Record<string, string>>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Routes for an operations agent, under `options.path` (all JSON, no session, no tenant):
|
|
11
|
+
* GET list (`status`, `severity` comma lists, `limit`, `cursor`), GET `/totals`, GET `/health`,
|
|
12
|
+
* GET `/:key` (an alert keyed `totals` or `health` is not reachable here), GET `/:key/occurrences`, and POST `/:key/acknowledge`, `/:key/resolve`, `/:key/link`.
|
|
13
|
+
* `:key` is URL-encoded. Every request needs `Authorization: Bearer <secret>` matching one of
|
|
14
|
+
* `credentials`; the credential's name is the default `by` for acknowledge and resolve.
|
|
15
|
+
* Reads cross tenants (the handle reads through `pipe.system()`). Resolve never notifies:
|
|
16
|
+
* the agent does not hear its own change. Dates are ISO strings. A bad value is 400 naming the field.
|
|
17
|
+
*/
|
|
18
|
+
export declare function alertsHttp(handle: Alerts, options: AlertsHttpOptions): Handler<Record<string, unknown>, unknown>[];
|
|
19
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/infra/alerts/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAGxD,OAAO,KAAK,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAErE,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,6KAA6K;IAC7K,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACvD;AAiFD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,CA0ElH"}
|