diff --git a/atom/common/api/atom_bindings.cc b/atom/common/api/atom_bindings.cc index 9d8c15ff4faf..675ec46a8c2a 100644 --- a/atom/common/api/atom_bindings.cc +++ b/atom/common/api/atom_bindings.cc @@ -14,6 +14,7 @@ #include "atom/common/node_includes.h" #include "base/logging.h" #include "base/process/process_metrics.h" +#include "base/sys_info.h" #include "native_mate/dictionary.h" namespace atom { @@ -52,6 +53,8 @@ void AtomBindings::BindTo(v8::Isolate* isolate, dict.SetMethod("log", &Log); dict.SetMethod("getProcessMemoryInfo", &GetProcessMemoryInfo); dict.SetMethod("getSystemMemoryInfo", &GetSystemMemoryInfo); + dict.SetMethod("getCPUUsage", &GetCPUUsage); + dict.SetMethod("getIOCounters", &GetIOCounters); #if defined(OS_POSIX) dict.SetMethod("setFdLimit", &base::SetFdLimit); #endif @@ -171,4 +174,37 @@ v8::Local AtomBindings::GetSystemMemoryInfo(v8::Isolate* isolate, return dict.GetHandle(); } +// static +v8::Local AtomBindings::GetCPUUsage(v8::Isolate* isolate) { + std::unique_ptr 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(); +} + +// static +v8::Local AtomBindings::GetIOCounters(v8::Isolate* isolate) { + std::unique_ptr metrics( + base::ProcessMetrics::CreateCurrentProcessMetrics()); + base::IoCounters io_counters; + mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate); + + if (metrics->GetIOCounters(&io_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(); +} + } // namespace atom diff --git a/atom/common/api/atom_bindings.h b/atom/common/api/atom_bindings.h index 09561b046b14..1deb50f7d0f2 100644 --- a/atom/common/api/atom_bindings.h +++ b/atom/common/api/atom_bindings.h @@ -37,6 +37,8 @@ class AtomBindings { static v8::Local GetProcessMemoryInfo(v8::Isolate* isolate); static v8::Local GetSystemMemoryInfo(v8::Isolate* isolate, mate::Arguments* args); + static v8::Local GetCPUUsage(v8::Isolate* isolate); + static v8::Local GetIOCounters(v8::Isolate* isolate); private: void ActivateUVLoop(v8::Isolate* isolate); diff --git a/docs/api/process.md b/docs/api/process.md index 84320ca98bb0..59f80963d81e 100644 --- a/docs/api/process.md +++ b/docs/api/process.md @@ -116,3 +116,15 @@ Returns `Object`: Returns an object giving memory usage statistics about the entire system. Note that all statistics are reported in Kilobytes. + +### `process.getCPUUsage()` + +Returns: + +* `CPUUsage` [CPUUsage](structures/cpu-usage.md) + +### `process.getIOCounters()` _Windows_ _Linux_ + +Returns: + +* `IOCounters` [IOCounters](structures/io-counters.md) \ No newline at end of file diff --git a/docs/api/structures/cpu-usage.md b/docs/api/structures/cpu-usage.md new file mode 100644 index 000000000000..b700d4945f0f --- /dev/null +++ b/docs/api/structures/cpu-usage.md @@ -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. diff --git a/docs/api/structures/io-counters.md b/docs/api/structures/io-counters.md new file mode 100644 index 000000000000..62ad39a90b09 --- /dev/null +++ b/docs/api/structures/io-counters.md @@ -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. diff --git a/spec/api-process-spec.js b/spec/api-process-spec.js new file mode 100644 index 000000000000..5f4ad1730bce --- /dev/null +++ b/spec/api-process-spec.js @@ -0,0 +1,26 @@ +const assert = require('assert') + +describe('process module', function () { + describe('process.getCPUUsage()', function () { + it('returns a cpu usage object', function () { + const 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 () { + if (process.platform === 'darwin') { + return + } + const ioCounters = process.getIOCounters() + assert.equal(typeof ioCounters.readOperationCount, 'number') + assert.equal(typeof ioCounters.writeOperationCount, 'number') + assert.equal(typeof ioCounters.otherOperationCount, 'number') + assert.equal(typeof ioCounters.readTransferCount, 'number') + assert.equal(typeof ioCounters.writeTransferCount, 'number') + assert.equal(typeof ioCounters.otherTransferCount, 'number') + }) + }) +})