diff --git a/Client/src/Pages/Infrastructure/details/data.js b/Client/src/Pages/Infrastructure/details/data.js deleted file mode 100644 index f945ae525..000000000 --- a/Client/src/Pages/Infrastructure/details/data.js +++ /dev/null @@ -1,133 +0,0 @@ -function generateMonitorEntries(monitorId, count = 10, options = {}) { - const defaultOptions = { - timeRange: { - start: new Date(Date.now() - 24 * 60 * 60 * 1000 * 20), - end: new Date(), - }, - statusVariation: [true, false], - responseTimeRange: [50, 500], - cpuUsageRange: [0, 1], - memoryUsageRange: [0, 1], - diskUsageRange: [0, 1], - }; - - const mergedOptions = { ...defaultOptions, ...options }; - const startTime = mergedOptions.timeRange.start.getTime(); - const endTime = mergedOptions.timeRange.end.getTime(); - const totalTimeSpan = endTime - startTime; - - // Generate sorted random time points - const timePoints = Array.from({ length: count }, (_, index) => { - // Use a non-linear distribution to create more varied spacing - const progress = Math.pow(Math.random(), 2); // Bias towards earlier times - return startTime + progress * totalTimeSpan; - }).sort((a, b) => a - b); - - return timePoints.map((timestamp) => { - const createdAt = new Date(timestamp); - - return { - _id: "123", - monitorId: monitorId, - status: randomFromArray(mergedOptions.statusVariation), - responseTime: randomInRange(mergedOptions.responseTimeRange), - statusCode: randomStatusCode(), - message: randomMessage(), - cpu: { - physical_core: randomInRange([4, 8]), - logical_core: randomInRange([4, 16]), - frequency: randomInRange([10, 4000]), - temperature: randomInRange([20, 90]), - free_percent: 1 - randomInRange(mergedOptions.cpuUsageRange), - usage_percent: randomInRange(mergedOptions.cpuUsageRange), - _id: "123", - }, - memory: { - total_bytes: randomInRange([8, 32]) * 1024 * 1024 * 1024, - available_bytes: randomInRange([4, 16]) * 1024 * 1024 * 1024, - used_bytes: randomInRange([4, 16]) * 1024 * 1024 * 1024, - usage_percent: randomInRange(mergedOptions.memoryUsageRange), - _id: "123", - }, - disk: [ - { - read_speed_bytes: randomInRange([100, 1000]) * 1024 * 1024, - write_speed_bytes: randomInRange([100, 1000]) * 1024 * 1024, - total_bytes: randomInRange([100, 1000]) * 1024 * 1024 * 1024, - free_bytes: randomInRange([50, 500]) * 1024 * 1024 * 1024, - usage_percent: randomInRange(mergedOptions.diskUsageRange), - _id: "123", - }, - ], - host: { - os: randomOS(), - platform: randomPlatform(), - kernel_version: randomKernelVersion(), - _id: "123", - }, - errors: randomErrors(), - expiry: new Date(createdAt.getTime() + 365 * 24 * 60 * 60 * 1000), - createdAt: createdAt, - updatedAt: createdAt, - __v: 0, - }; - }); -} - -// Modify randomInRange to work with decimal ranges -function randomInRange([min, max]) { - return Number((Math.random() * (max - min) + min).toFixed(2)); -} - -// ... rest of the code remains the same -function randomFromArray(arr) { - return arr[Math.floor(Math.random() * arr.length)]; -} - -function randomStatusCode() { - const statusCodes = [200, 201, 204, 400, 401, 403, 404, 500, 502, 503]; - return randomFromArray(statusCodes); -} - -function randomMessage() { - const messages = [ - "OK", - "Created", - "No Content", - "Bad Request", - "Unauthorized", - "Forbidden", - "Not Found", - "Internal Server Error", - ]; - return randomFromArray(messages); -} - -function randomOS() { - const oss = ["Windows", "Linux", "macOS", "Ubuntu", "CentOS"]; - return randomFromArray(oss); -} - -function randomPlatform() { - const platforms = ["x64", "x86", "ARM", "ARM64"]; - return randomFromArray(platforms); -} - -function randomKernelVersion() { - return `${randomInRange([4, 6])}.${randomInRange([0, 20])}.${randomInRange([0, 100])}`; -} - -function randomErrors() { - const possibleErrors = [ - "Network timeout", - "Connection refused", - "SSL certificate error", - "DNS resolution failed", - "", - ]; - return Math.random() < 0.2 ? [randomFromArray(possibleErrors)] : []; -} - -// Usage -const monitorId = "123"; -export const monitorData = generateMonitorEntries(monitorId, 20); diff --git a/Client/src/Pages/Infrastructure/details/index.jsx b/Client/src/Pages/Infrastructure/details/index.jsx index bf31e8d27..40db34b80 100644 --- a/Client/src/Pages/Infrastructure/details/index.jsx +++ b/Client/src/Pages/Infrastructure/details/index.jsx @@ -1,10 +1,11 @@ -import { monitorData } from "./data"; import { useParams } from "react-router-dom"; +import { useEffect, useState } from "react"; import Breadcrumbs from "../../../Components/Breadcrumbs"; import { Stack, Box, Typography } from "@mui/material"; import { useTheme } from "@emotion/react"; import CustomGauge from "../../../Components/Charts/CustomGauge"; import AreaChart from "../../../Components/Charts/AreaChart"; +import axios from "axios"; import { TzTick, PercentTick, @@ -17,11 +18,18 @@ import PropTypes from "prop-types"; * @param {number} bytes - Number of bytes to convert * @returns {number} Converted value in gigabytes */ -const bytesToGB = (bytes) => { - if (typeof bytes !== "number") return 0; - if (bytes === 0) return 0; +const formatBytes = (bytes) => { + if (typeof bytes !== "number") return "0 GB"; + if (bytes === 0) return "0 GB"; + const GB = bytes / (1024 * 1024 * 1024); - return Number(GB.toFixed(0)); + const MB = bytes / (1024 * 1024); + + if (GB >= 1) { + return `${Number(GB.toFixed(0))} GB`; + } else { + return `${Number(MB.toFixed(0))} MB`; + } }; /** @@ -130,12 +138,12 @@ const GaugeBox = ({ value, heading, metricOne, valueOne, metricTwo, valueTwo }) }; GaugeBox.propTypes = { - value: PropTypes.number.isRequired, + value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, heading: PropTypes.string.isRequired, metricOne: PropTypes.string.isRequired, - valueOne: PropTypes.string.isRequired, + valueOne: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, metricTwo: PropTypes.string.isRequired, - valueTwo: PropTypes.string.isRequired, + valueTwo: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, }; /** @@ -145,189 +153,207 @@ GaugeBox.propTypes = { const InfrastructureDetails = () => { const theme = useTheme(); const { monitorId } = useParams(); - const testData = monitorData; - const latestCheck = testData[testData.length - 1]; const navList = [ { name: "infrastructure monitors", path: "/infrastructure" }, { name: "details", path: `/infrastructure/${monitorId}` }, ]; + const [monitor, setMonitor] = useState(null); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await axios.get("http://localhost:5000/api/v1/dummy-data", { + headers: { + "Content-Type": "application/json", + "Cache-Control": "no-cache", + }, + }); + setMonitor(response.data.data); + } catch (error) { + console.error(error); + } + }; + fetchData(); + }, []); return ( - - - + monitor && ( + + - - - - - - - - - - {latestCheck.disk.map((disk, idx) => { - return ( - + + + + + + + + + + {monitor.checks[0].disk.map((disk, idx) => { + return ( + + ); + })} + + *": { + flexBasis: `calc(50% - ${theme.spacing(8)})`, + maxWidth: `calc(50% - ${theme.spacing(8)})`, + }, + }} + > + + + Memory usage + + ( + + )} + xTick={} + yTick={} + strokeColor={theme.palette.primary.main} + gradient={true} + gradientStartColor={theme.palette.primary.main} //FE team HELP! Not sure what colors to use + gradientEndColor="#ffffff" // FE team HELP! /> - ); - })} + + + + CPU usage + + ( + + )} + xTick={} + yTick={} + strokeColor={theme.palette.success.main} // FE team HELP! + gradient={true} + fill={theme.palette.success.main} // FE team HELP! + gradientStartColor={theme.palette.success.main} + gradientEndColor="#ffffff" + /> + + {monitor?.checks?.[0]?.disk?.map((disk, idx) => { + // disk is an array of disks, so we need to map over it + return ( + + + {`Disk${idx} usage`} + + ( + + )} + xTick={} + yTick={} + strokeColor={theme.palette.warning.main} + gradient={true} + gradientStartColor={theme.palette.warning.main} + gradientEndColor="#ffffff" + /> + + ); + })} + - *": { - flexBasis: `calc(50% - ${theme.spacing(8)})`, - maxWidth: `calc(50% - ${theme.spacing(8)})`, - }, - }} - > - - - Memory usage - - ( - - )} - xTick={} - yTick={} - strokeColor={theme.palette.primary.main} - gradient={true} - gradientStartColor={theme.palette.primary.main} //FE team HELP! Not sure what colors to use - gradientEndColor="#ffffff" // FE team HELP! - /> - - - - CPU usage - - ( - - )} - xTick={} - yTick={} - strokeColor={theme.palette.success.main} // FE team HELP! - gradient={true} - fill={theme.palette.success.main} // FE team HELP! - gradientStartColor={theme.palette.success.main} - gradientEndColor="#ffffff" - /> - - {latestCheck.disk.map((disk, idx) => { - // disk is an array of disks, so we need to map over it - return ( - - - {`Disk${idx} usage`} - - ( - - )} - xTick={} - yTick={} - strokeColor={theme.palette.warning.main} - gradient={true} - gradientStartColor={theme.palette.warning.main} - gradientEndColor="#ffffff" - /> - - ); - })} - - - + + ) ); };