fix(previews): logging and promise fixes (#4137)

This commit is contained in:
Gergő Jedlicska
2025-03-10 10:22:02 +01:00
committed by GitHub
parent 8a580f86ec
commit a900aa3c7b
3 changed files with 29 additions and 29 deletions
+10 -20
View File
@@ -35,28 +35,22 @@ export const jobProcessor = async ({
port,
timeout
}: JobArgs): Promise<PreviewResultPayload> => {
const jobId = job.jobId
const jobLogger = logger.child({ jobId, serverUrl: job.url })
const start = new Date()
jobLogger.info('Picked up job {jobId} for {serverUrl}')
logger.info('Picked up job {jobId} for {serverUrl}')
const jobMessage =
'Processed job {jobId} with result {status}. It took {elapsed} seconds.'
let page: Page | undefined = undefined
try {
page = await browser.newPage()
const result = await pageFunction({ page, job, logger: jobLogger, port, timeout })
const result = await pageFunction({ page, job, logger, port, timeout })
const elapsed = (new Date().getTime() - start.getTime()) / 1000
jobLogger.info(
{ status: result.status, elapsed },
'Processes job {jobId} with result {status}. It took {elapsed} seconds.'
)
logger.info({ status: result.status, elapsed }, jobMessage)
return result
} catch (err) {
const elapsed = (new Date().getTime() - start.getTime()) / 1000
jobLogger.error(
{ err, elapsed },
'Failed to process {jobId} job. It took {elapsed} seconds'
)
logger.error({ err, elapsed }, jobMessage)
const reason =
err instanceof Error
? err.stack ?? err.toString()
@@ -90,14 +84,10 @@ const pageFunction = async ({
})
await page.goto(`http://127.0.0.1:${port}/index.html`)
page.setDefaultTimeout(timeout)
// page.setDefaultTimeout(deps.timeoutMilliseconds)
const previewResult = await Promise.race([
page.evaluate(async (job: JobPayload) => {
await window.load(job)
return await window.takeScreenshot()
}, job),
timeoutAt(timeout)
])
const previewResult = await page.evaluate(async (job: JobPayload) => {
await window.load(job)
return await window.takeScreenshot()
}, job)
return { jobId: job.jobId, status: 'success', result: previewResult }
}
+11 -4
View File
@@ -77,31 +77,38 @@ const server = app.listen(port, async () => {
// nothing after this line is getting called, this blocks
await jobQueue.process(async (payload, done) => {
let jobLogger = logger.child({ payloadId: payload.id })
try {
jobDoneCallback = done
const browser = await launchBrowser()
const parseResult = jobPayload.safeParse(payload.data)
if (!parseResult.success) {
logger.error({ parseError: parseResult.error }, 'Invalid job payload')
jobLogger.error(
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
{ parseError: parseResult.error, payload: payload.data },
'Invalid job payload'
)
return done(parseResult.error)
}
const job = parseResult.data
jobLogger = jobLogger.child({ jobId: job.jobId, serverUrl: job.url })
const resultsQueue = new Bull(job.responseQueue, opts)
const result = await jobProcessor({
logger,
logger: jobLogger,
browser,
job: parseResult.data,
port: PORT,
timeout: PREVIEW_TIMEOUT
})
const resultsQueue = new Bull(job.responseQueue, opts)
// with removeOnComplete, the job response potentially containing a large images,
// is cleared from the response queue
await resultsQueue.add(result, { removeOnComplete: true })
await browser.close()
done()
} catch (err) {
logger.error({ err }, 'Job processing failed')
jobLogger.error({ err }, 'Processing {jobId} failed')
if (err instanceof Error) {
done(err)
} else {
@@ -73,12 +73,18 @@ export const consumePreviewResultFactory =
const priority = 0
const previewStatus = 2
const log = logger.child({
...previewResult,
jobId: previewResult.jobId,
status: previewResult.status,
durationSeconds: previewResult.result.durationSeconds,
projectId: streamId
})
const previewMessage =
'Consumed preview generation {status} message payload for {jobId}.'
switch (previewResult.status) {
case 'error':
log.error(previewMessage)
await upsertObjectPreview({
objectPreview: {
objectId,
@@ -89,13 +95,10 @@ export const consumePreviewResultFactory =
previewStatus
}
})
log.error('Preview generation failed for {jobId}.')
// store preview error in the db
break
case 'success':
log.info('Consumed preview generation {status} message payload for {jobId}.')
log.info(previewMessage)
const preview: Record<string, string> = {}
const allImgsArr: Buffer[] = []
let i = 0