Skip to content

Commit e11d4d9

Browse files
feat: track per-stage resource usage in pipeline run records
1 parent 4f5e9b9 commit e11d4d9

2 files changed

Lines changed: 12 additions & 3 deletions

File tree

scripts/orchestrator/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ function mapStageResults({
192192
status: string;
193193
durationMs?: number;
194194
error?: string | null;
195+
resourceUsage?: ProcessResourceUsage;
195196
}> = [];
196197
const completedMap = new Map<string, StageExecutionResult<ResolvedStageDefinition>>();
197198
for (const entry of completedStages) {
@@ -224,11 +225,12 @@ function mapStageResults({
224225
}
225226

226227
if (completedMap.has(stage.id)) {
227-
const { durationMs } = completedMap.get(stage.id)!;
228+
const { durationMs, resourceUsage } = completedMap.get(stage.id)!;
228229
results.push({
229230
...base,
230231
status: "succeeded",
231-
durationMs
232+
durationMs,
233+
...(resourceUsage ? { resourceUsage } : {})
232234
});
233235
continue;
234236
}

scripts/orchestrator/stage-executor.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import process from "node:process";
22
import { spawn } from "node:child_process";
3+
import { createResourceMonitor } from "./resource-monitor.ts";
34
import type { StageCommand, StageDefinition } from "./stage-graph.ts";
5+
import type { ProcessResourceUsage } from "./resource-monitor.ts";
46

57
export interface StageExecutionContext {
68
cwd: string;
@@ -10,6 +12,7 @@ export interface StageExecutionContext {
1012
export interface StageExecutionResult<TStage extends StageDefinition = StageDefinition> {
1113
stage: TStage;
1214
durationMs: number;
15+
resourceUsage?: ProcessResourceUsage;
1316
}
1417

1518
export interface StageProgressDetails {
@@ -117,6 +120,8 @@ export async function runStagesSequentially<TStage extends StageDefinition>(
117120
logger?.start?.(stage, { stepNumber, total, message });
118121

119122
const startedAt = Date.now();
123+
const stageMonitor = createResourceMonitor();
124+
stageMonitor.start();
120125

121126
try {
122127
await executeStage(stage, { cwd, env, stageRunner });
@@ -126,6 +131,7 @@ export async function runStagesSequentially<TStage extends StageDefinition>(
126131
}
127132
}
128133
catch (error) {
134+
stageMonitor.stop();
129135
logger?.fail?.(stage, { stepNumber, total, message, error });
130136

131137
if (error instanceof Error) {
@@ -141,10 +147,11 @@ export async function runStagesSequentially<TStage extends StageDefinition>(
141147
}
142148

143149
const durationMs = Date.now() - startedAt;
150+
const resourceUsage = stageMonitor.stop() ?? undefined;
144151
const formattedDuration = formatDuration(durationMs);
145152
logger?.succeed?.(stage, { stepNumber, total, message, durationMs, formattedDuration });
146153

147-
results.push({ stage, durationMs });
154+
results.push({ stage, durationMs, resourceUsage });
148155
}
149156
}
150157
finally {

0 commit comments

Comments
 (0)