Separate hw.intrcnt and m.stats.sys.v_intr modules
Vladimir Kobal committed
Mar 9, 2017 at 01:47 UTC
35843ec9e77b2593c476108558eb1eff4a39078a
3 files changed
+169
-94
src/freebsd_sysctl.c
+164
-93
@@ -72,7 +72,7 @@ int do_vm_loadavg(int update_every, usec_t dt){
72
static usec_t next_loadavg_dt = 0;
73
74
if (next_loadavg_dt <= dt) {
75
- static int mib[2] = {0,0};
75
+ static int mib[2] = {0, 0};
76
struct loadavg sysload;
77
78
if (unlikely(GETSYSCTL_SIMPLE("vm.loadavg", mib, sysload))) {
@@ -255,6 +255,9 @@ int do_kern_cp_time(int update_every, usec_t dt) {
255
error("DISABLED: kern.cp_time module");
256
return 1;
257
} else {
258
+
259
+ // --------------------------------------------------------------------
260
+
261
static RRDSET *st = NULL;
262
static RRDDIM *rd_nice = NULL, *rd_system = NULL, *rd_user = NULL, *rd_interrupt = NULL, *rd_idle = NULL;
263
@@ -287,6 +290,8 @@ int do_kern_cp_time(int update_every, usec_t dt) {
290
rrdset_done(st);
291
}
292
}
293
+
294
+ return 0;
295
}
296
297
// --------------------------------------------------------------------------------------------------------------------
@@ -309,6 +314,9 @@ int do_kern_cp_times(int update_every, usec_t dt) {
314
error("DISABLED: kern.cp_times module");
315
return 1;
316
} else {
317
+
318
+ // --------------------------------------------------------------------
319
+
320
int i;
321
static struct cpu_chart {
322
char cpuid[MAX_INT_DIGITS + 4];
@@ -359,6 +367,159 @@ int do_kern_cp_times(int update_every, usec_t dt) {
367
}
368
}
369
}
370
+
371
+ return 0;
372
+}
373
+
374
+// --------------------------------------------------------------------------------------------------------------------
375
+// hw.intrcnt
376
+
377
+int do_hw_intcnt(int update_every, usec_t dt) {
378
+ static int mib_hw_intrcnt[2] = {0, 0};
379
+ size_t intrcnt_size;
380
+ int i;
381
+
382
+ if (unlikely(GETSYSCTL_SIZE("hw.intrcnt", mib_hw_intrcnt, intrcnt_size))) {
383
+ error("DISABLED: system.intr chart");
384
+ error("DISABLED: system.interrupts chart");
385
+ error("DISABLED: hw.intrcnt module");
386
+ return 1;
387
+ } else {
388
+ unsigned long nintr = 0;
389
+ static unsigned long *intrcnt = NULL;
390
+ unsigned long long totalintr = 0;
391
+
392
+ nintr = intrcnt_size / sizeof(u_long);
393
+ intrcnt = reallocz(intrcnt, nintr * sizeof(u_long));
394
+ if (unlikely(GETSYSCTL_WSIZE("hw.intrcnt", mib_hw_intrcnt, intrcnt, nintr * sizeof(u_long)))) {
395
+ error("DISABLED: system.intr chart");
396
+ error("DISABLED: system.interrupts chart");
397
+ error("DISABLED: hw.intrcnt module");
398
+ return 1;
399
+ } else {
400
+ for (i = 0; i < nintr; i++)
401
+ totalintr += intrcnt[i];
402
+
403
+ // --------------------------------------------------------------------
404
+
405
+ static RRDSET *st_intr = NULL;
406
+ static RRDDIM *rd_intr = NULL;
407
+
408
+ if (unlikely(!st_intr)) {
409
+ st_intr = rrdset_create_localhost("system",
410
+ "intr",
411
+ NULL,
412
+ "interrupts",
413
+ NULL,
414
+ "Total Hardware Interrupts",
415
+ "interrupts/s",
416
+ 900,
417
+ update_every,
418
+ RRDSET_TYPE_LINE
419
+ );
420
+ rrdset_flag_set(st_intr, RRDSET_FLAG_DETAIL);
421
+
422
+ rd_intr = rrddim_add(st_intr, "interrupts", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
423
+ } else
424
+ rrdset_next(st_intr);
425
+
426
+ rrddim_set_by_pointer(st_intr, rd_intr, totalintr);
427
+ rrdset_done(st_intr);
428
+
429
+ // --------------------------------------------------------------------
430
+
431
+ size_t size;
432
+ static int mib_hw_intrnames[2] = {0, 0};
433
+ static char *intrnames = NULL;
434
+
435
+ size = nintr * (MAXCOMLEN + 1);
436
+ intrnames = reallocz(intrnames, size);
437
+ if (unlikely(GETSYSCTL_WSIZE("hw.intrnames", mib_hw_intrnames, intrnames, size))) {
438
+ error("DISABLED: system.intr chart");
439
+ error("DISABLED: system.interrupts chart");
440
+ error("DISABLED: hw.intrcnt module");
441
+ return 1;
442
+ } else {
443
+
444
+ // --------------------------------------------------------------------
445
+
446
+ static RRDSET *st_interrupts = NULL;
447
+ RRDDIM *rd_interrupts = NULL;
448
+ void *p;
449
+
450
+ if (unlikely(!st_interrupts))
451
+ st_interrupts = rrdset_create_localhost("system",
452
+ "interrupts",
453
+ NULL,
454
+ "interrupts",
455
+ NULL,
456
+ "System interrupts",
457
+ "interrupts/s",
458
+ 1000,
459
+ update_every,
460
+ RRDSET_TYPE_STACKED
461
+ );
462
+ else
463
+ rrdset_next(st_interrupts);
464
+
465
+ for (i = 0; i < nintr; i++) {
466
+ p = intrnames + i * (MAXCOMLEN + 1);
467
+ if (unlikely((intrcnt[i] != 0) && (*(char *) p != 0))) {
468
+ rd_interrupts = rrddim_find(st_interrupts, p);
469
+ if (unlikely(!rd_interrupts))
470
+ rd_interrupts = rrddim_add(st_interrupts, p, NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
471
+ rrddim_set_by_pointer(st_interrupts, rd_interrupts, intrcnt[i]);
472
+ }
473
+ }
474
+ rrdset_done(st_interrupts);
475
+ }
476
+ }
477
+ }
478
+
479
+ return 0;
480
+}
481
+
482
+// --------------------------------------------------------------------------------------------------------------------
483
+// vm.stats.sys.v_intr
484
+
485
+int do_vm_stats_sys_v_intr(int update_every, usec_t dt) {
486
+ static int mib[4] = {0, 0, 0, 0};
487
+ u_int int_number;
488
+
489
+ if (unlikely(GETSYSCTL_SIMPLE("vm.stats.sys.v_intr", mib, int_number))) {
490
+ error("DISABLED: system.dev_intr chart");
491
+ error("DISABLED: vm.stats.sys.v_intr module");
492
+ return 1;
493
+ } else {
494
+
495
+ // --------------------------------------------------------------------
496
+
497
+ static RRDSET *st = NULL;
498
+ static RRDDIM *rd = NULL;
499
+
500
+ st = rrdset_find_bytype_localhost("system", "dev_intr");
501
+ if (unlikely(!st)) {
502
+ st = rrdset_create_localhost("system",
503
+ "dev_intr",
504
+ NULL,
505
+ "interrupts",
506
+ NULL,
507
+ "Device Interrupts",
508
+ "interrupts/s",
509
+ 1000,
510
+ update_every,
511
+ RRDSET_TYPE_LINE
512
+ );
513
+
514
+ rd = rrddim_add(st, "interrupts", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
515
+ }
516
+ else rrdset_next(st);
517
+
518
+ rrddim_set_by_pointer(st, rd, int_number);
519
+ rrdset_done(st);
520
+ }
521
+
522
+ return 0;
523
}
524
525
// --------------------------------------------------------------------------------------------------------------------
@@ -371,9 +532,9 @@ int do_kern_cp_times(int update_every, usec_t dt) {
532
#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
533
534
int do_freebsd_sysctl_old(int update_every, usec_t dt) {
374
- static int do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
535
+ static int do_context = -1, do_forks = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
536
do_pgfaults = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1, do_ipc_msg_queues = -1,
376
- do_dev_intr = -1, do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1,
537
+ do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1,
538
do_tcp_sockets = -1, do_tcp_packets = -1, do_tcp_errors = -1, do_tcp_handshake = -1,
539
do_ecn = -1, do_tcpext_syscookies = -1, do_tcpext_ofo = -1, do_tcpext_connaborts = -1,
540
do_udp_packets = -1, do_udp_errors = -1, do_icmp_packets = -1, do_icmpmsg = -1,
@@ -383,9 +544,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) {
544
do_icmp6_neighbor = -1, do_icmp6_types = -1, do_space = -1, do_inodes = -1, do_uptime = -1;
545
546
if (unlikely(do_uptime == -1)) {
386
- do_cpu_cores = config_get_boolean("plugin:freebsd:sysctl", "per cpu core utilization", 1);
387
- do_interrupts = config_get_boolean("plugin:freebsd:sysctl", "cpu interrupts", 1);
388
- do_dev_intr = config_get_boolean("plugin:freebsd:sysctl", "device interrupts", 1);
547
do_soft_intr = config_get_boolean("plugin:freebsd:sysctl", "software interrupts", 1);
548
do_context = config_get_boolean("plugin:freebsd:sysctl", "context switches", 1);
549
do_forks = config_get_boolean("plugin:freebsd:sysctl", "processes started", 1);
@@ -445,13 +603,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) {
603
// NEEDED BY: do_context, do_forks
604
u_int u_int_data;
605
448
- // NEEDED BY: do_interrupts
449
- size_t intrcnt_size;
450
- unsigned long nintr = 0;
451
- static unsigned long *intrcnt = NULL;
452
- static char *intrnames = NULL;
453
- unsigned long long totalintr = 0;
454
-
606
// NEEDED BY: do_disk_io
607
#define BINTIME_SCALE 5.42101086242752217003726400434970855712890625e-17 // this is 1000/2^64
608
int numdevs;
@@ -572,86 +723,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) {
723
724
// --------------------------------------------------------------------
725
575
- if (likely(do_interrupts)) {
576
- if (unlikely(sysctlbyname("hw.intrcnt", NULL, &intrcnt_size, NULL, 0) == -1)) {
577
- error("FREEBSD: sysctl(hw.intrcnt...) failed: %s", strerror(errno));
578
- do_interrupts = 0;
579
- error("DISABLED: system.intr");
580
- } else {
581
- nintr = intrcnt_size / sizeof(u_long);
582
- intrcnt = reallocz(intrcnt, nintr * sizeof(u_long));
583
- if (unlikely(getsysctl_by_name("hw.intrcnt", intrcnt, nintr * sizeof(u_long)))){
584
- do_interrupts = 0;
585
- error("DISABLED: system.intr");
586
- } else {
587
- for (i = 0; i < nintr; i++)
588
- totalintr += intrcnt[i];
589
-
590
- st = rrdset_find_bytype_localhost("system", "intr");
591
- if (unlikely(!st)) {
592
- st = rrdset_create_localhost("system", "intr", NULL, "interrupts", NULL, "Total Hardware Interrupts", "interrupts/s", 900, update_every, RRDSET_TYPE_LINE);
593
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
594
-
595
- rrddim_add(st, "interrupts", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
596
- }
597
- else rrdset_next(st);
598
-
599
- rrddim_set(st, "interrupts", totalintr);
600
- rrdset_done(st);
601
-
602
- // --------------------------------------------------------------------
603
-
604
- size = nintr * (MAXCOMLEN +1);
605
- intrnames = reallocz(intrnames, size);
606
- if (unlikely(getsysctl_by_name("hw.intrnames", intrnames, size))) {
607
- do_interrupts = 0;
608
- error("DISABLED: system.intr");
609
- } else {
610
- st = rrdset_find_bytype_localhost("system", "interrupts");
611
- if (unlikely(!st))
612
- st = rrdset_create_localhost("system", "interrupts", NULL, "interrupts", NULL, "System interrupts", "interrupts/s",
613
- 1000, update_every, RRDSET_TYPE_STACKED);
614
- else
615
- rrdset_next(st);
616
-
617
- for (i = 0; i < nintr; i++) {
618
- p = intrnames + i * (MAXCOMLEN + 1);
619
- if (unlikely((intrcnt[i] != 0) && (*(char*)p != 0))) {
620
- rd = rrddim_find(st, p);
621
- if (unlikely(!rd))
622
- rd = rrddim_add(st, p, NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
623
- rrddim_set_by_pointer(st, rd, intrcnt[i]);
624
- }
625
- }
626
- rrdset_done(st);
627
- }
628
- }
629
- }
630
- }
631
-
632
- // --------------------------------------------------------------------
633
-
634
- if (likely(do_dev_intr)) {
635
- if (unlikely(GETSYSCTL_BY_NAME("vm.stats.sys.v_intr", u_int_data))) {
636
- do_dev_intr = 0;
637
- error("DISABLED: system.dev_intr");
638
- } else {
639
-
640
- st = rrdset_find_bytype_localhost("system", "dev_intr");
641
- if (unlikely(!st)) {
642
- st = rrdset_create_localhost("system", "dev_intr", NULL, "interrupts", NULL, "Device Interrupts", "interrupts/s", 1000, update_every, RRDSET_TYPE_LINE);
643
-
644
- rrddim_add(st, "interrupts", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
645
- }
646
- else rrdset_next(st);
647
-
648
- rrddim_set(st, "interrupts", u_int_data);
649
- rrdset_done(st);
650
- }
651
- }
652
-
653
- // --------------------------------------------------------------------
654
-
726
if (likely(do_soft_intr)) {
727
if (unlikely(GETSYSCTL_BY_NAME("vm.stats.sys.v_soft", u_int_data))) {
728
do_soft_intr = 0;
src/plugin_freebsd.c
+2
@@ -20,6 +20,8 @@ static struct freebsd_module {
20
{ .name = "vm.vmtotal", .dim = "vmtotal", .enabled = 1, .func = do_vm_vmtotal },
21
{ .name = "kern.cp_time", .dim = "cp_time", .enabled = 1, .func = do_kern_cp_time },
22
{ .name = "kern.cp_times", .dim = "cp_times", .enabled = 1, .func = do_kern_cp_times },
23
+ { .name = "hw.intrcnt", .dim = "hw_intrcnt", .enabled = 1, .func = do_hw_intcnt },
24
+ { .name = "vm.stats.sys.v_intr", .dim = "dev_intrcnt", .enabled = 1, .func = do_vm_stats_sys_v_intr },
25
26
// the terminator of this array
27
{ .name = NULL, .dim = NULL, .enabled = 0, .func = NULL }
src/plugin_freebsd.h
+3
-1
@@ -11,6 +11,8 @@ extern int do_vm_loadavg(int update_every, usec_t dt);
11
extern int do_vm_vmtotal(int update_every, usec_t dt);
12
extern int do_kern_cp_time(int update_every, usec_t dt);
13
extern int do_kern_cp_times(int update_every, usec_t dt);
14
+extern int do_hw_intcnt(int update_every, usec_t dt);
15
+extern int do_vm_stats_sys_v_intr(int update_every, usec_t dt);
16
extern int do_freebsd_sysctl_old(int update_every, usec_t dt);
17
18
#define GETSYSCTL_MIB(name, mib) getsysctl_mib(name, mib, sizeof(mib)/sizeof(int))
@@ -68,7 +70,7 @@ static inline int getsysctl(const char *name, int *mib, size_t miblen, void *ptr
70
error("FREEBSD: sysctl(%s...) failed: %s", name, strerror(errno));
71
return 1;
72
}
71
- if (unlikely(nlen != *len)) {
73
+ if (unlikely(ptr != NULL && nlen != *len)) {
74
error("FREEBSD: sysctl(%s...) expected %lu, got %lu", name, (unsigned long)*len, (unsigned long)nlen);
75
return 1;
76
}