Skip to content

Commit cc5b52d

Browse files
committed
Add depth and related runs to the retrieve run API response
1 parent 86e5297 commit cc5b52d

File tree

10 files changed

+440
-124
lines changed

10 files changed

+440
-124
lines changed

apps/webapp/app/db.server.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { PrismaClient, Prisma } from "@trigger.dev/database";
1+
import { withOptimize } from "@prisma/extension-optimize";
2+
import { Prisma, PrismaClient } from "@trigger.dev/database";
23
import invariant from "tiny-invariant";
34
import { z } from "zod";
4-
import { logger } from "./services/logger.server";
55
import { env } from "./env.server";
6-
import { singleton } from "./utils/singleton";
6+
import { logger } from "./services/logger.server";
77
import { isValidDatabaseUrl } from "./utils/db";
8+
import { singleton } from "./utils/singleton";
89

910
export type PrismaTransactionClient = Omit<
1011
PrismaClient,
@@ -94,6 +95,7 @@ function getClient() {
9495
url: databaseUrl.href,
9596
},
9697
},
98+
// @ts-expect-error
9799
log: [
98100
{
99101
emit: "stdout",
@@ -107,25 +109,16 @@ function getClient() {
107109
emit: "stdout",
108110
level: "warn",
109111
},
110-
// {
111-
// emit: "stdout",
112-
// level: "query",
113-
// },
114-
// {
115-
// emit: "event",
116-
// level: "query",
117-
// },
118-
],
112+
].concat(
113+
process.env.VERBOSE_PRISMA_LOGS === "1"
114+
? [
115+
{ emit: "event", level: "query" },
116+
{ emit: "stdout", level: "query" },
117+
]
118+
: []
119+
),
119120
});
120121

121-
// client.$on("query", (e) => {
122-
// console.log(`Query tooks ${e.duration}ms`, {
123-
// query: e.query,
124-
// params: e.params,
125-
// duration: e.duration,
126-
// });
127-
// });
128-
129122
// connect eagerly
130123
client.$connect();
131124

@@ -153,6 +146,7 @@ function getReplicaClient() {
153146
url: replicaUrl.href,
154147
},
155148
},
149+
// @ts-expect-error
156150
log: [
157151
{
158152
emit: "stdout",
@@ -166,7 +160,14 @@ function getReplicaClient() {
166160
emit: "stdout",
167161
level: "warn",
168162
},
169-
],
163+
].concat(
164+
process.env.VERBOSE_PRISMA_LOGS === "1"
165+
? [
166+
{ emit: "event", level: "query" },
167+
{ emit: "stdout", level: "query" },
168+
]
169+
: []
170+
),
170171
});
171172

172173
// connect eagerly

apps/webapp/app/presenters/v3/ApiRetrieveRunPresenter.server.ts

Lines changed: 184 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
2222
showSecretDetails: boolean
2323
): Promise<RetrieveRunResponse | undefined> {
2424
return this.traceWithEnv("call", env, async (span) => {
25-
const taskRun = await this._prisma.taskRun.findUnique({
25+
const taskRun = await this._replica.taskRun.findFirst({
2626
where: {
2727
friendlyId,
2828
runtimeEnvironmentId: env.id,
@@ -36,6 +36,94 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
3636
lockedToVersion: true,
3737
schedule: true,
3838
tags: true,
39+
parentTaskRun: {
40+
select: {
41+
id: true,
42+
friendlyId: true,
43+
status: true,
44+
taskIdentifier: true,
45+
createdAt: true,
46+
startedAt: true,
47+
updatedAt: true,
48+
completedAt: true,
49+
expiredAt: true,
50+
delayUntil: true,
51+
ttl: true,
52+
tags: true,
53+
costInCents: true,
54+
baseCostInCents: true,
55+
usageDurationMs: true,
56+
idempotencyKey: true,
57+
isTest: true,
58+
depth: true,
59+
lockedToVersion: {
60+
select: {
61+
version: true,
62+
},
63+
},
64+
},
65+
},
66+
rootTaskRun: {
67+
select: {
68+
id: true,
69+
friendlyId: true,
70+
status: true,
71+
taskIdentifier: true,
72+
createdAt: true,
73+
startedAt: true,
74+
updatedAt: true,
75+
completedAt: true,
76+
expiredAt: true,
77+
delayUntil: true,
78+
ttl: true,
79+
tags: true,
80+
costInCents: true,
81+
baseCostInCents: true,
82+
usageDurationMs: true,
83+
idempotencyKey: true,
84+
isTest: true,
85+
depth: true,
86+
lockedToVersion: {
87+
select: {
88+
version: true,
89+
},
90+
},
91+
},
92+
},
93+
childRuns: {
94+
select: {
95+
id: true,
96+
taskIdentifier: true,
97+
friendlyId: true,
98+
resumeParentOnCompletion: true,
99+
status: true,
100+
createdAt: true,
101+
startedAt: true,
102+
updatedAt: true,
103+
completedAt: true,
104+
expiredAt: true,
105+
delayUntil: true,
106+
ttl: true,
107+
tags: true,
108+
costInCents: true,
109+
baseCostInCents: true,
110+
usageDurationMs: true,
111+
idempotencyKey: true,
112+
isTest: true,
113+
depth: true,
114+
lockedToVersion: {
115+
select: {
116+
version: true,
117+
},
118+
},
119+
batch: {
120+
select: {
121+
id: true,
122+
friendlyId: true,
123+
},
124+
},
125+
},
126+
},
39127
},
40128
});
41129

@@ -124,6 +212,7 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
124212
costInCents: taskRun.costInCents,
125213
baseCostInCents: taskRun.baseCostInCents,
126214
durationMs: taskRun.usageDurationMs,
215+
depth: taskRun.depth,
127216
schedule: taskRun.schedule
128217
? {
129218
id: taskRun.schedule.friendlyId,
@@ -150,6 +239,94 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
150239
completedAt: a.completedAt ?? undefined,
151240
error: ApiRetrieveRunPresenter.apiErrorFromError(a.error),
152241
})),
242+
relatedRuns: {
243+
root: taskRun.rootTaskRun
244+
? {
245+
id: taskRun.rootTaskRun.friendlyId,
246+
taskIdentifier: taskRun.rootTaskRun.taskIdentifier,
247+
idempotencyKey: taskRun.rootTaskRun.idempotencyKey ?? undefined,
248+
version: taskRun.rootTaskRun.lockedToVersion?.version,
249+
status: ApiRetrieveRunPresenter.apiStatusFromRunStatus(taskRun.rootTaskRun.status),
250+
createdAt: taskRun.rootTaskRun.createdAt,
251+
startedAt: taskRun.rootTaskRun.startedAt ?? undefined,
252+
updatedAt: taskRun.rootTaskRun.updatedAt,
253+
finishedAt: taskRun.rootTaskRun.completedAt ?? undefined,
254+
expiredAt: taskRun.rootTaskRun.expiredAt ?? undefined,
255+
delayedUntil: taskRun.rootTaskRun.delayUntil ?? undefined,
256+
ttl: taskRun.rootTaskRun.ttl ?? undefined,
257+
costInCents: taskRun.rootTaskRun.costInCents,
258+
baseCostInCents: taskRun.rootTaskRun.baseCostInCents,
259+
durationMs: taskRun.rootTaskRun.usageDurationMs,
260+
isTest: taskRun.rootTaskRun.isTest,
261+
depth: taskRun.rootTaskRun.depth,
262+
tags: taskRun.rootTaskRun.tags
263+
.map((t) => t.name)
264+
.sort((a, b) => a.localeCompare(b)),
265+
...ApiRetrieveRunPresenter.apiBooleanHelpersFromTaskRunStatus(
266+
taskRun.rootTaskRun.status
267+
),
268+
}
269+
: undefined,
270+
parent: taskRun.parentTaskRun
271+
? {
272+
id: taskRun.parentTaskRun.friendlyId,
273+
taskIdentifier: taskRun.parentTaskRun.taskIdentifier,
274+
idempotencyKey: taskRun.parentTaskRun.idempotencyKey ?? undefined,
275+
version: taskRun.parentTaskRun.lockedToVersion?.version,
276+
status: ApiRetrieveRunPresenter.apiStatusFromRunStatus(
277+
taskRun.parentTaskRun.status
278+
),
279+
createdAt: taskRun.parentTaskRun.createdAt,
280+
startedAt: taskRun.parentTaskRun.startedAt ?? undefined,
281+
updatedAt: taskRun.parentTaskRun.updatedAt,
282+
finishedAt: taskRun.parentTaskRun.completedAt ?? undefined,
283+
expiredAt: taskRun.parentTaskRun.expiredAt ?? undefined,
284+
delayedUntil: taskRun.parentTaskRun.delayUntil ?? undefined,
285+
isRoot: taskRun.parentTaskRun.id === taskRun.rootTaskRun?.id,
286+
ttl: taskRun.parentTaskRun.ttl ?? undefined,
287+
costInCents: taskRun.parentTaskRun.costInCents,
288+
baseCostInCents: taskRun.parentTaskRun.baseCostInCents,
289+
durationMs: taskRun.parentTaskRun.usageDurationMs,
290+
isTest: taskRun.parentTaskRun.isTest,
291+
depth: taskRun.parentTaskRun.depth,
292+
tags: taskRun.parentTaskRun.tags
293+
.map((t) => t.name)
294+
.sort((a, b) => a.localeCompare(b)),
295+
...ApiRetrieveRunPresenter.apiBooleanHelpersFromTaskRunStatus(
296+
taskRun.parentTaskRun.status
297+
),
298+
}
299+
: undefined,
300+
children: taskRun.childRuns.map((r) => ({
301+
id: r.friendlyId,
302+
taskIdentifier: r.taskIdentifier,
303+
idempotencyKey: r.idempotencyKey ?? undefined,
304+
version: r.lockedToVersion?.version,
305+
triggerFunction: r.batch
306+
? r.resumeParentOnCompletion
307+
? "batchTriggerAndWait"
308+
: "batchTrigger"
309+
: r.resumeParentOnCompletion
310+
? "triggerAndWait"
311+
: "trigger",
312+
batchId: r.batch?.friendlyId,
313+
status: ApiRetrieveRunPresenter.apiStatusFromRunStatus(r.status),
314+
createdAt: r.createdAt,
315+
startedAt: r.startedAt ?? undefined,
316+
updatedAt: r.updatedAt,
317+
finishedAt: r.completedAt ?? undefined,
318+
expiredAt: r.expiredAt ?? undefined,
319+
delayedUntil: r.delayUntil ?? undefined,
320+
ttl: r.ttl ?? undefined,
321+
tags: r.tags.map((t) => t.name).sort((a, b) => a.localeCompare(b)),
322+
costInCents: r.costInCents,
323+
baseCostInCents: r.baseCostInCents,
324+
durationMs: r.usageDurationMs,
325+
depth: r.depth,
326+
isTest: r.isTest,
327+
...ApiRetrieveRunPresenter.apiBooleanHelpersFromTaskRunStatus(r.status),
328+
})),
329+
},
153330
};
154331
});
155332
}
@@ -225,6 +402,12 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
225402
}
226403
}
227404

405+
static apiBooleanHelpersFromTaskRunStatus(status: TaskRunStatus) {
406+
return ApiRetrieveRunPresenter.apiBooleanHelpersFromRunStatus(
407+
ApiRetrieveRunPresenter.apiStatusFromRunStatus(status)
408+
);
409+
}
410+
228411
static apiBooleanHelpersFromRunStatus(status: RunStatus) {
229412
const isQueued = status === "QUEUED" || status === "WAITING_FOR_DEPLOY" || status === "DELAYED";
230413
const isExecuting = status === "EXECUTING" || status === "REATTEMPTING" || status === "FROZEN";

apps/webapp/app/v3/services/triggerTask.server.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export class TriggerTaskService extends BaseService {
109109
status: true,
110110
taskIdentifier: true,
111111
rootTaskRunId: true,
112+
depth: true,
112113
},
113114
},
114115
},
@@ -145,6 +146,7 @@ export class TriggerTaskService extends BaseService {
145146
status: true,
146147
taskIdentifier: true,
147148
rootTaskRunId: true,
149+
depth: true,
148150
},
149151
},
150152
},
@@ -163,6 +165,7 @@ export class TriggerTaskService extends BaseService {
163165
status: true,
164166
taskIdentifier: true,
165167
rootTaskRunId: true,
168+
depth: true,
166169
},
167170
},
168171
},
@@ -281,6 +284,14 @@ export class TriggerTaskService extends BaseService {
281284
}
282285
}
283286

287+
const depth = dependentAttempt
288+
? dependentAttempt.taskRun.depth + 1
289+
: parentAttempt
290+
? parentAttempt.taskRun.depth + 1
291+
: dependentBatchRun?.dependentTaskAttempt
292+
? dependentBatchRun.dependentTaskAttempt.taskRun.depth + 1
293+
: 0;
294+
284295
const taskRun = await tx.taskRun.create({
285296
data: {
286297
status: delayUntil ? "DELAYED" : "PENDING",
@@ -325,9 +336,9 @@ export class TriggerTaskService extends BaseService {
325336
parentAttempt?.taskRun.id ??
326337
dependentBatchRun?.dependentTaskAttempt?.taskRun.rootTaskRunId ??
327338
dependentBatchRun?.dependentTaskAttempt?.taskRun.id,
328-
329339
batchId: dependentBatchRun?.id ?? parentBatchRun?.id,
330340
resumeParentOnCompletion: !!(dependentAttempt ?? dependentBatchRun),
341+
depth,
331342
},
332343
});
333344

apps/webapp/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,4 +247,4 @@
247247
"engines": {
248248
"node": ">=16.0.0"
249249
}
250-
}
250+
}

0 commit comments

Comments
 (0)