diff --git a/packages/preview-service/package.json b/packages/preview-service/package.json index 23a39884b..3ee4919a4 100644 --- a/packages/preview-service/package.json +++ b/packages/preview-service/package.json @@ -27,6 +27,7 @@ "build": "tsc -p ./tsconfig.build.json" }, "dependencies": { + "@godaddy/terminus": "^4.12.1", "@speckle/shared": "workspace:^", "bull": "^4.16.4", "dotenv": "^16.4.7", diff --git a/packages/preview-service/src/main.ts b/packages/preview-service/src/main.ts index 641898fc3..7bfce860e 100644 --- a/packages/preview-service/src/main.ts +++ b/packages/preview-service/src/main.ts @@ -15,6 +15,7 @@ import { jobProcessor } from '@/jobProcessor.js' import { Redis, RedisOptions } from 'ioredis' import { jobPayload } from '@speckle/shared/dist/esm/previews/job.js' import { initMetrics, initPrometheusRegistry } from '@/metrics.js' +import { createTerminus } from '@godaddy/terminus' const app = express() const host = HOST @@ -122,25 +123,32 @@ const server = app.listen(port, host, async () => { }) }) -const shutdown = async () => { - // stop accepting new jobs +const beforeShutdown = async () => { + logger.info('🛑 Beginning shut down, pausing all jobs') + // stop accepting new jobs and kill any running jobs await jobQueue.pause( true, // just pausing this local worker of the queue true // do not wait for active jobs to finish ) - // if there is a job currently running, cancell it with an error if (jobDoneCallback) { - jobDoneCallback(new Error('Job cancelled due to perview-service shutdown')) + logger.warn('Cancelling job due to preview-service shutdown') + jobDoneCallback(new Error('Job cancelled due to preview-service shutdown')) } - - logger.info('Received signal to shut down') - server.close(() => { - logger.debug('Exiting the express server') - process.exit() - }) } -process.on('SIGINT', async () => await shutdown()) -process.on('SIGQUIT', async () => await shutdown()) -process.on('SIGABRT', async () => await shutdown()) +const onShutdown = async () => { + logger.info('👋 Completed shut down, now exiting') +} + +createTerminus(server, { + beforeShutdown, + onShutdown, + logger: (msg, err) => { + if (err) { + logger.error({ err }, msg) + return + } + logger.info(msg) + } +}) diff --git a/packages/server/modules/previews/resultListener.ts b/packages/server/modules/previews/resultListener.ts index 1d3ca199c..23b2f08da 100644 --- a/packages/server/modules/previews/resultListener.ts +++ b/packages/server/modules/previews/resultListener.ts @@ -84,7 +84,7 @@ export const consumePreviewResultFactory = switch (previewResult.status) { case 'error': - log.error(previewMessage) + log.error({ reason: previewResult.reason }, previewMessage) await upsertObjectPreview({ objectPreview: { objectId, diff --git a/yarn.lock b/yarn.lock index 0f1d5306a..77cc393fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10526,6 +10526,15 @@ __metadata: languageName: node linkType: hard +"@godaddy/terminus@npm:^4.12.1": + version: 4.12.1 + resolution: "@godaddy/terminus@npm:4.12.1" + dependencies: + stoppable: "npm:^1.1.0" + checksum: 10/e1b6e0a079db5748c71211e22d2fc1ab76ee20763bb552e9e2b6003330c0b19fee10b20b1dd961218a402c6aadd3a8ecf7f03ecdfaa2c65ed072b2479eb9b517 + languageName: node + linkType: hard + "@godaddy/terminus@npm:^4.9.0": version: 4.10.2 resolution: "@godaddy/terminus@npm:4.10.2" @@ -16752,6 +16761,7 @@ __metadata: version: 0.0.0-use.local resolution: "@speckle/preview-service@workspace:packages/preview-service" dependencies: + "@godaddy/terminus": "npm:^4.12.1" "@speckle/shared": "workspace:^" "@swc/cli": "npm:^0.5.1" "@swc/core": "npm:^1.9.3"