/**
* collectd-td - collectd traffic generator
- * Copyright (C) 2010 Florian octo Forster
+ * Copyright (C) 2010-2012 Florian octo Forster
*
* 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
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors:
- * Florian Forster <ff at octo.it>
+ * Florian Forster <octo at collectd.org>
**/
#if HAVE_CONFIG_H
#define DEF_NUM_HOSTS 1000
#define DEF_NUM_PLUGINS 20
#define DEF_NUM_VALUES 100000
-#define DEF_INTERVAL 10
+#define DEF_INTERVAL 10.0
static int conf_num_hosts = DEF_NUM_HOSTS;
static int conf_num_plugins = DEF_NUM_PLUGINS;
static int conf_num_values = DEF_NUM_VALUES;
-static int conf_interval = DEF_INTERVAL;
+static double conf_interval = DEF_INTERVAL;
static const char *conf_destination = NET_DEFAULT_V6_ADDR;
static const char *conf_service = NET_DEFAULT_PORT;
" -n <number> Number of value lists. (Default: %i)\n"
" -H <number> Number of hosts to emulate. (Default: %i)\n"
" -p <number> Number of plugins to emulate. (Default: %i)\n"
- " -i <seconds> Interval of each value in seconds. (Default: %i)\n"
+ " -i <seconds> Interval of each value in seconds. (Default: %.3f)\n"
" -d <dest> Destination address of the network packets.\n"
" (Default: %s)\n"
" -D <port> Destination port of the network packets.\n"
" (Default: %s)\n"
" -h Print usage information (this output).\n"
"\n"
- "Copyright (C) 2010 Florian Forster\n"
+ "Copyright (C) 2010-2012 Florian Forster\n"
"Licensed under the GNU General Public License, version 2 (GPLv2)\n",
DEF_NUM_VALUES, DEF_NUM_HOSTS, DEF_NUM_PLUGINS,
DEF_INTERVAL,
host_num = get_boundet_random (0, conf_num_hosts);
vl->interval = conf_interval;
- vl->time = time (NULL) + (host_num % vl->interval) + 1;
+ vl->time = 1.0 + time (NULL)
+ + (host_num % (1 + (int) vl->interval));
if (get_boundet_random (0, 2) == 0)
vl->values_types[0] = LCC_TYPE_GAUGE;
return (0);
} /* }}} int get_integer_opt */
+static int get_double_opt (const char *str, double *ret_value) /* {{{ */
+{
+ char *endptr;
+ double tmp;
+
+ errno = 0;
+ endptr = NULL;
+ tmp = strtod (str, &endptr);
+ if (errno != 0)
+ {
+ fprintf (stderr, "Unable to parse option as a number: \"%s\": %s\n",
+ str, strerror (errno));
+ exit (EXIT_FAILURE);
+ }
+ else if (endptr == str)
+ {
+ fprintf (stderr, "Unable to parse option as a number: \"%s\"\n", str);
+ exit (EXIT_FAILURE);
+ }
+ else if (*endptr != 0)
+ {
+ fprintf (stderr, "Garbage after end of value: \"%s\"\n", str);
+ exit (EXIT_FAILURE);
+ }
+
+ *ret_value = tmp;
+ return (0);
+} /* }}} int get_double_opt */
+
static int read_options (int argc, char **argv) /* {{{ */
{
int opt;
break;
case 'i':
- get_integer_opt (optarg, &conf_interval);
+ get_double_opt (optarg, &conf_interval);
break;
case 'd':
SSTRCATF (command, "PUTVAL %s",
lcc_strescape (ident_esc, ident_str, sizeof (ident_esc)));
- if (vl->interval > 0)
- SSTRCATF (command, " interval=%i", vl->interval);
+ if (vl->interval > 0.0)
+ SSTRCATF (command, " interval=%.3f", vl->interval);
- if (vl->time > 0)
- SSTRCATF (command, " %u", (unsigned int) vl->time);
+ if (vl->time > 0.0)
+ SSTRCATF (command, " %.3f", vl->time);
else
SSTRCAT (command, " N");
#define TYPE_HOST 0x0000
#define TYPE_TIME 0x0001
+#define TYPE_TIME_HR 0x0008
#define TYPE_PLUGIN 0x0002
#define TYPE_PLUGIN_INSTANCE 0x0003
#define TYPE_TYPE 0x0004
#define TYPE_TYPE_INSTANCE 0x0005
#define TYPE_VALUES 0x0006
#define TYPE_INTERVAL 0x0007
+#define TYPE_INTERVAL_HR 0x0009
/* Types to transmit notifications */
#define TYPE_MESSAGE 0x0100
return (0);
} /* }}} int nb_add_number */
+static int nb_add_time (char **ret_buffer, /* {{{ */
+ size_t *ret_buffer_len,
+ uint16_t type, double value)
+{
+ /* Convert to collectd's "cdtime" representation. */
+ uint64_t cdtime_value = (uint64_t) (value * 1073741824.0);
+ return (nb_add_number (ret_buffer, ret_buffer_len, type, cdtime_value));
+} /* }}} int nb_add_time */
+
static int nb_add_string (char **ret_buffer, /* {{{ */
size_t *ret_buffer_len,
uint16_t type, const char *str, size_t str_len)
if (nb->state.time != vl->time)
{
- if (nb_add_number (&buffer, &buffer_size, TYPE_TIME,
- (uint64_t) vl->time))
+ if (nb_add_time (&buffer, &buffer_size, TYPE_TIME_HR, vl->time))
return (-1);
nb->state.time = vl->time;
}
if (nb->state.interval != vl->interval)
{
- if (nb_add_number (&buffer, &buffer_size, TYPE_INTERVAL,
- (uint64_t) vl->interval))
+ if (nb_add_time (&buffer, &buffer_size, TYPE_INTERVAL_HR, vl->interval))
return (-1);
nb->state.interval = vl->interval;
}