X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdisk.c;h=b2285c1836d41d51c131432513cb555b1bcc1bf2;hb=0ac4011bb728f8716082a3ddea4f112acc2c86e5;hp=206862baab4ebea4cfa809a7e4e57774e7be5a5a;hpb=3f4d0cbd79ca46e1b98edb10ddee3a723d69a6bb;p=collectd.git diff --git a/src/disk.c b/src/disk.c index 206862ba..b2285c18 100644 --- a/src/disk.c +++ b/src/disk.c @@ -303,9 +303,7 @@ static void submit_io_time(char const *plugin_instance, derive_t io_time, plugin_dispatch_values(&vl); } /* void submit_io_time */ -#endif /* KERNEL_FREEBSD || KERNEL_LINUX */ -#if KERNEL_LINUX static void submit_in_progress(char const *disk_name, gauge_t in_progress) { value_list_t vl = VALUE_LIST_INIT; @@ -317,7 +315,9 @@ static void submit_in_progress(char const *disk_name, gauge_t in_progress) { plugin_dispatch_values(&vl); } +#endif /* KERNEL_FREEBSD || KERNEL_LINUX */ +#if KERNEL_LINUX static counter_t disk_calc_time_incr(counter_t delta_time, counter_t delta_ops) { double interval = CDTIME_T_TO_DOUBLE(plugin_get_interval()); @@ -544,6 +544,7 @@ static int disk_read(void) { const char *disk_name; long double read_time, write_time, busy_time, total_duration; + uint64_t queue_length; for (retry = 0, dirty = 1; retry < 5 && dirty == 1; retry++) { if (snap != NULL) @@ -646,10 +647,12 @@ static int disk_read(void) { } if (devstat_compute_statistics(snap_iter, NULL, 1.0, DSM_TOTAL_BUSY_TIME, &busy_time, DSM_TOTAL_DURATION, - &total_duration, DSM_NONE) != 0) { + &total_duration, DSM_QUEUE_LENGTH, + &queue_length, DSM_NONE) != 0) { WARNING("%s", devstat_errbuf); } else { submit_io_time(disk_name, busy_time, total_duration); + submit_in_progress(disk_name, (gauge_t)queue_length); } } geom_stats_snapshot_free(snap); @@ -659,10 +662,6 @@ static int disk_read(void) { char buffer[1024]; char *fields[32]; - int numfields; - int fieldshift = 0; - - int minor = 0; derive_t read_sectors = 0; derive_t write_sectors = 0; @@ -681,28 +680,21 @@ static int disk_read(void) { diskstats_t *ds, *pre_ds; if ((fh = fopen("/proc/diskstats", "r")) == NULL) { - fh = fopen("/proc/partitions", "r"); - if (fh == NULL) { - ERROR("disk plugin: fopen (/proc/{diskstats,partitions}) failed."); - return -1; - } - - /* Kernel is 2.4.* */ - fieldshift = 1; + ERROR("disk plugin: fopen(\"/proc/diskstats\"): %s", STRERRNO); + return -1; } while (fgets(buffer, sizeof(buffer), fh) != NULL) { char *disk_name; char *output_name; - numfields = strsplit(buffer, fields, 32); + int numfields = strsplit(buffer, fields, 32); - if ((numfields != (14 + fieldshift)) && (numfields != 7)) + /* need either 7 fields (partition) or at least 14 fields */ + if ((numfields != 7) && (numfields < 14)) continue; - minor = atoll(fields[1]); - - disk_name = fields[2 + fieldshift]; + disk_name = fields[2]; for (ds = disklist, pre_ds = disklist; ds != NULL; pre_ds = ds, ds = ds->next) @@ -731,28 +723,24 @@ static int disk_read(void) { read_sectors = atoll(fields[4]); write_ops = atoll(fields[5]); write_sectors = atoll(fields[6]); - } else if (numfields == (14 + fieldshift)) { - read_ops = atoll(fields[3 + fieldshift]); - write_ops = atoll(fields[7 + fieldshift]); + } else { + assert(numfields >= 14); + read_ops = atoll(fields[3]); + write_ops = atoll(fields[7]); - read_sectors = atoll(fields[5 + fieldshift]); - write_sectors = atoll(fields[9 + fieldshift]); + read_sectors = atoll(fields[5]); + write_sectors = atoll(fields[9]); - if ((fieldshift == 0) || (minor == 0)) { - is_disk = 1; - read_merged = atoll(fields[4 + fieldshift]); - read_time = atoll(fields[6 + fieldshift]); - write_merged = atoll(fields[8 + fieldshift]); - write_time = atoll(fields[10 + fieldshift]); + is_disk = 1; + read_merged = atoll(fields[4]); + read_time = atoll(fields[6]); + write_merged = atoll(fields[8]); + write_time = atoll(fields[10]); - in_progress = atof(fields[11 + fieldshift]); + in_progress = atof(fields[11]); - io_time = atof(fields[12 + fieldshift]); - weighted_time = atof(fields[13 + fieldshift]); - } - } else { - DEBUG("numfields = %i; => unknown file format.", numfields); - continue; + io_time = atof(fields[12]); + weighted_time = atof(fields[13]); } {