standardize log statements

This commit is contained in:
Alex Holliday committed 2024-10-24 15:28:13 +08:00
1 parent 6984eb8a70
commit a0248c81c2
12 files changed
+167 -115

No files matched your search

+7 -5
View File
@@ -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,
});
});
+4 -2
View File
@@ -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,
});
});
+34 -36
View File
@@ -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,
+10 -6
View File
@@ -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,
});
}
};
+7 -3
View File
@@ -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,
});
}
+19 -9
View File
@@ -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);
});
+3 -1
View File
@@ -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 });
};
+3 -1
View File
@@ -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;
+9 -2
View File
@@ -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 });
}
+13 -7
View File
@@ -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,
});
}
};
+34 -24
View File
@@ -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;
+24 -19
View File
@@ -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,
});
}
}