@dbos-inc/dbos-enterprise 0.0.1 → 5.3.2-preview
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 +4 -2
- package/dist/src/conductor/conductor.d.ts +39 -0
- package/dist/src/conductor/conductor.d.ts.map +1 -0
- package/dist/src/conductor/conductor.js +948 -0
- package/dist/src/conductor/conductor.js.map +1 -0
- package/dist/src/conductor/protocol.d.ts +594 -0
- package/dist/src/conductor/protocol.d.ts.map +1 -0
- package/dist/src/conductor/protocol.js +447 -0
- package/dist/src/conductor/protocol.js.map +1 -0
- package/dist/src/export.d.ts +12 -0
- package/dist/src/export.d.ts.map +1 -0
- package/dist/src/export.js +190 -0
- package/dist/src/export.js.map +1 -0
- package/dist/src/fork.d.ts +11 -0
- package/dist/src/fork.d.ts.map +1 -0
- package/dist/src/fork.js +63 -0
- package/dist/src/fork.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/observability.d.ts +82 -0
- package/dist/src/observability.d.ts.map +1 -0
- package/dist/src/observability.js +378 -0
- package/dist/src/observability.js.map +1 -0
- package/dist/src/retention.d.ts +49 -0
- package/dist/src/retention.d.ts.map +1 -0
- package/dist/src/retention.js +448 -0
- package/dist/src/retention.js.map +1 -0
- package/package.json +11 -3
- package/dist/src/scratch.d.ts +0 -9
- package/dist/src/scratch.d.ts.map +0 -1
- package/dist/src/scratch.js +0 -15
- package/dist/src/scratch.js.map +0 -1
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Dashboard queries over the system database: aggregates, metrics, and the bulk reads behind a workflow page.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.getMetrics = exports.getStepAggregates = exports.getWorkflowAggregates = exports.getAllStreamEntries = exports.getAllNotifications = exports.getAllEvents = exports.getPendingWorkflows = void 0;
|
|
5
|
+
const serialization_1 = require("@dbos-inc/dbos-sdk/internal/serialization");
|
|
6
|
+
const system_database_1 = require("@dbos-inc/dbos-sdk/internal/system_database");
|
|
7
|
+
const workflow_1 = require("@dbos-inc/dbos-sdk/internal/workflow");
|
|
8
|
+
async function getPendingWorkflows(sysdb, executorID, appVersion) {
|
|
9
|
+
const params = [workflow_1.StatusString.PENDING, executorID, appVersion];
|
|
10
|
+
// executor_id defaults to "local", so it collides across applications.
|
|
11
|
+
const scope = sysdb.appNameFilter('application_name', sysdb.appName, params);
|
|
12
|
+
const getWorkflows = await sysdb.pool.query(`SELECT workflow_uuid
|
|
13
|
+
FROM "${sysdb.schemaName}".workflow_status
|
|
14
|
+
WHERE status=$1 AND executor_id=$2 AND application_version=$3 AND ${scope}`, params);
|
|
15
|
+
return getWorkflows.rows.map((i) => ({
|
|
16
|
+
workflowUUID: i.workflow_uuid,
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
exports.getPendingWorkflows = getPendingWorkflows;
|
|
20
|
+
async function getAllEvents(sysdb, workflowID) {
|
|
21
|
+
const { rows } = await sysdb.observabilityQuery((client) => client.query(`SELECT key, value, serialization FROM "${sysdb.schemaName}".workflow_events
|
|
22
|
+
WHERE workflow_uuid = $1`, [workflowID]));
|
|
23
|
+
const events = {};
|
|
24
|
+
for (const row of rows) {
|
|
25
|
+
events[row.key] = await (0, serialization_1.safeParse)(sysdb.serializer, row.value, row.serialization);
|
|
26
|
+
}
|
|
27
|
+
return events;
|
|
28
|
+
}
|
|
29
|
+
exports.getAllEvents = getAllEvents;
|
|
30
|
+
async function getAllNotifications(sysdb, workflowID) {
|
|
31
|
+
const { rows } = await sysdb.observabilityQuery((client) => client.query(`SELECT topic, message, serialization, created_at_epoch_ms, consumed
|
|
32
|
+
FROM "${sysdb.schemaName}".notifications
|
|
33
|
+
WHERE destination_uuid = $1
|
|
34
|
+
ORDER BY created_at_epoch_ms`, [workflowID]));
|
|
35
|
+
return await Promise.all(rows.map(async (row) => ({
|
|
36
|
+
topic: row.topic === sysdb.nullTopic ? null : row.topic,
|
|
37
|
+
message: await (0, serialization_1.safeParse)(sysdb.serializer, row.message, row.serialization),
|
|
38
|
+
createdAtEpochMs: Number(row.created_at_epoch_ms),
|
|
39
|
+
consumed: row.consumed,
|
|
40
|
+
})));
|
|
41
|
+
}
|
|
42
|
+
exports.getAllNotifications = getAllNotifications;
|
|
43
|
+
async function getAllStreamEntries(sysdb, workflowID) {
|
|
44
|
+
const { rows } = await sysdb.observabilityQuery((client) => client.query(`SELECT key, value, serialization FROM "${sysdb.schemaName}".streams
|
|
45
|
+
WHERE workflow_uuid = $1
|
|
46
|
+
ORDER BY key, "offset"`, [workflowID]));
|
|
47
|
+
const streams = {};
|
|
48
|
+
const closed = new Set();
|
|
49
|
+
for (const row of rows) {
|
|
50
|
+
if (closed.has(row.key)) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// safeParse yields the raw string for the legacy unserialized marker, which does not parse.
|
|
54
|
+
const value = await (0, serialization_1.safeParse)(sysdb.serializer, row.value, row.serialization);
|
|
55
|
+
if ((0, system_database_1.isStreamClosedSentinel)(value)) {
|
|
56
|
+
// End the stream where readStream does, so the two never disagree.
|
|
57
|
+
closed.add(row.key);
|
|
58
|
+
streams[row.key] ??= [];
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
(streams[row.key] ??= []).push(value);
|
|
62
|
+
}
|
|
63
|
+
return streams;
|
|
64
|
+
}
|
|
65
|
+
exports.getAllStreamEntries = getAllStreamEntries;
|
|
66
|
+
async function getWorkflowAggregates(sysdb, input) {
|
|
67
|
+
if (input.timeBucketSizeMs !== undefined && input.timeBucketSizeMs <= 0) {
|
|
68
|
+
throw new Error('time_bucket_size_ms must be > 0');
|
|
69
|
+
}
|
|
70
|
+
const groupByFlags = [
|
|
71
|
+
['status', input.groupByStatus ?? false, 'status'],
|
|
72
|
+
['name', input.groupByName ?? false, 'name'],
|
|
73
|
+
['queue_name', input.groupByQueueName ?? false, 'queue_name'],
|
|
74
|
+
['executor_id', input.groupByExecutorId ?? false, 'executor_id'],
|
|
75
|
+
['application_version', input.groupByApplicationVersion ?? false, 'application_version'],
|
|
76
|
+
['application_name', input.groupByApplicationName ?? false, 'application_name'],
|
|
77
|
+
];
|
|
78
|
+
const groupNames = [];
|
|
79
|
+
const groupColumns = [];
|
|
80
|
+
const groupSelectColumns = [];
|
|
81
|
+
for (const [colName, enabled, col] of groupByFlags) {
|
|
82
|
+
if (enabled) {
|
|
83
|
+
groupNames.push(colName);
|
|
84
|
+
groupColumns.push(col);
|
|
85
|
+
groupSelectColumns.push(col);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const params = [];
|
|
89
|
+
if (input.timeBucketSizeMs !== undefined) {
|
|
90
|
+
// Bucket on created_at — the indexed wall-clock timestamp on workflow_status.
|
|
91
|
+
// One placeholder shared by SELECT and GROUP BY, so Postgres sees the two expressions as identical.
|
|
92
|
+
params.push(input.timeBucketSizeMs);
|
|
93
|
+
const bucket = `$${params.length}::bigint`;
|
|
94
|
+
const bucketExpr = `(CAST(FLOOR(created_at / ${bucket}) AS BIGINT) * ${bucket})`;
|
|
95
|
+
groupNames.push('time_bucket');
|
|
96
|
+
groupColumns.push(bucketExpr);
|
|
97
|
+
groupSelectColumns.push(`${bucketExpr} AS time_bucket`);
|
|
98
|
+
}
|
|
99
|
+
if (groupColumns.length === 0) {
|
|
100
|
+
throw new Error('At least one group_by flag must be set to True');
|
|
101
|
+
}
|
|
102
|
+
// Build select columns from boolean flags. MAX ignores NULLs, so rows
|
|
103
|
+
// missing started_at_epoch_ms or completed_at naturally drop out of the
|
|
104
|
+
// latency maxes.
|
|
105
|
+
const selectFlags = [
|
|
106
|
+
['count', input.selectCount ?? false, 'COUNT(*)'],
|
|
107
|
+
['min_created_at', input.selectMinCreatedAt ?? false, 'MIN(created_at)'],
|
|
108
|
+
['max_queue_wait_ms', input.selectMaxQueueWaitMs ?? false, 'MAX(started_at_epoch_ms - created_at)'],
|
|
109
|
+
['max_total_latency_ms', input.selectMaxTotalLatencyMs ?? false, 'MAX(completed_at - created_at)'],
|
|
110
|
+
];
|
|
111
|
+
const selectNames = [];
|
|
112
|
+
const selectColumns = [];
|
|
113
|
+
for (const [name, enabled, expr] of selectFlags) {
|
|
114
|
+
if (enabled) {
|
|
115
|
+
selectNames.push(name);
|
|
116
|
+
selectColumns.push(`${expr} AS ${name}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (selectColumns.length === 0) {
|
|
120
|
+
throw new Error('At least one select_ flag must be set to True');
|
|
121
|
+
}
|
|
122
|
+
const whereClauses = [];
|
|
123
|
+
let paramIdx = params.length + 1;
|
|
124
|
+
const addFilter = (column, values) => {
|
|
125
|
+
if (!values || values.length === 0)
|
|
126
|
+
return;
|
|
127
|
+
const placeholders = values.map((_, i) => `$${paramIdx + i}`).join(', ');
|
|
128
|
+
whereClauses.push(`${column} IN (${placeholders})`);
|
|
129
|
+
params.push(...values);
|
|
130
|
+
paramIdx += values.length;
|
|
131
|
+
};
|
|
132
|
+
addFilter('status', input.status);
|
|
133
|
+
addFilter('name', input.name);
|
|
134
|
+
addFilter('application_version', input.appVersion);
|
|
135
|
+
addFilter('executor_id', input.executorId);
|
|
136
|
+
addFilter('queue_name', input.queueName);
|
|
137
|
+
if (input.workflowIdPrefix && input.workflowIdPrefix.length > 0) {
|
|
138
|
+
const likeClauses = input.workflowIdPrefix.map((p) => {
|
|
139
|
+
params.push(`${p}%`);
|
|
140
|
+
return `workflow_uuid LIKE $${paramIdx++}`;
|
|
141
|
+
});
|
|
142
|
+
whereClauses.push(`(${likeClauses.join(' OR ')})`);
|
|
143
|
+
}
|
|
144
|
+
addFilter('workflow_uuid', input.workflowIDs);
|
|
145
|
+
addFilter('authenticated_user', input.authenticatedUser);
|
|
146
|
+
addFilter('forked_from', input.forkedFrom);
|
|
147
|
+
addFilter('parent_workflow_id', input.parentWorkflowID);
|
|
148
|
+
addFilter('schedule_name', input.scheduleName);
|
|
149
|
+
// Unset scopes to this application, as on every other observability query.
|
|
150
|
+
whereClauses.push(sysdb.observabilityFilter('application_name', input.applicationName, params));
|
|
151
|
+
paramIdx = params.length + 1;
|
|
152
|
+
if (input.wasForkedFrom !== undefined) {
|
|
153
|
+
whereClauses.push(`was_forked_from = $${paramIdx}`);
|
|
154
|
+
params.push(input.wasForkedFrom);
|
|
155
|
+
paramIdx++;
|
|
156
|
+
}
|
|
157
|
+
// Matches the forks themselves, as opposed to wasForkedFrom, which matches the workflows they were forked from.
|
|
158
|
+
if (input.isFork !== undefined) {
|
|
159
|
+
whereClauses.push(input.isFork ? `forked_from IS NOT NULL` : `forked_from IS NULL`);
|
|
160
|
+
}
|
|
161
|
+
if (input.hasParent !== undefined) {
|
|
162
|
+
whereClauses.push(input.hasParent ? `parent_workflow_id IS NOT NULL` : `parent_workflow_id IS NULL`);
|
|
163
|
+
}
|
|
164
|
+
// Match workflows whose attributes JSONB contains all the given key-value pairs.
|
|
165
|
+
if (input.attributes && Object.keys(input.attributes).length > 0) {
|
|
166
|
+
whereClauses.push(`attributes @> $${paramIdx}::jsonb`);
|
|
167
|
+
params.push(JSON.stringify(input.attributes));
|
|
168
|
+
paramIdx++;
|
|
169
|
+
}
|
|
170
|
+
if (input.startTime) {
|
|
171
|
+
whereClauses.push(`created_at >= $${paramIdx}`);
|
|
172
|
+
params.push(new Date(input.startTime).getTime());
|
|
173
|
+
paramIdx++;
|
|
174
|
+
}
|
|
175
|
+
if (input.endTime) {
|
|
176
|
+
whereClauses.push(`created_at <= $${paramIdx}`);
|
|
177
|
+
params.push(new Date(input.endTime).getTime());
|
|
178
|
+
paramIdx++;
|
|
179
|
+
}
|
|
180
|
+
if (input.completedAfter) {
|
|
181
|
+
whereClauses.push(`completed_at >= $${paramIdx}`);
|
|
182
|
+
params.push(new Date(input.completedAfter).getTime());
|
|
183
|
+
paramIdx++;
|
|
184
|
+
}
|
|
185
|
+
if (input.completedBefore) {
|
|
186
|
+
whereClauses.push(`completed_at <= $${paramIdx}`);
|
|
187
|
+
params.push(new Date(input.completedBefore).getTime());
|
|
188
|
+
paramIdx++;
|
|
189
|
+
}
|
|
190
|
+
// dequeuedAfter/Before filter on started_at_epoch_ms: that column is
|
|
191
|
+
// populated on dequeue and surfaced as WorkflowStatus.dequeuedAt.
|
|
192
|
+
if (input.dequeuedAfter) {
|
|
193
|
+
whereClauses.push(`started_at_epoch_ms >= $${paramIdx}`);
|
|
194
|
+
params.push(new Date(input.dequeuedAfter).getTime());
|
|
195
|
+
paramIdx++;
|
|
196
|
+
}
|
|
197
|
+
if (input.dequeuedBefore) {
|
|
198
|
+
whereClauses.push(`started_at_epoch_ms <= $${paramIdx}`);
|
|
199
|
+
params.push(new Date(input.dequeuedBefore).getTime());
|
|
200
|
+
paramIdx++;
|
|
201
|
+
}
|
|
202
|
+
const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';
|
|
203
|
+
const groupByClause = groupColumns.join(', ');
|
|
204
|
+
const selectClause = [...groupSelectColumns, ...selectColumns].join(', ');
|
|
205
|
+
const query = `
|
|
206
|
+
SELECT ${selectClause}
|
|
207
|
+
FROM "${sysdb.schemaName}".workflow_status
|
|
208
|
+
${whereClause}
|
|
209
|
+
GROUP BY ${groupByClause}
|
|
210
|
+
`;
|
|
211
|
+
const result = await sysdb.observabilityQuery((client) => client.query(query, params));
|
|
212
|
+
const toIntOrNull = (v) => (v === null || v === undefined ? null : Number(v));
|
|
213
|
+
return result.rows.map((row) => {
|
|
214
|
+
const group = {};
|
|
215
|
+
for (const name of groupNames) {
|
|
216
|
+
const v = row[name];
|
|
217
|
+
group[name] = v === null || v === undefined ? null : String(v);
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
group,
|
|
221
|
+
count: selectNames.includes('count') ? toIntOrNull(row.count) : null,
|
|
222
|
+
minCreatedAt: selectNames.includes('min_created_at') ? toIntOrNull(row.min_created_at) : null,
|
|
223
|
+
maxQueueWaitMs: selectNames.includes('max_queue_wait_ms') ? toIntOrNull(row.max_queue_wait_ms) : null,
|
|
224
|
+
maxTotalLatencyMs: selectNames.includes('max_total_latency_ms') ? toIntOrNull(row.max_total_latency_ms) : null,
|
|
225
|
+
};
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
exports.getWorkflowAggregates = getWorkflowAggregates;
|
|
229
|
+
async function getStepAggregates(sysdb, input) {
|
|
230
|
+
if (input.timeBucketSizeMs !== undefined && input.timeBucketSizeMs <= 0) {
|
|
231
|
+
throw new Error('time_bucket_size_ms must be > 0');
|
|
232
|
+
}
|
|
233
|
+
// operation_outputs has no explicit status column; derive it from whether `error` is populated.
|
|
234
|
+
// Child-workflow mapping rows have NULL error, so they appear as SUCCESS — callers filter by function_name.
|
|
235
|
+
const statusExpr = `CASE WHEN error IS NULL THEN 'SUCCESS' ELSE 'ERROR' END`;
|
|
236
|
+
const groupByFlags = [
|
|
237
|
+
['function_name', input.groupByFunctionName ?? false, 'function_name'],
|
|
238
|
+
['status', input.groupByStatus ?? false, statusExpr],
|
|
239
|
+
];
|
|
240
|
+
const groupNames = [];
|
|
241
|
+
const groupColumns = [];
|
|
242
|
+
const groupSelectColumns = [];
|
|
243
|
+
for (const [colName, enabled, expr] of groupByFlags) {
|
|
244
|
+
if (enabled) {
|
|
245
|
+
groupNames.push(colName);
|
|
246
|
+
groupColumns.push(expr);
|
|
247
|
+
groupSelectColumns.push(`${expr} AS ${colName}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const params = [];
|
|
251
|
+
if (input.timeBucketSizeMs !== undefined) {
|
|
252
|
+
// Bucket on completed_at_epoch_ms — it's the indexed timestamp on
|
|
253
|
+
// this table.
|
|
254
|
+
params.push(input.timeBucketSizeMs);
|
|
255
|
+
const bucket = `$${params.length}::bigint`;
|
|
256
|
+
const bucketExpr = `(CAST(FLOOR(completed_at_epoch_ms / ${bucket}) AS BIGINT) * ${bucket})`;
|
|
257
|
+
groupNames.push('time_bucket');
|
|
258
|
+
groupColumns.push(bucketExpr);
|
|
259
|
+
groupSelectColumns.push(`${bucketExpr} AS time_bucket`);
|
|
260
|
+
}
|
|
261
|
+
if (groupColumns.length === 0) {
|
|
262
|
+
throw new Error('At least one group_by flag must be set to True');
|
|
263
|
+
}
|
|
264
|
+
// Build select columns from boolean flags. Child-workflow mapping rows record start and
|
|
265
|
+
// complete at nearly the same instant, so they contribute ~0; DBOS.getResult and DBOS.sleep
|
|
266
|
+
// rows span their whole wait, so those dominate the duration max.
|
|
267
|
+
const selectFlags = [
|
|
268
|
+
['count', input.selectCount ?? false, 'COUNT(*)'],
|
|
269
|
+
['max_duration_ms', input.selectMaxDurationMs ?? false, 'MAX(completed_at_epoch_ms - started_at_epoch_ms)'],
|
|
270
|
+
];
|
|
271
|
+
const selectNames = [];
|
|
272
|
+
const selectColumns = [];
|
|
273
|
+
for (const [name, enabled, expr] of selectFlags) {
|
|
274
|
+
if (enabled) {
|
|
275
|
+
selectNames.push(name);
|
|
276
|
+
selectColumns.push(`${expr} AS ${name}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (selectColumns.length === 0) {
|
|
280
|
+
throw new Error('At least one select_ flag must be set to True');
|
|
281
|
+
}
|
|
282
|
+
const whereClauses = [];
|
|
283
|
+
let paramIdx = params.length + 1;
|
|
284
|
+
if (input.status && input.status.length > 0) {
|
|
285
|
+
const placeholders = input.status.map((_, i) => `$${paramIdx + i}`).join(', ');
|
|
286
|
+
whereClauses.push(`(${statusExpr}) IN (${placeholders})`);
|
|
287
|
+
params.push(...input.status);
|
|
288
|
+
paramIdx += input.status.length;
|
|
289
|
+
}
|
|
290
|
+
if (input.functionName && input.functionName.length > 0) {
|
|
291
|
+
const placeholders = input.functionName.map((_, i) => `$${paramIdx + i}`).join(', ');
|
|
292
|
+
whereClauses.push(`function_name IN (${placeholders})`);
|
|
293
|
+
params.push(...input.functionName);
|
|
294
|
+
paramIdx += input.functionName.length;
|
|
295
|
+
}
|
|
296
|
+
if (input.workflowIdPrefix && input.workflowIdPrefix.length > 0) {
|
|
297
|
+
const likeClauses = input.workflowIdPrefix.map((p) => {
|
|
298
|
+
params.push(`${p}%`);
|
|
299
|
+
return `workflow_uuid LIKE $${paramIdx++}`;
|
|
300
|
+
});
|
|
301
|
+
whereClauses.push(`(${likeClauses.join(' OR ')})`);
|
|
302
|
+
}
|
|
303
|
+
if (input.completedAfter) {
|
|
304
|
+
whereClauses.push(`completed_at_epoch_ms >= $${paramIdx}`);
|
|
305
|
+
params.push(new Date(input.completedAfter).getTime());
|
|
306
|
+
paramIdx++;
|
|
307
|
+
}
|
|
308
|
+
if (input.completedBefore) {
|
|
309
|
+
whereClauses.push(`completed_at_epoch_ms <= $${paramIdx}`);
|
|
310
|
+
params.push(new Date(input.completedBefore).getTime());
|
|
311
|
+
paramIdx++;
|
|
312
|
+
}
|
|
313
|
+
// Unset scopes to this application, as on every other observability query.
|
|
314
|
+
whereClauses.push(sysdb.observabilityFilter('application_name', input.applicationName, params));
|
|
315
|
+
paramIdx = params.length + 1;
|
|
316
|
+
const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';
|
|
317
|
+
const groupByClause = groupColumns.join(', ');
|
|
318
|
+
const selectClause = [...groupSelectColumns, ...selectColumns].join(', ');
|
|
319
|
+
const query = `
|
|
320
|
+
SELECT ${selectClause}
|
|
321
|
+
FROM "${sysdb.schemaName}".operation_outputs
|
|
322
|
+
${whereClause}
|
|
323
|
+
GROUP BY ${groupByClause}
|
|
324
|
+
`;
|
|
325
|
+
const result = await sysdb.observabilityQuery((client) => client.query(query, params));
|
|
326
|
+
const toIntOrNull = (v) => (v === null || v === undefined ? null : Number(v));
|
|
327
|
+
return result.rows.map((row) => {
|
|
328
|
+
const group = {};
|
|
329
|
+
for (const name of groupNames) {
|
|
330
|
+
const v = row[name];
|
|
331
|
+
group[name] = v === null || v === undefined ? null : String(v);
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
group,
|
|
335
|
+
count: selectNames.includes('count') ? toIntOrNull(row.count) : null,
|
|
336
|
+
maxDurationMs: selectNames.includes('max_duration_ms') ? toIntOrNull(row.max_duration_ms) : null,
|
|
337
|
+
};
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
exports.getStepAggregates = getStepAggregates;
|
|
341
|
+
async function getMetrics(sysdb, startTime, endTime, applicationName) {
|
|
342
|
+
return (0, system_database_1.withDbRetry)(async () => {
|
|
343
|
+
const startEpochMs = new Date(startTime).getTime();
|
|
344
|
+
const endEpochMs = new Date(endTime).getTime();
|
|
345
|
+
const workflowParams = [startEpochMs, endEpochMs];
|
|
346
|
+
const workflowScope = sysdb.observabilityFilter('application_name', applicationName, workflowParams);
|
|
347
|
+
const stepParams = [startEpochMs, endEpochMs];
|
|
348
|
+
const stepScope = sysdb.observabilityFilter('application_name', applicationName, stepParams);
|
|
349
|
+
const [workflowResult, stepResult] = await sysdb.observabilityQuery(async (client) => [
|
|
350
|
+
await client.query(`SELECT name, COUNT(workflow_uuid) as count
|
|
351
|
+
FROM "${sysdb.schemaName}".workflow_status
|
|
352
|
+
WHERE created_at >= $1 AND created_at < $2 AND ${workflowScope}
|
|
353
|
+
GROUP BY name`, workflowParams),
|
|
354
|
+
await client.query(`SELECT function_name, COUNT(*) as count
|
|
355
|
+
FROM "${sysdb.schemaName}".operation_outputs
|
|
356
|
+
WHERE completed_at_epoch_ms >= $1 AND completed_at_epoch_ms < $2 AND ${stepScope}
|
|
357
|
+
GROUP BY function_name`, stepParams),
|
|
358
|
+
]);
|
|
359
|
+
const metrics = [];
|
|
360
|
+
for (const row of workflowResult.rows) {
|
|
361
|
+
metrics.push({
|
|
362
|
+
metricType: 'workflow_count',
|
|
363
|
+
metricName: row.name,
|
|
364
|
+
value: Number(row.count),
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
for (const row of stepResult.rows) {
|
|
368
|
+
metrics.push({
|
|
369
|
+
metricType: 'step_count',
|
|
370
|
+
metricName: row.function_name,
|
|
371
|
+
value: Number(row.count),
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return metrics;
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
exports.getMetrics = getMetrics;
|
|
378
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../../src/observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type SystemDatabase } from '@dbos-inc/dbos-sdk/internal/system_database';
|
|
2
|
+
/**
|
|
3
|
+
* Re-run a batch that lost a deadlock or serialization race. The database already rolled it
|
|
4
|
+
* back, so replaying it is safe.
|
|
5
|
+
*/
|
|
6
|
+
export declare function retryOnSerializationError<T>(operation: () => Promise<T>): Promise<T>;
|
|
7
|
+
/**
|
|
8
|
+
* The pg_try_advisory_lock argument for one schema's retention round: the leading 8 bytes of
|
|
9
|
+
* SHA-256 over a fixed string, read as a signed big-endian 64-bit integer. Separate locks for
|
|
10
|
+
* separate schemas. Every DBOS SDK derives the key this way, so rounds in different languages
|
|
11
|
+
* against one system database contend for the same lock; changing it here changes it everywhere.
|
|
12
|
+
*/
|
|
13
|
+
export declare function retentionLockKey(schemaName: string): bigint;
|
|
14
|
+
export declare const DEFAULT_GC_BATCH_SIZE = 50000;
|
|
15
|
+
/**
|
|
16
|
+
* Take a database-wide lock for one retention round, returning how to release it, or
|
|
17
|
+
* undefined when another round already holds it. The lock is session-scoped, so a round
|
|
18
|
+
* that crashes releases it. CockroachDB has no advisory locks and always takes it, so it
|
|
19
|
+
* collects unprotected rather than not at all.
|
|
20
|
+
*/
|
|
21
|
+
export declare function acquireRetentionLock(sysdb: SystemDatabase): Promise<{
|
|
22
|
+
release: () => Promise<void>;
|
|
23
|
+
} | undefined>;
|
|
24
|
+
/**
|
|
25
|
+
* Delete payload and step rows below the cutoff whose workflow is gone, returning the count
|
|
26
|
+
* removed from each table. Runs after the status sweep, whose orphans all fall in range:
|
|
27
|
+
* every payload is stamped no later than the completion that made the row collectable.
|
|
28
|
+
*/
|
|
29
|
+
export declare function collectPayloads(sysdb: SystemDatabase, cutoff: number, batchSize?: number): Promise<number[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Delete old terminal workflows throughout the system database, returning the cutoff
|
|
32
|
+
* actually used, or undefined when there is nothing to collect.
|
|
33
|
+
*
|
|
34
|
+
* Conductor sends cleared retention thresholds as JSON null, so every param is nullish.
|
|
35
|
+
*/
|
|
36
|
+
export declare function collectStatuses(sysdb: SystemDatabase, cutoffEpochTimestampMs?: number | null, rowsThreshold?: number | null, options?: {
|
|
37
|
+
batchSize?: number | null;
|
|
38
|
+
}): Promise<number | undefined>;
|
|
39
|
+
/**
|
|
40
|
+
* IDs of this application's in-flight workflows created at or before the cutoff.
|
|
41
|
+
* Claiming-scoped, so an upgrade still times out its own unclaimed workflows.
|
|
42
|
+
*/
|
|
43
|
+
export declare function listTimedOutWorkflowIds(sysdb: SystemDatabase, cutoffEpochTimestampMs: number): Promise<string[]>;
|
|
44
|
+
/** Enforce retention across the entire system database. */
|
|
45
|
+
export declare function garbageCollect(sysdb: SystemDatabase, cutoffEpochTimestampMs?: number | null, rowsThreshold?: number | null, options?: {
|
|
46
|
+
batchSize?: number | null;
|
|
47
|
+
}): Promise<void>;
|
|
48
|
+
export declare function globalTimeout(sysdb: SystemDatabase, cutoffEpochTimestampMs: number): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/retention.ts"],"names":[],"mappings":"AAKA,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,6CAA6C,CAAC;AAwCrD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0B1F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAGD,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAoB5C;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,SAAS,CAAC,CA2CvD;AA2GD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAA8B,GACxC,OAAO,CAAC,MAAM,EAAE,CAAC,CA0CnB;AA2DD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,EACrB,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,EACtC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,EAC7B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC1C,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA+D7B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,cAAc,EACrB,sBAAsB,EAAE,MAAM,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBnB;AAED,2DAA2D;AAC3D,wBAAsB,cAAc,CAClC,KAAK,EAAE,cAAc,EACrB,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,EACtC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,EAC7B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC1C,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxG"}
|