Skip to content

Commit 18b3ef7

Browse files
committed
perfrep Host Performance Report in Percent
1 parent 592af7a commit 18b3ef7

File tree

7 files changed

+147
-1
lines changed

7 files changed

+147
-1
lines changed

.circleci/config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defaults: &defaults
22
working_directory: ~/app
33
docker:
4-
- image: circleci/node:10.2-browsers
4+
- image: circleci/node:10-browsers
55

66
version: 2
77
jobs:

packages/perfrep/.npmignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.*
2+
*.log
3+
spec.js

packages/perfrep/.npmrc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package-lock=false

packages/perfrep/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# perfrep [![](https://img.shields.io/npm/v/perfrep.svg)](https://www.npmjs.com/package/perfrep) [![](https://img.shields.io/badge/source--000000.svg?logo=github&style=social)](https://github.com/omrilotan/mono/tree/master/packages/perfrep)
2+
3+
Host Performance Report in Percent
4+
5+
```js
6+
const perfrep = require('perfrep');
7+
8+
const {cpu, memory, heap} = await perfrep();
9+
10+
// log to statsd for example
11+
logMetrics(
12+
...Object.entries(await perfrep())
13+
.map(
14+
([key, value]) => `application.host_perf.${key}_usage:${value}|ms|@0.1`
15+
)
16+
)
17+
);
18+
```

packages/perfrep/index.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const {
2+
cpus,
3+
freemem,
4+
totalmem,
5+
} = require('os');
6+
7+
/**
8+
* Get CPU and memory usage in percent (async). Takes about a second
9+
* @return {Object} {cpu: Float, memory: Float}
10+
*/
11+
module.exports = async function usage(){
12+
const before = info();
13+
await wait(1000);
14+
const after = info();
15+
const {heapUsed, heapTotal} = process.memoryUsage();
16+
17+
return {
18+
cpu: percent(after.idle - before.idle, after.total - before.total),
19+
memory: 100 - percent(freemem(), totalmem()),
20+
heap: percent(heapUsed, heapTotal),
21+
};
22+
}
23+
24+
/**
25+
* Get current idle and total CPU usage
26+
* @return {Object} {idle: Integer, total: Integer}
27+
*/
28+
const info = () => cpus().reduce(
29+
(accumulator, {times: {user, nice, sys, irq, idle}}) => ({
30+
idle: accumulator.idle + idle,
31+
total: accumulator.total + user + nice + sys + irq + idle,
32+
}),
33+
{
34+
idle: 0,
35+
total: 0,
36+
}
37+
);
38+
39+
/**
40+
* A waiting promise
41+
* @param {Number} ms
42+
* @return {Promise}
43+
*/
44+
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
45+
46+
/**
47+
* Calculate percent of a pert from the whole
48+
* @param {Number} part
49+
* @param {Number} whole
50+
* @return {Number}
51+
*/
52+
const percent = (part, whole) => Math.round(part / whole * 100);

packages/perfrep/package.json

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "perfrep",
3+
"version": "0.1.0",
4+
"description": "Host Performance Report in Percent",
5+
"keywords": [
6+
"cpu",
7+
"heap",
8+
"mem",
9+
"memory",
10+
"performance",
11+
"report",
12+
"monitoring",
13+
"usage",
14+
"stats"
15+
],
16+
"author": "omrilotan",
17+
"license": "MIT",
18+
"repository": {
19+
"type": "git",
20+
"url": "git+https://github.com/omrilotan/mono.git"
21+
},
22+
"homepage": "https://omrilotan.com/mono/perfrep/",
23+
"main": "index.js",
24+
"scripts": {
25+
"test": "cd ../../; npm t perfrep; cd -"
26+
}
27+
}

packages/perfrep/spec.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const perfrep = require('.');
2+
3+
describe('notate', async() => {
4+
it('Should return numeric results in percent (between 0 and 100)', async() => {
5+
const {cpu, memory, heap} = await perfrep();
6+
7+
expect(cpu).to.be.at.least(0);
8+
expect(cpu).to.be.at.most(100);
9+
expect(memory).to.be.at.least(0);
10+
expect(memory).to.be.at.most(100);
11+
expect(heap).to.be.at.least(0);
12+
expect(heap).to.be.at.most(100);
13+
});
14+
it('Should take about a second', async() => {
15+
let cpu, memory, heap;
16+
async function results() {
17+
const results = await perfrep();
18+
cpu = results.cpu;
19+
memory = results.memory;
20+
heap = results.heap;
21+
}
22+
23+
expect(cpu).to.not.be.a('number');
24+
expect(memory).to.not.be.a('number');
25+
expect(heap).to.not.be.a('number');
26+
27+
results();
28+
29+
expect(cpu).to.not.be.a('number');
30+
expect(memory).to.not.be.a('number');
31+
expect(heap).to.not.be.a('number');
32+
33+
await sleep(100);
34+
35+
expect(cpu).to.not.be.a('number');
36+
expect(memory).to.not.be.a('number');
37+
expect(heap).to.not.be.a('number');
38+
39+
await sleep(1000);
40+
41+
expect(cpu).to.be.a('number');
42+
expect(memory).to.be.a('number');
43+
expect(heap).to.be.a('number');
44+
});
45+
});

0 commit comments

Comments
 (0)