/**
* collectd - src/csv.c
- * Copyright (C) 2007 Florian octo Forster
+ * Copyright (C) 2007-2009 Florian octo Forster
+ * Copyright (C) 2009 Doug MacEachern
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
*
* Authors:
* Florian octo Forster <octo at verplant.org>
+ * Doug MacEachern <dougm@hyperic.com>
**/
#include "collectd.h"
#include "plugin.h"
#include "common.h"
#include "utils_cache.h"
+#include "utils_parse_option.h"
/*
* Private variables
static char *datadir = NULL;
static int store_rates = 0;
+static int use_stdio = 0;
static int value_list_to_string (char *buffer, int buffer_len,
const data_set_t *ds, const value_list_t *vl)
for (i = 0; i < ds->ds_num; i++)
{
if ((ds->ds[i].type != DS_TYPE_COUNTER)
- && (ds->ds[i].type != DS_TYPE_GAUGE))
+ && (ds->ds[i].type != DS_TYPE_GAUGE)
+ && (ds->ds[i].type != DS_TYPE_DERIVE)
+ && (ds->ds[i].type != DS_TYPE_ABSOLUTE))
return (-1);
- if (ds->ds[i].type == DS_TYPE_COUNTER)
+ if (ds->ds[i].type == DS_TYPE_GAUGE)
{
- if (store_rates == 0)
- {
- status = ssnprintf (buffer + offset,
- buffer_len - offset,
- ",%llu",
- vl->values[i].counter);
- }
- else /* if (store_rates == 1) */
+ status = ssnprintf (buffer + offset, buffer_len - offset,
+ ",%lf", vl->values[i].gauge);
+ }
+ else if (store_rates != 0)
+ {
+ if (rates == NULL)
+ rates = uc_get_rate (ds, vl);
+ if (rates == NULL)
{
- if (rates == NULL)
- rates = uc_get_rate (ds, vl);
- if (rates == NULL)
- {
- WARNING ("csv plugin: "
- "uc_get_rate failed.");
- return (-1);
- }
- status = ssnprintf (buffer + offset,
- buffer_len - offset,
- ",%lf", rates[i]);
+ WARNING ("csv plugin: "
+ "uc_get_rate failed.");
+ return (-1);
}
+ status = ssnprintf (buffer + offset,
+ buffer_len - offset,
+ ",%lf", rates[i]);
}
- else /* if (ds->ds[i].type == DS_TYPE_GAUGE) */
+ else if (ds->ds[i].type == DS_TYPE_COUNTER)
{
- status = ssnprintf (buffer + offset, buffer_len - offset,
- ",%lf", vl->values[i].gauge);
+ status = ssnprintf (buffer + offset,
+ buffer_len - offset,
+ ",%llu",
+ vl->values[i].counter);
+ }
+ else if (ds->ds[i].type == DS_TYPE_DERIVE)
+ {
+ status = ssnprintf (buffer + offset,
+ buffer_len - offset,
+ ",%"PRIi64,
+ vl->values[i].derive);
+ }
+ else if (ds->ds[i].type == DS_TYPE_ABSOLUTE)
+ {
+ status = ssnprintf (buffer + offset,
+ buffer_len - offset,
+ ",%"PRIu64,
+ vl->values[i].absolute);
}
if ((status < 1) || (status >= (buffer_len - offset)))
return (-1);
offset += status;
+ if (!use_stdio)
{
time_t now;
struct tm stm;
{
if (datadir != NULL)
free (datadir);
+ if (strcasecmp ("stdout", value) == 0)
+ {
+ use_stdio = 1;
+ return (0);
+ }
+ else if (strcasecmp ("stderr", value) == 0)
+ {
+ use_stdio = 2;
+ return (0);
+ }
datadir = strdup (value);
if (datadir != NULL)
{
}
else if (strcasecmp ("StoreRates", key) == 0)
{
- if ((strcasecmp ("True", value) == 0)
- || (strcasecmp ("Yes", value) == 0)
- || (strcasecmp ("On", value) == 0))
- {
+ if (IS_TRUE (value))
store_rates = 1;
- }
else
- {
store_rates = 0;
- }
}
else
{
return (0);
} /* int csv_config */
-static int csv_write (const data_set_t *ds, const value_list_t *vl)
+static int csv_write (const data_set_t *ds, const value_list_t *vl,
+ user_data_t __attribute__((unused)) *user_data)
{
struct stat statbuf;
char filename[512];
if (value_list_to_string (values, sizeof (values), ds, vl) != 0)
return (-1);
+ if (use_stdio)
+ {
+ size_t i;
+
+ escape_string (filename, sizeof (filename));
+
+ /* Replace commas by colons for PUTVAL compatible output. */
+ for (i = 0; i < sizeof (values); i++)
+ {
+ if (values[i] == 0)
+ break;
+ else if (values[i] == ',')
+ values[i] = ':';
+ }
+
+ fprintf (use_stdio == 1 ? stdout : stderr,
+ "PUTVAL %s interval=%i %s\n",
+ filename, interval_g, values);
+ return (0);
+ }
+
if (stat (filename, &statbuf) == -1)
{
if (errno == ENOENT)
{
plugin_register_config ("csv", csv_config,
config_keys, config_keys_num);
- plugin_register_write ("csv", csv_write);
+ plugin_register_write ("csv", csv_write, /* user_data = */ NULL);
} /* void module_register */