Adding CPU and I/O metrics to process module

This commit is contained in:
Hari Krishna Reddy Juturu 2017-05-04 10:49:01 -07:00
parent 70e199e255
commit 8a5aa04756
5 changed files with 84 additions and 0 deletions

View file

@ -14,6 +14,7 @@
#include "atom/common/node_includes.h" #include "atom/common/node_includes.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/process/process_metrics.h" #include "base/process/process_metrics.h"
#include "base/sys_info.h"
#include "native_mate/dictionary.h" #include "native_mate/dictionary.h"
namespace atom { namespace atom {
@ -23,6 +24,38 @@ namespace {
// Dummy class type that used for crashing the program. // Dummy class type that used for crashing the program.
struct DummyClass { bool crash; }; struct DummyClass { bool crash; };
v8::Local<v8::Value> GetCPUUsage(v8::Isolate* isolate) {
std::unique_ptr<base::ProcessMetrics> metrics(
base::ProcessMetrics::CreateCurrentProcessMetrics());
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
int processor_count = base::SysInfo::NumberOfProcessors();
dict.Set("percentCPUUsage",
metrics->GetPlatformIndependentCPUUsage() / processor_count);
dict.Set("idleWakeupsPerSecond", metrics->GetIdleWakeupsPerSecond());
return dict.GetHandle();
}
v8::Local<v8::Value> GetIOCounters(v8::Isolate* isolate) {
std::unique_ptr<base::ProcessMetrics> metrics(
base::ProcessMetrics::CreateCurrentProcessMetrics());
base::IoCounters io_counters;
const bool got_counters = metrics->GetIOCounters(&io_counters);
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
if (got_counters) {
dict.Set("readOperationCount", io_counters.ReadOperationCount);
dict.Set("writeOperationCount", io_counters.WriteOperationCount);
dict.Set("otherOperationCount", io_counters.OtherOperationCount);
dict.Set("readTransferCount", io_counters.ReadTransferCount);
dict.Set("writeTransferCount", io_counters.WriteTransferCount);
dict.Set("otherTransferCount", io_counters.OtherTransferCount);
}
return dict.GetHandle();
}
// Called when there is a fatal error in V8, we just crash the process here so // Called when there is a fatal error in V8, we just crash the process here so
// we can get the stack trace. // we can get the stack trace.
void FatalErrorCallback(const char* location, const char* message) { void FatalErrorCallback(const char* location, const char* message) {
@ -52,6 +85,8 @@ void AtomBindings::BindTo(v8::Isolate* isolate,
dict.SetMethod("log", &Log); dict.SetMethod("log", &Log);
dict.SetMethod("getProcessMemoryInfo", &GetProcessMemoryInfo); dict.SetMethod("getProcessMemoryInfo", &GetProcessMemoryInfo);
dict.SetMethod("getSystemMemoryInfo", &GetSystemMemoryInfo); dict.SetMethod("getSystemMemoryInfo", &GetSystemMemoryInfo);
dict.SetMethod("getCPUUsage", &GetCPUUsage);
dict.SetMethod("getIOCounters", &GetIOCounters);
#if defined(OS_POSIX) #if defined(OS_POSIX)
dict.SetMethod("setFdLimit", &base::SetFdLimit); dict.SetMethod("setFdLimit", &base::SetFdLimit);
#endif #endif

View file

@ -116,3 +116,15 @@ Returns `Object`:
Returns an object giving memory usage statistics about the entire system. Note Returns an object giving memory usage statistics about the entire system. Note
that all statistics are reported in Kilobytes. that all statistics are reported in Kilobytes.
### `process.getCPUUsage()`
Returns:
* `CPUUsage` [CPUUsage](structures/cpu-usage.md)
### `process.getIOCounters()`
Returns:
* `IOCounters` [IOCounters](structures/io-counters.md)

View file

@ -0,0 +1,6 @@
# CPUUsage Object
* `percentCPUUsage` number - Percentage of CPU used since the last call to getCPUUsage.
First call returns 0.
* `idleWakeupsPerSecond` number - The number of average idle cpu wakeups per second
since the last call to getCPUUsage. First call returns 0.

View file

@ -0,0 +1,8 @@
# IOCounters Object
* `readOperationCount` Number - The number of I/O read operations.
* `writeOperationCount` Number - The number of I/O write operations.
* `otherOperationCount` Number - Then number of I/O other operations.
* `readTransferCount` Number - The number of I/O read transfers.
* `writeTransferCount` Number - The number of I/O write transfers.
* `otherTransferCount` Number - Then number of I/O other transfers.

23
spec/api-process-spec.js Normal file
View file

@ -0,0 +1,23 @@
const assert = require('assert')
describe('process module', function () {
describe('process.getCPUUsage()', function () {
it('returns a cpu usage object', function () {
var cpuUsage = process.getCPUUsage()
assert.equal(typeof cpuUsage.percentCPUUsage, 'number')
assert.equal(typeof cpuUsage.idleWakeupsPerSecond, 'number')
})
})
describe('process.getIOCounters()', function () {
it('returns an io counters object', function () {
var ioCounters = process.getIOCounters()
assert.ok(ioCounters.readOperationCount > 0, 'read operation count not > 0')
assert.ok(ioCounters.writeOperationCount > 0, 'write operation count not > 0')
assert.ok(ioCounters.otherOperationCount > 0, 'other operation count not > 0')
assert.ok(ioCounters.readTransferCount > 0, 'read transfer count not > 0')
assert.ok(ioCounters.writeTransferCount > 0, 'write transfer count not > 0')
assert.ok(ioCounters.otherTransferCount > 0, 'other transfer count not > 0')
})
})
})