From a61bb7510c0d742e866ed7ff0fcf8cb6c54906e4 Mon Sep 17 00:00:00 2001 From: zk Date: Fri, 19 Jun 2026 17:38:38 +0100 Subject: [PATCH] feat: allow quiet cronjobs (#1696) Co-authored-by: zk <--global> --- typescript/server/src/lib/jobs/cron/cron-registry.ts | 7 +++++++ typescript/server/src/lib/jobs/cron/cron-service.ts | 4 +++- typescript/server/src/lib/jobs/drain-dirty-queues.ts | 10 +++++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/typescript/server/src/lib/jobs/cron/cron-registry.ts b/typescript/server/src/lib/jobs/cron/cron-registry.ts index f084fdd04..320d737b1 100644 --- a/typescript/server/src/lib/jobs/cron/cron-registry.ts +++ b/typescript/server/src/lib/jobs/cron/cron-registry.ts @@ -22,6 +22,12 @@ export interface CronTaskDef { schedule: string; /** Shown in admin and synced to `cron_task.description`. */ description: string; + /** + * When true, the scheduler logs completion at debug instead of info, and the task's own + * routine logs should also be at debug. Use for high-frequency tasks whose output is too + * noisy at info level. + */ + quiet?: boolean; run: () => Promise; } @@ -59,6 +65,7 @@ function buildList(): Array { schedule: "* * * * *", // TODO(zk): really? this is so lazy description: "Drain score_rederive, pb_dirty, session_dirty, game_profile_dirty (ordered)", + quiet: true, run: drainStatsQueuesInOrder, }, ]; diff --git a/typescript/server/src/lib/jobs/cron/cron-service.ts b/typescript/server/src/lib/jobs/cron/cron-service.ts index 94bec3990..11946123d 100644 --- a/typescript/server/src/lib/jobs/cron/cron-service.ts +++ b/typescript/server/src/lib/jobs/cron/cron-service.ts @@ -158,7 +158,9 @@ export async function runCronTickOnce(): Promise { }) .where("cron_task_execution.id", "=", execRow.id) .execute(); - log.info(`Cron task ${def.id} completed for fire ${scheduledAtIso}.`); + (def.quiet ? log.debug : log.info)( + `Cron task ${def.id} completed for fire ${scheduledAtIso}.`, + ); } catch (err) { const message = err instanceof Error ? err.message : String(err); log.error({ err }, `Cron task ${def.id} failed.`); diff --git a/typescript/server/src/lib/jobs/drain-dirty-queues.ts b/typescript/server/src/lib/jobs/drain-dirty-queues.ts index 171c9bbcd..32ad0ee79 100644 --- a/typescript/server/src/lib/jobs/drain-dirty-queues.ts +++ b/typescript/server/src/lib/jobs/drain-dirty-queues.ts @@ -80,7 +80,7 @@ export async function drainPbDirty(): Promise { }); } - log.info(`Drained ${rows.length} pb_dirty entries across ${groups.size} user/game groups.`); + log.debug(`Drained ${rows.length} pb_dirty entries across ${groups.size} user/game groups.`); return rows.length; } @@ -186,7 +186,7 @@ export async function drainSessionDirty(): Promise { .execute(); } - log.info(`Drained ${rows.length} session_dirty entries.`); + log.debug(`Drained ${rows.length} session_dirty entries.`); return rows.length; } @@ -211,7 +211,7 @@ export async function drainGameProfileDirty(): Promise { }); } - log.info(`Drained ${rows.length} game_profile_dirty entries.`); + log.debug(`Drained ${rows.length} game_profile_dirty entries.`); return rows.length; } @@ -254,7 +254,7 @@ export async function drainStatsQueuesInOrder(): Promise { .executeTakeFirst(), ]); - log.info( + log.debug( { score_rederive: Number(queueSizes[0]?.n ?? 0), pb_dirty: Number(queueSizes[1]?.n ?? 0), @@ -330,7 +330,7 @@ export async function drainStatsQueuesInOrder(): Promise { const elapsedMs = Date.now() - tickStart; - log.info({ elapsedMs }, "drainStatsQueuesInOrder: tick complete"); + log.debug({ elapsedMs }, "drainStatsQueuesInOrder: tick complete"); } /**