proceso 0.0.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d49661725405e398e78ba8b53acd8d9c28d8110
4
- data.tar.gz: 0acfd2992fe40aa6c188f747eb1b934ae43accb6
3
+ metadata.gz: 5ba2fac203e9bf0d1bec8ad20defc3ff07582c5f
4
+ data.tar.gz: a40f55f136b868bd641129c5c8680feb2e3855d6
5
5
  SHA512:
6
- metadata.gz: c41bda0b3153f6564b05cfb806eafa005d2bc69947af100a0393f2a22e07059b7653a9ba4b0008fdebae2af70e7f089ecfd8f970c3d6826615d588e1d21842c6
7
- data.tar.gz: f4788aace60dd4ed5c3f6c8b23f8a10046fcaa3b3b86ace7f01ac57bf3a16ed7b9f8ca31c345223efd8d4990214e4e6f5918a1048abf6baac87bc87b37dcda81
6
+ metadata.gz: c9d453e1d265a4d3625328733ceadc4cbc26a34cd22c90cf131512ca1f57caf5fcabb54da937953a4c14802c17221f59f149bd588249541a3ebaa02b4c548dfd
7
+ data.tar.gz: d914eddb8fe44c1fdafaf6c73b689481f7a94c9b06b26e1ee66d738d4120dc910958b227227a4a7b528e4994abb7f06a0d593a35874dc35a24e17c949b16872a
@@ -0,0 +1,69 @@
1
+ #ifdef __APPLE__
2
+
3
+ #include "darwin.h"
4
+
5
+ int rb_sysctl_kern_argmax() {
6
+ int ret, argmax;
7
+ int mib[2] = { CTL_KERN, KERN_ARGMAX };
8
+ size_t buf_size = sizeof(argmax);
9
+ ret = sysctl(mib, 2, &argmax, &buf_size, NULL, 0);
10
+ if (ret == 0) {
11
+ return argmax;
12
+ }
13
+ return 0;
14
+ }
15
+
16
+ int rb_sysctl_kern_procargs2(int pid, char **process_name, int argmax, size_t buf_size) {
17
+ int ret, nargs;
18
+ int mib[3] = { CTL_KERN, KERN_PROCARGS, pid };
19
+ char *process;
20
+ process = (char *)malloc(argmax);
21
+ ret = sysctl(mib, 3, process, &buf_size, NULL, 0);
22
+ if (ret < 0) {
23
+ free(process);
24
+ return 0;
25
+ }
26
+ memcpy(&nargs, process, sizeof(nargs));
27
+ *process_name = process + sizeof(nargs);
28
+ return 1;
29
+ }
30
+
31
+ int rb_process_info(int pid, int flavor, void *pti, int size) {
32
+ int ret = proc_pidinfo(pid, flavor, 0, pti, size);
33
+ if ((ret == 0) || (ret != size)) {
34
+ return 0;
35
+ } else {
36
+ return 1;
37
+ }
38
+ }
39
+
40
+ /* List of Processes */
41
+ int * rb_process_list() {
42
+ int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
43
+ size_t buf_size;
44
+ int ret;
45
+ int list[4096];
46
+ ret = sysctl(mib, 4, NULL, &buf_size, NULL, 0);
47
+ if (ret >= 0) {
48
+ struct kinfo_proc *processes = NULL;
49
+ int i, nb_entries;
50
+ nb_entries = buf_size / sizeof(struct kinfo_proc);
51
+ processes = (struct kinfo_proc*) malloc(buf_size);
52
+ if (processes != NULL) {
53
+ ret = sysctl(mib, 4, processes, &buf_size, NULL, 0);
54
+ if (ret >= 0) {
55
+ for (i = 0; i < nb_entries; i++) {
56
+ int pid = processes[i].kp_proc.p_pid;
57
+ list[i] = pid;
58
+ }
59
+ free(processes);
60
+ return list;
61
+ }
62
+ free(processes);
63
+ return 0;
64
+ }
65
+ }
66
+ return 0;
67
+ }
68
+
69
+ #endif
@@ -0,0 +1,18 @@
1
+ #include <stdio.h>
2
+ #include <unistd.h>
3
+ #include <stdlib.h>
4
+ #include <string.h>
5
+ #include <errno.h>
6
+ #include <sys/sysctl.h>
7
+ #include <signal.h>
8
+
9
+ #if defined(__APPLE__)
10
+ # include <mach/mach.h>
11
+ # include <libproc.h>
12
+ #endif
13
+
14
+
15
+ int rb_sysctl_kern_argmax();
16
+ int rb_sysctl_kern_procargs2(int pid, char **process_name, int argmax, size_t buf_size);
17
+ int rb_process_info(int pid, int flavor, void *pti, int size);
18
+ int * rb_process_list();
@@ -1,3 +1,19 @@
1
1
  require "mkmf"
2
2
 
3
- create_makefile('proceso/proceso')
3
+ RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
4
+
5
+ def have_platform(name)
6
+ have_header("#{name}.h")
7
+ $objs.unshift "#{name}.o"
8
+ end
9
+
10
+
11
+ $objs = ["utility.o", "pid.o", "proceso.o"]
12
+ case RUBY_PLATFORM
13
+ when /linux/ then have_platform("linux")
14
+ when /darwin/ then have_platform("darwin")
15
+ else
16
+ raise "#{RUBY_PLATFORM} is not currently supported. Send Pull Request for platform support"
17
+ end
18
+
19
+ create_makefile('proceso/proceso')
@@ -0,0 +1,90 @@
1
+ #if defined(__linux) || defined(__LINUX__) || defined(__linux__)
2
+
3
+ #include "linux.h"
4
+ // const char *format = "%d %s %c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %llu";
5
+
6
+ int rb_proc_ncpu() {
7
+ int ncpu = 0;
8
+ char buffer[120];
9
+ FILE *fp;
10
+ fp = fopen("/proc/cpuinfo","r");
11
+ if(!fp)
12
+ return 0;
13
+ while(fgets(buffer,120,fp)){
14
+ if(strncmp(buffer,"processor",9) == 0)
15
+ ++ncpu;
16
+ }
17
+ fclose(fp);
18
+ return ncpu;
19
+ }
20
+ int rb_proc_pid_rss(int pid) {
21
+ const char *format = "%*d %*s %*c %*d %*d %*d %*d %*d %*lu %*lu %*lu %*lu %*lu %*lu %*lu %*ld %*ld %*ld %*ld %*ld %*ld %*lu %*lu %ld";
22
+ int rss_size = 0;
23
+ char buffer[256];
24
+ FILE *fp;
25
+ sprintf(buffer, "/proc/%d/stat", pid);
26
+ fp = fopen(buffer, "r");
27
+ if (!fp)
28
+ return 0;
29
+ fscanf(fp, format, &rss_size);
30
+ fclose(fp);
31
+ return rss_size;
32
+ }
33
+
34
+ int rb_proc_pid_vsize(int pid) {
35
+ const char *format = "%*d %*s %*c %*d %*d %*d %*d %*d %*lu %*lu %*lu %*lu %*lu %*lu %*lu %*ld %*ld %*ld %*ld %*ld %*ld %*lu %lu";
36
+ int vsize = 0;
37
+ char buffer[256];
38
+ FILE *fp;
39
+ sprintf(buffer, "/proc/%d/stat", pid);
40
+ fp = fopen(buffer, "r");
41
+ if (!fp)
42
+ return 0;
43
+ fscanf(fp, format, &vsize);
44
+ fclose(fp);
45
+ return vsize;
46
+ }
47
+
48
+ float rb_proc_pid_stime(int pid) {
49
+ const char *format = "%*d %*s %*c %*d %*d %*d %*d %*d %*lu %*lu %*lu %*lu %*lu %*lu %lu";
50
+ int stime = 0;
51
+ char buffer[256];
52
+ FILE *fp;
53
+ sprintf(buffer, "/proc/%d/stat", pid);
54
+ fp = fopen(buffer, "r");
55
+ if (!fp)
56
+ return 0;
57
+ fscanf(fp, format, &stime);
58
+ fclose(fp);
59
+ return stime / 1000000.0;
60
+ }
61
+
62
+ float rb_proc_pid_utime(int pid) {
63
+ const char *format = "%*d %*s %*c %*d %*d %*d %*d %*d %*lu %*lu %*lu %*lu %*lu %lu";
64
+ int utime = 0;
65
+ char buffer[256];
66
+ FILE *fp;
67
+ sprintf(buffer, "/proc/%d/stat", pid);
68
+ fp = fopen(buffer, "r");
69
+ if (!fp)
70
+ return 0;
71
+ fscanf(fp, format, &utime);
72
+ fclose(fp);
73
+ return utime / 1000000.0;
74
+ }
75
+
76
+ char * rb_proc_pid_cmdline(int pid) {
77
+ char buffer[512];
78
+ FILE *fp;
79
+ char *cmdline;
80
+ size_t size = 0;
81
+ sprintf(buffer, "/proc/%d/cmdline", pid);
82
+ fp = fopen(buffer, "rb");
83
+ if (!fp)
84
+ return NULL;
85
+ getdelim(&cmdline, &size, 0 , fp);
86
+ fclose(fp);
87
+ return cmdline;
88
+ }
89
+
90
+ #endif
@@ -0,0 +1,64 @@
1
+ #include <stdio.h>
2
+ #include <unistd.h>
3
+ #include <stdlib.h>
4
+ #include <string.h>
5
+ #include <errno.h>
6
+ #include <sys/sysctl.h>
7
+ #include <signal.h>
8
+
9
+ #ifndef __LINUX__
10
+ # define __LINUX__
11
+ #endif
12
+
13
+ struct proc_pid_stat {
14
+ int pid; // %d
15
+ char comm[256]; // %s
16
+ char state; // %c
17
+ int ppid; // %d
18
+ int pgrp; // %d
19
+ int session; // %d
20
+ int tty_nr; // %d
21
+ int tpgid; // %d
22
+ unsigned long flags; // %lu
23
+ unsigned long minflt; // %lu
24
+ unsigned long cminflt; // %lu
25
+ unsigned long majflt; // %lu
26
+ unsigned long cmajflt; // %lu
27
+ unsigned long utime; // %lu
28
+ unsigned long stime; // %lu
29
+ long cutime; // %ld
30
+ long cstime; // %ld
31
+ long priority; // %ld
32
+ long nice; // %ld
33
+ long num_threads; // %ld
34
+ long itrealvalue; // %ld
35
+ unsigned long starttime; // %lu
36
+ unsigned long vsize; // %lu
37
+ long rss; // %ld
38
+ unsigned long rlim; // %lu
39
+ unsigned long startcode; // %lu
40
+ unsigned long endcode; // %lu
41
+ unsigned long startstack; // %lu
42
+ unsigned long kstkesp; // %lu
43
+ unsigned long kstkeip; // %lu
44
+ unsigned long signal; // %lu
45
+ unsigned long blocked; // %lu
46
+ unsigned long sigignore; // %lu
47
+ unsigned long sigcatch; // %lu
48
+ unsigned long wchan; // %lu
49
+ unsigned long nswap; // %lu
50
+ unsigned long cnswap; // %lu
51
+ int exit_signal; // %d
52
+ int processor; // %d
53
+ unsigned long rt_priority; // %lu
54
+ unsigned long policy; // %lu
55
+ unsigned long long delayacct_blkio_ticks; // %llu
56
+ };
57
+
58
+ int rb_proc_ncpu();
59
+ int rb_proc_pid_vsize(int pid);
60
+ int rb_proc_pid_rss(int pid);
61
+ float rb_proc_pid_stime(int pid);
62
+ float rb_proc_pid_utime(int pid);
63
+ char * rb_proc_pid_cmdline(int pid);
64
+ char * rb_proc_pid_name(int pid);
data/ext/proceso/pid.c ADDED
@@ -0,0 +1,87 @@
1
+ #include "proceso.h"
2
+
3
+ static VALUE rb_cProcesoPID;
4
+
5
+ static VALUE
6
+ proceso__process_init(VALUE self, VALUE pid) {
7
+ rb_iv_set(self, "@pid", pid);
8
+ return self;
9
+ }
10
+
11
+ /* PID running? */
12
+ static VALUE
13
+ proceso__process_running(VALUE self) {
14
+ int pid = iv2pid(self);
15
+ rb_pid_t i = getpgid(pid);
16
+ if (i < 0) {
17
+ return Qfalse;
18
+ }
19
+ return Qtrue;
20
+ }
21
+
22
+ /* PID command line */
23
+ static VALUE
24
+ proceso__process_command(VALUE self) {
25
+ int pid = iv2pid(self);
26
+ char *process_cmd = rb_process_command(pid);
27
+ if (process_cmd == NULL)
28
+ return Qnil;
29
+ return rb_str_new2(process_cmd);
30
+ }
31
+
32
+ /* PID Resident Size (bytes) */
33
+ static VALUE
34
+ proceso__process_rss(VALUE self) {
35
+ int ret = rb_process_memory_size(iv2pid(self), PROCESS_RSS);
36
+ return INT2NUM(ret);
37
+ }
38
+
39
+ /* PID Virtual Size (bytes) */
40
+ static VALUE
41
+ proceso__process_vms(VALUE self) {
42
+ int ret = rb_process_memory_size(iv2pid(self), PROCESS_VMS);
43
+ return INT2NUM(ret);
44
+ }
45
+
46
+ /* PID User CPU */
47
+ static VALUE
48
+ proceso__process_user_cpu(VALUE self) {
49
+ float val = rb_process_cpu_times(iv2pid(self), FCPU_USR);
50
+ return rb_float_new(val);
51
+ }
52
+
53
+ /* PID System CPU */
54
+ static VALUE
55
+ proceso__process_system_cpu(VALUE self) {
56
+ float val = rb_process_cpu_times(iv2pid(self), FCPU_SYS);
57
+ return rb_float_new(val);
58
+ }
59
+
60
+ /* PID CPU Usage */
61
+ static VALUE
62
+ proceso__process_cpu_usage(VALUE self) {
63
+ int ncpu = rb_hw_ncpu();
64
+ float u1, u2;
65
+ float usage;
66
+ u1 = rb_process_cpu_times(iv2pid(self), FCPU_USR);
67
+ usleep(100000);
68
+ u2 = rb_process_cpu_times(iv2pid(self), FCPU_USR);
69
+ usage = ncpu * ((u2 - u1) * 100);
70
+ return rb_float_new(usage);
71
+ }
72
+
73
+ void Init__proceso_pid() {
74
+
75
+ VALUE rb_mProceso = rb_define_module("Proceso");
76
+ rb_cProcesoPID = rb_define_class_under(rb_mProceso, "PID", rb_cObject);
77
+
78
+ rb_define_method(rb_cProcesoPID, "initialize", proceso__process_init, 1);
79
+ rb_define_method(rb_cProcesoPID, "running?", proceso__process_running, 0);
80
+ rb_define_method(rb_cProcesoPID, "command", proceso__process_command, 0);
81
+ rb_define_method(rb_cProcesoPID, "resident_size", proceso__process_rss, 0);
82
+ rb_define_method(rb_cProcesoPID, "virtual_size", proceso__process_vms, 0);
83
+ rb_define_method(rb_cProcesoPID, "user_cpu_times", proceso__process_user_cpu, 0);
84
+ rb_define_method(rb_cProcesoPID, "system_cpu_times", proceso__process_system_cpu, 0);
85
+ rb_define_method(rb_cProcesoPID, "cpu_usage", proceso__process_cpu_usage, 0);
86
+
87
+ }
@@ -0,0 +1,36 @@
1
+ #include "proceso.h"
2
+
3
+ static VALUE rb_mProceso;
4
+
5
+ int iv2pid(VALUE self) {
6
+ return FIX2INT(rb_iv_get(self, "@pid"));
7
+ }
8
+
9
+ #ifdef __APPLE__
10
+ /* Process PIDs */
11
+ static VALUE
12
+ proceso__pids(VALUE self) {
13
+ int *pids = rb_process_list();
14
+ VALUE processes = rb_ary_new();
15
+ int i;
16
+ for(i = 0; i < sizeof(pids); i++) {
17
+ rb_ary_push(processes, INT2NUM(pids[i]));
18
+ }
19
+ return processes;
20
+ }
21
+ #endif
22
+
23
+ void Init_proceso() {
24
+
25
+ rb_mProceso = rb_define_module("Proceso");
26
+
27
+ rb_define_const(rb_mProceso, "NCPU", INT2NUM(rb_hw_ncpu()));
28
+
29
+ #ifdef __APPLE__
30
+ rb_define_singleton_method(rb_mProceso, "pids", proceso__pids, 0);
31
+ #endif
32
+
33
+ Init__proceso_pid();
34
+ }
35
+
36
+
@@ -0,0 +1,20 @@
1
+ #ifndef PROCESO_H
2
+
3
+ #define PROCSEO_H
4
+
5
+ #define PROCESS_RSS 0
6
+ #define PROCESS_VMS 1
7
+ #define FCPU_USR 0
8
+ #define FCPU_SYS 1
9
+
10
+ #include <ruby.h>
11
+
12
+ #if defined(__APPLE__)
13
+ # include "darwin.h"
14
+ #elif defined(__linux) || defined(__linux__) || defined(__LINUX__)
15
+ # include "linux.h"
16
+ #endif
17
+
18
+ #include "utility.h"
19
+
20
+ #endif // PROCESO_H
@@ -0,0 +1,88 @@
1
+ #include "proceso.h"
2
+
3
+ int rb_hw_ncpu() {
4
+ int ncpu = 0;
5
+ #if defined(__APPLE__)
6
+ int mib[2] = { CTL_HW, HW_NCPU };
7
+ int ret;
8
+ size_t len;
9
+ len = sizeof(ncpu);
10
+ ret = sysctl(mib, 2, &ncpu, &len, NULL, 0);
11
+ if (ret == -1) {
12
+ return 0;
13
+ }
14
+ #elif defined(__LINUX__)
15
+ ncpu = rb_proc_ncpu();
16
+ #endif
17
+ return ncpu;
18
+ }
19
+
20
+ float rb_process_cpu_times(int pid, int flag) {
21
+ int ret;
22
+ #if defined(__APPLE__)
23
+ struct proc_taskinfo pti;
24
+ ret = rb_process_info(pid, PROC_PIDTASKINFO, &pti, sizeof(pti));
25
+ if (ret == 0)
26
+ return 0.0;
27
+ if (flag == FCPU_SYS) { // total system
28
+ return (float)pti.pti_total_system / 1000000000.0;
29
+ } else {
30
+ return (float)pti.pti_total_user / 1000000000.0;
31
+ }
32
+ #elif defined(__LINUX__)
33
+ if (flag == FCPU_SYS) {
34
+ return rb_proc_pid_stime(pid);
35
+ } else {
36
+ return rb_proc_pid_utime(pid);
37
+ }
38
+ #endif
39
+ return 0.0;
40
+ }
41
+
42
+ char * rb_process_command(int pid) {
43
+ int ret;
44
+ char *process_name;
45
+ #if defined(__APPLE__)
46
+ int argmax;
47
+ argmax = rb_sysctl_kern_argmax();
48
+ if (argmax) {
49
+ ret = rb_sysctl_kern_procargs2(pid, &process_name, argmax, (size_t)argmax);
50
+ if (ret == 1)
51
+ return process_name;
52
+ }
53
+ #elif defined(__LINUX__)
54
+ process_name = rb_proc_pid_cmdline(pid);
55
+ return process_name;
56
+ #endif
57
+ return NULL;
58
+ }
59
+
60
+ int rb_process_memory_size(int pid, int flag) {
61
+ int result = 0;
62
+ #if defined(__APPLE__)
63
+ kern_return_t kr;
64
+ task_t task;
65
+ kr = task_for_pid(mach_task_self(), pid, &task);
66
+ if (kr == KERN_SUCCESS) {
67
+ task_basic_info_data_t basic_info;
68
+ mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT;
69
+ kr = task_info(task, TASK_BASIC_INFO, (task_info_t)&basic_info, &count);
70
+ if (kr == KERN_SUCCESS) {
71
+ if (count == TASK_BASIC_INFO_COUNT) {
72
+ if (flag == 1) {
73
+ result = (int)basic_info.virtual_size;
74
+ } else {
75
+ result = (int)basic_info.resident_size;
76
+ }
77
+ }
78
+ }
79
+ }
80
+ #elif defined(__LINUX__)
81
+ if (flag == 1) {
82
+ result = rb_proc_pid_vsize(pid);
83
+ } else {
84
+ result = rb_proc_pid_rss(pid);
85
+ }
86
+ #endif
87
+ return result;
88
+ }
@@ -0,0 +1,4 @@
1
+ int rb_hw_ncpu();
2
+ int rb_process_memory_size(int pid, int flag);
3
+ float rb_process_cpu_times(int pid, int flag);
4
+ char * rb_process_command(int pid);
@@ -0,0 +1,71 @@
1
+ require 'rack'
2
+
3
+ module Proceso
4
+ class Middleware
5
+
6
+ SUBSCRIPTION = 'proceso.usage'
7
+
8
+ def self.report
9
+ subscribe do |name, start, finish, id, payload|
10
+ puts
11
+ puts "******* PROCESO INFORMATION *******"
12
+ mem_used = (payload[:mem_used].to_f / 1024.0).round(1)
13
+ cpu_used = payload[:cpu_used].to_f.round(1)
14
+ path = payload[:request].path_info
15
+ resp_time = payload[:resp_time]
16
+ puts "MEM: #{mem_used}KB CPU: #{cpu_used} RESP: #{resp_time}ms PATH: #{path}"
17
+ puts "******* END OF PROCESO INFORMATION *******"
18
+ puts
19
+ end
20
+ end
21
+
22
+ def self.subscribe(&blk)
23
+ return unless defined?(ActiveSupport::Notifications)
24
+ ActiveSupport::Notifications.subscribe(SUBSCRIPTION, &blk)
25
+ end
26
+
27
+ attr_reader :app, :pid, :notifier
28
+
29
+ def initialize(app)
30
+ @app = app
31
+ @notifier ||= ActiveSupport::Notifications if defined?(ActiveSupport::Notifications)
32
+ @pid = Process.pid
33
+ end
34
+
35
+ def call(env)
36
+ measure_process_usage(env) do
37
+ @app.call(env)
38
+ end
39
+ end
40
+
41
+ def measure_process_usage(env)
42
+ mem_1 = process.mem_size
43
+ cpu_1 = process.user_cpu_times
44
+ resp_1 = Time.now.to_i
45
+ response = yield
46
+ mem_2 = process.mem_size
47
+ cpu_2 = process.user_cpu_times
48
+ resp_2 = Time.now.to_i
49
+ process_usage = process_info(env, (mem_2 - mem_1), (cpu_2 - cpu_1), (resp_2 - resp_1))
50
+ notifier.instrument(SUBSCRIPTION, process_usage)
51
+ response
52
+ end
53
+
54
+ def process_info(env, mem_used, cpu_used, resp_time)
55
+ req = Rack::Request.new(env)
56
+ {
57
+ pid: process.pid,
58
+ mem_used: mem_used,
59
+ cpu_used: cpu_used,
60
+ resp_time: resp_time,
61
+ request: req
62
+ }
63
+ end
64
+
65
+ def process
66
+ @process ||= Proceso::PID.new(pid)
67
+ end
68
+
69
+ end
70
+ end
71
+
@@ -0,0 +1,26 @@
1
+ module Proceso
2
+ class PID
3
+
4
+ attr_accessor :pid
5
+
6
+ def path
7
+ File.dirname(command)
8
+ end
9
+
10
+ def executable
11
+ File.basename(command)
12
+ end
13
+
14
+ def mem_size(format = :bytes)
15
+ rss = resident_size
16
+ rss *= 1024 if RUBY_PLATFORM =~ /linux/
17
+ case format.to_s
18
+ when "bytes" then rss
19
+ when "kb", "kilobytes" then rss.to_f / 1024.0
20
+ when "mb", "megabytes" then rss.to_f / 1024.0 / 1024.0
21
+ when "gb", "gigabytes" then rss.to_f / 1024.0 / 1024.0 / 1024.0
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module Proceso
2
- VERSION = "0.0.0"
3
- end
2
+ VERSION = "0.1.1"
3
+ end
data/lib/proceso.rb CHANGED
@@ -1 +1,29 @@
1
- require 'proceso/proceso'
1
+ require 'proceso/proceso'
2
+ require 'proceso/pid'
3
+
4
+ module Proceso
5
+ extend self
6
+
7
+ if RUBY_PLATFORM =~ /linux/
8
+ def pids
9
+ Dir["/proc/*"].select do
10
+ |x| x =~ /\/\d+$/
11
+ end.map(&File.method(:basename)).map(&:to_i)
12
+ end
13
+ end
14
+
15
+ def processes
16
+ pids.map do |i|
17
+ Proceso::PID.new(i)
18
+ end
19
+ end
20
+
21
+ def current
22
+ @current ||= Proceso::PID.new(Process.pid)
23
+ end
24
+
25
+ end
26
+
27
+ if defined?(Rails) || defined?(Rack)
28
+ require 'proceso/middleware'
29
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe Proceso::PID do
4
+
5
+ let(:process) { Proceso::PID.new($$) }
6
+
7
+ it "should create new Process object with pid" do
8
+ expect { Proceso::PID.new($$) }.to_not raise_error
9
+ end
10
+
11
+ it "creates new Base object without argument will raise error" do
12
+ expect { Proceso::PID.new }.to raise_error
13
+ end
14
+
15
+ it "should be running" do
16
+ process.running?.should be_true
17
+ end
18
+
19
+ it "should return process command" do
20
+ process.command.should =~ /ruby/
21
+ end
22
+
23
+ it "should return executable name" do
24
+ process.executable.should == "ruby"
25
+ end
26
+
27
+ it "should return path name" do
28
+ process.path.should =~ /bin$/
29
+ end
30
+
31
+ it "should return resident size in bytes" do
32
+ process.resident_size.should be_kind_of(Numeric)
33
+ process.stub(:resident_size).and_return(100)
34
+ process.resident_size.should == 100
35
+ end
36
+
37
+ it "should return virtual size in bytes" do
38
+ process.virtual_size.should be_kind_of(Numeric)
39
+ process.stub(:virtual_size).and_return(100)
40
+ process.virtual_size.should == 100
41
+ end
42
+
43
+ it "should return cpu usage" do
44
+ process.cpu_usage.should be_kind_of(Float)
45
+ process.stub(:cpu_usage).and_return(0.1)
46
+ process.cpu_usage.should == 0.1
47
+ end
48
+
49
+ it "should return user cpu times" do
50
+ process.user_cpu_times.should be_kind_of(Float)
51
+ process.stub(:user_cpu_times).and_return(0.1)
52
+ process.user_cpu_times.should == 0.1
53
+ end
54
+
55
+ it "should return system cpu times" do
56
+ process.system_cpu_times.should be_kind_of(Float)
57
+ process.stub(:system_cpu_times).and_return(0.1)
58
+ process.system_cpu_times.should == 0.1
59
+ end
60
+
61
+ it "should return mem size" do
62
+ process.mem_size.should be_kind_of(Numeric)
63
+ rss = process.resident_size
64
+ process.stub(:resident_size).and_return(rss)
65
+ rss *= 1024 if RUBY_PLATFORM =~ /linux/
66
+ process.mem_size.should == rss
67
+ process.mem_size(:kb).should == (rss / 1024.0)
68
+ process.mem_size(:mb).should == (rss / 1024.0 / 1024.0)
69
+ process.mem_size(:gb).should == (rss / 1024.0 / 1024.0 / 1024.0)
70
+ end
71
+
72
+ end
data/spec/proceso_spec.rb CHANGED
@@ -2,42 +2,22 @@ require "spec_helper"
2
2
 
3
3
  describe Proceso do
4
4
 
5
- let(:process) { Proceso::Info.new($$) }
6
-
7
- it "should create new Process object with pid" do
8
- expect { Proceso::Info.new($$) }.to_not raise_error
9
- end
10
-
11
- it "creates new Base object without argument will raise error" do
12
- expect { Proceso::Info.new }.to raise_error
13
- end
14
-
15
- it "should be running" do
16
- process.running?.should be_true
17
- end
18
-
19
- it "should return process name" do
20
- process.name.should =~ /ruby/
21
- end
22
-
23
- it "should return resident size in bytes" do
24
- process.resident_size.should be_kind_of(Numeric)
25
- end
26
-
27
- it "should return virtual size in bytes" do
28
- process.virtual_size.should be_kind_of(Numeric)
5
+ it "should return cpu core" do
6
+ Proceso::NCPU.should_not == 0
29
7
  end
30
8
 
31
- it "should return cpu usage" do
32
- process.cpu_usage.should be_kind_of(Float)
9
+ it "should return list of pids" do
10
+ Proceso.pids.should be_kind_of(Array)
33
11
  end
34
12
 
35
- it "should return user cpu times" do
36
- process.user_cpu_times.should be_kind_of(Float)
13
+ it "should return list of Proceso::PID objects" do
14
+ Proceso.processes.should be_kind_of(Array)
15
+ Proceso.processes.last.should be_kind_of(Proceso::PID)
37
16
  end
38
17
 
39
- it "should return system cpu times" do
40
- process.system_cpu_times.should be_kind_of(Float)
18
+ it "should return current process" do
19
+ Proceso.current.should_not be_nil
20
+ Proceso.current.pid.should == Process.pid
41
21
  end
42
22
 
43
23
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proceso
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Goines
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-14 00:00:00.000000000 Z
11
+ date: 2013-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rake
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -74,11 +88,23 @@ extensions:
74
88
  - ext/proceso/extconf.rb
75
89
  extra_rdoc_files: []
76
90
  files:
91
+ - lib/proceso/middleware.rb
92
+ - lib/proceso/pid.rb
77
93
  - lib/proceso/version.rb
78
94
  - lib/proceso.rb
95
+ - ext/proceso/extconf.rb
96
+ - ext/proceso/darwin.c
97
+ - ext/proceso/linux.c
98
+ - ext/proceso/pid.c
99
+ - ext/proceso/proceso.c
100
+ - ext/proceso/utility.c
101
+ - ext/proceso/darwin.h
102
+ - ext/proceso/linux.h
103
+ - ext/proceso/proceso.h
104
+ - ext/proceso/utility.h
105
+ - spec/proceso/pid_spec.rb
79
106
  - spec/proceso_spec.rb
80
107
  - spec/spec_helper.rb
81
- - ext/proceso/extconf.rb
82
108
  homepage: https://github.com/bry4n/proceso
83
109
  licenses:
84
110
  - MIT
@@ -105,5 +131,6 @@ signing_key:
105
131
  specification_version: 4
106
132
  summary: Simple process information gather
107
133
  test_files:
134
+ - spec/proceso/pid_spec.rb
108
135
  - spec/proceso_spec.rb
109
136
  - spec/spec_helper.rb