From f9f73dbc4719448521658696e8d1a199b01c2fd6 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 14 Jun 2024 14:31:07 -0700 Subject: [PATCH] Implemented ping type for monitors, added cleanup for job queue --- Server/index.js | 10 ++++++++++ Server/models/Monitor.js | 5 +++++ Server/package-lock.json | 10 ++++++++++ Server/package.json | 1 + Server/service/jobQueue.js | 33 ++++++++++++++++++++++++++++++--- Server/validation/joi.js | 3 ++- 6 files changed, 58 insertions(+), 4 deletions(-) diff --git a/Server/index.js b/Server/index.js index 0d5be15ea..eab64e36d 100644 --- a/Server/index.js +++ b/Server/index.js @@ -93,6 +93,16 @@ const startApp = async () => { await connectDbAndRunServer(app, db); const jobQueue = await JobQueue.createJobQueue(db); + + const cleanup = async () => { + console.log("Shutting down gracefully"); + await jobQueue.obliterate(); + console.log("Finished cleanup"); + process.exit(0); + }; + + process.on("SIGINT", cleanup); + process.on("SIGTERM", cleanup); }; startApp().catch((error) => { diff --git a/Server/models/Monitor.js b/Server/models/Monitor.js index 4aaad1497..8455aa312 100644 --- a/Server/models/Monitor.js +++ b/Server/models/Monitor.js @@ -14,6 +14,11 @@ const MonitorSchema = mongoose.Schema( description: { type: String, }, + type: { + type: String, + required: true, + enum: ["http", "ping"], + }, url: { type: String, required: true, diff --git a/Server/package-lock.json b/Server/package-lock.json index 9b8273ebd..edfb2ef44 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -21,6 +21,7 @@ "jsonwebtoken": "9.0.2", "mailersend": "^2.2.0", "mongoose": "^8.3.3", + "ping": "0.4.4", "winston": "^3.13.0" }, "devDependencies": { @@ -2205,6 +2206,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/ping": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.4.tgz", + "integrity": "sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", diff --git a/Server/package.json b/Server/package.json index 2d21452c1..3df37cda6 100644 --- a/Server/package.json +++ b/Server/package.json @@ -23,6 +23,7 @@ "jsonwebtoken": "9.0.2", "mailersend": "^2.2.0", "mongoose": "^8.3.3", + "ping": "0.4.4", "winston": "^3.13.0" }, "devDependencies": { diff --git a/Server/service/jobQueue.js b/Server/service/jobQueue.js index 58bbbfc09..cf0c795f4 100644 --- a/Server/service/jobQueue.js +++ b/Server/service/jobQueue.js @@ -8,6 +8,7 @@ const JOBS_PER_WORKER = 5; const logger = require("../utils/logger"); const SERVICE_NAME = "JobQueue"; const axios = require("axios"); +const ping = require("ping"); class JobQueue { /** @@ -35,6 +36,9 @@ class JobQueue { try { queue.db = db; const monitors = await db.getAllMonitors(); + for (const monitor of monitors) { + await queue.addJob(monitor.id, monitor); + } const workerStats = await queue.getWorkerStats(); await queue.scaleWorkers(workerStats); return queue; @@ -52,9 +56,25 @@ class JobQueue { const worker = new Worker( QUEUE_NAME, async (job) => { - const response = await axios.get(job.data.url); - // TODO create a check object and save it to the db - console.log(response.status); + // TODO Extract to service + if (job.data.type === "ping") { + const response = await ping.promise.probe(job.data.url); + // TODO insert checks into DB + if (response.alive === true) { + console.log(`${job.data.url} is alive`); + } else { + console.log(`${job.data.url} is dead`); + } + } else if (job.data.type === "http") { + const response = await axios.get(job.data.url); + // TODO create a check object and save it to the db + if (response.status >= 200 && response.status < 300) { + // TODO insert checks into DB + console.log(`${job.data.url} is alive`); + } else { + console.log(`${job.data.url} is dead`); + } + } }, { connection, @@ -215,12 +235,19 @@ class JobQueue { */ async obliterate() { try { + const jobs = await this.getJobs(); + for (const job of jobs) { + await this.queue.remove(job.id); + } + console.log(jobs); await this.queue.obliterate(); return true; } catch (error) { throw error; } } + + //TODO Cleanup Queue on shutdown } module.exports = JobQueue; diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 2277083e7..4316939b4 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -60,7 +60,8 @@ const monitorValidation = joi.object({ userId: joi.string().required(), name: joi.string().required(), description: joi.string().required(), - url: joi.string().uri().required(), + type: joi.string().required(), + url: joi.string().required(), isActive: joi.boolean(), interval: joi.number(), });