Add system interrupts chart to FreeBSD plugin
Vladimir Kobal committed
Dec 30, 2016 at 01:54 UTC
fffacfa0429e98c4a8191a3fca1d5c20c4664a61
1 file changed
+30
src/freebsd_sysctl.c
+30
@@ -61,9 +61,11 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
61
}
62
63
RRDSET *st;
64
+ RRDDIM *rd;
65
66
int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
67
int i, n;
68
+ void *p;
69
int common_error = 0;
70
size_t size;
71
@@ -91,6 +93,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
93
size_t intrcnt_size;
94
unsigned long nintr = 0;
95
static unsigned long *intrcnt = NULL;
96
+ static char *intrnames = NULL;
97
unsigned long long totalintr = 0;
98
99
// NEEDED BY: do_disk_io
@@ -380,6 +383,33 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
383
384
rrddim_set(st, "interrupts", totalintr);
385
rrdset_done(st);
386
+
387
+ // --------------------------------------------------------------------
388
+
389
+ size = nintr * (MAXCOMLEN +1);
390
+ intrnames = reallocz(intrnames, size);
391
+ if (unlikely(getsysctl("hw.intrnames", intrnames, size))) {
392
+ do_interrupts = 0;
393
+ error("DISABLED: system.intr");
394
+ } else {
395
+ st = rrdset_find_bytype("system", "interrupts");
396
+ if (unlikely(!st))
397
+ st = rrdset_create("system", "interrupts", NULL, "interrupts", NULL, "System interrupts", "interrupts/s",
398
+ 1000, update_every, RRDSET_TYPE_STACKED);
399
+ else
400
+ rrdset_next(st);
401
+
402
+ for (i = 0; i < nintr; i++) {
403
+ p = intrnames + i * (MAXCOMLEN + 1);
404
+ if (unlikely((intrcnt[i] != 0) && (*(char*)p != 0))) {
405
+ rd = rrddim_find(st, p);
406
+ if (unlikely(!rd))
407
+ rd = rrddim_add(st, p, NULL, 1, 1, RRDDIM_INCREMENTAL);
408
+ rrddim_set_by_pointer(st, rd, intrcnt[i]);
409
+ }
410
+ }
411
+ rrdset_done(st);
412
+ }
413
}
414
}
415
}