From 51058b6d2b19614248599aab4b7450801dded672 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Thu, 8 Aug 2024 11:20:54 -0700 Subject: [PATCH 1/2] Moved normalization to BE --- .../Charts/MonitorDetailsAreaChart/index.jsx | 8 +------- .../Charts/ResponseTimeChart/index.jsx | 6 ++---- .../UptimeMonitors/uptimeMonitorsSlice.js | 2 +- Client/src/Pages/Monitors/Details/index.jsx | 2 +- Client/src/Pages/Monitors/index.jsx | 2 +- Server/db/mongo/modules/monitorModule.js | 18 +++++++++++++++--- .../ChartUtils.js => Server/utils/dataUtils.js | 6 +++++- Server/validation/joi.js | 2 ++ 8 files changed, 28 insertions(+), 18 deletions(-) rename Client/src/Components/Charts/ChartUtils.js => Server/utils/dataUtils.js (93%) diff --git a/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx b/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx index b25c3b57b..863ba398f 100644 --- a/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx +++ b/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx @@ -1,6 +1,5 @@ import PropTypes from "prop-types"; import { AreaChart, Area, XAxis, Tooltip, ResponsiveContainer } from "recharts"; -import { NormalizeData } from "../ChartUtils"; import "./index.css"; const CustomToolTip = ({ active, payload, label }) => { @@ -47,17 +46,12 @@ const MonitorDetailsAreaChart = ({ checks, filter }) => { }); }; - let normalizedChecks = []; - if (checks && checks.length > 0) { - normalizedChecks = NormalizeData(checks, 10, 100); - } - return ( { - const normalizedChecks = NormalizeData(checks, 1, 100); return (
- {normalizedChecks.map((check, index) => ( + {checks.map((check, index) => ( { const fetchMonitor = useCallback(async () => { try { const res = await axiosInstance.get( - `/monitors/${monitorId}?sortOrder=asc&filter=${filter}&numToDisplay=50`, + `/monitors/${monitorId}?sortOrder=asc&filter=${filter}&numToDisplay=50&normalize=true`, { headers: { Authorization: `Bearer ${authToken}`, diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index d7f70e300..e56be39b2 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -145,7 +145,7 @@ const Monitors = () => { useEffect(() => { dispatch(getUptimeMonitorsByUserId(authState.authToken)); - }, []); + }, [authState.authToken, dispatch]); const up = monitorState.monitors.reduce((acc, cur) => { return cur.status === true ? acc + 1 : acc; diff --git a/Server/db/mongo/modules/monitorModule.js b/Server/db/mongo/modules/monitorModule.js index df9790003..15f431673 100644 --- a/Server/db/mongo/modules/monitorModule.js +++ b/Server/db/mongo/modules/monitorModule.js @@ -3,6 +3,7 @@ const Check = require("../../../models/Check"); const PageSpeedCheck = require("../../../models/PageSpeedCheck"); const { errorMessages } = require("../../../utils/messages"); const Notification = require("../../../models/Notification"); +const { NormalizeData } = require("../../../utils/dataUtils"); /** * Get all monitors @@ -32,7 +33,8 @@ const getAllMonitors = async (req, res) => { const getMonitorById = async (req, res) => { try { const { monitorId } = req.params; - let { status, limit, sortOrder, filter, numToDisplay } = req.query; + let { status, limit, sortOrder, filter, numToDisplay, normalize } = + req.query; const filterLookup = { day: new Date(new Date().setDate(new Date().getDate() - 1)), @@ -82,6 +84,11 @@ const getMonitorById = async (req, res) => { checks = checks.filter((_, index) => index % n === 0); } + // Normalize checks if requested + if (normalize) { + checks = NormalizeData(checks, 10, 100); + } + const notifications = await Notification.find({ monitorId: monitor._id }); const monitorWithChecks = { ...monitor.toObject(), checks, notifications }; return monitorWithChecks; @@ -100,7 +107,7 @@ const getMonitorById = async (req, res) => { */ const getMonitorsByUserId = async (req, res) => { try { - let { limit, type, status, sortOrder } = req.query; + let { limit, type, status, sortOrder, normalize } = req.query; const monitorQuery = { userId: req.params.userId }; if (type !== undefined) { @@ -133,13 +140,18 @@ const getMonitorsByUserId = async (req, res) => { : PageSpeedCheck; // Checks are order newest -> oldest - const checks = await model + let checks = await model .find(checksQuery) .sort({ createdAt: sortOrder, }) .limit(limit); + //Normalize checks if requested + if (normalize === true) { + checks = NormalizeData(checks, 10, 100); + } + // Get notifications const notifications = await Notification.find({ monitorId: monitor._id, diff --git a/Client/src/Components/Charts/ChartUtils.js b/Server/utils/dataUtils.js similarity index 93% rename from Client/src/Components/Charts/ChartUtils.js rename to Server/utils/dataUtils.js index 77d9d4c2d..88112013d 100644 --- a/Client/src/Components/Charts/ChartUtils.js +++ b/Server/utils/dataUtils.js @@ -11,7 +11,7 @@ const calculatePercentile = (arr, percentile) => { ); }; -export const NormalizeData = (checks, rangeMin, rangeMax) => { +const NormalizeData = (checks, rangeMin, rangeMax) => { if (checks.length > 1) { // Get the 5th and 95th percentile const min = calculatePercentile(checks, 0); @@ -44,3 +44,7 @@ export const NormalizeData = (checks, rangeMin, rangeMax) => { }); } }; + +module.exports = { + NormalizeData, +}; diff --git a/Server/validation/joi.js b/Server/validation/joi.js index e1032cb6d..8e3dbcfec 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -128,6 +128,7 @@ const getMonitorByIdQueryValidation = joi.object({ limit: joi.number(), filter: joi.string().valid("day", "week", "month"), numToDisplay: joi.number(), + normalize: joi.boolean(), }); const getMonitorsByUserIdValidation = joi.object({ @@ -138,6 +139,7 @@ const getMonitorsByUserIdQueryValidation = joi.object({ status: joi.boolean(), sortOrder: joi.string().valid("asc", "desc"), limit: joi.number(), + normalize: joi.boolean(), type: joi .alternatives() .try( From 284253638b6a6bf50eca8a63ef52cc7a1096d7f9 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Thu, 8 Aug 2024 11:32:48 -0700 Subject: [PATCH 2/2] Properly extract doc from mongoose model in Normalization --- Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx | 2 +- Server/utils/dataUtils.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx b/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx index 863ba398f..567de0b68 100644 --- a/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx +++ b/Client/src/Components/Charts/MonitorDetailsAreaChart/index.jsx @@ -27,7 +27,7 @@ const CustomToolTip = ({ active, payload, label }) => { return null; }; -const MonitorDetailsAreaChart = ({ checks, filter }) => { +const MonitorDetailsAreaChart = ({ checks }) => { // SQUASH ERROR, NOT PERMANENT SOLUTION const error = console.error; console.error = (...args) => { diff --git a/Server/utils/dataUtils.js b/Server/utils/dataUtils.js index 88112013d..3495cc3d6 100644 --- a/Server/utils/dataUtils.js +++ b/Server/utils/dataUtils.js @@ -19,6 +19,7 @@ const NormalizeData = (checks, rangeMin, rangeMax) => { const normalizedChecks = checks.map((check) => { const originalResponseTime = check.responseTime; + console.log(originalResponseTime); // Normalize the response time between 1 and 100 let normalizedResponseTime = rangeMin + @@ -31,7 +32,7 @@ const NormalizeData = (checks, rangeMin, rangeMax) => { Math.min(rangeMax, normalizedResponseTime) ); return { - ...check, + ...check._doc, responseTime: normalizedResponseTime, originalResponseTime: originalResponseTime, };