cron: keep usage telemetry in run log types + error paths

This commit is contained in:
Rob Dunn
2026-02-16 08:58:19 -07:00
committed by Peter Steinberger
parent ddea5458d0
commit dbe2ab6f62
2 changed files with 37 additions and 2 deletions

View File

@@ -589,6 +589,7 @@ export async function runCronIsolatedAgentTurn(params: {
error: resolvedDelivery.error.message,
summary,
outputText,
...telemetry,
});
}
logWarn(`[cron:${params.job.id}] ${resolvedDelivery.error.message}`);
@@ -602,6 +603,7 @@ export async function runCronIsolatedAgentTurn(params: {
error: message,
summary,
outputText,
...telemetry,
});
}
logWarn(`[cron:${params.job.id}] ${message}`);
@@ -639,7 +641,7 @@ export async function runCronIsolatedAgentTurn(params: {
}
} catch (err) {
if (!deliveryBestEffort) {
return withRunSession({ status: "error", summary, outputText, error: String(err) });
return withRunSession({ status: "error", summary, outputText, error: String(err), ...telemetry });
}
}
} else if (synthesizedText) {
@@ -730,13 +732,14 @@ export async function runCronIsolatedAgentTurn(params: {
summary,
outputText,
error: message,
...telemetry,
});
}
logWarn(`[cron:${params.job.id}] ${message}`);
}
} catch (err) {
if (!deliveryBestEffort) {
return withRunSession({ status: "error", summary, outputText, error: String(err) });
return withRunSession({ status: "error", summary, outputText, error: String(err), ...telemetry });
}
logWarn(`[cron:${params.job.id}] ${String(err)}`);
}

View File

@@ -13,6 +13,17 @@ export type CronRunLogEntry = {
runAtMs?: number;
durationMs?: number;
nextRunAtMs?: number;
// Telemetry (best-effort)
model?: string;
provider?: string;
usage?: {
input_tokens?: number;
output_tokens?: number;
total_tokens?: number;
cache_read_tokens?: number;
cache_write_tokens?: number;
};
};
export function resolveCronRunLogPath(params: { storePath: string; jobId: string }) {
@@ -105,6 +116,27 @@ export async function readCronRunLogEntries(
runAtMs: obj.runAtMs,
durationMs: obj.durationMs,
nextRunAtMs: obj.nextRunAtMs,
model: typeof obj.model === "string" && obj.model.trim() ? obj.model : undefined,
provider: typeof obj.provider === "string" && obj.provider.trim() ? obj.provider : undefined,
usage:
obj.usage && typeof obj.usage === "object"
? {
input_tokens:
typeof (obj.usage as any).input_tokens === "number" ? (obj.usage as any).input_tokens : undefined,
output_tokens:
typeof (obj.usage as any).output_tokens === "number" ? (obj.usage as any).output_tokens : undefined,
total_tokens:
typeof (obj.usage as any).total_tokens === "number" ? (obj.usage as any).total_tokens : undefined,
cache_read_tokens:
typeof (obj.usage as any).cache_read_tokens === "number"
? (obj.usage as any).cache_read_tokens
: undefined,
cache_write_tokens:
typeof (obj.usage as any).cache_write_tokens === "number"
? (obj.usage as any).cache_write_tokens
: undefined,
}
: undefined,
};
if (typeof obj.sessionId === "string" && obj.sessionId.trim().length > 0) {
entry.sessionId = obj.sessionId;