Node Module for reading cgroup metrics. Reads from /sys/fs/cgroup/.
Memory reads from path /sys/fs/cgroup/memory/memory:
Raw values:
stat.rss: # of bytes of anonymous and swap cache memorykmem.usage_in_bytes: current kernel memory allocationlimit_in_bytes: limit of memory usage
Calculated values:
containerUsage():stats.rss+kmem.usage_in_bytescontainerUsagePercentage():stats.rss+kmem.usage_in_bytes/limit_in_bytes
Raw CPU values:
CPU reads from path /sys/fs/cgroup/:
cpuacct.usage: total CPU time (in nanoseconds) since the start of the container obtained by this cgroup (CPU time obtained by all the tasks) in the systemcpuacct.stat: reports the user and system CPU time consumed by all tasks in this cgroup (including tasks lower in the hierarchy)user: CPU time (in nanoseconds) spent by tasks of the cgroup in user modesystem: CPU time (in nanoseconds) spent by tasks of the cgroup in kernel modetimestamp: timestamp of when the measurement was taken
Both calls will return an object containing one or more CpuMetric objects for a specific cpu task:
cpuNanosSinceContainerStart: total CPU time (in nanoseconds) since the start of the container obtained by this cgroup in the systemtimestamp: timestamp of when the measurement was taken
Calculated CPU values:
calculateUsage: takes two instances of calls tocpuacct.usageorcpuacct.statand returns the calculated usage in percentage of CPU time:second time since container start - first time since container start / total time
npm install cgroup-metrics
You can access each metric separately using the async functions for each metric
const cgroup = require('cgroup-metrics');
const memory = cgroup.memory();
const containerUsage = await memory.containerUsage();
console.log(containerUsage);
const containerUsagePercentage = await memory.containerUsagePercentage(containerUsage);
console.log(containerUsagePercentage);const cpu = cgroup.cpu();
/* Returns an object like:
* {
* cpuNanosSinceContainerStart: 120234,
* timestamp: 153686574
* }
* */
const cpuacct_usage = await cpu.usage();
console.log(`Total CPU time since start of container (ns): ${cpuacct_usage.cpuNanosSinceContainerStart}`);
/* Returns an object like:
* {
* user: {
* cpuNanosSinceContainerStart: 120234,
* timestamp: 153686574
* },
* system: {
* cpuNanosSinceContainerStart: 120234,
* timestamp: 153686574
* },
* }
* */
const cpuacct_stats = await cpu.stat();
console.log(`CPU user count object: ${cpuacct_stat.user}`);
console.log(`CPU system count object: ${cpuacct_stat.system}`);
const calculateUsage = await cpu.calculateUsage(cpuacct_usage1, cpuacct_usage2);Or you can use the function metrics to get an object of all the metrics:
const metrics = await cgroup.metrics();
console.log(`Container usage: ${metrics.memory.containerUsage}`);
console.log(`Container usage percentage: ${metrics.memory.containerUsagePercentage}`);
console.log(`Total CPU time since start of container (ns): ${metrics.cpuacct.usagecpuNanosSinceContainerStart}`);
console.log(`CPU user count: ${metrics.cpuacct.stat.user}`);
console.log(`CPU system count: ${metrics.cpuacct.stat.system}`);If you call metrics with parameter flatten set to true, it will return a flattened (1D) js object:
const metrics = await cgroup.metrics(true);
console.log(`Memory usage in the container: ${metrics["memory.containerUsage"]}`)If there is no container running or there is an issue reading the file path, the function call will error something like this:
Error: Error reading file /sys/fs/cgroup/memory/memory.stat, Message: ENOENT: no such file or directory, open '/sys/fs/cgroup/memory/memory.stat'
If one of the files is empty, it will return an error like this:
Error: Error reading file /sys/fs/cgroup/memory/memory.stat, Message: File is empty
If a file is malformed, it will return an error like this:
Error: One or more metrics are malformed. containerUsage: 1234, limit: NaN
Or:
Error reading file /sys/fs/cgroup/cpuacct/cpuacct.stat, Message: Cannot read property 'split' of undefined
Contributions are welcomed! Read the Contributing Guide for more information.
This project is licensed under the Apache V2 License. See LICENSE for more information.