e = llist_search(ksp, key);
if (e == NULL) {
- ERROR("zfs_arc plugin: `llist_search` failed for key: '%s'.", key);
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));
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);
+ 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);
+ 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);
+ 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);
+ za_submit(type, type_instance, &(value_t){.gauge = (gauge_t)tmp},
+ /* values_num = */ 1);
return (0);
}
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)
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) {
char *fields[3];
value_t v;
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);