]> arthur.barton.de Git - netdata.git/blob - src/plugin_proc.c
added nfsd statistics (v2, v3 and v4)
[netdata.git] / src / plugin_proc.c
1 #include <pthread.h>
2 #include <sys/time.h>
3 #include <sys/resource.h>
4 #include <strings.h>
5 #include <unistd.h>
6
7 #include "global_statistics.h"
8 #include "common.h"
9 #include "config.h"
10 #include "log.h"
11 #include "rrd.h"
12 #include "plugin_proc.h"
13
14 void *proc_main(void *ptr)
15 {
16         if(ptr) { ; }
17
18         if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) != 0)
19                 error("Cannot set pthread cancel type to DEFERRED.");
20
21         if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
22                 error("Cannot set pthread cancel state to ENABLE.");
23
24         struct rusage me, me_last;
25         struct timeval last, now;
26
27         gettimeofday(&last, NULL);
28         last.tv_sec -= update_every;
29         
30         // disable (by default) various interface that are not needed
31         config_get_boolean("plugin:proc:/proc/net/dev", "interface lo", 0);
32         config_get_boolean("plugin:proc:/proc/net/dev", "interface fireqos_monitor", 0);
33
34         // when ZERO, attempt to do it
35         int vdo_proc_net_dev                    = !config_get_boolean("plugin:proc", "/proc/net/dev", 1);
36         int vdo_proc_diskstats                  = !config_get_boolean("plugin:proc", "/proc/diskstats", 1);
37         int vdo_proc_net_snmp                   = !config_get_boolean("plugin:proc", "/proc/net/snmp", 1);
38         int vdo_proc_net_netstat                = !config_get_boolean("plugin:proc", "/proc/net/netstat", 1);
39         int vdo_proc_net_stat_conntrack = !config_get_boolean("plugin:proc", "/proc/net/stat/conntrack", 1);
40         int vdo_proc_net_ip_vs_stats    = !config_get_boolean("plugin:proc", "/proc/net/ip_vs/stats", 1);
41         int vdo_proc_stat                               = !config_get_boolean("plugin:proc", "/proc/stat", 1);
42         int vdo_proc_meminfo                    = !config_get_boolean("plugin:proc", "/proc/meminfo", 1);
43         int vdo_proc_vmstat                     = !config_get_boolean("plugin:proc", "/proc/vmstat", 1);
44         int vdo_proc_net_rpc_nfsd               = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfsd", 1);
45         int vdo_cpu_netdata                     = !config_get_boolean("plugin:proc", "netdata server resources", 1);
46
47         RRD_STATS *stcpu = NULL, *stclients = NULL, *streqs = NULL, *stbytes = NULL;
48
49         gettimeofday(&last, NULL);
50         getrusage(RUSAGE_SELF, &me_last);
51
52         unsigned long long usec = 0, susec = 0;
53         for(;1;) {
54                 
55                 // BEGIN -- the job to be done
56                 if(!vdo_proc_net_dev)                           vdo_proc_net_dev                        = do_proc_net_dev(update_every, usec+susec);
57                 if(!vdo_proc_diskstats)                         vdo_proc_diskstats                      = do_proc_diskstats(update_every, usec+susec);
58                 if(!vdo_proc_net_snmp)                          vdo_proc_net_snmp                       = do_proc_net_snmp(update_every, usec+susec);
59                 if(!vdo_proc_net_netstat)                       vdo_proc_net_netstat            = do_proc_net_netstat(update_every, usec+susec);
60                 if(!vdo_proc_net_stat_conntrack)        vdo_proc_net_stat_conntrack     = do_proc_net_stat_conntrack(update_every, usec+susec);
61                 if(!vdo_proc_net_ip_vs_stats)           vdo_proc_net_ip_vs_stats        = do_proc_net_ip_vs_stats(update_every, usec+susec);
62                 if(!vdo_proc_stat)                                      vdo_proc_stat                           = do_proc_stat(update_every, usec+susec);
63                 if(!vdo_proc_meminfo)                           vdo_proc_meminfo                        = do_proc_meminfo(update_every, usec+susec);
64                 if(!vdo_proc_vmstat)                            vdo_proc_vmstat                         = do_proc_vmstat(update_every, usec+susec);
65                 if(!vdo_proc_net_rpc_nfsd)                      vdo_proc_net_rpc_nfsd           = do_proc_net_rpc_nfsd(update_every, usec+susec);
66                 // END -- the job is done
67                 
68                 // find the time to sleep in order to wait exactly update_every seconds
69                 gettimeofday(&now, NULL);
70                 usec = usecdiff(&now, &last) - susec;
71                 debug(D_PROCNETDEV_LOOP, "PROCNETDEV: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec);
72                 
73                 if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec;
74                 else susec = update_every * 1000000ULL / 2ULL;
75                 
76                 // --------------------------------------------------------------------
77
78                 if(!vdo_cpu_netdata && getrusage(RUSAGE_SELF, &me) == 0) {
79                 
80                         unsigned long long cpuuser = me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec;
81                         unsigned long long cpusyst = me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec;
82
83                         if(!stcpu) stcpu = rrd_stats_find("netdata.server_cpu");
84                         if(!stcpu) {
85                                 stcpu = rrd_stats_create("netdata", "server_cpu", NULL, "netdata", "NetData CPU usage", "milliseconds/s", 9999, update_every, CHART_TYPE_STACKED);
86
87                                 rrd_stats_dimension_add(stcpu, "user",  NULL,  1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
88                                 rrd_stats_dimension_add(stcpu, "system", NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
89                         }
90                         else rrd_stats_next(stcpu);
91
92                         rrd_stats_dimension_set(stcpu, "user", cpuuser);
93                         rrd_stats_dimension_set(stcpu, "system", cpusyst);
94                         rrd_stats_done(stcpu);
95                         
96                         bcopy(&me, &me_last, sizeof(struct rusage));
97
98                         // ----------------------------------------------------------------
99
100                         if(!stclients) stclients = rrd_stats_find("netdata.clients");
101                         if(!stclients) {
102                                 stclients = rrd_stats_create("netdata", "clients", NULL, "netdata", "NetData Web Clients", "connected clients", 11000, update_every, CHART_TYPE_LINE);
103
104                                 rrd_stats_dimension_add(stclients, "clients",  NULL,  1, 1, RRD_DIMENSION_ABSOLUTE);
105                         }
106                         else rrd_stats_next(stclients);
107
108                         rrd_stats_dimension_set(stclients, "clients", global_statistics.connected_clients);
109                         rrd_stats_done(stclients);
110
111                         // ----------------------------------------------------------------
112
113                         if(!streqs) streqs = rrd_stats_find("netdata.requests");
114                         if(!streqs) {
115                                 streqs = rrd_stats_create("netdata", "requests", NULL, "netdata", "NetData Web Requests", "requests/s", 12000, update_every, CHART_TYPE_LINE);
116
117                                 rrd_stats_dimension_add(streqs, "requests",  NULL,  1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
118                         }
119                         else rrd_stats_next(streqs);
120
121                         rrd_stats_dimension_set(streqs, "requests", global_statistics.web_requests);
122                         rrd_stats_done(streqs);
123
124                         // ----------------------------------------------------------------
125
126                         if(!stbytes) stbytes = rrd_stats_find("netdata.net");
127                         if(!stbytes) {
128                                 stbytes = rrd_stats_create("netdata", "net", NULL, "netdata", "NetData Network Traffic", "kilobits/s", 13000, update_every, CHART_TYPE_AREA);
129
130                                 rrd_stats_dimension_add(stbytes, "in",  NULL,  8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
131                                 rrd_stats_dimension_add(stbytes, "out",  NULL,  -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
132                         }
133                         else rrd_stats_next(stbytes);
134
135                         rrd_stats_dimension_set(stbytes, "in", global_statistics.bytes_received);
136                         rrd_stats_dimension_set(stbytes, "out", global_statistics.bytes_sent);
137                         rrd_stats_done(stbytes);
138                 }
139
140                 usleep(susec);
141                 
142                 // copy current to last
143                 bcopy(&now, &last, sizeof(struct timeval));
144         }
145
146         return NULL;
147 }