From cf0df0e6d84a76649d8cbf8adcbf83efb6e883ab Mon Sep 17 00:00:00 2001 From: MohamedBassem Date: Fri, 12 Apr 2024 00:15:37 +0300 Subject: [PATCH] fix: Differentiate between pending in db and in redis in admin job stats --- apps/web/app/dashboard/admin/page.tsx | 18 ++++--- apps/workers/searchWorker.ts | 2 +- packages/trpc/routers/admin.ts | 70 ++++++++++++++++++++------- 3 files changed, 64 insertions(+), 26 deletions(-) diff --git a/apps/web/app/dashboard/admin/page.tsx b/apps/web/app/dashboard/admin/page.tsx index c1fa4dee..65ac44e1 100644 --- a/apps/web/app/dashboard/admin/page.tsx +++ b/apps/web/app/dashboard/admin/page.tsx @@ -163,24 +163,28 @@ function ServerStatsSection() { Job + Queued Pending Failed Crawling Jobs - {serverStats.pendingCrawls} - {serverStats.failedCrawls} + {serverStats.crawlStats.queuedInRedis} + {serverStats.crawlStats.pending} + {serverStats.crawlStats.failed} Indexing Jobs - {serverStats.pendingIndexing} - {serverStats.failedIndexing} + {serverStats.indexingStats.queuedInRedis} + - + - - OpenAI Jobs - {serverStats.pendingOpenai} - {serverStats.failedOpenai} + Inference Jobs + {serverStats.inferenceStats.queuedInRedis} + {serverStats.inferenceStats.pending} + {serverStats.inferenceStats.failed}
diff --git a/apps/workers/searchWorker.ts b/apps/workers/searchWorker.ts index fcef7a1b..42a28bc1 100644 --- a/apps/workers/searchWorker.ts +++ b/apps/workers/searchWorker.ts @@ -32,7 +32,7 @@ export class SearchIndexingWorker { worker.on("failed", (job, error) => { const jobId = job?.id ?? "unknown"; - logger.error(`[search][${jobId}] openai job failed: ${error}`); + logger.error(`[search][${jobId}] search job failed: ${error}`); }); return worker; diff --git a/packages/trpc/routers/admin.ts b/packages/trpc/routers/admin.ts index c88a9b00..8792f7ed 100644 --- a/packages/trpc/routers/admin.ts +++ b/packages/trpc/routers/admin.ts @@ -16,27 +16,44 @@ export const adminAppRouter = router({ z.object({ numUsers: z.number(), numBookmarks: z.number(), - pendingCrawls: z.number(), - failedCrawls: z.number(), - pendingIndexing: z.number(), - failedIndexing: z.number(), - pendingOpenai: z.number(), - failedOpenai: z.number(), + crawlStats: z.object({ + queuedInRedis: z.number(), + pending: z.number(), + failed: z.number(), + }), + inferenceStats: z.object({ + queuedInRedis: z.number(), + pending: z.number(), + failed: z.number(), + }), + indexingStats: z.object({ + queuedInRedis: z.number(), + }), }), ) .query(async ({ ctx }) => { const [ [{ value: numUsers }], [{ value: numBookmarks }], + + // Crawls + pendingCrawlsInRedis, [{ value: pendingCrawls }], [{ value: failedCrawls }], - pendingIndexing, - failedIndexing, - pendingOpenai, - failedOpenai, + + // Indexing + pendingIndexingInRedis, + + // Inference + pendingInferenceInRedis, + [{ value: pendingInference }], + [{ value: failedInference }], ] = await Promise.all([ ctx.db.select({ value: count() }).from(users), ctx.db.select({ value: count() }).from(bookmarks), + + // Crawls + LinkCrawlerQueue.getWaitingCount(), ctx.db .select({ value: count() }) .from(bookmarkLinks) @@ -45,21 +62,38 @@ export const adminAppRouter = router({ .select({ value: count() }) .from(bookmarkLinks) .where(eq(bookmarkLinks.crawlStatus, "failure")), + + // Indexing SearchIndexingQueue.getWaitingCount(), - SearchIndexingQueue.getFailedCount(), + + // Inference OpenAIQueue.getWaitingCount(), - OpenAIQueue.getFailedCount(), + ctx.db + .select({ value: count() }) + .from(bookmarks) + .where(eq(bookmarks.taggingStatus, "pending")), + ctx.db + .select({ value: count() }) + .from(bookmarks) + .where(eq(bookmarks.taggingStatus, "failure")), ]); return { numUsers, numBookmarks, - pendingCrawls, - failedCrawls, - pendingIndexing, - failedIndexing, - pendingOpenai, - failedOpenai, + crawlStats: { + queuedInRedis: pendingCrawlsInRedis, + pending: pendingCrawls, + failed: failedCrawls, + }, + inferenceStats: { + queuedInRedis: pendingInferenceInRedis, + pending: pendingInference, + failed: failedInference, + }, + indexingStats: { + queuedInRedis: pendingIndexingInRedis, + }, }; }), recrawlLinks: adminProcedure