diff --git a/server/job/job-lifecycle.js b/server/job/job-lifecycle.js index c2ea72737..7f97e098b 100644 --- a/server/job/job-lifecycle.js +++ b/server/job/job-lifecycle.js @@ -3,6 +3,7 @@ const queries = require("../graphql-client/queries"); const moment = require("moment"); const durationToHumanReadable = require("../utils/durationToHumanReadable"); const calculateStatusDuration = require("../utils/calculateStatusDuration"); +const getLifecycleStatusColor = require("../utils/getLifecycleStatusColor"); const jobLifecycle = async (req, res) => { // Grab the jobids and statuses from the request body @@ -34,6 +35,7 @@ const jobLifecycle = async (req, res) => { const transitionsByJobId = _.groupBy(resp.transitions, 'jobid'); const groupedTransitions = {}; + const allDurations = []; for (let jobId in transitionsByJobId) { let lifecycle = transitionsByJobId[jobId].map(transition => { @@ -53,15 +55,52 @@ const jobLifecycle = async (req, res) => { return transition; }); + const durations = calculateStatusDuration(lifecycle, statuses); + groupedTransitions[jobId] = { - lifecycle: lifecycle, - durations: calculateStatusDuration(lifecycle, statuses), + lifecycle, + durations }; + + if (durations?.summations) { + allDurations.push(durations.summations); + } } + + const finalSummations = []; + const flatGroupedAllDurations = _.groupBy(allDurations.flat(),'status'); + + // Calculate total value of all statuses + const finalTotal = Object.values(flatGroupedAllDurations).reduce((total, statusArr) => { + return total + statusArr.reduce((acc, curr) => acc + curr.value, 0); + }, 0); + + Object.keys(flatGroupedAllDurations).forEach(status => { + const value = flatGroupedAllDurations[status].reduce((acc, curr) => acc + curr.value, 0); + const humanReadable = durationToHumanReadable(moment.duration(value)); + const percentage = (value / finalTotal) * 100; + const color = getLifecycleStatusColor(status); + const roundedPercentage = `${Math.round(percentage)}%`; + finalSummations.push({ + status, + value, + humanReadable, + percentage, + color, + roundedPercentage + }); + }); + return res.status(200).json({ jobIDs, transition: groupedTransitions, + durations: { + summations: finalSummations, + totalStatuses: finalSummations.length, + total: finalTotal, + humanReadable: durationToHumanReadable(moment.duration(finalTotal)) + } }); } diff --git a/server/utils/calculateStatusDuration.js b/server/utils/calculateStatusDuration.js index 16165d001..28315e0e7 100644 --- a/server/utils/calculateStatusDuration.js +++ b/server/utils/calculateStatusDuration.js @@ -1,15 +1,7 @@ const durationToHumanReadable = require("./durationToHumanReadable"); const moment = require("moment"); +const getLifecycleStatusColor = require("./getLifecycleStatusColor"); const _ = require("lodash"); -const crypto = require('crypto'); - -const getColor = (key) => { - const hash = crypto.createHash('sha256'); - hash.update(key); - const hashedKey = hash.digest('hex'); - const num = parseInt(hashedKey, 16); - return '#' + (num % 16777215).toString(16).padStart(6, '0'); -}; const calculateStatusDuration = (transitions, statuses) => { let statusDuration = {}; @@ -79,7 +71,7 @@ const calculateStatusDuration = (transitions, statuses) => { value, humanReadable, percentage: statusDuration[status].percentage, - color: getColor(status), + color: getLifecycleStatusColor(status), roundedPercentage: `${Math.round(statusDuration[status].percentage)}%` }); } diff --git a/server/utils/getLifecycleStatusColor.js b/server/utils/getLifecycleStatusColor.js new file mode 100644 index 000000000..d726e1cb3 --- /dev/null +++ b/server/utils/getLifecycleStatusColor.js @@ -0,0 +1,11 @@ +const crypto = require('crypto'); + +const getLifecycleStatusColor = (key) => { + const hash = crypto.createHash('sha256'); + hash.update(key); + const hashedKey = hash.digest('hex'); + const num = parseInt(hashedKey, 16); + return '#' + (num % 16777215).toString(16).padStart(6, '0'); +}; + +module.exports = getLifecycleStatusColor; \ No newline at end of file