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
}