X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdisk.c;h=cdf2816d24237025e5a649bdbb9e9890a8e676c6;hb=bc014af07ee3ea6231c629cc72099f668788a343;hp=375583c432418dd355a4eafe753a849a0cc18ba2;hpb=148b944e265a610d513cfd6c0f3a6b563b96fcfa;p=collectd.git diff --git a/src/disk.c b/src/disk.c index 375583c4..cdf2816d 100644 --- a/src/disk.c +++ b/src/disk.c @@ -109,7 +109,7 @@ static diskstats_t *disklist; /* #endif KERNEL_LINUX */ #elif HAVE_LIBKSTAT -#define MAX_NUMDISK 256 +#define MAX_NUMDISK 1024 extern kstat_ctl_t *kc; static kstat_t *ksp[MAX_NUMDISK]; static int numdisk = 0; @@ -128,11 +128,19 @@ static int pnumdisk; # error "No applicable input method." #endif +#if HAVE_LIBUDEV +#include + +static char *conf_udev_name_attr = NULL; +static struct udev *handle_udev; +#endif + static const char *config_keys[] = { "Disk", "UseBSDName", - "IgnoreSelected" + "IgnoreSelected", + "UdevNameAttr" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); @@ -165,6 +173,21 @@ static int disk_config (const char *key, const char *value) "on Mach / Mac OS X and will be ignored."); #endif } + else if (strcasecmp ("UdevNameAttr", key) == 0) + { +#if HAVE_LIBUDEV + if (conf_udev_name_attr != NULL) + { + free (conf_udev_name_attr); + conf_udev_name_attr = NULL; + } + if ((conf_udev_name_attr = strdup (value)) == NULL) + return (1); +#else + WARNING ("disk plugin: The \"UdevNameAttr\" option is only supported " + "if collectd is built with libudev support"); +#endif + } else { return (-1); @@ -251,13 +274,42 @@ static void disk_submit (const char *plugin_instance, #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 ()); double avg_time = ((double) delta_time) / ((double) delta_ops); - double avg_time_incr = CDTIME_T_TO_DOUBLE (interval_g) * avg_time; + double avg_time_incr = interval * avg_time; return ((counter_t) (avg_time_incr + .5)); } #endif +#if HAVE_LIBUDEV +/** + * Attempt to provide an rename disk instance from an assigned udev attribute. + * + * On success, it returns a strduped char* to the desired attribute value. + * Otherwise it returns NULL. + */ + +static char *disk_udev_attr_name (struct udev *udev, char *disk_name, const char *attr) +{ + struct udev_device *dev; + const char *prop; + char *output = NULL; + + dev = udev_device_new_from_subsystem_sysname (udev, "block", disk_name); + if (dev != NULL) + { + prop = udev_device_get_property_value (dev, attr); + if (prop) { + output = strdup (prop); + DEBUG ("disk plugin: renaming %s => %s", disk_name, output); + } + udev_device_unref (dev); + } + return output; +} +#endif + #if HAVE_IOKIT_IOKITLIB_H static signed long long dict_get_value (CFDictionaryRef dict, const char *key) { @@ -504,9 +556,15 @@ static int disk_read (void) fieldshift = 1; } +#if HAVE_LIBUDEV + handle_udev = udev_new(); +#endif + while (fgets (buffer, sizeof (buffer), fh) != NULL) { char *disk_name; + char *output_name; + char *alt_name; numfields = strsplit (buffer, fields, 32); @@ -658,25 +716,43 @@ static int disk_read (void) continue; } + output_name = disk_name; + +#if HAVE_LIBUDEV + alt_name = disk_udev_attr_name (handle_udev, disk_name, + conf_udev_name_attr); +#else + alt_name = NULL; +#endif + if (alt_name != NULL) + output_name = alt_name; + if ((ds->read_bytes != 0) || (ds->write_bytes != 0)) - disk_submit (disk_name, "disk_octets", + disk_submit (output_name, "disk_octets", ds->read_bytes, ds->write_bytes); if ((ds->read_ops != 0) || (ds->write_ops != 0)) - disk_submit (disk_name, "disk_ops", + disk_submit (output_name, "disk_ops", read_ops, write_ops); if ((ds->avg_read_time != 0) || (ds->avg_write_time != 0)) - disk_submit (disk_name, "disk_time", + disk_submit (output_name, "disk_time", ds->avg_read_time, ds->avg_write_time); if (is_disk) { - disk_submit (disk_name, "disk_merged", + disk_submit (output_name, "disk_merged", read_merged, write_merged); } /* if (is_disk) */ + + /* release udev-based alternate name, if allocated */ + free(alt_name); } /* while (fgets (buffer, sizeof (buffer), fh) != NULL) */ +#if HAVE_LIBUDEV + udev_unref(handle_udev); +#endif + fclose (fh); /* #endif defined(KERNEL_LINUX) */