@cryptotaxi247 / netdata-1 / commits / 35843ec9e

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 }