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
}