From 22a341ea4d7365fb51781f96791394315afd8860 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Sat, 15 Feb 2025 22:15:51 +0100 Subject: [PATCH] feat: downgrade log level callback succeeded (#2329) --- packages/common/src/stopwatch.ts | 7 +++++++ packages/cron-jobs-core/src/creator.ts | 11 ++++++++++- packages/cron-jobs-core/src/logger.ts | 5 +++++ packages/cron-jobs/src/jobs/icons-updater.ts | 1 + packages/cron-jobs/src/lib/index.ts | 4 ++++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/common/src/stopwatch.ts b/packages/common/src/stopwatch.ts index ed15476f6..33693631c 100644 --- a/packages/common/src/stopwatch.ts +++ b/packages/common/src/stopwatch.ts @@ -1,9 +1,12 @@ import dayjs from "dayjs"; +import duration from "dayjs/plugin/duration"; import relativeTime from "dayjs/plugin/relativeTime"; import updateLocale from "dayjs/plugin/updateLocale"; dayjs.extend(relativeTime); dayjs.extend(updateLocale); +dayjs.extend(duration); + dayjs.updateLocale("en", { relativeTime: { future: "in %s", @@ -38,6 +41,10 @@ export class Stopwatch { return dayjs().millisecond(this.startTime).fromNow(true); } + getElapsedInMilliseconds() { + return performance.now() - this.startTime; + } + reset() { this.startTime = performance.now(); } diff --git a/packages/cron-jobs-core/src/creator.ts b/packages/cron-jobs-core/src/creator.ts index a25535db6..3987ad82f 100644 --- a/packages/cron-jobs-core/src/creator.ts +++ b/packages/cron-jobs-core/src/creator.ts @@ -16,6 +16,7 @@ export interface CreateCronJobCreatorOptions { interface CreateCronJobOptions { runOnStart?: boolean; + expectedMaximumDurationInMillis?: number; beforeStart?: () => MaybePromise; } @@ -25,6 +26,7 @@ const createCallback = , ) => { + const expectedMaximumDurationInMillis = options.expectedMaximumDurationInMillis ?? 1000; return (callback: () => MaybePromise) => { const catchingCallbackAsync = async () => { try { @@ -34,9 +36,16 @@ const createCallback = expectedMaximumDurationInMillis) { + creatorOptions.logger.logWarning( + `The callback of '${name}' succeeded but took ${(durationInMillis - expectedMaximumDurationInMillis).toFixed(2)}ms longer than expected (${expectedMaximumDurationInMillis}ms). This may indicate that your network performance, host performance or something else is too slow. If this happens too often, it should be looked into.`, + ); + } await creatorOptions.onCallbackSuccess?.(name); } catch (error) { // eslint-disable-next-line @typescript-eslint/restrict-template-expressions diff --git a/packages/cron-jobs-core/src/logger.ts b/packages/cron-jobs-core/src/logger.ts index 2ff1a8030..73628b31c 100644 --- a/packages/cron-jobs-core/src/logger.ts +++ b/packages/cron-jobs-core/src/logger.ts @@ -2,6 +2,7 @@ export interface Logger { logDebug(message: string): void; logInfo(message: string): void; logError(error: unknown): void; + logWarning(message: string): void; } export class ConsoleLogger implements Logger { @@ -16,4 +17,8 @@ export class ConsoleLogger implements Logger { public logError(error: unknown) { console.error(error); } + + public logWarning(message: string) { + console.warn(message); + } } diff --git a/packages/cron-jobs/src/jobs/icons-updater.ts b/packages/cron-jobs/src/jobs/icons-updater.ts index d278e7b87..814ed47a8 100644 --- a/packages/cron-jobs/src/jobs/icons-updater.ts +++ b/packages/cron-jobs/src/jobs/icons-updater.ts @@ -11,6 +11,7 @@ import { createCronJob } from "../lib"; export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { runOnStart: true, + expectedMaximumDurationInMillis: 10 * 1000, }).withCallback(async () => { logger.info("Updating icon repository cache..."); const stopWatch = new Stopwatch(); diff --git a/packages/cron-jobs/src/lib/index.ts b/packages/cron-jobs/src/lib/index.ts index b0bc4f243..28516fc53 100644 --- a/packages/cron-jobs/src/lib/index.ts +++ b/packages/cron-jobs/src/lib/index.ts @@ -16,6 +16,10 @@ class WinstonCronJobLogger implements Logger { logError(error: unknown) { logger.error(error); } + + logWarning(message: string) { + logger.warn(message); + } } export const { createCronJob, createCronJobGroup } = createCronJobFunctions<