Merge branch 'collectd-5.7'
[collectd.git] / src / zfs_arc.c
index b53ea0b..cf858f8 100644 (file)
@@ -75,12 +75,11 @@ static long long get_zfs_value(kstat_t *ksp, const char *key) {
 
   e = llist_search(ksp, key);
   if (e == NULL) {
-    ERROR("zfs_arc plugin: `llist_search` failed for key: '%s'.", key);
-    return (-1);
+    return -1;
   }
 
   v = e->value;
-  return ((long long)v->derive);
+  return (long long)v->derive;
 }
 
 static void free_zfs_values(kstat_t *ksp) {
@@ -100,7 +99,7 @@ extern kstat_ctl_t *kc;
 
 static long long get_zfs_value(kstat_t *ksp, char *name) {
 
-  return (get_kstat_value(ksp, name));
+  return get_kstat_value(ksp, name);
 }
 #elif defined(KERNEL_FREEBSD)
 #include <sys/sysctl.h>
@@ -123,20 +122,19 @@ static long long get_zfs_value(kstat_t *dummy __attribute__((unused)),
   rv = sysctlbyname(buffer, (void *)&value, &valuelen,
                     /* new value = */ NULL, /* new length = */ (size_t)0);
   if (rv == 0)
-    return (value);
+    return value;
 
-  return (-1);
+  return -1;
 }
 #endif
 
 static void za_submit(const char *type, const char *type_instance,
-                      value_t *values, int values_len) {
+                      value_t *values, size_t values_len) {
   value_list_t vl = VALUE_LIST_INIT;
 
   vl.values = values;
   vl.values_len = values_len;
 
-  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
   sstrncpy(vl.plugin, "zfs_arc", sizeof(vl.plugin));
   sstrncpy(vl.type, type, sizeof(vl.type));
   sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
@@ -146,42 +144,33 @@ static void za_submit(const char *type, const char *type_instance,
 
 static void za_submit_gauge(const char *type, const char *type_instance,
                             gauge_t value) {
-  value_t vv;
-
-  vv.gauge = value;
-  za_submit(type, type_instance, &vv, 1);
+  za_submit(type, type_instance, &(value_t){.gauge = value}, 1);
 }
 
 static int za_read_derive(kstat_t *ksp, const char *kstat_value,
                           const char *type, const char *type_instance) {
-  long long tmp;
-  value_t v;
-
-  tmp = get_zfs_value(ksp, (char *)kstat_value);
+  long long tmp = get_zfs_value(ksp, (char *)kstat_value);
   if (tmp == -1LL) {
-    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
-    return (-1);
+    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+    return -1;
   }
 
-  v.derive = (derive_t)tmp;
-  za_submit(type, type_instance, /* values = */ &v, /* values_num = */ 1);
-  return (0);
+  za_submit(type, type_instance, &(value_t){.derive = (derive_t)tmp},
+            /* values_num = */ 1);
+  return 0;
 }
 
 static int za_read_gauge(kstat_t *ksp, const char *kstat_value,
                          const char *type, const char *type_instance) {
-  long long tmp;
-  value_t v;
-
-  tmp = get_zfs_value(ksp, (char *)kstat_value);
+  long long tmp = get_zfs_value(ksp, (char *)kstat_value);
   if (tmp == -1LL) {
-    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
-    return (-1);
+    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+    return -1;
   }
 
-  v.gauge = (gauge_t)tmp;
-  za_submit(type, type_instance, /* values = */ &v, /* values_num = */ 1);
-  return (0);
+  za_submit(type, type_instance, &(value_t){.gauge = (gauge_t)tmp},
+            /* values_num = */ 1);
+  return 0;
 }
 
 static void za_submit_ratio(const char *type_instance, gauge_t hits,
@@ -201,7 +190,6 @@ static void za_submit_ratio(const char *type_instance, gauge_t hits,
 
 static int za_read(void) {
   gauge_t arc_hits, arc_misses, l2_hits, l2_misses;
-  value_t l2_io[2];
   kstat_t *ksp = NULL;
 
 #if defined(KERNEL_LINUX)
@@ -213,14 +201,29 @@ static int za_read(void) {
     char errbuf[1024];
     ERROR("zfs_arc plugin: Opening \"%s\" failed: %s", ZOL_ARCSTATS_FILE,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   ksp = llist_create();
   if (ksp == NULL) {
     ERROR("zfs_arc plugin: `llist_create' failed.");
     fclose(fh);
-    return (-1);
+    return -1;
+  }
+
+  // Ignore the first two lines because they contain information about
+  // the rest of the file.
+  // See kstat_seq_show_headers module/spl/spl-kstat.c of the spl kernel
+  // module.
+  if (fgets(buffer, sizeof(buffer), fh) == NULL) {
+    ERROR("zfs_arc plugin: \"%s\" does not contain a single line.", ZOL_ARCSTATS_FILE);
+    fclose(fh);
+    return -1;
+  }
+  if (fgets(buffer, sizeof(buffer), fh) == NULL) {
+    ERROR("zfs_arc plugin: \"%s\" does not contain at least two lines.", ZOL_ARCSTATS_FILE);
+    fclose(fh);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -245,7 +248,7 @@ static int za_read(void) {
   get_kstat(&ksp, "zfs", 0, "arcstats");
   if (ksp == NULL) {
     ERROR("zfs_arc plugin: Cannot find zfs:0:arcstats kstat.");
-    return (-1);
+    return -1;
   }
 #endif
 
@@ -318,16 +321,17 @@ static int za_read(void) {
   za_submit_ratio("L2", l2_hits, l2_misses);
 
   /* I/O */
-  l2_io[0].derive = get_zfs_value(ksp, "l2_read_bytes");
-  l2_io[1].derive = get_zfs_value(ksp, "l2_write_bytes");
-
-  za_submit("io_octets", "L2", l2_io, /* num values = */ 2);
+  value_t l2_io[] = {
+      {.derive = (derive_t)get_zfs_value(ksp, "l2_read_bytes")},
+      {.derive = (derive_t)get_zfs_value(ksp, "l2_write_bytes")},
+  };
+  za_submit("io_octets", "L2", l2_io, STATIC_ARRAY_SIZE(l2_io));
 
 #if defined(KERNEL_LINUX)
   free_zfs_values(ksp);
 #endif
 
-  return (0);
+  return 0;
 } /* int za_read */
 
 static int za_init(void) /* {{{ */
@@ -337,11 +341,11 @@ static int za_init(void) /* {{{ */
    * went fine. */
   if (kc == NULL) {
     ERROR("zfs_arc plugin: kstat chain control structure not available.");
-    return (-1);
+    return -1;
   }
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int za_init */
 
 void module_register(void) {