X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Ftape.c;h=32b42965c55d5e31ca6a5e53f54554cd0842aa54;hb=936c450a86c841eea89888c8550c9118fae90c25;hp=2345cb343e5d3e3590064496a3431a9a903ae1e3;hpb=6dee31bca87a552017791aa97afa9bd40bc0ebfe;p=collectd.git diff --git a/src/tape.c b/src/tape.c index 2345cb34..3f4bb55b 100644 --- a/src/tape.c +++ b/src/tape.c @@ -21,162 +21,101 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#if defined(HAVE_LIBKSTAT) -# define TAPE_HAVE_READ 1 -#else -# define TAPE_HAVE_READ 0 +#if !HAVE_LIBKSTAT +#error "No applicable input method." #endif -/* 2^34 = 17179869184 = ~17.2GByte/s */ -static data_source_t octets_dsrc[2] = -{ - {"read", DS_TYPE_COUNTER, 0, 17179869183.0}, - {"write", DS_TYPE_COUNTER, 0, 17179869183.0} -}; - -static data_set_t octets_ds = -{ - "tape_octets", 2, octets_dsrc -}; - -static data_source_t operations_dsrc[2] = -{ - {"read", DS_TYPE_COUNTER, 0, 4294967295.0}, - {"write", DS_TYPE_COUNTER, 0, 4294967295.0} -}; - -static data_set_t operations_ds = -{ - "tape_ops", 2, operations_dsrc -}; - -static data_source_t merged_dsrc[2] = -{ - {"read", DS_TYPE_COUNTER, 0, 4294967295.0}, - {"write", DS_TYPE_COUNTER, 0, 4294967295.0} -}; - -static data_set_t merged_ds = -{ - "tape_merged", 2, merged_dsrc -}; - -/* max is 1000000us per second. */ -static data_source_t time_dsrc[2] = -{ - {"read", DS_TYPE_COUNTER, 0, 1000000.0}, - {"write", DS_TYPE_COUNTER, 0, 1000000.0} -}; - -static data_set_t time_ds = -{ - "tape_time", 2, time_dsrc -}; - -#if TAPE_HAVE_READ -#if defined(HAVE_LIBKSTAT) #define MAX_NUMTAPE 256 extern kstat_ctl_t *kc; static kstat_t *ksp[MAX_NUMTAPE]; static int numtape = 0; -#endif /* HAVE_LIBKSTAT */ - -static int tape_init (void) -{ -#ifdef HAVE_LIBKSTAT - kstat_t *ksp_chain; - - numtape = 0; - - if (kc == NULL) - return (-1); - - for (numtape = 0, ksp_chain = kc->kc_chain; - (numtape < MAX_NUMTAPE) && (ksp_chain != NULL); - ksp_chain = ksp_chain->ks_next) - { - if (strncmp (ksp_chain->ks_class, "tape", 4) ) - continue; - if (ksp_chain->ks_type != KSTAT_TYPE_IO) - continue; - ksp[numtape++] = ksp_chain; - } -#endif - - return (0); -} -static void tape_submit (const char *plugin_instance, - const char *type, - counter_t read, counter_t write) -{ - value_t values[2]; - value_list_t vl = VALUE_LIST_INIT; - - values[0].counter = read; - values[1].counter = write; - - vl.values = values; - vl.values_len = 2; - vl.time = time (NULL); - strcpy (vl.host, hostname_g); - strcpy (vl.plugin, "tape"); - strncpy (vl.plugin_instance, plugin_instance, - sizeof (vl.plugin_instance)); - - plugin_dispatch_values (type, &vl); +static int tape_init(void) { + kstat_t *ksp_chain; + + numtape = 0; + + if (kc == NULL) + return (-1); + + for (numtape = 0, ksp_chain = kc->kc_chain; + (numtape < MAX_NUMTAPE) && (ksp_chain != NULL); + ksp_chain = ksp_chain->ks_next) { + if (strncmp(ksp_chain->ks_class, "tape", 4)) + continue; + if (ksp_chain->ks_type != KSTAT_TYPE_IO) + continue; + ksp[numtape++] = ksp_chain; + } + + return (0); +} /* int tape_init */ + +static void tape_submit(const char *plugin_instance, const char *type, + derive_t read, derive_t write) { + value_list_t vl = VALUE_LIST_INIT; + value_t values[] = { + {.derive = read}, {.derive = write}, + }; + + vl.values = values; + vl.values_len = STATIC_ARRAY_SIZE(values); + sstrncpy(vl.plugin, "tape", sizeof(vl.plugin)); + sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance)); + sstrncpy(vl.type, type, sizeof(vl.type)); + + plugin_dispatch_values(&vl); } /* void tape_submit */ -static int tape_read (void) -{ - -#if defined(HAVE_LIBKSTAT) - static kstat_io_t kio; - int i; +static int tape_read(void) { + +#if HAVE_KSTAT_IO_T_WRITES && HAVE_KSTAT_IO_T_NWRITES && HAVE_KSTAT_IO_T_WTIME +#define KIO_ROCTETS reads +#define KIO_WOCTETS writes +#define KIO_ROPS nreads +#define KIO_WOPS nwrites +#define KIO_RTIME rtime +#define KIO_WTIME wtime +#elif HAVE_KSTAT_IO_T_NWRITTEN && HAVE_KSTAT_IO_T_WRITES && \ + HAVE_KSTAT_IO_T_WTIME +#define KIO_ROCTETS nread +#define KIO_WOCTETS nwritten +#define KIO_ROPS reads +#define KIO_WOPS writes +#define KIO_RTIME rtime +#define KIO_WTIME wtime +#else +#error "kstat_io_t does not have the required members" +#endif + static kstat_io_t kio; - if (kc == NULL) - return (-1); + if (kc == NULL) + return (-1); - if (numtape <= 0) - return (-1); + if (numtape <= 0) + return (-1); - for (i = 0; i < numtape; i++) - { - if (kstat_read (kc, ksp[i], &kio) == -1) - continue; + for (int i = 0; i < numtape; i++) { + if (kstat_read(kc, ksp[i], &kio) == -1) + continue; - if (strncmp (ksp[i]->ks_class, "tape", 4) == 0) - { - tape_submit (ksp[i]->ks_name, "tape_octets", kio.reads, kio.writes); - tape_submit (ksp[i]->ks_name, "tape_ops", kio.nreads, kio.nwrites); - /* FIXME: Convert this to microseconds if necessary */ - tape_submit (ksp[i]->ks_name, "tape_time", kio.rtime, kio.wtime); - } - } -#endif /* defined(HAVE_LIBKSTAT) */ + if (strncmp(ksp[i]->ks_class, "tape", 4) == 0) { + tape_submit(ksp[i]->ks_name, "tape_octets", kio.KIO_ROCTETS, + kio.KIO_WOCTETS); + tape_submit(ksp[i]->ks_name, "tape_ops", kio.KIO_ROPS, kio.KIO_WOPS); + /* FIXME: Convert this to microseconds if necessary */ + tape_submit(ksp[i]->ks_name, "tape_time", kio.KIO_RTIME, kio.KIO_WTIME); + } + } - return (0); + return (0); } -#endif /* TAPE_HAVE_READ */ - -void module_register (modreg_e load) -{ - if (load & MR_DATASETS) - { - plugin_register_data_set (&octets_ds); - plugin_register_data_set (&operations_ds); - plugin_register_data_set (&merged_ds); - plugin_register_data_set (&time_ds); - } - -#if TAPE_HAVE_READ - if (load & MR_READ) - { - plugin_register_init ("tape", tape_init); - plugin_register_read ("tape", tape_read); - } -#endif /* TAPE_HAVE_READ */ + +void module_register(void) { + plugin_register_init("tape", tape_init); + plugin_register_read("tape", tape_read); }