@cryptotaxi247 / netdata-1 / commits / da94a62a2

Fix mirrored disks stats issue in FreeBSD plugin

Vladimir Kobal committed Jan 19, 2017 at 22:45 UTC da94a62a27412d8e1170bf0bccc5f2f526f8975b
1 file changed +34 -32
src/freebsd_sysctl.c
+34 -32
@@ -163,6 +163,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
163 int numdevs;
164 static void *devstat_data = NULL;
165 struct devstat *dstat;
166 + char disk[DEVSTAT_NAME_LEN + 10 + 1]; // 10 - maximum number of digits for int
167 struct cur_dstat {
168 collected_number duration_read_ms;
169 collected_number duration_write_ms;
@@ -609,34 +610,35 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
610 error("DISABLED: disk.io");
611 } else {
612 dstat = devstat_data + sizeof(long); // skip generation number
612 - collected_number total_disk_reads = 0;
613 - collected_number total_disk_writes = 0;
613 + collected_number total_disk_kbytes_read = 0;
614 + collected_number total_disk_kbytes_write = 0;
615
616 for (i = 0; i < numdevs; i++) {
617 if (((dstat[i].device_type & DEVSTAT_TYPE_MASK) == DEVSTAT_TYPE_DIRECT) || ((dstat[i].device_type & DEVSTAT_TYPE_MASK) == DEVSTAT_TYPE_STORARRAY)) {
618 + sprintf(disk, "%s%d", dstat[i].device_name, dstat[i].unit_number);
619
620 // --------------------------------------------------------------------
621
620 - st = rrdset_find_bytype(RRD_TYPE_DISK, dstat[i].device_name);
622 + st = rrdset_find_bytype(RRD_TYPE_DISK, disk);
623 if (unlikely(!st)) {
622 - st = rrdset_create(RRD_TYPE_DISK, dstat[i].device_name, NULL, dstat[i].device_name, "disk.io", "Disk I/O Bandwidth", "kilobytes/s", 2000, update_every, RRDSET_TYPE_AREA);
624 + st = rrdset_create(RRD_TYPE_DISK, disk, NULL, disk, "disk.io", "Disk I/O Bandwidth", "kilobytes/s", 2000, update_every, RRDSET_TYPE_AREA);
625
626 rrddim_add(st, "reads", NULL, 1, 1024, RRDDIM_INCREMENTAL);
627 rrddim_add(st, "writes", NULL, -1, 1024, RRDDIM_INCREMENTAL);
628 }
629 else rrdset_next(st);
630
629 - total_disk_reads += dstat[i].bytes[DEVSTAT_READ];
630 - total_disk_writes += dstat[i].bytes[DEVSTAT_WRITE];
631 + total_disk_kbytes_read += dstat[i].bytes[DEVSTAT_READ]/KILO_FACTOR;
632 + total_disk_kbytes_write += dstat[i].bytes[DEVSTAT_WRITE]/KILO_FACTOR;
633 prev_dstat.bytes_read = rrddim_set(st, "reads", dstat[i].bytes[DEVSTAT_READ]);
634 prev_dstat.bytes_write = rrddim_set(st, "writes", dstat[i].bytes[DEVSTAT_WRITE]);
635 rrdset_done(st);
636
637 // --------------------------------------------------------------------
638
637 - st = rrdset_find_bytype("disk_ops", dstat[i].device_name);
639 + st = rrdset_find_bytype("disk_ops", disk);
640 if (unlikely(!st)) {
639 - st = rrdset_create("disk_ops", dstat[i].device_name, NULL, dstat[i].device_name, "disk.ops", "Disk Completed I/O Operations", "operations/s", 2001, update_every, RRDSET_TYPE_LINE);
641 + st = rrdset_create("disk_ops", disk, NULL, disk, "disk.ops", "Disk Completed I/O Operations", "operations/s", 2001, update_every, RRDSET_TYPE_LINE);
642 st->isdetail = 1;
643
644 rrddim_add(st, "reads", NULL, 1, 1, RRDDIM_INCREMENTAL);
@@ -650,9 +652,9 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
652
653 // --------------------------------------------------------------------
654
653 - st = rrdset_find_bytype("disk_qops", dstat[i].device_name);
655 + st = rrdset_find_bytype("disk_qops", disk);
656 if (unlikely(!st)) {
655 - st = rrdset_create("disk_qops", dstat[i].device_name, NULL, dstat[i].device_name, "disk.qops", "Disk Current I/O Operations", "operations", 2002, update_every, RRDSET_TYPE_LINE);
657 + st = rrdset_create("disk_qops", disk, NULL, disk, "disk.qops", "Disk Current I/O Operations", "operations", 2002, update_every, RRDSET_TYPE_LINE);
658 st->isdetail = 1;
659
660 rrddim_add(st, "operations", NULL, 1, 1, RRDDIM_ABSOLUTE);
@@ -664,9 +666,9 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
666
667 // --------------------------------------------------------------------
668
667 - st = rrdset_find_bytype("disk_util", dstat[i].device_name);
669 + st = rrdset_find_bytype("disk_util", disk);
670 if (unlikely(!st)) {
669 - st = rrdset_create("disk_util", dstat[i].device_name, NULL, dstat[i].device_name, "disk.util", "Disk Utilization Time", "% of time working", 2004, update_every, RRDSET_TYPE_AREA);
671 + st = rrdset_create("disk_util", disk, NULL, disk, "disk.util", "Disk Utilization Time", "% of time working", 2004, update_every, RRDSET_TYPE_AREA);
672 st->isdetail = 1;
673
674 rrddim_add(st, "utilization", NULL, 1, 10, RRDDIM_INCREMENTAL);
@@ -679,9 +681,9 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
681
682 // --------------------------------------------------------------------
683
682 - st = rrdset_find_bytype("disk_iotime", dstat[i].device_name);
684 + st = rrdset_find_bytype("disk_iotime", disk);
685 if (unlikely(!st)) {
684 - st = rrdset_create("disk_iotime", dstat[i].device_name, NULL, dstat[i].device_name, "disk.iotime", "Disk Total I/O Time", "milliseconds/s", 2022, update_every, RRDSET_TYPE_LINE);
686 + st = rrdset_create("disk_iotime", disk, NULL, disk, "disk.iotime", "Disk Total I/O Time", "milliseconds/s", 2022, update_every, RRDSET_TYPE_LINE);
687 st->isdetail = 1;
688
689 rrddim_add(st, "reads", NULL, 1, 1, RRDDIM_INCREMENTAL);
@@ -703,9 +705,9 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
705
706 // --------------------------------------------------------------------
707
706 - st = rrdset_find_bytype("disk_await", dstat[i].device_name);
708 + st = rrdset_find_bytype("disk_await", disk);
709 if (unlikely(!st)) {
708 - st = rrdset_create("disk_await", dstat[i].device_name, NULL, dstat[i].device_name, "disk.await", "Average Completed I/O Operation Time", "ms per operation", 2005, update_every, RRDSET_TYPE_LINE);
710 + st = rrdset_create("disk_await", disk, NULL, disk, "disk.await", "Average Completed I/O Operation Time", "ms per operation", 2005, update_every, RRDSET_TYPE_LINE);
711 st->isdetail = 1;
712
713 rrddim_add(st, "reads", NULL, 1, 1, RRDDIM_ABSOLUTE);
@@ -721,9 +723,9 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
723
724 // --------------------------------------------------------------------
725
724 - st = rrdset_find_bytype("disk_avgsz", dstat[i].device_name);
726 + st = rrdset_find_bytype("disk_avgsz", disk);
727 if (unlikely(!st)) {
726 - st = rrdset_create("disk_avgsz", dstat[i].device_name, NULL, dstat[i].device_name, "disk.avgsz", "Average Completed I/O Operation Bandwidth", "kilobytes per operation", 2006, update_every, RRDSET_TYPE_AREA);
728 + st = rrdset_create("disk_avgsz", disk, NULL, disk, "disk.avgsz", "Average Completed I/O Operation Bandwidth", "kilobytes per operation", 2006, update_every, RRDSET_TYPE_AREA);
729 st->isdetail = 1;
730
731 rrddim_add(st, "reads", NULL, 1, 1024, RRDDIM_ABSOLUTE);
@@ -739,9 +741,9 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
741
742 // --------------------------------------------------------------------
743
742 - st = rrdset_find_bytype("disk_svctm", dstat[i].device_name);
744 + st = rrdset_find_bytype("disk_svctm", disk);
745 if (unlikely(!st)) {
744 - st = rrdset_create("disk_svctm", dstat[i].device_name, NULL, dstat[i].device_name, "disk.svctm", "Average Service Time", "ms per operation", 2007, update_every, RRDSET_TYPE_LINE);
746 + st = rrdset_create("disk_svctm", disk, NULL, disk, "disk.svctm", "Average Service Time", "ms per operation", 2007, update_every, RRDSET_TYPE_LINE);
747 st->isdetail = 1;
748
749 rrddim_add(st, "svctm", NULL, 1, 1, RRDDIM_ABSOLUTE);
@@ -753,21 +755,21 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
755 rrdset_done(st);
756 }
757 }
758 + }
759
757 - // --------------------------------------------------------------------
758 -
759 - st = rrdset_find_bytype("system", "io");
760 - if (unlikely(!st)) {
761 - st = rrdset_create("system", "io", NULL, "disk", NULL, "Disk I/O", "kilobytes/s", 150, update_every, RRDSET_TYPE_AREA);
762 - rrddim_add(st, "in", NULL, 1, 1024, RRDDIM_INCREMENTAL);
763 - rrddim_add(st, "out", NULL, -1, 1024, RRDDIM_INCREMENTAL);
764 - }
765 - else rrdset_next(st);
760 + // --------------------------------------------------------------------
761
767 - rrddim_set(st, "in", total_disk_reads);
768 - rrddim_set(st, "out", total_disk_writes);
769 - rrdset_done(st);
762 + st = rrdset_find_bytype("system", "io");
763 + if (unlikely(!st)) {
764 + st = rrdset_create("system", "io", NULL, "disk", NULL, "Disk I/O", "kilobytes/s", 150, update_every, RRDSET_TYPE_AREA);
765 + rrddim_add(st, "in", NULL, 1, 1, RRDDIM_INCREMENTAL);
766 + rrddim_add(st, "out", NULL, -1, 1, RRDDIM_INCREMENTAL);
767 }
768 + else rrdset_next(st);
769 +
770 + rrddim_set(st, "in", total_disk_kbytes_read);
771 + rrddim_set(st, "out", total_disk_kbytes_write);
772 + rrdset_done(st);
773 }
774 }
775 }