@cryptotaxi247 / netdata-1 / commits / 0bf657741

Add IPC semaphores stats to FreeBSD plugin

Vladimir Kobal committed Dec 11, 2016 at 22:31 UTC 0bf65774114ea128022c3b804678f822df2d7f83
1 file changed +63 -1
src/freebsd_sysctl.c
+63 -1
@@ -6,6 +6,10 @@
6 #include <sys/devicestat.h>
7 // NEEDED BY: struct xswdev
8 #include <vm/vm_param.h>
9 +// NEEDED BY: struct ipc_sem_data
10 +#define _KERNEL
11 +#include <sys/sem.h>
12 +#undef _KERNEL
13 // NEEDED BY: do_disk_io
14 #define RRD_TYPE_DISK "disk"
15
@@ -17,7 +21,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
21
22 static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
23 do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
20 - do_pgfaults = -1, do_committed = -1;
24 + do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1;
25
26 if (unlikely(do_cpu == -1)) {
27 do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -34,6 +38,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
38 do_swapio = config_get_boolean("plugin:freebsd:sysctl", "swap i/o", 1);
39 do_pgfaults = config_get_boolean("plugin:freebsd:sysctl", "memory page faults", 1);
40 do_committed = config_get_boolean("plugin:freebsd:sysctl", "committed memory", 1);
41 + do_ipc_semaphores = config_get_boolean("plugin:freebsd:sysctl", "ipc semaphores", 1);
42 }
43
44 RRDSET *st;
@@ -100,6 +105,15 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
105 // NEEDED BY: do_ram
106 int vfs_bufspace_count;
107
108 + // NEEDED BY: do_ipc_semaphores
109 + struct ipc_sem {
110 + int semmni;
111 + collected_number sets;
112 + collected_number semaphores;
113 + } ipc_sem = {0, 0, 0};
114 + static struct semid_kernel *ipc_sem_data = NULL;
115 +
116 +
117 // --------------------------------------------------------------------
118
119 if (last_loadavg_usec <= dt) {
@@ -666,5 +680,53 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
680 }
681 }
682
683 + // --------------------------------------------------------------------
684 +
685 + if (likely(do_ipc_semaphores)) {
686 + if (unlikely(GETSYSCTL("kern.ipc.semmni", ipc_sem.semmni))) {
687 + do_ipc_semaphores = 0;
688 + error("DISABLED: system.ipc_semaphores");
689 + error("DISABLED: system.ipc_semaphore_arrays");
690 + } else {
691 + ipc_sem_data = reallocz(ipc_sem_data, sizeof(struct semid_kernel) * ipc_sem.semmni);
692 + if (unlikely(getsysctl("kern.ipc.sema", ipc_sem_data, sizeof(struct semid_kernel) * ipc_sem.semmni))) {
693 + do_ipc_semaphores = 0;
694 + error("DISABLED: system.ipc_semaphores");
695 + error("DISABLED: system.ipc_semaphore_arrays");;
696 + } else {
697 + for (i = 0; i < ipc_sem.semmni; i++) {
698 + if (unlikely(ipc_sem_data[i].u.sem_perm.mode & SEM_ALLOC)) {
699 + ipc_sem.sets += 1;
700 + ipc_sem.semaphores += ipc_sem_data[i].u.sem_nsems;
701 + }
702 + }
703 +
704 + // --------------------------------------------------------------------
705 +
706 + st = rrdset_find("system.ipc_semaphores");
707 + if (unlikely(!st)) {
708 + st = rrdset_create("system", "ipc_semaphores", NULL, "ipc semaphores", NULL, "IPC Semaphores", "semaphores", 1000, rrd_update_every, RRDSET_TYPE_AREA);
709 + rrddim_add(st, "semaphores", NULL, 1, 1, RRDDIM_ABSOLUTE);
710 + }
711 + else rrdset_next(st);
712 +
713 + rrddim_set(st, "semaphores", ipc_sem.semaphores);
714 + rrdset_done(st);
715 +
716 + // --------------------------------------------------------------------
717 +
718 + st = rrdset_find("system.ipc_semaphore_arrays");
719 + if (unlikely(!st)) {
720 + st = rrdset_create("system", "ipc_semaphore_arrays", NULL, "ipc semaphores", NULL, "IPC Semaphore Arrays", "arrays", 1000, rrd_update_every, RRDSET_TYPE_AREA);
721 + rrddim_add(st, "arrays", NULL, 1, 1, RRDDIM_ABSOLUTE);
722 + }
723 + else rrdset_next(st);
724 +
725 + rrddim_set(st, "arrays", ipc_sem.sets);
726 + rrdset_done(st);
727 + }
728 + }
729 + }
730 +
731 return 0;
732 }