]> arthur.barton.de Git - netdata.git/blob - src/plugin_proc.c
improvements identified via static code analysis with cppcheck
[netdata.git] / src / plugin_proc.c
1 #include "common.h"
2
3 void *proc_main(void *ptr)
4 {
5     (void)ptr;
6
7     info("PROC Plugin thread created with task id %d", gettid());
8
9     if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) != 0)
10         error("Cannot set pthread cancel type to DEFERRED.");
11
12     if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
13         error("Cannot set pthread cancel state to ENABLE.");
14
15     // disable (by default) various interface that are not needed
16     config_get_boolean("plugin:proc:/proc/net/dev:lo", "enabled", 0);
17     config_get_boolean("plugin:proc:/proc/net/dev:fireqos_monitor", "enabled", 0);
18
19     // when ZERO, attempt to do it
20     int vdo_proc_net_dev            = !config_get_boolean("plugin:proc", "/proc/net/dev", 1);
21     int vdo_proc_diskstats          = !config_get_boolean("plugin:proc", "/proc/diskstats", 1);
22     int vdo_proc_net_snmp           = !config_get_boolean("plugin:proc", "/proc/net/snmp", 1);
23     int vdo_proc_net_snmp6          = !config_get_boolean("plugin:proc", "/proc/net/snmp6", 1);
24     int vdo_proc_net_netstat        = !config_get_boolean("plugin:proc", "/proc/net/netstat", 1);
25     int vdo_proc_net_stat_conntrack = !config_get_boolean("plugin:proc", "/proc/net/stat/conntrack", 1);
26     int vdo_proc_net_ip_vs_stats    = !config_get_boolean("plugin:proc", "/proc/net/ip_vs/stats", 1);
27     int vdo_proc_net_stat_synproxy  = !config_get_boolean("plugin:proc", "/proc/net/stat/synproxy", 1);
28     int vdo_proc_stat               = !config_get_boolean("plugin:proc", "/proc/stat", 1);
29     int vdo_proc_meminfo            = !config_get_boolean("plugin:proc", "/proc/meminfo", 1);
30     int vdo_proc_vmstat             = !config_get_boolean("plugin:proc", "/proc/vmstat", 1);
31     int vdo_proc_net_rpc_nfs        = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfs", 1);
32     int vdo_proc_net_rpc_nfsd       = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfsd", 1);
33     int vdo_proc_sys_kernel_random_entropy_avail    = !config_get_boolean("plugin:proc", "/proc/sys/kernel/random/entropy_avail", 1);
34     int vdo_proc_interrupts         = !config_get_boolean("plugin:proc", "/proc/interrupts", 1);
35     int vdo_proc_softirqs           = !config_get_boolean("plugin:proc", "/proc/softirqs", 1);
36     int vdo_proc_net_softnet_stat   = !config_get_boolean("plugin:proc", "/proc/net/softnet_stat", 1);
37     int vdo_proc_loadavg            = !config_get_boolean("plugin:proc", "/proc/loadavg", 1);
38     int vdo_ipc                     = !config_get_boolean("plugin:proc", "ipc", 1);
39     int vdo_sys_kernel_mm_ksm       = !config_get_boolean("plugin:proc", "/sys/kernel/mm/ksm", 1);
40     int vdo_cpu_netdata             = !config_get_boolean("plugin:proc", "netdata server resources", 1);
41
42     // keep track of the time each module was called
43     unsigned long long sutime_proc_net_dev = 0ULL;
44     unsigned long long sutime_proc_diskstats = 0ULL;
45     unsigned long long sutime_proc_net_snmp = 0ULL;
46     unsigned long long sutime_proc_net_snmp6 = 0ULL;
47     unsigned long long sutime_proc_net_netstat = 0ULL;
48     unsigned long long sutime_proc_net_stat_conntrack = 0ULL;
49     unsigned long long sutime_proc_net_ip_vs_stats = 0ULL;
50     unsigned long long sutime_proc_net_stat_synproxy = 0ULL;
51     unsigned long long sutime_proc_stat = 0ULL;
52     unsigned long long sutime_proc_meminfo = 0ULL;
53     unsigned long long sutime_proc_vmstat = 0ULL;
54     unsigned long long sutime_proc_net_rpc_nfs = 0ULL;
55     unsigned long long sutime_proc_net_rpc_nfsd = 0ULL;
56     unsigned long long sutime_proc_sys_kernel_random_entropy_avail = 0ULL;
57     unsigned long long sutime_proc_interrupts = 0ULL;
58     unsigned long long sutime_proc_softirqs = 0ULL;
59     unsigned long long sutime_proc_net_softnet_stat = 0ULL;
60     unsigned long long sutime_proc_loadavg = 0ULL;
61     unsigned long long sutime_ipc = 0ULL;
62     unsigned long long sutime_sys_kernel_mm_ksm = 0ULL;
63
64     // the next time we will run - aligned properly
65     unsigned long long sunext = (time(NULL) - (time(NULL) % rrd_update_every) + rrd_update_every) * 1000000ULL;
66
67     for(;;) {
68         unsigned long long sunow;
69         if(unlikely(netdata_exit)) break;
70
71         // delay until it is our time to run
72         while((sunow = time_usec()) < sunext)
73             sleep_usec(sunext - sunow);
74
75         // find the next time we need to run
76         while(time_usec() > sunext)
77             sunext += rrd_update_every * 1000000ULL;
78
79         if(unlikely(netdata_exit)) break;
80
81         // BEGIN -- the job to be done
82
83         if(!vdo_sys_kernel_mm_ksm) {
84             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_sys_kernel_mm_ksm().");
85
86             sunow = time_usec();
87             vdo_sys_kernel_mm_ksm = do_sys_kernel_mm_ksm(rrd_update_every, (sutime_sys_kernel_mm_ksm > 0)?sunow - sutime_sys_kernel_mm_ksm:0ULL);
88             sutime_sys_kernel_mm_ksm = sunow;
89         }
90         if(unlikely(netdata_exit)) break;
91
92         if(!vdo_proc_loadavg) {
93             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_loadavg().");
94             sunow = time_usec();
95             vdo_proc_loadavg = do_proc_loadavg(rrd_update_every, (sutime_proc_loadavg > 0)?sunow - sutime_proc_loadavg:0ULL);
96             sutime_proc_loadavg = sunow;
97         }
98         if(unlikely(netdata_exit)) break;
99
100         if(!vdo_ipc) {
101             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_ipc().");
102             sunow = time_usec();
103             vdo_ipc = do_ipc(rrd_update_every, (sutime_ipc > 0)?sunow - sutime_ipc:0ULL);
104             sutime_ipc = sunow;
105         }
106         if(unlikely(netdata_exit)) break;
107
108         if(!vdo_proc_interrupts) {
109             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_interrupts().");
110             sunow = time_usec();
111             vdo_proc_interrupts = do_proc_interrupts(rrd_update_every, (sutime_proc_interrupts > 0)?sunow - sutime_proc_interrupts:0ULL);
112             sutime_proc_interrupts = sunow;
113         }
114         if(unlikely(netdata_exit)) break;
115
116         if(!vdo_proc_softirqs) {
117             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_softirqs().");
118             sunow = time_usec();
119             vdo_proc_softirqs = do_proc_softirqs(rrd_update_every, (sutime_proc_softirqs > 0)?sunow - sutime_proc_softirqs:0ULL);
120             sutime_proc_softirqs = sunow;
121         }
122         if(unlikely(netdata_exit)) break;
123
124         if(!vdo_proc_net_softnet_stat) {
125             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_softnet_stat().");
126             sunow = time_usec();
127             vdo_proc_net_softnet_stat = do_proc_net_softnet_stat(rrd_update_every, (sutime_proc_net_softnet_stat > 0)?sunow - sutime_proc_net_softnet_stat:0ULL);
128             sutime_proc_net_softnet_stat = sunow;
129         }
130         if(unlikely(netdata_exit)) break;
131
132         if(!vdo_proc_sys_kernel_random_entropy_avail) {
133             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_sys_kernel_random_entropy_avail().");
134             sunow = time_usec();
135             vdo_proc_sys_kernel_random_entropy_avail = do_proc_sys_kernel_random_entropy_avail(rrd_update_every, (sutime_proc_sys_kernel_random_entropy_avail > 0)?sunow - sutime_proc_sys_kernel_random_entropy_avail:0ULL);
136             sutime_proc_sys_kernel_random_entropy_avail = sunow;
137         }
138         if(unlikely(netdata_exit)) break;
139
140         if(!vdo_proc_net_dev) {
141             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_dev().");
142             sunow = time_usec();
143             vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, (sutime_proc_net_dev > 0)?sunow - sutime_proc_net_dev:0ULL);
144             sutime_proc_net_dev = sunow;
145         }
146         if(unlikely(netdata_exit)) break;
147
148         if(!vdo_proc_diskstats) {
149             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_diskstats().");
150             sunow = time_usec();
151             vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, (sutime_proc_diskstats > 0)?sunow - sutime_proc_diskstats:0ULL);
152             sutime_proc_diskstats = sunow;
153         }
154         if(unlikely(netdata_exit)) break;
155
156         if(!vdo_proc_net_snmp) {
157             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp().");
158             sunow = time_usec();
159             vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, (sutime_proc_net_snmp > 0)?sunow - sutime_proc_net_snmp:0ULL);
160             sutime_proc_net_snmp = sunow;
161         }
162         if(unlikely(netdata_exit)) break;
163
164         if(!vdo_proc_net_snmp6) {
165             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp6().");
166             sunow = time_usec();
167             vdo_proc_net_snmp6 = do_proc_net_snmp6(rrd_update_every, (sutime_proc_net_snmp6 > 0)?sunow - sutime_proc_net_snmp6:0ULL);
168             sutime_proc_net_snmp6 = sunow;
169         }
170         if(unlikely(netdata_exit)) break;
171
172         if(!vdo_proc_net_netstat) {
173             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_netstat().");
174             sunow = time_usec();
175             vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, (sutime_proc_net_netstat > 0)?sunow - sutime_proc_net_netstat:0ULL);
176             sutime_proc_net_netstat = sunow;
177         }
178         if(unlikely(netdata_exit)) break;
179
180         if(!vdo_proc_net_stat_conntrack) {
181             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_stat_conntrack().");
182             sunow = time_usec();
183             vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(rrd_update_every, (sutime_proc_net_stat_conntrack > 0)?sunow - sutime_proc_net_stat_conntrack:0ULL);
184             sutime_proc_net_stat_conntrack = sunow;
185         }
186         if(unlikely(netdata_exit)) break;
187
188         if(!vdo_proc_net_ip_vs_stats) {
189             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_ip_vs_stats().");
190             sunow = time_usec();
191             vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(rrd_update_every, (sutime_proc_net_ip_vs_stats > 0)?sunow - sutime_proc_net_ip_vs_stats:0ULL);
192             sutime_proc_net_ip_vs_stats = sunow;
193         }
194         if(unlikely(netdata_exit)) break;
195
196         if(!vdo_proc_net_stat_synproxy) {
197             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_stat_synproxy().");
198             sunow = time_usec();
199             vdo_proc_net_stat_synproxy = do_proc_net_stat_synproxy(rrd_update_every, (sutime_proc_net_stat_synproxy > 0)?sunow - sutime_proc_net_stat_synproxy:0ULL);
200             sutime_proc_net_stat_synproxy = sunow;
201         }
202         if(unlikely(netdata_exit)) break;
203
204         if(!vdo_proc_stat) {
205             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_stat().");
206             sunow = time_usec();
207             vdo_proc_stat = do_proc_stat(rrd_update_every, (sutime_proc_stat > 0)?sunow - sutime_proc_stat:0ULL);
208             sutime_proc_stat = sunow;
209         }
210         if(unlikely(netdata_exit)) break;
211
212         if(!vdo_proc_meminfo) {
213             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_meminfo().");
214             sunow = time_usec();
215             vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, (sutime_proc_meminfo > 0)?sunow - sutime_proc_meminfo:0ULL);
216             sutime_proc_meminfo = sunow;
217         }
218         if(unlikely(netdata_exit)) break;
219
220         if(!vdo_proc_vmstat) {
221             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_vmstat().");
222             sunow = time_usec();
223             vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, (sutime_proc_vmstat > 0)?sunow - sutime_proc_vmstat:0ULL);
224             sutime_proc_vmstat = sunow;
225         }
226         if(unlikely(netdata_exit)) break;
227
228         if(!vdo_proc_net_rpc_nfsd) {
229             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfsd().");
230             sunow = time_usec();
231             vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(rrd_update_every, (sutime_proc_net_rpc_nfsd > 0)?sunow - sutime_proc_net_rpc_nfsd:0ULL);
232             sutime_proc_net_rpc_nfsd = sunow;
233         }
234         if(unlikely(netdata_exit)) break;
235
236         if(!vdo_proc_net_rpc_nfs) {
237             debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfs().");
238             sunow = time_usec();
239             vdo_proc_net_rpc_nfs = do_proc_net_rpc_nfs(rrd_update_every, (sutime_proc_net_rpc_nfs > 0)?sunow - sutime_proc_net_rpc_nfs:0ULL);
240             sutime_proc_net_rpc_nfs = sunow;
241         }
242         if(unlikely(netdata_exit)) break;
243
244         // END -- the job is done
245
246         // --------------------------------------------------------------------
247
248         if(!vdo_cpu_netdata) {
249             global_statistics_charts();
250             registry_statistics();
251         }
252     }
253
254     info("PROC thread exiting");
255
256     pthread_exit(NULL);
257     return NULL;
258 }