@cryptotaxi247 / netdata-1 / commits / f569beac5

Move global stats to a separate thread (#10991)

Vladimir Kobal committed Apr 19, 2021 at 16:46 UTC f569beac51534fb0fe5ca0e33d2b63dbdc2d5427
14 files changed +477 -320
backends/backends.c
+1 -1
@@ -690,7 +690,7 @@ void *backends_main(void *ptr) {
690 rrddim_add(chart_latency, "latency", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
691 */
692
693 - RRDSET *chart_rusage = rrdset_create_localhost("netdata", "backend_thread_cpu", NULL, "backend", NULL, "NetData Backend Thread CPU usage", "milliseconds/s", "backends", NULL, 130630, global_backend_update_every, RRDSET_TYPE_STACKED);
693 + RRDSET *chart_rusage = rrdset_create_localhost("netdata", "backend_thread_cpu", NULL, "backend", NULL, "Netdata Backend Thread CPU usage", "milliseconds/s", "backends", NULL, 130630, global_backend_update_every, RRDSET_TYPE_STACKED);
694 rrddim_add(chart_rusage, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
695 rrddim_add(chart_rusage, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
696
collectors/cgroups.plugin/sys_fs_cgroup.c
+1 -1
@@ -4077,7 +4077,7 @@ void *cgroups_main(void *ptr) {
4077 , NULL
4078 , "cgroups"
4079 , NULL
4080 - , "NetData CGroups Plugin CPU usage"
4080 + , "Netdata CGroups Plugin CPU usage"
4081 , "milliseconds/s"
4082 , PLUGIN_CGROUPS_NAME
4083 , "stats"
collectors/diskspace.plugin/plugin_diskspace.c
+2 -2
@@ -413,7 +413,7 @@ void *diskspace_main(void *ptr) {
413 , NULL
414 , "diskspace"
415 , NULL
416 - , "NetData Disk Space Plugin CPU usage"
416 + , "Netdata Disk Space Plugin CPU usage"
417 , "milliseconds/s"
418 , PLUGIN_DISKSPACE_NAME
419 , NULL
@@ -441,7 +441,7 @@ void *diskspace_main(void *ptr) {
441 , NULL
442 , "diskspace"
443 , NULL
444 - , "NetData Disk Space Plugin Duration"
444 + , "Netdata Disk Space Plugin Duration"
445 , "milliseconds/run"
446 , PLUGIN_DISKSPACE_NAME
447 , NULL
collectors/freebsd.plugin/plugin_freebsd.c
+131 -95
@@ -15,60 +15,61 @@ static struct freebsd_module {
15
16 } freebsd_modules[] = {
17
18 - // system metrics
19 - { .name = "kern.cp_time", .dim = "cp_time", .enabled = 1, .func = do_kern_cp_time },
20 - { .name = "vm.loadavg", .dim = "loadavg", .enabled = 1, .func = do_vm_loadavg },
21 - { .name = "system.ram", .dim = "system_ram", .enabled = 1, .func = do_system_ram },
22 - { .name = "vm.swap_info", .dim = "swap", .enabled = 1, .func = do_vm_swap_info },
23 - { .name = "vm.stats.vm.v_swappgs", .dim = "swap_io", .enabled = 1, .func = do_vm_stats_sys_v_swappgs },
24 - { .name = "vm.vmtotal", .dim = "vmtotal", .enabled = 1, .func = do_vm_vmtotal },
25 - { .name = "vm.stats.vm.v_forks", .dim = "forks", .enabled = 1, .func = do_vm_stats_sys_v_forks },
26 - { .name = "vm.stats.sys.v_swtch", .dim = "context_swtch", .enabled = 1, .func = do_vm_stats_sys_v_swtch },
27 - { .name = "hw.intrcnt", .dim = "hw_intr", .enabled = 1, .func = do_hw_intcnt },
28 - { .name = "vm.stats.sys.v_intr", .dim = "dev_intr", .enabled = 1, .func = do_vm_stats_sys_v_intr },
29 - { .name = "vm.stats.sys.v_soft", .dim = "soft_intr", .enabled = 1, .func = do_vm_stats_sys_v_soft },
30 - { .name = "net.isr", .dim = "net_isr", .enabled = 1, .func = do_net_isr },
31 - { .name = "kern.ipc.sem", .dim = "semaphores", .enabled = 1, .func = do_kern_ipc_sem },
32 - { .name = "kern.ipc.shm", .dim = "shared_memory", .enabled = 1, .func = do_kern_ipc_shm },
33 - { .name = "kern.ipc.msq", .dim = "message_queues", .enabled = 1, .func = do_kern_ipc_msq },
34 - { .name = "uptime", .dim = "uptime", .enabled = 1, .func = do_uptime },
35 -
36 - // memory metrics
37 - { .name = "vm.stats.vm.v_pgfaults", .dim = "pgfaults", .enabled = 1, .func = do_vm_stats_sys_v_pgfaults },
38 -
39 - // CPU metrics
40 - { .name = "kern.cp_times", .dim = "cp_times", .enabled = 1, .func = do_kern_cp_times },
41 - { .name = "dev.cpu.temperature", .dim = "cpu_temperature", .enabled = 1, .func = do_dev_cpu_temperature },
42 - { .name = "dev.cpu.0.freq", .dim = "cpu_frequency", .enabled = 1, .func = do_dev_cpu_0_freq },
43 -
44 - // disk metrics
45 - { .name = "kern.devstat", .dim = "kern_devstat", .enabled = 1, .func = do_kern_devstat },
46 - { .name = "getmntinfo", .dim = "getmntinfo", .enabled = 1, .func = do_getmntinfo },
47 -
48 - // network metrics
49 - { .name = "net.inet.tcp.states", .dim = "tcp_states", .enabled = 1, .func = do_net_inet_tcp_states },
50 - { .name = "net.inet.tcp.stats", .dim = "tcp_stats", .enabled = 1, .func = do_net_inet_tcp_stats },
51 - { .name = "net.inet.udp.stats", .dim = "udp_stats", .enabled = 1, .func = do_net_inet_udp_stats },
52 - { .name = "net.inet.icmp.stats", .dim = "icmp_stats", .enabled = 1, .func = do_net_inet_icmp_stats },
53 - { .name = "net.inet.ip.stats", .dim = "ip_stats", .enabled = 1, .func = do_net_inet_ip_stats },
54 - { .name = "net.inet6.ip6.stats", .dim = "ip6_stats", .enabled = 1, .func = do_net_inet6_ip6_stats },
55 - { .name = "net.inet6.icmp6.stats", .dim = "icmp6_stats", .enabled = 1, .func = do_net_inet6_icmp6_stats },
56 -
57 - // network interfaces metrics
58 - { .name = "getifaddrs", .dim = "getifaddrs", .enabled = 1, .func = do_getifaddrs },
59 -
60 - // ZFS metrics
61 - { .name = "kstat.zfs.misc.arcstats", .dim = "arcstats", .enabled = 1, .func = do_kstat_zfs_misc_arcstats },
62 - { .name = "kstat.zfs.misc.zio_trim", .dim = "trim", .enabled = 1, .func = do_kstat_zfs_misc_zio_trim },
63 -
64 - // ipfw metrics
65 - { .name = "ipfw", .dim = "ipfw", .enabled = 1, .func = do_ipfw },
66 -
67 - // the terminator of this array
68 - { .name = NULL, .dim = NULL, .enabled = 0, .func = NULL }
18 + // system metrics
19 + {.name = "kern.cp_time", .dim = "cp_time", .enabled = 1, .func = do_kern_cp_time},
20 + {.name = "vm.loadavg", .dim = "loadavg", .enabled = 1, .func = do_vm_loadavg},
21 + {.name = "system.ram", .dim = "system_ram", .enabled = 1, .func = do_system_ram},
22 + {.name = "vm.swap_info", .dim = "swap", .enabled = 1, .func = do_vm_swap_info},
23 + {.name = "vm.stats.vm.v_swappgs", .dim = "swap_io", .enabled = 1, .func = do_vm_stats_sys_v_swappgs},
24 + {.name = "vm.vmtotal", .dim = "vmtotal", .enabled = 1, .func = do_vm_vmtotal},
25 + {.name = "vm.stats.vm.v_forks", .dim = "forks", .enabled = 1, .func = do_vm_stats_sys_v_forks},
26 + {.name = "vm.stats.sys.v_swtch", .dim = "context_swtch", .enabled = 1, .func = do_vm_stats_sys_v_swtch},
27 + {.name = "hw.intrcnt", .dim = "hw_intr", .enabled = 1, .func = do_hw_intcnt},
28 + {.name = "vm.stats.sys.v_intr", .dim = "dev_intr", .enabled = 1, .func = do_vm_stats_sys_v_intr},
29 + {.name = "vm.stats.sys.v_soft", .dim = "soft_intr", .enabled = 1, .func = do_vm_stats_sys_v_soft},
30 + {.name = "net.isr", .dim = "net_isr", .enabled = 1, .func = do_net_isr},
31 + {.name = "kern.ipc.sem", .dim = "semaphores", .enabled = 1, .func = do_kern_ipc_sem},
32 + {.name = "kern.ipc.shm", .dim = "shared_memory", .enabled = 1, .func = do_kern_ipc_shm},
33 + {.name = "kern.ipc.msq", .dim = "message_queues", .enabled = 1, .func = do_kern_ipc_msq},
34 + {.name = "uptime", .dim = "uptime", .enabled = 1, .func = do_uptime},
35 +
36 + // memory metrics
37 + {.name = "vm.stats.vm.v_pgfaults", .dim = "pgfaults", .enabled = 1, .func = do_vm_stats_sys_v_pgfaults},
38 +
39 + // CPU metrics
40 + {.name = "kern.cp_times", .dim = "cp_times", .enabled = 1, .func = do_kern_cp_times},
41 + {.name = "dev.cpu.temperature", .dim = "cpu_temperature", .enabled = 1, .func = do_dev_cpu_temperature},
42 + {.name = "dev.cpu.0.freq", .dim = "cpu_frequency", .enabled = 1, .func = do_dev_cpu_0_freq},
43 +
44 + // disk metrics
45 + {.name = "kern.devstat", .dim = "kern_devstat", .enabled = 1, .func = do_kern_devstat},
46 + {.name = "getmntinfo", .dim = "getmntinfo", .enabled = 1, .func = do_getmntinfo},
47 +
48 + // network metrics
49 + {.name = "net.inet.tcp.states", .dim = "tcp_states", .enabled = 1, .func = do_net_inet_tcp_states},
50 + {.name = "net.inet.tcp.stats", .dim = "tcp_stats", .enabled = 1, .func = do_net_inet_tcp_stats},
51 + {.name = "net.inet.udp.stats", .dim = "udp_stats", .enabled = 1, .func = do_net_inet_udp_stats},
52 + {.name = "net.inet.icmp.stats", .dim = "icmp_stats", .enabled = 1, .func = do_net_inet_icmp_stats},
53 + {.name = "net.inet.ip.stats", .dim = "ip_stats", .enabled = 1, .func = do_net_inet_ip_stats},
54 + {.name = "net.inet6.ip6.stats", .dim = "ip6_stats", .enabled = 1, .func = do_net_inet6_ip6_stats},
55 + {.name = "net.inet6.icmp6.stats", .dim = "icmp6_stats", .enabled = 1, .func = do_net_inet6_icmp6_stats},
56 +
57 + // network interfaces metrics
58 + {.name = "getifaddrs", .dim = "getifaddrs", .enabled = 1, .func = do_getifaddrs},
59 +
60 + // ZFS metrics
61 + {.name = "kstat.zfs.misc.arcstats", .dim = "arcstats", .enabled = 1, .func = do_kstat_zfs_misc_arcstats},
62 + {.name = "kstat.zfs.misc.zio_trim", .dim = "trim", .enabled = 1, .func = do_kstat_zfs_misc_zio_trim},
63 +
64 + // ipfw metrics
65 + {.name = "ipfw", .dim = "ipfw", .enabled = 1, .func = do_ipfw},
66 +
67 + // the terminator of this array
68 + {.name = NULL, .dim = NULL, .enabled = 0, .func = NULL}
69 };
70
71 -static void freebsd_main_cleanup(void *ptr) {
71 +static void freebsd_main_cleanup(void *ptr)
72 +{
73 struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
74 static_thread->enabled = NETDATA_MAIN_THREAD_EXITING;
75
@@ -77,7 +78,8 @@ static void freebsd_main_cleanup(void *ptr) {
78 static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
79 }
80
80 -void *freebsd_main(void *ptr) {
81 +void *freebsd_main(void *ptr)
82 +{
83 netdata_thread_cleanup_push(freebsd_main_cleanup, ptr);
84
85 int vdo_cpu_netdata = config_get_boolean("plugin:freebsd", "netdata server resources", 1);
@@ -88,7 +90,7 @@ void *freebsd_main(void *ptr) {
90
91 // check the enabled status for each module
92 int i;
91 - for(i = 0 ; freebsd_modules[i].name ;i++) {
93 + for (i = 0; freebsd_modules[i].name; i++) {
94 struct freebsd_module *pm = &freebsd_modules[i];
95
96 pm->enabled = config_get_boolean("plugin:freebsd", pm->name, pm->enabled);
@@ -100,17 +102,19 @@ void *freebsd_main(void *ptr) {
102 heartbeat_t hb;
103 heartbeat_init(&hb);
104
103 - while(!netdata_exit) {
105 + while (!netdata_exit) {
106 usec_t hb_dt = heartbeat_next(&hb, step);
107 usec_t duration = 0ULL;
108
107 - if(unlikely(netdata_exit)) break;
109 + if (unlikely(netdata_exit))
110 + break;
111
112 // BEGIN -- the job to be done
113
111 - for(i = 0 ; freebsd_modules[i].name ;i++) {
114 + for (i = 0; freebsd_modules[i].name; i++) {
115 struct freebsd_module *pm = &freebsd_modules[i];
113 - if(unlikely(!pm->enabled)) continue;
116 + if (unlikely(!pm->enabled))
117 + continue;
118
119 debug(D_PROCNETDEV_LOOP, "FREEBSD calling %s.", pm->name);
120
@@ -118,55 +122,87 @@ void *freebsd_main(void *ptr) {
122 pm->duration = heartbeat_monotonic_dt_to_now_usec(&hb) - duration;
123 duration += pm->duration;
124
121 - if(unlikely(netdata_exit)) break;
125 + if (unlikely(netdata_exit))
126 + break;
127 }
128
129 // END -- the job is done
130
126 - // --------------------------------------------------------------------
127 -
128 - if(vdo_cpu_netdata) {
129 - static RRDSET *st = NULL;
130 -
131 - if(unlikely(!st)) {
132 - st = rrdset_find_active_bytype_localhost("netdata", "plugin_freebsd_modules");
133 -
134 - if(!st) {
135 - st = rrdset_create_localhost(
136 - "netdata"
137 - , "plugin_freebsd_modules"
138 - , NULL
139 - , "freebsd"
140 - , NULL
141 - , "NetData FreeBSD Plugin Modules Durations"
142 - , "milliseconds/run"
143 - , "netdata"
144 - , "stats"
145 - , 132001
146 - , localhost->rrd_update_every
147 - , RRDSET_TYPE_STACKED
148 - );
149 -
150 - for(i = 0 ; freebsd_modules[i].name ;i++) {
131 + if (vdo_cpu_netdata) {
132 + static RRDSET *st_cpu_thread = NULL, *st_duration = NULL;
133 + static RRDDIM *rd_user = NULL, *rd_system = NULL;
134 +
135 + // ----------------------------------------------------------------
136 +
137 + struct rusage thread;
138 + getrusage(RUSAGE_THREAD, &thread);
139 +
140 + if (unlikely(!st_cpu_thread)) {
141 + st_cpu_thread = rrdset_create_localhost(
142 + "netdata",
143 + "plugin_freebsd_cpu",
144 + NULL,
145 + "freebsd",
146 + NULL,
147 + "Netdata FreeBSD plugin CPU usage",
148 + "milliseconds/s",
149 + "freebsd",
150 + "stats",
151 + 132000,
152 + localhost->rrd_update_every,
153 + RRDSET_TYPE_STACKED);
154 +
155 + rd_user = rrddim_add(st_cpu_thread, "user", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
156 + rd_system = rrddim_add(st_cpu_thread, "system", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
157 + } else {
158 + rrdset_next(st_cpu_thread);
159 + }
160 +
161 + rrddim_set_by_pointer(
162 + st_cpu_thread, rd_user, thread.ru_utime.tv_sec * USEC_PER_SEC + thread.ru_utime.tv_usec);
163 + rrddim_set_by_pointer(
164 + st_cpu_thread, rd_system, thread.ru_stime.tv_sec * USEC_PER_SEC + thread.ru_stime.tv_usec);
165 + rrdset_done(st_cpu_thread);
166 +
167 + // ----------------------------------------------------------------
168 +
169 + if (unlikely(!st_duration)) {
170 + st_duration = rrdset_find_active_bytype_localhost("netdata", "plugin_freebsd_modules");
171 +
172 + if (!st_duration) {
173 + st_duration = rrdset_create_localhost(
174 + "netdata",
175 + "plugin_freebsd_modules",
176 + NULL,
177 + "freebsd",
178 + NULL,
179 + "Netdata FreeBSD plugin modules durations",
180 + "milliseconds/run",
181 + "freebsd",
182 + "stats",
183 + 132001,
184 + localhost->rrd_update_every,
185 + RRDSET_TYPE_STACKED);
186 +
187 + for (i = 0; freebsd_modules[i].name; i++) {
188 struct freebsd_module *pm = &freebsd_modules[i];
152 - if(unlikely(!pm->enabled)) continue;
189 + if (unlikely(!pm->enabled))
190 + continue;
191
154 - pm->rd = rrddim_add(st, pm->dim, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
192 + pm->rd = rrddim_add(st_duration, pm->dim, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
193 }
194 }
157 - }
158 - else rrdset_next(st);
195 + } else
196 + rrdset_next(st_duration);
197
160 - for(i = 0 ; freebsd_modules[i].name ;i++) {
198 + for (i = 0; freebsd_modules[i].name; i++) {
199 struct freebsd_module *pm = &freebsd_modules[i];
162 - if(unlikely(!pm->enabled)) continue;
200 + if (unlikely(!pm->enabled))
201 + continue;
202
164 - rrddim_set_by_pointer(st, pm->rd, pm->duration);
203 + rrddim_set_by_pointer(st_duration, pm->rd, pm->duration);
204 }
166 - rrdset_done(st);
167 -
168 - global_statistics_charts();
169 - registry_statistics();
205 + rrdset_done(st_duration);
206 }
207 }
208
collectors/macos.plugin/plugin_macos.c
+121 -33
@@ -2,7 +2,28 @@
2
3 #include "plugin_macos.h"
4
5 -static void macos_main_cleanup(void *ptr) {
5 +static struct macos_module {
6 + const char *name;
7 + const char *dim;
8 +
9 + int enabled;
10 +
11 + int (*func)(int update_every, usec_t dt);
12 + usec_t duration;
13 +
14 + RRDDIM *rd;
15 +
16 +} macos_modules[] = {
17 + {.name = "sysctl", .dim = "sysctl", .enabled = 1, .func = do_macos_sysctl},
18 + {.name = "mach system management interface", .dim = "mach_smi", .enabled = 1, .func = do_macos_mach_smi},
19 + {.name = "iokit", .dim = "iokit", .enabled = 1, .func = do_macos_iokit},
20 +
21 + // the terminator of this array
22 + {.name = NULL, .dim = NULL, .enabled = 0, .func = NULL}
23 +};
24 +
25 +static void macos_main_cleanup(void *ptr)
26 +{
27 struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
28 static_thread->enabled = NETDATA_MAIN_THREAD_EXITING;
29
@@ -11,56 +32,123 @@ static void macos_main_cleanup(void *ptr) {
32 static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
33 }
34
14 -void *macos_main(void *ptr) {
35 +void *macos_main(void *ptr)
36 +{
37 netdata_thread_cleanup_push(macos_main_cleanup, ptr);
38
17 - // when ZERO, attempt to do it
18 - int vdo_cpu_netdata = !config_get_boolean("plugin:macos", "netdata server resources", 1);
19 - int vdo_macos_sysctl = !config_get_boolean("plugin:macos", "sysctl", 1);
20 - int vdo_macos_mach_smi = !config_get_boolean("plugin:macos", "mach system management interface", 1);
21 - int vdo_macos_iokit = !config_get_boolean("plugin:macos", "iokit", 1);
39 + int vdo_cpu_netdata = config_get_boolean("plugin:macos", "netdata server resources", CONFIG_BOOLEAN_YES);
40
23 - // keep track of the time each module was called
24 - unsigned long long sutime_macos_sysctl = 0ULL;
25 - unsigned long long sutime_macos_mach_smi = 0ULL;
26 - unsigned long long sutime_macos_iokit = 0ULL;
41 + // check the enabled status for each module
42 + for (int i = 0; macos_modules[i].name; i++) {
43 + struct macos_module *pm = &macos_modules[i];
44 +
45 + pm->enabled = config_get_boolean("plugin:macos", pm->name, pm->enabled);
46 + pm->duration = 0ULL;
47 + pm->rd = NULL;
48 + }
49
50 usec_t step = localhost->rrd_update_every * USEC_PER_SEC;
51 heartbeat_t hb;
52 heartbeat_init(&hb);
53
32 - while(!netdata_exit) {
54 + while (!netdata_exit) {
55 usec_t hb_dt = heartbeat_next(&hb, step);
34 -
35 - if(unlikely(netdata_exit)) break;
56 + usec_t duration = 0ULL;
57
58 // BEGIN -- the job to be done
59
39 - if(!vdo_macos_sysctl) {
40 - debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_sysctl().");
41 - vdo_macos_sysctl = do_macos_sysctl(localhost->rrd_update_every, hb_dt);
42 - }
43 - if(unlikely(netdata_exit)) break;
60 + for (int i = 0; macos_modules[i].name; i++) {
61 + struct macos_module *pm = &macos_modules[i];
62 + if (unlikely(!pm->enabled))
63 + continue;
64
45 - if(!vdo_macos_mach_smi) {
46 - debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_mach_smi().");
47 - vdo_macos_mach_smi = do_macos_mach_smi(localhost->rrd_update_every, hb_dt);
48 - }
49 - if(unlikely(netdata_exit)) break;
65 + debug(D_PROCNETDEV_LOOP, "macos calling %s.", pm->name);
66 +
67 + pm->enabled = !pm->func(localhost->rrd_update_every, hb_dt);
68 + pm->duration = heartbeat_monotonic_dt_to_now_usec(&hb) - duration;
69 + duration += pm->duration;
70
51 - if(!vdo_macos_iokit) {
52 - debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_iokit().");
53 - vdo_macos_iokit = do_macos_iokit(localhost->rrd_update_every, hb_dt);
71 + if (unlikely(netdata_exit))
72 + break;
73 }
55 - if(unlikely(netdata_exit)) break;
74
75 // END -- the job is done
76
59 - // --------------------------------------------------------------------
60 -
61 - if(!vdo_cpu_netdata) {
62 - global_statistics_charts();
63 - registry_statistics();
77 + if (vdo_cpu_netdata) {
78 + static RRDSET *st_cpu_thread = NULL, *st_duration = NULL;
79 + static RRDDIM *rd_user = NULL, *rd_system = NULL;
80 +
81 + // ----------------------------------------------------------------
82 +
83 + struct rusage thread;
84 + getrusage(RUSAGE_THREAD, &thread);
85 +
86 + if (unlikely(!st_cpu_thread)) {
87 + st_cpu_thread = rrdset_create_localhost(
88 + "netdata",
89 + "plugin_macos_cpu",
90 + NULL,
91 + "macos",
92 + NULL,
93 + "Netdata macOS plugin CPU usage",
94 + "milliseconds/s",
95 + "macos",
96 + "stats",
97 + 132000,
98 + localhost->rrd_update_every,
99 + RRDSET_TYPE_STACKED);
100 +
101 + rd_user = rrddim_add(st_cpu_thread, "user", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
102 + rd_system = rrddim_add(st_cpu_thread, "system", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
103 + } else {
104 + rrdset_next(st_cpu_thread);
105 + }
106 +
107 + rrddim_set_by_pointer(
108 + st_cpu_thread, rd_user, thread.ru_utime.tv_sec * USEC_PER_SEC + thread.ru_utime.tv_usec);
109 + rrddim_set_by_pointer(
110 + st_cpu_thread, rd_system, thread.ru_stime.tv_sec * USEC_PER_SEC + thread.ru_stime.tv_usec);
111 + rrdset_done(st_cpu_thread);
112 +
113 + // ----------------------------------------------------------------
114 +
115 + if (unlikely(!st_duration)) {
116 + st_duration = rrdset_find_active_bytype_localhost("netdata", "plugin_macos_modules");
117 +
118 + if (!st_duration) {
119 + st_duration = rrdset_create_localhost(
120 + "netdata",
121 + "plugin_macos_modules",
122 + NULL,
123 + "macos",
124 + NULL,
125 + "Netdata macOS plugin modules durations",
126 + "milliseconds/run",
127 + "macos",
128 + "stats",
129 + 132001,
130 + localhost->rrd_update_every,
131 + RRDSET_TYPE_STACKED);
132 +
133 + for (int i = 0; macos_modules[i].name; i++) {
134 + struct macos_module *pm = &macos_modules[i];
135 + if (unlikely(!pm->enabled))
136 + continue;
137 +
138 + pm->rd = rrddim_add(st_duration, pm->dim, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
139 + }
140 + }
141 + } else
142 + rrdset_next(st_duration);
143 +
144 + for (int i = 0; macos_modules[i].name; i++) {
145 + struct macos_module *pm = &macos_modules[i];
146 + if (unlikely(!pm->enabled))
147 + continue;
148 +
149 + rrddim_set_by_pointer(st_duration, pm->rd, pm->duration);
150 + }
151 + rrdset_done(st_duration);
152 }
153 }
154
collectors/proc.plugin/plugin_proc.c
+148 -110
@@ -15,70 +15,73 @@ static struct proc_module {
15
16 } proc_modules[] = {
17
18 - // system metrics
19 - { .name = "/proc/stat", .dim = "stat", .func = do_proc_stat },
20 - { .name = "/proc/uptime", .dim = "uptime", .func = do_proc_uptime },
21 - { .name = "/proc/loadavg", .dim = "loadavg", .func = do_proc_loadavg },
22 - { .name = "/proc/sys/kernel/random/entropy_avail", .dim = "entropy", .func = do_proc_sys_kernel_random_entropy_avail },
23 -
24 - // pressure metrics
25 - { .name = "/proc/pressure", .dim = "pressure", .func = do_proc_pressure },
26 -
27 - // CPU metrics
28 - { .name = "/proc/interrupts", .dim = "interrupts", .func = do_proc_interrupts },
29 - { .name = "/proc/softirqs", .dim = "softirqs", .func = do_proc_softirqs },
30 -
31 - // memory metrics
32 - { .name = "/proc/vmstat", .dim = "vmstat", .func = do_proc_vmstat },
33 - { .name = "/proc/meminfo", .dim = "meminfo", .func = do_proc_meminfo },
34 - { .name = "/sys/kernel/mm/ksm", .dim = "ksm", .func = do_sys_kernel_mm_ksm },
35 - { .name = "/sys/block/zram", .dim = "zram", .func = do_sys_block_zram },
36 - { .name = "/sys/devices/system/edac/mc", .dim = "ecc", .func = do_proc_sys_devices_system_edac_mc },
37 - { .name = "/sys/devices/system/node", .dim = "numa", .func = do_proc_sys_devices_system_node },
38 - { .name = "/proc/pagetypeinfo", .dim = "pagetypeinfo", .func = do_proc_pagetypeinfo },
39 -
40 - // network metrics
41 - { .name = "/proc/net/dev", .dim = "netdev", .func = do_proc_net_dev },
42 - { .name = "/proc/net/wireless", .dim = "netwireless", .func = do_proc_net_wireless },
43 - { .name = "/proc/net/sockstat", .dim = "sockstat", .func = do_proc_net_sockstat },
44 - { .name = "/proc/net/sockstat6", .dim = "sockstat6", .func = do_proc_net_sockstat6 },
45 - { .name = "/proc/net/netstat", .dim = "netstat", .func = do_proc_net_netstat }, // this has to be before /proc/net/snmp, because there is a shared metric
46 - { .name = "/proc/net/snmp", .dim = "snmp", .func = do_proc_net_snmp },
47 - { .name = "/proc/net/snmp6", .dim = "snmp6", .func = do_proc_net_snmp6 },
48 - { .name = "/proc/net/sctp/snmp", .dim = "sctp", .func = do_proc_net_sctp_snmp },
49 - { .name = "/proc/net/softnet_stat", .dim = "softnet", .func = do_proc_net_softnet_stat },
50 - { .name = "/proc/net/ip_vs/stats", .dim = "ipvs", .func = do_proc_net_ip_vs_stats },
51 - { .name = "/sys/class/infiniband", .dim = "infiniband", .func = do_sys_class_infiniband },
52 -
53 - // firewall metrics
54 - { .name = "/proc/net/stat/conntrack", .dim = "conntrack", .func = do_proc_net_stat_conntrack },
55 - { .name = "/proc/net/stat/synproxy", .dim = "synproxy", .func = do_proc_net_stat_synproxy },
56 -
57 - // disk metrics
58 - { .name = "/proc/diskstats", .dim = "diskstats", .func = do_proc_diskstats },
59 - { .name = "/proc/mdstat", .dim = "mdstat", .func = do_proc_mdstat },
60 -
61 - // NFS metrics
62 - { .name = "/proc/net/rpc/nfsd", .dim = "nfsd", .func = do_proc_net_rpc_nfsd },
63 - { .name = "/proc/net/rpc/nfs", .dim = "nfs", .func = do_proc_net_rpc_nfs },
64 -
65 - // ZFS metrics
66 - { .name = "/proc/spl/kstat/zfs/arcstats", .dim = "zfs_arcstats", .func = do_proc_spl_kstat_zfs_arcstats },
67 -
68 - // BTRFS metrics
69 - { .name = "/sys/fs/btrfs", .dim = "btrfs", .func = do_sys_fs_btrfs },
70 -
71 - // IPC metrics
72 - { .name = "ipc", .dim = "ipc", .func = do_ipc },
73 -
74 - // linux power supply metrics
75 - { .name = "/sys/class/power_supply", .dim = "power_supply", .func = do_sys_class_power_supply },
76 -
77 - // the terminator of this array
78 - { .name = NULL, .dim = NULL, .func = NULL }
18 + // system metrics
19 + {.name = "/proc/stat", .dim = "stat", .func = do_proc_stat},
20 + {.name = "/proc/uptime", .dim = "uptime", .func = do_proc_uptime},
21 + {.name = "/proc/loadavg", .dim = "loadavg", .func = do_proc_loadavg},
22 + {.name = "/proc/sys/kernel/random/entropy_avail", .dim = "entropy", .func = do_proc_sys_kernel_random_entropy_avail},
23 +
24 + // pressure metrics
25 + {.name = "/proc/pressure", .dim = "pressure", .func = do_proc_pressure},
26 +
27 + // CPU metrics
28 + {.name = "/proc/interrupts", .dim = "interrupts", .func = do_proc_interrupts},
29 + {.name = "/proc/softirqs", .dim = "softirqs", .func = do_proc_softirqs},
30 +
31 + // memory metrics
32 + {.name = "/proc/vmstat", .dim = "vmstat", .func = do_proc_vmstat},
33 + {.name = "/proc/meminfo", .dim = "meminfo", .func = do_proc_meminfo},
34 + {.name = "/sys/kernel/mm/ksm", .dim = "ksm", .func = do_sys_kernel_mm_ksm},
35 + {.name = "/sys/block/zram", .dim = "zram", .func = do_sys_block_zram},
36 + {.name = "/sys/devices/system/edac/mc", .dim = "ecc", .func = do_proc_sys_devices_system_edac_mc},
37 + {.name = "/sys/devices/system/node", .dim = "numa", .func = do_proc_sys_devices_system_node},
38 + {.name = "/proc/pagetypeinfo", .dim = "pagetypeinfo", .func = do_proc_pagetypeinfo},
39 +
40 + // network metrics
41 + {.name = "/proc/net/dev", .dim = "netdev", .func = do_proc_net_dev},
42 + {.name = "/proc/net/wireless", .dim = "netwireless", .func = do_proc_net_wireless},
43 + {.name = "/proc/net/sockstat", .dim = "sockstat", .func = do_proc_net_sockstat},
44 + {.name = "/proc/net/sockstat6", .dim = "sockstat6", .func = do_proc_net_sockstat6},
45 + {.name = "/proc/net/netstat",
46 + .dim = "netstat",
47 + .func = do_proc_net_netstat}, // this has to be before /proc/net/snmp, because there is a shared metric
48 + {.name = "/proc/net/snmp", .dim = "snmp", .func = do_proc_net_snmp},
49 + {.name = "/proc/net/snmp6", .dim = "snmp6", .func = do_proc_net_snmp6},
50 + {.name = "/proc/net/sctp/snmp", .dim = "sctp", .func = do_proc_net_sctp_snmp},
51 + {.name = "/proc/net/softnet_stat", .dim = "softnet", .func = do_proc_net_softnet_stat},
52 + {.name = "/proc/net/ip_vs/stats", .dim = "ipvs", .func = do_proc_net_ip_vs_stats},
53 + {.name = "/sys/class/infiniband", .dim = "infiniband", .func = do_sys_class_infiniband},
54 +
55 + // firewall metrics
56 + {.name = "/proc/net/stat/conntrack", .dim = "conntrack", .func = do_proc_net_stat_conntrack},
57 + {.name = "/proc/net/stat/synproxy", .dim = "synproxy", .func = do_proc_net_stat_synproxy},
58 +
59 + // disk metrics
60 + {.name = "/proc/diskstats", .dim = "diskstats", .func = do_proc_diskstats},
61 + {.name = "/proc/mdstat", .dim = "mdstat", .func = do_proc_mdstat},
62 +
63 + // NFS metrics
64 + {.name = "/proc/net/rpc/nfsd", .dim = "nfsd", .func = do_proc_net_rpc_nfsd},
65 + {.name = "/proc/net/rpc/nfs", .dim = "nfs", .func = do_proc_net_rpc_nfs},
66 +
67 + // ZFS metrics
68 + {.name = "/proc/spl/kstat/zfs/arcstats", .dim = "zfs_arcstats", .func = do_proc_spl_kstat_zfs_arcstats},
69 +
70 + // BTRFS metrics
71 + {.name = "/sys/fs/btrfs", .dim = "btrfs", .func = do_sys_fs_btrfs},
72 +
73 + // IPC metrics
74 + {.name = "ipc", .dim = "ipc", .func = do_ipc},
75 +
76 + {.name = "/sys/class/power_supply", .dim = "power_supply", .func = do_sys_class_power_supply},
77 + // linux power supply metrics
78 +
79 + // the terminator of this array
80 + {.name = NULL, .dim = NULL, .func = NULL}
81 };
82
81 -static void proc_main_cleanup(void *ptr) {
83 +static void proc_main_cleanup(void *ptr)
84 +{
85 struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
86 static_thread->enabled = NETDATA_MAIN_THREAD_EXITING;
87
@@ -87,7 +90,8 @@ static void proc_main_cleanup(void *ptr) {
90 static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
91 }
92
90 -void *proc_main(void *ptr) {
93 +void *proc_main(void *ptr)
94 +{
95 netdata_thread_cleanup_push(proc_main_cleanup, ptr);
96
97 int vdo_cpu_netdata = config_get_boolean("plugin:proc", "netdata server resources", CONFIG_BOOLEAN_YES);
@@ -96,7 +100,7 @@ void *proc_main(void *ptr) {
100
101 // check the enabled status for each module
102 int i;
99 - for(i = 0 ; proc_modules[i].name ;i++) {
103 + for (i = 0; proc_modules[i].name; i++) {
104 struct proc_module *pm = &proc_modules[i];
105
106 pm->enabled = config_get_boolean("plugin:proc", pm->name, CONFIG_BOOLEAN_YES);
@@ -109,20 +113,22 @@ void *proc_main(void *ptr) {
113 heartbeat_init(&hb);
114 size_t iterations = 0;
115
112 - while(!netdata_exit) {
116 + while (!netdata_exit) {
117 iterations++;
118 (void)iterations;
119
120 usec_t hb_dt = heartbeat_next(&hb, step);
121 usec_t duration = 0ULL;
122
119 - if(unlikely(netdata_exit)) break;
123 + if (unlikely(netdata_exit))
124 + break;
125
126 // BEGIN -- the job to be done
127
123 - for(i = 0 ; proc_modules[i].name ;i++) {
128 + for (i = 0; proc_modules[i].name; i++) {
129 struct proc_module *pm = &proc_modules[i];
125 - if(unlikely(!pm->enabled)) continue;
130 + if (unlikely(!pm->enabled))
131 + continue;
132
133 debug(D_PROCNETDEV_LOOP, "PROC calling %s.", pm->name);
134
@@ -139,55 +145,87 @@ void *proc_main(void *ptr) {
145 // log_thread_memory_allocations = 0;
146 //#endif
147
142 - if(unlikely(netdata_exit)) break;
148 + if (unlikely(netdata_exit))
149 + break;
150 }
151
152 // END -- the job is done
153
147 - // --------------------------------------------------------------------
148 -
149 - if(vdo_cpu_netdata) {
150 - static RRDSET *st = NULL;
151 -
152 - if(unlikely(!st)) {
153 - st = rrdset_find_active_bytype_localhost("netdata", "plugin_proc_modules");
154 -
155 - if(!st) {
156 - st = rrdset_create_localhost(
157 - "netdata"
158 - , "plugin_proc_modules"
159 - , NULL
160 - , "proc"
161 - , NULL
162 - , "NetData Proc Plugin Modules Durations"
163 - , "milliseconds/run"
164 - , "netdata"
165 - , "stats"
166 - , 132001
167 - , localhost->rrd_update_every
168 - , RRDSET_TYPE_STACKED
169 - );
170 -
171 - for(i = 0 ; proc_modules[i].name ;i++) {
154 + if (vdo_cpu_netdata) {
155 + static RRDSET *st_cpu_thread = NULL, *st_duration = NULL;
156 + static RRDDIM *rd_user = NULL, *rd_system = NULL;
157 +
158 + // ----------------------------------------------------------------
159 +
160 + struct rusage thread;
161 + getrusage(RUSAGE_THREAD, &thread);
162 +
163 + if (unlikely(!st_cpu_thread)) {
164 + st_cpu_thread = rrdset_create_localhost(
165 + "netdata",
166 + "plugin_proc_cpu",
167 + NULL,
168 + "proc",
169 + NULL,
170 + "Netdata proc plugin CPU usage",
171 + "milliseconds/s",
172 + "proc",
173 + "stats",
174 + 132000,
175 + localhost->rrd_update_every,
176 + RRDSET_TYPE_STACKED);
177 +
178 + rd_user = rrddim_add(st_cpu_thread, "user", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
179 + rd_system = rrddim_add(st_cpu_thread, "system", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
180 + } else {
181 + rrdset_next(st_cpu_thread);
182 + }
183 +
184 + rrddim_set_by_pointer(
185 + st_cpu_thread, rd_user, thread.ru_utime.tv_sec * USEC_PER_SEC + thread.ru_utime.tv_usec);
186 + rrddim_set_by_pointer(
187 + st_cpu_thread, rd_system, thread.ru_stime.tv_sec * USEC_PER_SEC + thread.ru_stime.tv_usec);
188 + rrdset_done(st_cpu_thread);
189 +
190 + // ----------------------------------------------------------------
191 +
192 + if (unlikely(!st_duration)) {
193 + st_duration = rrdset_find_active_bytype_localhost("netdata", "plugin_proc_modules");
194 +
195 + if (!st_duration) {
196 + st_duration = rrdset_create_localhost(
197 + "netdata",
198 + "plugin_proc_modules",
199 + NULL,
200 + "proc",
201 + NULL,
202 + "Netdata proc plugin modules durations",
203 + "milliseconds/run",
204 + "proc",
205 + "stats",
206 + 132001,
207 + localhost->rrd_update_every,
208 + RRDSET_TYPE_STACKED);
209 +
210 + for (i = 0; proc_modules[i].name; i++) {
211 struct proc_module *pm = &proc_modules[i];
173 - if(unlikely(!pm->enabled)) continue;
212 + if (unlikely(!pm->enabled))
213 + continue;
214
175 - pm->rd = rrddim_add(st, pm->dim, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
215 + pm->rd = rrddim_add(st_duration, pm->dim, NULL, 1, USEC_PER_MS, RRD_ALGORITHM_ABSOLUTE);
216 }
217 }
178 - }
179 - else rrdset_next(st);
218 + } else
219 + rrdset_next(st_duration);
220
181 - for(i = 0 ; proc_modules[i].name ;i++) {
221 + for (i = 0; proc_modules[i].name; i++) {
222 struct proc_module *pm = &proc_modules[i];
183 - if(unlikely(!pm->enabled)) continue;
223 + if (unlikely(!pm->enabled))
224 + continue;
225
185 - rrddim_set_by_pointer(st, pm->rd, pm->duration);
226 + rrddim_set_by_pointer(st_duration, pm->rd, pm->duration);
227 }
187 - rrdset_done(st);
188 -
189 - global_statistics_charts();
190 - registry_statistics();
228 + rrdset_done(st_duration);
229 }
230 }
231
@@ -209,16 +247,16 @@ int get_numa_node_count(void)
247 char *dirname = config_get("plugin:proc:/sys/devices/system/node", "directory to monitor", name);
248
249 DIR *dir = opendir(dirname);
212 - if(dir) {
250 + if (dir) {
251 struct dirent *de = NULL;
214 - while((de = readdir(dir))) {
215 - if(de->d_type != DT_DIR)
252 + while ((de = readdir(dir))) {
253 + if (de->d_type != DT_DIR)
254 continue;
255
218 - if(strncmp(de->d_name, "node", 4) != 0)
256 + if (strncmp(de->d_name, "node", 4) != 0)
257 continue;
258
221 - if(!isdigit(de->d_name[4]))
259 + if (!isdigit(de->d_name[4]))
260 continue;
261
262 numa_node_count++;
collectors/statsd.plugin/statsd.c
+1 -1
@@ -2418,7 +2418,7 @@ void *statsd_main(void *ptr) {
2418 , NULL
2419 , "statsd"
2420 , "netdata.statsd_cpu"
2421 - , "NetData statsd charting thread CPU usage"
2421 + , "Netdata statsd charting thread CPU usage"
2422 , "milliseconds/s"
2423 , PLUGIN_STATSD_NAME
2424 , "stats"
collectors/tc.plugin/plugin_tc.c
+2 -2
@@ -1082,7 +1082,7 @@ void *tc_main(void *ptr) {
1082 , NULL
1083 , "tc.helper"
1084 , NULL
1085 - , "NetData TC CPU usage"
1085 + , "Netdata TC CPU usage"
1086 , "milliseconds/s"
1087 , PLUGIN_TC_NAME
1088 , NULL
@@ -1109,7 +1109,7 @@ void *tc_main(void *ptr) {
1109 , NULL
1110 , "tc.helper"
1111 , NULL
1112 - , "NetData TC script execution"
1112 + , "Netdata TC script execution"
1113 , "milliseconds/run"
1114 , PLUGIN_TC_NAME
1115 , NULL
collectors/timex.plugin/plugin_timex.c
+2 -2
@@ -124,7 +124,7 @@ void *timex_main(void *ptr)
124 NULL,
125 "timex",
126 NULL,
127 - "NetData Timex Plugin CPU usage",
127 + "Netdata Timex Plugin CPU usage",
128 "milliseconds/s",
129 PLUGIN_TIMEX_NAME,
130 NULL,
@@ -152,7 +152,7 @@ void *timex_main(void *ptr)
152 NULL,
153 "timex",
154 NULL,
155 - "NetData Timex Plugin Duration",
155 + "Netdata Timex Plugin Duration",
156 "milliseconds/run",
157 PLUGIN_TIMEX_NAME,
158 NULL,
daemon/global_statistics.c
+52 -69
@@ -4,6 +4,7 @@
4
5 #define GLOBAL_STATS_RESET_WEB_USEC_MAX 0x01
6
7 +#define CONFIG_SECTION_GLOBAL_STATISTICS "global statistics"
8
9 static struct global_statistics {
10 volatile uint16_t connected_clients;
@@ -181,62 +182,11 @@ void global_statistics_charts(void) {
182 average_response_time = -1;
183
184 struct global_statistics gs;
184 - struct rusage me, thread;
185 + struct rusage me;
186
187 global_statistics_copy(&gs, GLOBAL_STATS_RESET_WEB_USEC_MAX);
187 - getrusage(RUSAGE_THREAD, &thread);
188 getrusage(RUSAGE_SELF, &me);
189
190 - {
191 - static RRDSET *st_cpu_thread = NULL;
192 - static RRDDIM *rd_cpu_thread_user = NULL,
193 - *rd_cpu_thread_system = NULL;
194 -
195 -#ifdef __FreeBSD__
196 - if (unlikely(!st_cpu_thread)) {
197 - st_cpu_thread = rrdset_create_localhost(
198 - "netdata"
199 - , "plugin_freebsd_cpu"
200 - , NULL
201 - , "freebsd"
202 - , NULL
203 - , "NetData FreeBSD Plugin CPU usage"
204 - , "milliseconds/s"
205 - , "netdata"
206 - , "stats"
207 - , 132000
208 - , localhost->rrd_update_every
209 - , RRDSET_TYPE_STACKED
210 - );
211 -#else
212 - if (unlikely(!st_cpu_thread)) {
213 - st_cpu_thread = rrdset_create_localhost(
214 - "netdata"
215 - , "plugin_proc_cpu"
216 - , NULL
217 - , "proc"
218 - , NULL
219 - , "NetData Proc Plugin CPU usage"
220 - , "milliseconds/s"
221 - , "netdata"
222 - , "stats"
223 - , 132000
224 - , localhost->rrd_update_every
225 - , RRDSET_TYPE_STACKED
226 - );
227 -#endif
228 -
229 - rd_cpu_thread_user = rrddim_add(st_cpu_thread, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
230 - rd_cpu_thread_system = rrddim_add(st_cpu_thread, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
231 - }
232 - else
233 - rrdset_next(st_cpu_thread);
234 -
235 - rrddim_set_by_pointer(st_cpu_thread, rd_cpu_thread_user, thread.ru_utime.tv_sec * 1000000ULL + thread.ru_utime.tv_usec);
236 - rrddim_set_by_pointer(st_cpu_thread, rd_cpu_thread_system, thread.ru_stime.tv_sec * 1000000ULL + thread.ru_stime.tv_usec);
237 - rrdset_done(st_cpu_thread);
238 - }
239 -
190 // ----------------------------------------------------------------
191
192 {
@@ -251,7 +201,7 @@ void global_statistics_charts(void) {
201 , NULL
202 , "netdata"
203 , NULL
254 - , "NetData CPU usage"
204 + , "Netdata CPU usage"
205 , "milliseconds/s"
206 , "netdata"
207 , "stats"
@@ -284,7 +234,7 @@ void global_statistics_charts(void) {
234 , NULL
235 , "netdata"
236 , NULL
287 - , "NetData Web Clients"
237 + , "Netdata Web Clients"
238 , "connected clients"
239 , "netdata"
240 , "stats"
@@ -315,7 +265,7 @@ void global_statistics_charts(void) {
265 , NULL
266 , "netdata"
267 , NULL
318 - , "NetData Web Requests"
268 + , "Netdata Web Requests"
269 , "requests/s"
270 , "netdata"
271 , "stats"
@@ -347,7 +297,7 @@ void global_statistics_charts(void) {
297 , NULL
298 , "netdata"
299 , NULL
350 - , "NetData Network Traffic"
300 + , "Netdata Network Traffic"
301 , "kilobits/s"
302 , "netdata"
303 , "stats"
@@ -381,7 +331,7 @@ void global_statistics_charts(void) {
331 , NULL
332 , "netdata"
333 , NULL
384 - , "NetData API Response Time"
334 + , "Netdata API Response Time"
335 , "milliseconds/request"
336 , "netdata"
337 , "stats"
@@ -430,7 +380,7 @@ void global_statistics_charts(void) {
380 , NULL
381 , "netdata"
382 , NULL
433 - , "NetData API Responses Compression Savings Ratio"
383 + , "Netdata API Responses Compression Savings Ratio"
384 , "percentage"
385 , "netdata"
386 , "stats"
@@ -477,7 +427,7 @@ void global_statistics_charts(void) {
427 , NULL
428 , "queries"
429 , NULL
480 - , "NetData API Queries"
430 + , "Netdata API Queries"
431 , "queries/s"
432 , "netdata"
433 , "stats"
@@ -510,7 +460,7 @@ void global_statistics_charts(void) {
460 , NULL
461 , "queries"
462 , NULL
513 - , "NetData API Points"
463 + , "Netdata API Points"
464 , "points/s"
465 , "netdata"
466 , "stats"
@@ -579,7 +529,7 @@ void global_statistics_charts(void) {
529 , NULL
530 , "dbengine"
531 , NULL
582 - , "NetData DB engine data extents' compression savings ratio"
532 + , "Netdata DB engine data extents' compression savings ratio"
533 , "percentage"
534 , "netdata"
535 , "stats"
@@ -621,7 +571,7 @@ void global_statistics_charts(void) {
571 , NULL
572 , "dbengine"
573 , NULL
624 - , "NetData DB engine page cache hit ratio"
574 + , "Netdata DB engine page cache hit ratio"
575 , "percentage"
576 , "netdata"
577 , "stats"
@@ -676,7 +626,7 @@ void global_statistics_charts(void) {
626 , NULL
627 , "dbengine"
628 , NULL
679 - , "NetData dbengine page cache statistics"
629 + , "Netdata dbengine page cache statistics"
630 , "pages"
631 , "netdata"
632 , "stats"
@@ -721,7 +671,7 @@ void global_statistics_charts(void) {
671 , NULL
672 , "dbengine"
673 , NULL
724 - , "NetData dbengine long-term page statistics"
674 + , "Netdata dbengine long-term page statistics"
675 , "pages"
676 , "netdata"
677 , "stats"
@@ -761,7 +711,7 @@ void global_statistics_charts(void) {
711 , NULL
712 , "dbengine"
713 , NULL
764 - , "NetData DB engine I/O throughput"
714 + , "Netdata DB engine I/O throughput"
715 , "MiB/s"
716 , "netdata"
717 , "stats"
@@ -795,7 +745,7 @@ void global_statistics_charts(void) {
745 , NULL
746 , "dbengine"
747 , NULL
798 - , "NetData DB engine I/O operations"
748 + , "Netdata DB engine I/O operations"
749 , "operations/s"
750 , "netdata"
751 , "stats"
@@ -830,7 +780,7 @@ void global_statistics_charts(void) {
780 , NULL
781 , "dbengine"
782 , NULL
833 - , "NetData DB engine errors"
783 + , "Netdata DB engine errors"
784 , "errors/s"
785 , "netdata"
786 , "stats"
@@ -867,7 +817,7 @@ void global_statistics_charts(void) {
817 , NULL
818 , "dbengine"
819 , NULL
870 - , "NetData DB engine File Descriptors"
820 + , "Netdata DB engine File Descriptors"
821 , "descriptors"
822 , "netdata"
823 , "stats"
@@ -906,7 +856,7 @@ void global_statistics_charts(void) {
856 , NULL
857 , "dbengine"
858 , NULL
909 - , "NetData DB engine RAM usage"
859 + , "Netdata DB engine RAM usage"
860 , "MiB"
861 , "netdata"
862 , "stats"
@@ -948,3 +898,36 @@ void global_statistics_charts(void) {
898 #endif
899
900 }
901 +
902 +static void global_statistics_cleanup(void *ptr)
903 +{
904 + struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
905 + static_thread->enabled = NETDATA_MAIN_THREAD_EXITING;
906 +
907 + info("cleaning up...");
908 +
909 + static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
910 +}
911 +
912 +void *global_statistics_main(void *ptr)
913 +{
914 + netdata_thread_cleanup_push(global_statistics_cleanup, ptr);
915 +
916 + int update_every =
917 + (int)config_get_number("CONFIG_SECTION_GLOBAL_STATISTICS", "update every", localhost->rrd_update_every);
918 + if (update_every < localhost->rrd_update_every)
919 + update_every = localhost->rrd_update_every;
920 +
921 + usec_t step = update_every * USEC_PER_SEC;
922 + heartbeat_t hb;
923 + heartbeat_init(&hb);
924 + while (!netdata_exit) {
925 + heartbeat_next(&hb, step);
926 +
927 + global_statistics_charts();
928 + registry_statistics();
929 + }
930 +
931 + netdata_thread_cleanup_pop(1);
932 + return NULL;
933 +}
daemon/global_statistics.h
+11
@@ -8,6 +8,17 @@
8 // ----------------------------------------------------------------------------
9 // global statistics
10
11 +#define NETDATA_PLUGIN_HOOK_GLOBAL_STATISTICS \
12 + {.name = "GLOBAL_STATS", \
13 + .config_section = NULL, \
14 + .config_name = NULL, \
15 + .enabled = 1, \
16 + .thread = NULL, \
17 + .init_routine = NULL, \
18 + .start_routine = global_statistics_main},
19 +
20 +extern void *global_statistics_main(void *ptr);
21 +
22 extern void rrdr_query_completed(uint64_t db_points_read, uint64_t result_points_generated);
23
24 extern void finished_web_request_statistics(uint64_t dt,
daemon/main.c
+1
@@ -71,6 +71,7 @@ void netdata_cleanup_and_exit(int ret) {
71 }
72
73 struct netdata_static_thread static_threads[] = {
74 + NETDATA_PLUGIN_HOOK_GLOBAL_STATISTICS
75
76 NETDATA_PLUGIN_HOOK_CHECKS
77 NETDATA_PLUGIN_HOOK_FREEBSD
registry/registry.c
+3 -3
@@ -366,7 +366,7 @@ void registry_statistics(void) {
366 , NULL
367 , "registry"
368 , NULL
369 - , "NetData Registry Sessions"
369 + , "Netdata Registry Sessions"
370 , "sessions"
371 , "registry"
372 , "stats"
@@ -391,7 +391,7 @@ void registry_statistics(void) {
391 , NULL
392 , "registry"
393 , NULL
394 - , "NetData Registry Entries"
394 + , "Netdata Registry Entries"
395 , "entries"
396 , "registry"
397 , "stats"
@@ -424,7 +424,7 @@ void registry_statistics(void) {
424 , NULL
425 , "registry"
426 , NULL
427 - , "NetData Registry Memory"
427 + , "Netdata Registry Memory"
428 , "KiB"
429 , "registry"
430 , "stats"
web/server/static/static-threaded.c
+1 -1
@@ -331,7 +331,7 @@ static void web_server_tmr_callback(void *timer_data) {
331 char title[100 + 1];
332
333 snprintfz(id, 100, "web_thread%d_cpu", worker_private->id + 1);
334 - snprintfz(title, 100, "NetData web server thread No %d CPU usage", worker_private->id + 1);
334 + snprintfz(title, 100, "Netdata web server thread No %d CPU usage", worker_private->id + 1);
335
336 st = rrdset_create_localhost(
337 "netdata"