From a0248c81c2d64e629c09053d5371a90cb7c01b77 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Thu, 24 Oct 2024 15:28:13 +0800 Subject: [PATCH] standardize log statements --- Server/controllers/authController.js | 12 +++-- Server/controllers/inviteController.js | 6 ++- Server/controllers/monitorController.js | 70 ++++++++++++------------- Server/db/mongo/MongoDB.js | 16 +++--- Server/db/mongo/modules/checkModule.js | 10 ++-- Server/index.js | 28 ++++++---- Server/middleware/handleErrors.js | 4 +- Server/middleware/verifyOwnership.js | 4 +- Server/middleware/verifySuperAdmin.js | 11 +++- Server/service/emailService.js | 20 ++++--- Server/service/jobQueue.js | 58 +++++++++++--------- Server/service/networkService.js | 43 ++++++++------- 12 files changed, 167 insertions(+), 115 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index fa59b4d05..2e0a8e270 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -79,10 +79,10 @@ const registerUser = async (req, res, next) => { } const newUser = await req.db.insertUser({ ...req.body }, req.file); - - logger.info(successMessages.AUTH_CREATE_USER, { + logger.info({ + message: successMessages.AUTH_CREATE_USER, service: SERVICE_NAME, - userId: newUser._id, + details: newUser._id, }); const userForToken = { ...newUser._doc }; @@ -102,9 +102,11 @@ const registerUser = async (req, res, next) => { "Welcome to Uptime Monitor" ) .catch((error) => { - logger.error("Error sending welcome email", { + logger.error({ + message: error.message, service: SERVICE_NAME, - error: error.message, + method: "registerUser", + stack: error.stack, }); }); diff --git a/Server/controllers/inviteController.js b/Server/controllers/inviteController.js index 72e3d99a3..96b19cc56 100644 --- a/Server/controllers/inviteController.js +++ b/Server/controllers/inviteController.js @@ -53,9 +53,11 @@ const issueInvitation = async (req, res, next) => { "Welcome to Uptime Monitor" ) .catch((error) => { - logger.error("Error sending invite email", { + logger.error({ + message: error.message, service: SERVICE_NAME, - error: error.message, + method: "issueInvitation", + stack: error.stack, }); }); diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index 24761089f..3479ecf69 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -3,7 +3,7 @@ import { getMonitorByIdQueryValidation, getMonitorsByTeamIdValidation, createMonitorBodyValidation, - getMonitorURLByQueryValidation, + getMonitorURLByQueryValidation, editMonitorBodyValidation, getMonitorsAndSummaryByTeamIdParamValidation, getMonitorsAndSummaryByTeamIdQueryValidation, @@ -270,32 +270,32 @@ const createMonitor = async (req, res, next) => { * @throws {Error} If there is an error during the process, especially if there is a validation error (422). */ const checkEndpointResolution = async (req, res, next) => { - try { + try { await getMonitorURLByQueryValidation.validateAsync(req.query); } catch (error) { next(handleValidationError(error, SERVICE_NAME)); return; } - try { - let { monitorURL } = req.query; - monitorURL = new URL(monitorURL); - await new Promise((resolve, reject) => { - dns.resolve(monitorURL.hostname, (error) => { - if (error) { - reject(error); - } - resolve(); - }); - }); - return res.status(200).json({ - success: true, - msg: `URL resolved successfully`, - }); - } catch (error) { - next(handleError(error, SERVICE_NAME, "checkEndpointResolution")); - } -} + try { + let { monitorURL } = req.query; + monitorURL = new URL(monitorURL); + await new Promise((resolve, reject) => { + dns.resolve(monitorURL.hostname, (error) => { + if (error) { + reject(error); + } + resolve(); + }); + }); + return res.status(200).json({ + success: true, + msg: `URL resolved successfully`, + }); + } catch (error) { + next(handleError(error, SERVICE_NAME, "checkEndpointResolution")); + } +}; /** * Deletes a monitor by its ID and also deletes associated checks, alerts, and notifications. @@ -325,14 +325,12 @@ const deleteMonitor = async (req, res, next) => { await req.db.deletePageSpeedChecksByMonitorId(monitor._id); await req.db.deleteNotificationsByMonitorId(monitor._id); } catch (error) { - logger.error( - `Error deleting associated records for monitor ${monitor._id} with name ${monitor.name}`, - { - method: "deleteMonitor", - service: SERVICE_NAME, - error: error.message, - } - ); + logger.error({ + message: `Error deleting associated records for monitor ${monitor._id} with name ${monitor.name}`, + service: SERVICE_NAME, + method: "deleteMonitor", + stack: error.stack, + }); } return res.status(200).json({ success: true, msg: successMessages.MONITOR_DELETE }); } catch (error) { @@ -365,12 +363,12 @@ const deleteAllMonitors = async (req, res, next) => { await req.db.deletePageSpeedChecksByMonitorId(monitor._id); await req.db.deleteNotificationsByMonitorId(monitor._id); } catch (error) { - logger.error( - `Error deleting associated records for monitor ${monitor._id} with name ${monitor.name}`, - { - method: "deleteAllMonitors", - } - ); + logger.error({ + message: `Error deleting associated records for monitor ${monitor._id} with name ${monitor.name}`, + service: SERVICE_NAME, + method: "deleteAllMonitors", + stack: error.stack, + }); } }) ); @@ -517,7 +515,7 @@ export { getMonitorsAndSummaryByTeamId, getMonitorsByTeamId, createMonitor, - checkEndpointResolution, + checkEndpointResolution, deleteMonitor, deleteAllMonitors, editMonitor, diff --git a/Server/db/mongo/MongoDB.js b/Server/db/mongo/MongoDB.js index 2fa01ebed..22460eff4 100644 --- a/Server/db/mongo/MongoDB.js +++ b/Server/db/mongo/MongoDB.js @@ -19,11 +19,13 @@ const connect = async () => { appSettings = new AppSettings({}); await appSettings.save(); } - logger.info("Connected to MongoDB", { service: SERVICE_NAME, method: "connect" }); + logger.info({ message: "Connected to MongoDB" }); } catch (error) { - logger.error("failed to connect to MongoDB", { + logger.error({ + message: error.message, service: SERVICE_NAME, method: "connect", + stack: error.stack, }); throw error; } @@ -31,14 +33,16 @@ const connect = async () => { const disconnect = async () => { try { - logger.info("Disconnecting from MongoDB", { service: SERVICE_NAME }); + logger.info({ message: "Disconnecting from MongoDB" }); await mongoose.disconnect(); - logger.info("Disconnected from MongoDB", { service: SERVICE_NAME }); + logger.info({ message: "Disconnected from MongoDB" }); return; } catch (error) { - logger.error("failed to disconnect from MongoDB", { + logger.error({ + message: error.message, service: SERVICE_NAME, - errorMsg: error.message, + method: "disconnect", + stack: error.stack, }); } }; diff --git a/Server/db/mongo/modules/checkModule.js b/Server/db/mongo/modules/checkModule.js index c01dceb07..eb9cc9f5c 100644 --- a/Server/db/mongo/modules/checkModule.js +++ b/Server/db/mongo/modules/checkModule.js @@ -30,9 +30,11 @@ const createCheck = async (checkData) => { const monitor = await Monitor.findById(monitorId); if (!monitor) { - logger.error("Monitor not found", { + logger.error({ + message: "Monitor not found", service: SERVICE_NAME, - monitorId, + method: "createCheck", + details: `monitor ID: ${monitorId}`, }); return; } @@ -248,9 +250,11 @@ const updateChecksTTL = async (teamId, ttl) => { try { await Check.collection.dropIndex("expiry_1"); } catch (error) { - logger.error("Failed to drop index", { + logger.error({ + message: error.message, service: SERVICE_NAME, method: "updateChecksTTL", + stack: error.stack, }); } diff --git a/Server/index.js b/Server/index.js index 05e8145e0..6ee0e0249 100644 --- a/Server/index.js +++ b/Server/index.js @@ -89,10 +89,15 @@ const startApp = async () => { //health check app.use("/api/v1/healthy", (req, res) => { try { - logger.info("Checking Health of the server."); + logger.info({ message: "Checking Health of the server." }); return res.status(200).json({ message: "Healthy" }); } catch (error) { - logger.error(error.message); + logger.error({ + message: error.message, + service: SERVICE_NAME, + method: "healthCheck", + stack: error.stack, + }); return res.status(500).json({ message: error.message }); } }); @@ -106,7 +111,7 @@ const startApp = async () => { // Create services await db.connect(); app.listen(PORT, () => { - console.log(`server started on port:${PORT}`); + logger.info({ message: `server started on port:${PORT}` }); }); const settingsService = new SettingsService(AppSettings); @@ -132,19 +137,21 @@ const startApp = async () => { const cleanup = async () => { if (cleaningUp) { - console.log("Already cleaning up"); + logger.warn({ message: "Already cleaning up" }); return; } cleaningUp = true; try { - console.log("Shutting down gracefully"); + logger.info({ message: "shutting down gracefully" }); await jobQueue.obliterate(); await db.disconnect(); - console.log("Finished cleanup"); + logger.info({ message: "shut down gracefully" }); } catch (error) { - logger.error(errorMessages.JOB_QUEUE_DELETE_JOB, { + logger.error({ + message: error.message, service: SERVICE_NAME, - errorMsg: error.message, + method: "cleanup", + stack: error.stack, }); } process.exit(0); @@ -155,8 +162,11 @@ const startApp = async () => { }; startApp().catch((error) => { - logger.error(error.message, { + logger.error({ + message: error.message, service: SERVICE_NAME, + method: "startApp", + stack: error.stack, }); process.exit(1); }); diff --git a/Server/middleware/handleErrors.js b/Server/middleware/handleErrors.js index 51b880878..bff2341c3 100644 --- a/Server/middleware/handleErrors.js +++ b/Server/middleware/handleErrors.js @@ -5,9 +5,11 @@ const handleErrors = (error, req, res, next) => { const status = error.status || 500; const message = error.message || errorMessages.FRIENDLY_ERROR; const service = error.service || errorMessages.UNKNOWN_SERVICE; - logger.error(error.message, { + logger.error({ + message: message, service: service, method: error.method, + stack: error.stack, }); res.status(status).json({ success: false, msg: message }); }; diff --git a/Server/middleware/verifyOwnership.js b/Server/middleware/verifyOwnership.js index 37c19b42b..d812dd543 100644 --- a/Server/middleware/verifyOwnership.js +++ b/Server/middleware/verifyOwnership.js @@ -10,8 +10,10 @@ const verifyOwnership = (Model, paramName) => { const doc = await Model.findById(documentId); //If the document is not found, return a 404 error if (!doc) { - logger.error(errorMessages.VERIFY_OWNER_NOT_FOUND, { + logger.error({ + message: errorMessages.VERIFY_OWNER_NOT_FOUND, service: SERVICE_NAME, + method: "verifyOwnership", }); const error = new Error(errorMessages.VERIFY_OWNER_NOT_FOUND); error.status = 404; diff --git a/Server/middleware/verifySuperAdmin.js b/Server/middleware/verifySuperAdmin.js index 073526791..a8d9d1b6e 100644 --- a/Server/middleware/verifySuperAdmin.js +++ b/Server/middleware/verifySuperAdmin.js @@ -37,8 +37,12 @@ const verifySuperAdmin = (req, res, next) => { jwt.verify(parsedToken, jwtSecret, (err, decoded) => { if (err) { - logger.error(errorMessages.INVALID_AUTH_TOKEN, { + logger.error({ + message: err.message, service: SERVICE_NAME, + method: "verifySuperAdmin", + stack: err.stack, + details: errorMessages.INVALID_AUTH_TOKEN, }); return res .status(401) @@ -46,8 +50,11 @@ const verifySuperAdmin = (req, res, next) => { } if (decoded.role.includes("superadmin") === false) { - logger.error(errorMessages.INVALID_AUTH_TOKEN, { + logger.error({ + message: errorMessages.INVALID_AUTH_TOKEN, service: SERVICE_NAME, + method: "verifySuperAdmin", + stack: err.stack, }); return res.status(401).json({ success: false, msg: errorMessages.UNAUTHORIZED }); } diff --git a/Server/service/emailService.js b/Server/service/emailService.js index 519162ba0..668a0094a 100644 --- a/Server/service/emailService.js +++ b/Server/service/emailService.js @@ -44,9 +44,11 @@ class EmailService { const templateContent = this.fs.readFileSync(templatePath, "utf8"); return this.compile(templateContent); } catch (error) { - this.logger.error("Error loading Email templates", { - error, - service: this.SERVICE_NAME, + this.logger.error({ + message: error.message, + service: SERVICE_NAME, + method: "loadTemplate", + stack: error.stack, }); } }; @@ -102,9 +104,11 @@ class EmailService { const html = await this.mjml2html(mjml); return html.html; } catch (error) { - this.logger.error("Error building Email HTML", { - error, + this.logger.error({ + message: error.message, service: SERVICE_NAME, + method: "buildAndSendEmail", + stack: error.stack, }); } }; @@ -118,9 +122,11 @@ class EmailService { }); return info; } catch (error) { - this.logger.error("Error sending Email", { - error, + this.logger.error({ + message: error.message, service: SERVICE_NAME, + method: "sendEmail", + stack: error.stack, }); } }; diff --git a/Server/service/jobQueue.js b/Server/service/jobQueue.js index cafcd1aa2..bb9457399 100644 --- a/Server/service/jobQueue.js +++ b/Server/service/jobQueue.js @@ -107,16 +107,19 @@ class JobQueue { if (!maintenanceWindowActive) { await this.networkService.getStatus(job); } else { - this.logger.info(`Monitor ${monitorId} is in maintenance window`, { + this.logger.info({ + message: `Monitor ${monitorId} is in maintenance window`, service: SERVICE_NAME, - monitorId, + method: "createWorker", }); } } catch (error) { - this.logger.error(`Error processing job ${job.id}: ${error.message}`, { + this.logger.error({ + message: error.message, service: SERVICE_NAME, - jobId: job.id, - error: error, + method: "createWorker", + details: `Error processing job ${job.id}: ${error.message}`, + stack: error.stack, }); } }, @@ -197,14 +200,15 @@ class JobQueue { while (workersToRemove > 0 && this.workers.length > 5) { const worker = this.workers.pop(); workersToRemove--; - try { - await worker.close(); - } catch (error) { + await worker.close().catch((error) => { // Catch the error instead of throwing it - this.logger.error(errorMessages.JOB_QUEUE_WORKER_CLOSE, { + this.logger.error({ + message: error.message, service: SERVICE_NAME, + method: "scaleWorkers", + stack: error.stack, }); - } + }); } return true; } @@ -282,20 +286,24 @@ class JobQueue { */ async deleteJob(monitor) { try { - const deleted = await this.queue.removeRepeatable(monitor._id, { + const wasDeleted = await this.queue.removeRepeatable(monitor._id, { every: monitor.interval, }); - if (deleted) { - this.logger.info(successMessages.JOB_QUEUE_DELETE_JOB, { + if (wasDeleted === true) { + this.logger.info({ + message: successMessages.JOB_QUEUE_DELETE_JOB, service: SERVICE_NAME, - jobId: monitor.id, + method: "deleteJob", + details: `Deleted job ${monitor._id}`, }); const workerStats = await this.getWorkerStats(); await this.scaleWorkers(workerStats); } else { - this.logger.error(errorMessages.JOB_QUEUE_DELETE_JOB, { + this.logger.error({ + message: errorMessages.JOB_QUEUE_DELETE_JOB, service: SERVICE_NAME, - jobId: monitor.id, + method: "deleteJob", + details: `Failed to delete job ${monitor._id}`, }); } } catch (error) { @@ -315,12 +323,16 @@ class JobQueue { delayed: await this.queue.getDelayedCount(), repeatableJobs: (await this.queue.getRepeatableJobs()).length, }; - console.log(metrics); + this.logger.info({ + message: metrics, + }); return metrics; } catch (error) { - this.logger.error("Failed to retrieve job queue metrics", { + this.logger.error({ + message: error.message, service: SERVICE_NAME, - errorMsg: error.message, + method: "getMetrics", + stack: error.stack, }); } } @@ -332,7 +344,7 @@ class JobQueue { async obliterate() { try { let metrics = await this.getMetrics(); - console.log(metrics); + this.logger.info({ message: metrics }); await this.queue.pause(); const jobs = await this.getJobs(); @@ -348,10 +360,8 @@ class JobQueue { await this.queue.obliterate(); metrics = await this.getMetrics(); - console.log(metrics); - this.logger.info(successMessages.JOB_QUEUE_OBLITERATE, { - service: SERVICE_NAME, - }); + this.logger.info({ message: metrics }); + this.logger.info({ message: successMessages.JOB_QUEUE_OBLITERATE }); return true; } catch (error) { error.service === undefined ? (error.service = SERVICE_NAME) : null; diff --git a/Server/service/networkService.js b/Server/service/networkService.js index e90180835..3f2a98965 100644 --- a/Server/service/networkService.js +++ b/Server/service/networkService.js @@ -56,10 +56,12 @@ class NetworkService { } } } catch (error) { - this.logger.error(error.message, { - method: "handleNotification", + this.logger.error({ + message: error.message, service: this.SERVICE_NAME, - monitorId: monitor._id, + method: "handleNotification", + details: `notification error for monitor: ${monitor._id}`, + stack: error.stack, }); } } @@ -79,19 +81,18 @@ class NetworkService { try { monitor = await this.db.getMonitorById(_id); } catch (error) { + this.logger.error({ + message: error.message, + service: this.SERVICE_NAME, + method: "handleStatusUpdate", + stack: error.stack, + details: `monitor lookup error for monitor: ${_id}`, + }); return; } // Otherwise, try to update monitor status try { - if (monitor === null || monitor === undefined) { - this.logger.error(`Null Monitor: ${_id}`, { - method: "handleStatusUpdate", - service: this.SERVICE_NAME, - jobId: job.id, - }); - return; - } if (monitor.status === undefined || monitor.status !== isAlive) { const oldStatus = monitor.status; monitor.status = isAlive; @@ -102,10 +103,12 @@ class NetworkService { } } } catch (error) { - this.logger.error(error.message, { - method: "handleStatusUpdate", + this.logger.error({ + message: error.message, service: this.SERVICE_NAME, - jobId: job.id, + method: "handleStatusUpdate", + stack: error.stack, + details: `status update error for monitor: ${_id}`, }); } } @@ -391,11 +394,12 @@ class NetworkService { case this.TYPE_HARDWARE: return await this.handleHardware(job); default: - this.logger.error(`Unsupported type: ${job.data.type}`, { + this.logger.error({ + message: `Unsupported type: ${job.data.type}`, service: this.SERVICE_NAME, method: "getStatus", - jobId: job.id, }); + return false; } } @@ -417,11 +421,12 @@ class NetworkService { } throw new Error(); } catch (error) { - this.logger.error(`Error writing check for ${data.monitorId}`, { + this.logger.error({ + message: error.message, service: this.SERVICE_NAME, method: "logAndStoreCheck", - monitorId: data.monitorId, - error: error, + details: `Error writing check for ${data.monitorId}`, + stack: error.stack, }); } }