UNPKG

@haystacks/async

Version:

A framework to build any number or any kind of native application or automation solution.

202 lines (195 loc) 13.5 kB
/** * @file performanceMetric.js * @module performanceMetric * @description Contains all of the performance metric commands. * @requires module:ruleBroker * @requires module:configurator * @requires module:loggers * @requires module:data * @requires module:stack * @requires {@link https://www.npmjs.com/package/@haystacks/constants|@haystacks/constants} * @requires {@link https://mathjs.org/index.html|math} * @requires {@link https://www.npmjs.com/package/path|path} * @author Seth Hollingsead * @date 2022/02/04 * @copyright Copyright © 2022-… by Seth Hollingsead. All rights reserved */ // Internal imports import ruleBroker from '../../brokers/ruleBroker.js'; import configurator from '../../executrix/configurator.js'; import loggers from '../../executrix/loggers.js'; import D from '../../structures/data.js'; import stack from '../../structures/stack.js'; // External imports import hayConst from '@haystacks/constants'; import * as math from 'mathjs'; import path from 'path'; const {bas, biz, cfg, msg, sys, wrd} = hayConst; const baseFileName = path.basename(import.meta.url, path.extname(import.meta.url)); // framework.commandsBlob.commands.performanceMetric. const namespacePrefix = wrd.cframework + bas.cDot + sys.ccommandsBlob + bas.cDot + wrd.ccommands + bas.cDot + baseFileName + bas.cDot; /** * @function businessRulesMetrics * @description A command to compute business rule metrics for each of the * business rules that were called in a sequence of call(s) or workflow(s). * @param {string} inputData Not used for this command. * @param {string} inputMetaData Not used for this command. * @return {array<boolean,string|integer|boolean|object|array>} An array with a boolean True or False value to * indicate if the application should exit or not exit, followed by the command output. * @author Seth Hollingsead * @date 2022/03/03 */ async function businessRulesMetrics(inputData, inputMetaData) { let functionName = businessRulesMetrics.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + JSON.stringify(inputData)); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = [true, []]; let businessRuleMetricsEnabled = await configurator.getConfigurationSetting(wrd.csystem, cfg.cenableBusinessRulePerformanceMetrics); if (businessRuleMetricsEnabled === true) { let businessRuleCounter = 0; let businessRulePerformanceSum = 0; let businessRulePerformanceStdSum = 0; let average = 0; let standardDev = 0; // Here we iterate over all of the business rules that were added to the sys.cBusinessRulePerformanceTrackingStack. for (let i = 0; i < await stack.length(cfg.cbusinessRulesNamesPerformanceTrackingStack); i++) { businessRuleCounter = 0; // Reset it to zero, because we are beginning again with another business rule name. businessRulePerformanceSum = 0; businessRulePerformanceStdSum = 0; average = 0; standardDev = 0; // Here we will not iterate over all of the contents of all of the business rule performance numbers and // do the necessary math for each business rule according to the parent loop. let currentBusinessRuleName = D[cfg.cbusinessRulesNamesPerformanceTrackingStack][i]; for (let j = 0; j < await stack.length(cfg.cbusinessRulesPerformanceTrackingStack); j++) { if (D[cfg.cbusinessRulesPerformanceTrackingStack][j][wrd.cName] === currentBusinessRuleName) { businessRuleCounter = businessRuleCounter + 1; // businessRuleCounter is: await loggers.consoleLog(namespacePrefix + functionName, msg.cbusinessRuleCounterIs + businessRuleCounter); businessRulePerformanceSum = businessRulePerformanceSum + D[cfg.cbusinessRulesPerformanceTrackingStack][j][sys.cRunTime]; // businessRulePerformanceSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.cbusinessRulePerformanceSumIs + businessRulePerformanceSum); } // End-if (D[cfg.cBusinessRulePerformanceTrackingStack][j][wrd.cName] === currentBusinessRuleName) } // End-for (let j = 0; j < await stack.length(cfg.cBusinessRulePerformanceTrackingStack); j++) // DONE! businessRulePerformanceSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.cDoneBusinessRulePerformanceSumIs + businessRulePerformanceSum); average = businessRulePerformanceSum / businessRuleCounter; // average is: await loggers.consoleLog(namespacePrefix + functionName, msg.caverageIs + average); // Now go back through them all so we can compute the standard deviation. for (let k = 0; k < await stack.length(cfg.cbusinessRulesPerformanceTrackingStack); k++) { if (D[cfg.cbusinessRulesPerformanceTrackingStack][k][wrd.cName] === currentBusinessRuleName) { businessRulePerformanceStdSum = businessRulePerformanceStdSum + math.pow((D[cfg.cbusinessRulesPerformanceTrackingStack][k][sys.cRunTime] - average), 2); // businessRulePerformanceStdSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.cbusinessRulePerformanceStdSumIs + businessRulePerformanceStdSum); } // End-if (D[cfg.cBusinessRulePerformanceTrackingStack][k][wrd.cName] === currentBusinessRuleName) } // End-for (let k = 0; k < await stack.length(cfg.cBusinessRulePerformanceTrackingStack); k++) // DONE! businessRulePerformanceStdSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.cDoneBusinessRulePerformanceStdSumIs + businessRulePerformanceStdSum); standardDev = math.sqrt(businessRulePerformanceStdSum / businessRuleCounter); // standardDev is: await loggers.consoleLog(namespacePrefix + functionName, msg.cstandardDevIs + standardDev); if (D[cfg.cbusinessRulesPerformanceAnalysisStack] === undefined) { await stack.initStack(cfg.cbusinessRulesPerformanceAnalysisStack); } await stack.push(cfg.cbusinessRulesPerformanceAnalysisStack, {Name: currentBusinessRuleName, Average: average, StandardDeviation: standardDev}); } // End-for (let i = 0; i < await stack.length(cfg.cBusinessRulesNamesPerformanceTrackingStack); i++) await loggers.consoleTableLog('', D[cfg.cbusinessRulesPerformanceAnalysisStack], [wrd.cName, wrd.cAverage, sys.cStandardDeviation]); returnData[1] = await ruleBroker.processRules([D[cfg.cbusinessRulesPerformanceAnalysisStack], ''], [biz.carrayDeepClone]); await stack.clearStack(cfg.cbusinessRulesPerformanceAnalysisStack); // We need to have a flag that will enable the user to determine if the data should be cleared after the analysis is complete. // It might be that the user wants to do something else with this data in memory after it's done. if (await configurator.getConfigurationSetting(wrd.csystem, cfg.cclearBusinessRulesPerformanceDataAfterAnalysis) === true) { await stack.clearStack(cfg.cbusinessRulesPerformanceTrackingStack); await stack.clearStack(cfg.cbusinessRulesNamesPerformanceTrackingStack); } // End-if (configurator.getConfigurationSetting(wrd.csystem, cfg.cclearBusinessRulesPerformanceDataAfterAnalysis) === true) } // End-if (businessRuleMetricsEnabled === true) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData)); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function commandMetrics * @description A command to compute command metrics for each of the commands that were called in a sequence of call(s) or workfow(s). * @param {string} inputData Not used for this command. * @param {string} inputMetaData Not used for this command. * @return {array<boolean,string|integer|boolean|object|array>} An array with a boolean True or False value to * indicate if the application should exit or not exit, followed by the command output. * @author Seth Hollingsead * @date 2022/03/11 */ async function commandMetrics(inputData, inputMetaData) { let functionName = commandMetrics.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + JSON.stringify(inputData)); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = [true, []]; let commandMetricsEnabled = await configurator.getConfigurationSetting(wrd.csystem, cfg.cenableCommandPerformanceMetrics); if (commandMetricsEnabled === true) { let commandCounter = 0; let commandPerformanceSum = 0; let commandPerformanceStdSum = 0; let average = 0; let standardDev = 0; // Here we iterate over all of the commands that were added to the cfg.ccommandsPerformanceTrackingStack. for (let i = 0; i < await stack.length(cfg.ccommandNamesPerformanceTrackingStack); i++) { commandCounter = 0; commandPerformanceSum = 0; commandPerformanceStdSum = 0; average = 0; standardDev = 0; // Here we will now iterate over all of the contents of all the command performance numbers and // do the necessary math for each command according to the parent loop. let currentCommandName = D[cfg.ccommandNamesPerformanceTrackingStack][i]; for (let j = 0; j < await stack.length(cfg.ccommandsPerformanceTrackingStack); j++) { if (D[cfg.ccommandsPerformanceTrackingStack][j][wrd.cName] === currentCommandName) { commandCounter = commandCounter + 1; // commandCounter is: await loggers.consoleLog(namespacePrefix + functionName, msg.ccommandCounterIs + commandCounter); commandPerformanceSum = commandPerformanceSum + D[cfg.ccommandsPerformanceTrackingStack][j][sys.cRunTime]; // commandPerformanceSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.ccommandPerformanceSumIs + commandPerformanceSum); } // End-if (D[cfg.ccommandsPerformanceTrackingStack][j][wrd.cName] === currentCommandName) } // End-for (let j = 0; j < stack.length(cfg.ccommandsPerformanceTrackingStack); j++) // DONE! commandPerformanceSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.cDoneCommandPerformanceSumIs + commandPerformanceSum); average = commandPerformanceSum / commandCounter; // average is: await loggers.consoleLog(namespacePrefix + functionName, msg.caverageIs + average); // Now go back through them allso we can compute the standard deviation. for (let k = 0; k < await stack.length(cfg.ccommandsPerformanceTrackingStack); k++) { if (D[cfg.ccommandsPerformanceTrackingStack][k][wrd.cName] === currentCommandName) { commandPerformanceStdSum = commandPerformanceStdSum + math.pow((D[cfg.ccommandsPerformanceTrackingStack][k][sys.cRunTime] - average), 2); // commandPerformanceStdSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.ccommandPerformanceStdSumIs + commandPerformanceStdSum); } // End-if (D[cfg.ccommandsPerformanceTrackingStack][k][wrd.cName] === currentCommandName) } // End-for (let k = 0; k < stack.length(cfg.ccommandsPerformanceTrackingStack); k++) // DONE! commandPerformanceStdSum is: await loggers.consoleLog(namespacePrefix + functionName, msg.cDoneCommandPerformanceStdSumIs + commandPerformanceStdSum); standardDev = math.sqrt(commandPerformanceStdSum / commandCounter); // standardDev is: await loggers.consoleLog(namespacePrefix + functionName, msg.cstandardDevIs + standardDev); if (D[cfg.ccommandsPerformanceAnalysisStack] === undefined) { await stack.initStack(cfg.ccommandsPerformanceAnalysisStack); } await stack.push(cfg.ccommandsPerformanceAnalysisStack, {Name: currentCommandName, Average: average, StandardDeviation: standardDev}); } // End-for (let i = 0; i < stack.length(cfg.ccommandNamesPerformanceTrackingStack); i++) await loggers.consoleTableLog('', D[cfg.ccommandsPerformanceAnalysisStack], [wrd.cName, wrd.cAverage, sys.cStandardDeviation]); returnData[1] = await ruleBroker.processRules([D[cfg.ccommandsPerformanceAnalysisStack], ''], [biz.carrayDeepClone]); await stack.clearStack(cfg.ccommandsPerformanceAnalysisStack); // We need to have a flag that will enable the user to determine if the data should be cleared after the analysis is complete. // It might be that the user wants to do something else with this data in memory after it's done. if (await configurator.getConfigurationSetting(wrd.csystem, cfg.cclearCommandPerformanceDataAfterAnalysis) === true) { await stack.clearStack(cfg.ccommandsPerformanceTrackingStack); await stack.clearStack(cfg.ccommandNamesPerformanceTrackingStack); } // End-if (configurator.getConfigurationSetting(wrd.csystem, cfg.cclearCommandPerformanceDataAfterAnalysis) === true) } // End-if (commandMetricsEnabled === true) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData)); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } export default { businessRulesMetrics, commandMetrics };