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.
@@ -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(['info', 'warning', 'error', 'critical']);
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
- 'count', up.count, 'firstSeenAt', up.first_seen_at, 'lastSeenAt', up.last_seen_at,
67
- 'resolvedAt', up.resolved_at, 'traceIds', to_jsonb(up.trace_ids))`;
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, 1, c.ts, c.ts, c.ts,
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
- count = CASE WHEN a.status = 'resolved' THEN 1 ELSE a.count + 1 END,
94
- first_seen_at = CASE WHEN a.status = 'resolved' THEN EXCLUDED.first_seen_at ELSE a.first_seen_at END,
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, CASE WHEN up.count = 1 THEN 'raise' ELSE 'repeat' END, s.sink,
116
- ${payloadSql(sql `CASE WHEN up.count = 1 THEN 'raise' ELSE 'repeat' END`)}, clock_timestamp(), clock_timestamp()
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' : alert.count === 1 ? 'opened' : 'resent';
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
- WHERE key = ${key} AND status = 'open'
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'`)}, clock_timestamp(), clock_timestamp()
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 = 'open' AND resolve_after_quiet_ms IS NOT NULL LIMIT 1`);
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 = 'open'
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 = 'open'`);
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":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAG3D,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAiGhD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;AAEpE,SAAS,OAAO,CAAC,GAA4B;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAU,EAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,CAAW,CAAC,CAAA;IACxD,MAAM,UAAU,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAChG,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,KAAK,CAAW;QACzB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAoB;QACxC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAkB;QAC1C,OAAO,EAAE,GAAG,CAAC,SAAS,CAAW;QACjC,OAAO,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAwB;QACxD,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACrC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3C,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC1C,QAAQ,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAa;KAC/C,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAA4B;IACjD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,IAAI,CAAW;QACvB,GAAG,EAAE,GAAG,CAAC,WAAW,CAAW;QAC/B,IAAI,EAAE,GAAG,CAAC,MAAM,CAAwB;QACxC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAW;QAC3B,OAAO,EAAE,GAAG,CAAC,SAAS,CAAiB;QACvC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,aAAa,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAW,CAAC;QACzD,WAAW,EAAE,GAAG,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAW,CAAC;QAC1F,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;QACjF,SAAS,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAkB;KACxD,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAyB;IAC5C,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;AAC/F,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACnG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAA;IAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAA;QAC5H,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACtB,CAAC;IACD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,iBAAiB,CAAA;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAA;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAA;IAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,CAAA;IAClD,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAA;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IAChC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAA;IAE3B,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAErC,qGAAqG;IACrG,MAAM,UAAU,GAAG,CAAC,IAA4B,EAAE,EAAE,CAAC,GAAG,CAAA;cAC5C,IAAI;;sEAEoD,CAAA;IAEpE,KAAK,UAAU,UAAU;QACvB,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;IACtF,CAAC;IAED,2FAA2F;IAC3F,KAAK,UAAU,KAAK,CAAC,GAAW,EAAE,OAAqB,EAAE,OAAO,GAAG,IAAI;QACrE,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QACxF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oFAAoF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACxK,MAAM,OAAO,GAAG,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,IAAI,CAAA;QAC/C,MAAM,UAAU,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QACnE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACtF,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA;;;;;iBAKtB,GAAG,aAAa,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,OAAO,KAAK,OAAO;iBAChE,UAAU,aAAa,OAAO,CAAC,aAAa,IAAI,IAAI,UAAU,OAAO,CAAC,mBAAmB,IAAI,IAAI;;;;;;;;;;;;;mBAa/F,OAAO;oEAC0C,OAAO;;;;;yEAKF,aAAa;;4EAEV,aAAa;;;;;;;;;iBASxE,UAAU,CAAC,GAAG,CAAA,uDAAuD,CAAC;oCACnD,SAAS;;;;sEAIyB,CAAC,CAAA;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACpB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;QACjC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC1E,MAAM,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7D,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO;SAC7E,EAAE,QAAQ,CAAC,CAAA;QACZ,IAAI,IAAI,IAAI,OAAO;YAAE,MAAM,UAAU,EAAE,CAAA;QACvC,OAAO,EAAE,MAAM,EAAE,CAAA;IACnB,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,WAAoB,EAAE,OAAO,GAAG,IAAI;QACzE,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA;;;sBAGjB,GAAG;qBACJ,WAAW;oDACoB,YAAY;;;;;4CAKpB,UAAU,CAAC,GAAG,CAAA,WAAW,CAAC;oCAClC,SAAS;;;sEAGyB,CAAC,CAAA;QACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;QAC/B,MAAM,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAA;QACrF,IAAI,OAAO;YAAE,MAAM,UAAU,EAAE,CAAA;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,UAAU,WAAW;QACxB,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,oGAAoG,CAAC,CAAA;YACvI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAA;QAChC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA;;;kFAG4C,YAAY,mCAAmC,CAAC,CAAA;QAC9H,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,KAAK,MAAM,GAAG,IAAI,GAAG;YAAE,IAAI,MAAM,UAAU,CAAC,GAAG,CAAC,KAAK,CAAW,EAAE,IAAI,EAAE,KAAK,CAAC;gBAAE,QAAQ,EAAE,CAAA;QAC1F,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,UAAU,UAAU;QACvB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAA;YACd,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAA;gBAC9D,SAAQ;YACV,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YACrI,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAQ;YACvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YAChD,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,uDAAuD,CAAC,CAAA;YAC7F,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAW,CAAA;gBAChC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;oBAAE,QAAQ,EAAE,CAAA;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAgB;QACzC,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS;QACrG,KAAK,EAAE,yBAAyB;QAChC,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7B,EAAE,EAAE,GAAG,CAAC,IAAI,CAAW,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAA0B,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,CAAW;YACpG,IAAI,EAAE,GAAG,CAAC,MAAM,CAAW,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAiB,EAAE,OAAO;SAC9E,CAAC;QACF,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC;QAC7I,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,WAAW,CAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC;KACjK,CAAC,CAAA;IAEF,KAAK,UAAU,OAAO;QACpB,IAAI,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAA;QAClC,QAAQ,IAAI,MAAM,UAAU,EAAE,CAAA;QAC9B,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,EAAE,CAAA;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,EAAE,OAAO,CAAC,CAAA;IACrE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;IAElE,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;QAC5C,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;QACtC,GAAG,EAAE,GAA2D;QAChE,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE;QACtB,KAAK,CAAC,IAAI;YACR,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,iFAAiF,CAAC,CAAA;YACrH,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,6CAA6C,GAAG,EAAE,CAAC,CAAA;YACtF,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACxD,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,EAAE;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS;gBACpC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,iEAAiE,CAAC;gBAC1F,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,6DAA6D,OAAO,CAAC,GAAG,0BAA0B,CAAC,CAAA;YAC7H,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAChC,CAAC;KACF,CAAA;AACH,CAAC"}
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"}