fix(previews): logging and promise fixes (#4137)
This commit is contained in:
@@ -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 }
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user