]> git.ipfire.org Git - ipfire-2.x.git/commitdiff
collectd: Use libstatgrab to read disk stats
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 8 Jul 2021 11:20:05 +0000 (11:20 +0000)
committerArne Fitzenreiter <arne_f@ipfire.org>
Fri, 9 Jul 2021 06:01:37 +0000 (06:01 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
lfs/collectd
src/patches/collectd-4.10-drop-linux-disk-module.patch [new file with mode: 0644]

index 36b5078686054f4481d3ef84905a4df166d6345b..09d8c6fcff9b0797f7509158e1a292a385eef528 100644 (file)
@@ -107,6 +107,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        cd $(DIR_APP) && patch -p1 -i $(DIR_SRC)/src/patches/collectd-4.10.9-xfs-compile-fix.patch
        cd $(DIR_APP) && patch -p1 -i $(DIR_SRC)/src/patches/collectd-4.10-libiptc-build-fixes.patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/collectd-4.10.9-remove-checks-for-SENSORS_API_VERSION-upper-limit.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/collectd-4.10-drop-linux-disk-module.patch
        cd $(DIR_APP) && autoupdate -v configure.in
        cd $(DIR_APP) && autoreconf -vfi
        cd $(DIR_APP)/libltdl && autoreconf -vfi
diff --git a/src/patches/collectd-4.10-drop-linux-disk-module.patch b/src/patches/collectd-4.10-drop-linux-disk-module.patch
new file mode 100644 (file)
index 0000000..02e9543
--- /dev/null
@@ -0,0 +1,299 @@
+diff --git a/src/collectd.c b/src/collectd.c
+index 6b77d599..f17c19eb 100644
+--- a/src/collectd.c
++++ b/src/collectd.c
+@@ -294,7 +294,7 @@ static int do_init (void)
+ #endif
+ #if HAVE_LIBSTATGRAB
+-      if (sg_init ())
++      if (sg_init (0))
+       {
+               ERROR ("sg_init: %s", sg_str_error (sg_get_error ()));
+               return (-1);
+diff --git a/src/disk.c b/src/disk.c
+index 4a78f1bd..5f972aa5 100644
+--- a/src/disk.c
++++ b/src/disk.c
+@@ -77,34 +77,6 @@
+ static mach_port_t io_master_port = MACH_PORT_NULL;
+ /* #endif HAVE_IOKIT_IOKITLIB_H */
+-#elif KERNEL_LINUX
+-typedef struct diskstats
+-{
+-      char *name;
+-
+-      /* This overflows in roughly 1361 years */
+-      unsigned int poll_count;
+-
+-      counter_t read_sectors;
+-      counter_t write_sectors;
+-
+-      counter_t read_bytes;
+-      counter_t write_bytes;
+-
+-      counter_t read_ops;
+-      counter_t write_ops;
+-      counter_t read_time;
+-      counter_t write_time;
+-
+-      counter_t avg_read_time;
+-      counter_t avg_write_time;
+-
+-      struct diskstats *next;
+-} diskstats_t;
+-
+-static diskstats_t *disklist;
+-/* #endif KERNEL_LINUX */
+-
+ #elif HAVE_LIBKSTAT
+ #define MAX_NUMDISK 256
+ extern kstat_ctl_t *kc;
+@@ -182,10 +154,6 @@ static int disk_init (void)
+       }
+ /* #endif HAVE_IOKIT_IOKITLIB_H */
+-#elif KERNEL_LINUX
+-      /* do nothing */
+-/* #endif KERNEL_LINUX */
+-
+ #elif HAVE_LIBKSTAT
+       kstat_t *ksp_chain;
+@@ -235,16 +203,6 @@ static void disk_submit (const char *plugin_instance,
+       plugin_dispatch_values (&vl);
+ } /* void disk_submit */
+-#if KERNEL_LINUX
+-static counter_t disk_calc_time_incr (counter_t delta_time, counter_t delta_ops)
+-{
+-      double avg_time = ((double) delta_time) / ((double) delta_ops);
+-      double avg_time_incr = ((double) interval_g) * avg_time;
+-
+-      return ((counter_t) (avg_time_incr + .5));
+-}
+-#endif
+-
+ #if HAVE_IOKIT_IOKITLIB_H
+ static signed long long dict_get_value (CFDictionaryRef dict, const char *key)
+ {
+@@ -428,218 +386,6 @@ static int disk_read (void)
+       IOObjectRelease (disk_list);
+ /* #endif HAVE_IOKIT_IOKITLIB_H */
+-#elif KERNEL_LINUX
+-      FILE *fh;
+-      char buffer[1024];
+-      
+-      char *fields[32];
+-      int numfields;
+-      int fieldshift = 0;
+-
+-      int minor = 0;
+-
+-      counter_t read_sectors  = 0;
+-      counter_t write_sectors = 0;
+-
+-      counter_t read_ops      = 0;
+-      counter_t read_merged   = 0;
+-      counter_t read_time     = 0;
+-      counter_t write_ops     = 0;
+-      counter_t write_merged  = 0;
+-      counter_t write_time    = 0;
+-      int is_disk = 0;
+-
+-      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;
+-      }
+-
+-      while (fgets (buffer, sizeof (buffer), fh) != NULL)
+-      {
+-              char *disk_name;
+-
+-              numfields = strsplit (buffer, fields, 32);
+-
+-              if ((numfields != (14 + fieldshift)) && (numfields != 7))
+-                      continue;
+-
+-              minor = atoll (fields[1]);
+-
+-              disk_name = fields[2 + fieldshift];
+-
+-              for (ds = disklist, pre_ds = disklist; ds != NULL; pre_ds = ds, ds = ds->next)
+-                      if (strcmp (disk_name, ds->name) == 0)
+-                              break;
+-
+-              if (ds == NULL)
+-              {
+-                      if ((ds = (diskstats_t *) calloc (1, sizeof (diskstats_t))) == NULL)
+-                              continue;
+-
+-                      if ((ds->name = strdup (disk_name)) == NULL)
+-                      {
+-                              free (ds);
+-                              continue;
+-                      }
+-
+-                      if (pre_ds == NULL)
+-                              disklist = ds;
+-                      else
+-                              pre_ds->next = ds;
+-              }
+-
+-              is_disk = 0;
+-              if (numfields == 7)
+-              {
+-                      /* Kernel 2.6, Partition */
+-                      read_ops      = atoll (fields[3]);
+-                      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]);
+-
+-                      read_sectors  = atoll (fields[5 + fieldshift]);
+-                      write_sectors = atoll (fields[9 + fieldshift]);
+-
+-                      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]);
+-                      }
+-              }
+-              else
+-              {
+-                      DEBUG ("numfields = %i; => unknown file format.", numfields);
+-                      continue;
+-              }
+-
+-              {
+-                      counter_t diff_read_sectors;
+-                      counter_t diff_write_sectors;
+-
+-              /* If the counter wraps around, it's only 32 bits.. */
+-                      if (read_sectors < ds->read_sectors)
+-                              diff_read_sectors = 1 + read_sectors
+-                                      + (UINT_MAX - ds->read_sectors);
+-                      else
+-                              diff_read_sectors = read_sectors - ds->read_sectors;
+-                      if (write_sectors < ds->write_sectors)
+-                              diff_write_sectors = 1 + write_sectors
+-                                      + (UINT_MAX - ds->write_sectors);
+-                      else
+-                              diff_write_sectors = write_sectors - ds->write_sectors;
+-
+-                      ds->read_bytes += 512 * diff_read_sectors;
+-                      ds->write_bytes += 512 * diff_write_sectors;
+-                      ds->read_sectors = read_sectors;
+-                      ds->write_sectors = write_sectors;
+-              }
+-
+-              /* Calculate the average time an io-op needs to complete */
+-              if (is_disk)
+-              {
+-                      counter_t diff_read_ops;
+-                      counter_t diff_write_ops;
+-                      counter_t diff_read_time;
+-                      counter_t diff_write_time;
+-
+-                      if (read_ops < ds->read_ops)
+-                              diff_read_ops = 1 + read_ops
+-                                      + (UINT_MAX - ds->read_ops);
+-                      else
+-                              diff_read_ops = read_ops - ds->read_ops;
+-                      DEBUG ("disk plugin: disk_name = %s; read_ops = %llu; "
+-                                      "ds->read_ops = %llu; diff_read_ops = %llu;",
+-                                      disk_name,
+-                                      read_ops, ds->read_ops, diff_read_ops);
+-
+-                      if (write_ops < ds->write_ops)
+-                              diff_write_ops = 1 + write_ops
+-                                      + (UINT_MAX - ds->write_ops);
+-                      else
+-                              diff_write_ops = write_ops - ds->write_ops;
+-
+-                      if (read_time < ds->read_time)
+-                              diff_read_time = 1 + read_time
+-                                      + (UINT_MAX - ds->read_time);
+-                      else
+-                              diff_read_time = read_time - ds->read_time;
+-
+-                      if (write_time < ds->write_time)
+-                              diff_write_time = 1 + write_time
+-                                      + (UINT_MAX - ds->write_time);
+-                      else
+-                              diff_write_time = write_time - ds->write_time;
+-
+-                      if (diff_read_ops != 0)
+-                              ds->avg_read_time += disk_calc_time_incr (
+-                                              diff_read_time, diff_read_ops);
+-                      if (diff_write_ops != 0)
+-                              ds->avg_write_time += disk_calc_time_incr (
+-                                              diff_write_time, diff_write_ops);
+-
+-                      ds->read_ops = read_ops;
+-                      ds->read_time = read_time;
+-                      ds->write_ops = write_ops;
+-                      ds->write_time = write_time;
+-              } /* if (is_disk) */
+-
+-              /* Don't write to the RRDs if we've just started.. */
+-              ds->poll_count++;
+-              if (ds->poll_count <= 2)
+-              {
+-                      DEBUG ("disk plugin: (ds->poll_count = %i) <= "
+-                                      "(min_poll_count = 2); => Not writing.",
+-                                      ds->poll_count);
+-                      continue;
+-              }
+-
+-              if ((read_ops == 0) && (write_ops == 0))
+-              {
+-                      DEBUG ("disk plugin: ((read_ops == 0) && "
+-                                      "(write_ops == 0)); => Not writing.");
+-                      continue;
+-              }
+-
+-              if ((ds->read_bytes != 0) || (ds->write_bytes != 0))
+-                      disk_submit (disk_name, "disk_octets",
+-                                      ds->read_bytes, ds->write_bytes);
+-
+-              if ((ds->read_ops != 0) || (ds->write_ops != 0))
+-                      disk_submit (disk_name, "disk_ops",
+-                                      read_ops, write_ops);
+-
+-              if ((ds->avg_read_time != 0) || (ds->avg_write_time != 0))
+-                      disk_submit (disk_name, "disk_time",
+-                                      ds->avg_read_time, ds->avg_write_time);
+-
+-              if (is_disk)
+-              {
+-                      disk_submit (disk_name, "disk_merged",
+-                                      read_merged, write_merged);
+-              } /* if (is_disk) */
+-      } /* while (fgets (buffer, sizeof (buffer), fh) != NULL) */
+-
+-      fclose (fh);
+-/* #endif defined(KERNEL_LINUX) */
+-
+ #elif HAVE_LIBKSTAT
+ # if HAVE_KSTAT_IO_T_WRITES && HAVE_KSTAT_IO_T_NWRITES && HAVE_KSTAT_IO_T_WTIME
+ #  define KIO_ROCTETS reads