const { Gauge, CachedGauge } = require('measured-core');
const { cpuAverage, calculateCpuUsagePercent } = require('./utils/CpuUtils');
const os = require('os');
/**
* The default reporting interval for node os metrics is 30 seconds.
*
* @type {number}
*/
const DEFAULT_NODE_OS_METRICS_REPORTING_INTERVAL_IN_SECONDS = 30;
/**
* A map of Metric generating functions, that create Metrics to measure node os stats.
*/
const nodeOsMetrics = {
/**
* https://nodejs.org/api/os.html#os_os_loadavg
* @return {Gauge}
*/
'node.os.loadavg.1m': () => {
return new Gauge(() => {
return os.loadavg()[0];
});
},
/**
* https://nodejs.org/api/os.html#os_os_loadavg
* @return {Gauge}
*/
'node.os.loadavg.5m': () => {
return new Gauge(() => {
return os.loadavg()[1];
});
},
/**
* https://nodejs.org/api/os.html#os_os_loadavg
* @return {Gauge}
*/
'node.os.loadavg.15m': () => {
return new Gauge(() => {
return os.loadavg()[2];
});
},
'node.os.freemem': () => {
return new Gauge(() => {
return os.freemem();
});
},
'node.os.totalmem': () => {
return new Gauge(() => {
return os.totalmem();
});
},
/**
* Gauge to track how long the os has been running.
*\
*]=-
* See {@link https://nodejs.org/api/os.html#os_os_uptime} for more information.
* @return {Gauge}
*/
'node.os.uptime': () => {
return new Gauge(() => {
// The os.uptime() method returns the system uptime in number of seconds.
return os.uptime();
});
},
/**
* Creates a {@link CachedGauge} that will self update every updateIntervalInSeconds and sample the
* cpu usage across all cores for sampleTimeInSeconds.
*
* @param {number} [updateIntervalInSeconds] How often to update and cache the cpu usage average, defaults to 30 seconds.
* @param {number} [sampleTimeInSeconds] How long to sample the cpu usage over, defaults to 5 seconds.
*/
'node.os.cpu.all-cores-avg': (updateIntervalInSeconds, sampleTimeInSeconds) => {
updateIntervalInSeconds = updateIntervalInSeconds || 30;
sampleTimeInSeconds = sampleTimeInSeconds || 5;
return new CachedGauge(() => {
return new Promise(resolve => {
//Grab first CPU Measure
const startMeasure = cpuAverage();
setTimeout(() => {
//Grab second Measure
const endMeasure = cpuAverage();
const percentageCPU = calculateCpuUsagePercent(startMeasure, endMeasure);
resolve(percentageCPU);
}, sampleTimeInSeconds);
});
}, updateIntervalInSeconds);
}
};
/**
* This module contains the methods to create and register default node os metrics to a metrics registry.
*
* @module node-os-metrics
*/
module.exports = {
/**
* Method that can be used to add a set of default node process metrics to your app.
*
* @param {SelfReportingMetricsRegistry} metricsRegistry
* @param {Dimensions} customDimensions
* @param {number} reportingIntervalInSeconds
*/
createOSMetrics: (metricsRegistry, customDimensions, reportingIntervalInSeconds) => {
customDimensions = customDimensions || {};
reportingIntervalInSeconds = reportingIntervalInSeconds || DEFAULT_NODE_OS_METRICS_REPORTING_INTERVAL_IN_SECONDS;
Object.keys(nodeOsMetrics).forEach(metricName => {
metricsRegistry.register(metricName, nodeOsMetrics[metricName](), customDimensions, reportingIntervalInSeconds);
});
},
/**
* Map of metric names to a corresponding function that creates and returns a Metric that tracks it.
* See {@link nodeOsMetrics}
*/
nodeOsMetrics
};