@cryptotaxi247 / netdata-1 / commits / ae6aaca83

Add IPC message queues stats to FreeBSD plugin

Vladimir Kobal committed Dec 12, 2016 at 00:33 UTC ae6aaca8361c920d51e4ade88479dd9dd684bdbe
1 file changed +95 -4
src/freebsd_sysctl.c
+95 -4
@@ -6,10 +6,11 @@
6 #include <sys/devicestat.h>
7 // NEEDED BY: struct xswdev
8 #include <vm/vm_param.h>
9 -// NEEDED BY: struct ipc_sem_data
9 +// NEEDED BY: struct semid_kernel, struct shmid_kernel, struct msqid_kernel
10 #define _KERNEL
11 #include <sys/sem.h>
12 #include <sys/shm.h>
13 +#include <sys/msg.h>
14 #undef _KERNEL
15 // NEEDED BY: do_disk_io
16 #define RRD_TYPE_DISK "disk"
@@ -22,7 +23,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
23
24 static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
25 do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
25 - do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1;
26 + do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1, do_ipc_msg_queues = -1;
27
28 if (unlikely(do_cpu == -1)) {
29 do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -41,6 +42,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
42 do_committed = config_get_boolean("plugin:freebsd:sysctl", "committed memory", 1);
43 do_ipc_semaphores = config_get_boolean("plugin:freebsd:sysctl", "ipc semaphores", 1);
44 do_ipc_shared_mem = config_get_boolean("plugin:freebsd:sysctl", "ipc shared memory", 1);
45 + do_ipc_msg_queues = config_get_boolean("plugin:freebsd:sysctl", "ipc message queues", 1);
46 }
47
48 RRDSET *st;
@@ -123,6 +125,16 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
125 } ipc_shm = {0, 0, 0};
126 static struct shmid_kernel *ipc_shm_data = NULL;
127
128 + // NEEDED BY: do_ipc_msg_queues
129 + struct ipc_msq {
130 + int msgmni;
131 + collected_number queues;
132 + collected_number messages;
133 + collected_number usedsize;
134 + collected_number allocsize;
135 + } ipc_msq = {0, 0, 0, 0, 0};
136 + static struct msqid_kernel *ipc_msq_data = NULL;
137 +
138 // --------------------------------------------------------------------
139
140 if (last_loadavg_usec <= dt) {
@@ -701,7 +713,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
713 if (unlikely(getsysctl("kern.ipc.sema", ipc_sem_data, sizeof(struct semid_kernel) * ipc_sem.semmni))) {
714 do_ipc_semaphores = 0;
715 error("DISABLED: system.ipc_semaphores");
704 - error("DISABLED: system.ipc_semaphore_arrays");;
716 + error("DISABLED: system.ipc_semaphore_arrays");
717 } else {
718 for (i = 0; i < ipc_sem.semmni; i++) {
719 if (unlikely(ipc_sem_data[i].u.sem_perm.mode & SEM_ALLOC)) {
@@ -749,7 +761,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
761 if (unlikely(getsysctl("kern.ipc.shmsegs", ipc_shm_data, sizeof(struct shmid_kernel) * ipc_shm.shmmni))) {
762 do_ipc_shared_mem = 0;
763 error("DISABLED: system.ipc_shared_mem_segs");
752 - error("DISABLED: system.ipc_shared_mem_size");;
764 + error("DISABLED: system.ipc_shared_mem_size");
765 } else {
766 for (i = 0; i < ipc_shm.shmmni; i++) {
767 if (unlikely(ipc_shm_data[i].u.shm_perm.mode & 0x0800)) {
@@ -785,5 +797,84 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
797 }
798 }
799
800 + // --------------------------------------------------------------------
801 +
802 + if (likely(do_ipc_msg_queues)) {
803 + if (unlikely(GETSYSCTL("kern.ipc.msgmni", ipc_msq.msgmni))) {
804 + do_ipc_msg_queues = 0;
805 + error("DISABLED: system.ipc_msq_queues");
806 + error("DISABLED: system.ipc_msq_messages");
807 + error("DISABLED: system.ipc_msq_used_size");
808 + error("DISABLED: system.ipc_msq_allocated_size");
809 + } else {
810 + ipc_msq_data = reallocz(ipc_msq_data, sizeof(struct msqid_kernel) * ipc_msq.msgmni);
811 + if (unlikely(getsysctl("kern.ipc.msqids", ipc_msq_data, sizeof(struct msqid_kernel) * ipc_msq.msgmni))) {
812 + do_ipc_msg_queues = 0;
813 + error("DISABLED: system.ipc_msq_queues");
814 + error("DISABLED: system.ipc_msq_messages");
815 + error("DISABLED: system.ipc_msq_used_size");
816 + error("DISABLED: system.ipc_msq_allocated_size");
817 + } else {
818 + for (i = 0; i < ipc_msq.msgmni; i++) {
819 + if (unlikely(ipc_msq_data[i].u.msg_qbytes != 0)) {
820 + ipc_msq.queues += 1;
821 + ipc_msq.messages += ipc_msq_data[i].u.msg_qnum;
822 + ipc_msq.usedsize += ipc_msq_data[i].u.msg_cbytes;
823 + ipc_msq.allocsize += ipc_msq_data[i].u.msg_qbytes;
824 + }
825 + }
826 +
827 + // --------------------------------------------------------------------
828 +
829 + st = rrdset_find("system.ipc_msq_queues");
830 + if (unlikely(!st)) {
831 + st = rrdset_create("system", "ipc_msq_queues", NULL, "ipc message queues", NULL, "Number of IPC Message Queues", "queues", 1000, rrd_update_every, RRDSET_TYPE_AREA);
832 + rrddim_add(st, "queues", NULL, 1, 1, RRDDIM_ABSOLUTE);
833 + }
834 + else rrdset_next(st);
835 +
836 + rrddim_set(st, "queues", ipc_msq.queues);
837 + rrdset_done(st);
838 +
839 + // --------------------------------------------------------------------
840 +
841 + st = rrdset_find("system.ipc_msq_messages");
842 + if (unlikely(!st)) {
843 + st = rrdset_create("system", "ipc_msq_messages", NULL, "ipc message queues", NULL, "Number of Messages in IPC Message Queues", "messages", 1000, rrd_update_every, RRDSET_TYPE_AREA);
844 + rrddim_add(st, "messages", NULL, 1, 1, RRDDIM_ABSOLUTE);
845 + }
846 + else rrdset_next(st);
847 +
848 + rrddim_set(st, "messages", ipc_msq.messages);
849 + rrdset_done(st);
850 +
851 + // --------------------------------------------------------------------
852 +
853 + st = rrdset_find("system.ipc_msq_used_size");
854 + if (unlikely(!st)) {
855 + st = rrdset_create("system", "ipc_msq_used_size", NULL, "ipc message queues", NULL, "Number of used bytes in IPC Message Queues", "bytes", 1000, rrd_update_every, RRDSET_TYPE_AREA);
856 + rrddim_add(st, "used", NULL, 1, 1, RRDDIM_ABSOLUTE);
857 + }
858 + else rrdset_next(st);
859 +
860 + rrddim_set(st, "used", ipc_msq.usedsize);
861 + rrdset_done(st);
862 +
863 +
864 + // --------------------------------------------------------------------
865 +
866 + st = rrdset_find("system.ipc_msq_allocated_size");
867 + if (unlikely(!st)) {
868 + st = rrdset_create("system", "ipc_msq_allocated_size", NULL, "ipc message queues", NULL, "Maximum size of IPC Message Queues", "bytes", 1000, rrd_update_every, RRDSET_TYPE_AREA);
869 + rrddim_add(st, "allocated", NULL, 1, 1, RRDDIM_ABSOLUTE);
870 + }
871 + else rrdset_next(st);
872 +
873 + rrddim_set(st, "allocated", ipc_msq.allocsize);
874 + rrdset_done(st);
875 + }
876 + }
877 + }
878 +
879 return 0;
880 }