#</Plugin>
#<Plugin write_graphite>
-# <Carbon>
+# <Node "example">
# Host "localhost"
# Port "2003"
# Prefix "collectd"
# Postfix "collectd"
-# StoreRates false
+# StoreRates true
# AlwaysAppendDS false
# EscapeCharacter "_"
-# </Carbon>
+# </Node>
#</Plugin>
#<Plugin write_http>
# <Node "example">
# Host "localhost"
# Port 5555
+# Protocol UDP
# StoreRates true
# AlwaysAppendDS false
# </Node>
Synopsis:
<Plugin write_graphite>
- <Carbon>
+ <Node "example">
Host "localhost"
Port "2003"
Prefix "collectd"
- </Carbon>
+ </Node>
</Plugin>
+The configuration consists of one or more E<lt>B<Node>E<nbsp>I<Name>E<gt>
+blocks. Inside the B<Node> blocks, the following options are recognized:
+
=over 4
=item B<Host> I<Address>
<Node "example">
Host "localhost"
Port "5555"
- StoreRates false
+ Protocol UDP
+ StoreRates true
+ AlwaysAppendDS false
Delay 10
</Node>
Tag "foobar"
Service name or port number to connect to. Defaults to C<5555>.
-=item B<StoreRates> B<false>|B<true>
+=item B<Protocol> B<UDP>|B<TCP>
+
+Specify the protocol to use when communicating with I<Riemann>. Defaults to
+B<UDP>.
+
+=item B<StoreRates> B<true>|B<false>
If set to B<true> (the default), convert counter values to rates. If set to
B<false> counter values are stored as is, i.e. as an increasing integer number.
c_psql_connect (db);
}
- /* "ping" */
- PQclear (PQexec (db->conn, "SELECT 42;"));
-
if (CONNECTION_OK != PQstatus (db->conn)) {
PQreset (db->conn);
if (PGRES_TUPLES_OK != PQresultStatus (res)) {
pthread_mutex_lock (&db->db_lock);
+ if ((CONNECTION_OK != PQstatus (db->conn))
+ && (0 == c_psql_check_connection (db))) {
+ PQclear (res);
+ return c_psql_exec_query (db, q, prep_area);
+ }
+
log_err ("Failed to execute SQL query: %s",
PQerrorMessage (db->conn));
log_info ("SQL query was: %s",
{
int sock_fd;
+ char *name;
+
char *node;
char *service;
char *prefix;
close(cb->sock_fd);
cb->sock_fd = -1;
+ sfree(cb->name);
sfree(cb->node);
sfree(cb->service);
sfree(cb->prefix);
return (0);
}
-static int wg_config_carbon (oconfig_item_t *ci)
+static int wg_config_node (oconfig_item_t *ci)
{
struct wg_callback *cb;
user_data_t user_data;
}
memset (cb, 0, sizeof (*cb));
cb->sock_fd = -1;
+ cb->name = NULL;
cb->node = NULL;
cb->service = NULL;
cb->prefix = NULL;
cb->escape_char = WG_DEFAULT_ESCAPE;
cb->store_rates = 1;
+ /* FIXME: Legacy configuration syntax. */
+ if (strcasecmp ("Carbon", ci->key) != 0)
+ {
+ int status = cf_util_get_string (ci, &cb->name);
+ if (status != 0)
+ {
+ wg_callback_free (cb);
+ return (status);
+ }
+ }
+
pthread_mutex_init (&cb->send_lock, /* attr = */ NULL);
for (i = 0; i < ci->children_num; i++)
}
}
- ssnprintf (callback_name, sizeof (callback_name), "write_graphite/%s/%s",
- cb->node != NULL ? cb->node : WG_DEFAULT_NODE,
- cb->service != NULL ? cb->service : WG_DEFAULT_SERVICE);
+ /* FIXME: Legacy configuration syntax. */
+ if (cb->name == NULL)
+ ssnprintf (callback_name, sizeof (callback_name), "write_graphite/%s/%s",
+ cb->node != NULL ? cb->node : WG_DEFAULT_NODE,
+ cb->service != NULL ? cb->service : WG_DEFAULT_SERVICE);
+ else
+ ssnprintf (callback_name, sizeof (callback_name), "write_graphite/%s",
+ cb->name);
memset (&user_data, 0, sizeof (user_data));
user_data.data = cb;
{
oconfig_item_t *child = ci->children + i;
- if (strcasecmp ("Carbon", child->key) == 0)
- wg_config_carbon (child);
+ if (strcasecmp ("Node", child->key) == 0)
+ wg_config_node (child);
+ /* FIXME: Remove this legacy mode in version 6. */
+ else if (strcasecmp ("Carbon", child->key) == 0)
+ wg_config_node (child);
else
{
ERROR ("write_graphite plugin: Invalid configuration "
_Bool always_append_ds;
char *node;
char *service;
+ _Bool use_tcp;
int s;
int reference_count;
}
buffer_len = msg__get_packed_size(msg);
+ if (host->use_tcp)
+ buffer_len += 4;
+
buffer = malloc (buffer_len);
if (buffer == NULL) {
pthread_mutex_unlock (&host->lock);
}
memset (buffer, 0, buffer_len);
- msg__pack(msg, buffer);
+ if (host->use_tcp)
+ {
+ uint32_t length = htonl ((uint32_t) (buffer_len - 4));
+ memcpy (buffer, &length, 4);
+ msg__pack(msg, buffer + 4);
+ }
+ else
+ {
+ msg__pack(msg, buffer);
+ }
status = (int) swrite (host->s, buffer, buffer_len);
if (status != 0)
memset(&hints, 0, sizeof(hints));
memset(&service, 0, sizeof(service));
hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_socktype = host->use_tcp ? SOCK_STREAM : SOCK_DGRAM;
#ifdef AI_ADDRCONFIG
hints.ai_flags |= AI_ADDRCONFIG;
#endif
host->service = NULL;
host->store_rates = 1;
host->always_append_ds = 0;
+ host->use_tcp = 0;
status = cf_util_get_string (ci, &host->name);
if (status != 0) {
"option.");
break;
}
+ } else if (strcasecmp ("Protocol", child->key) == 0) {
+ char tmp[16];
+ status = cf_util_get_string_buffer (child,
+ tmp, sizeof (tmp));
+ if (status != 0)
+ {
+ ERROR ("write_riemann plugin: cf_util_get_"
+ "string_buffer failed with "
+ "status %i.", status);
+ break;
+ }
+
+ if (strcasecmp ("UDP", tmp) == 0)
+ host->use_tcp = 0;
+ else if (strcasecmp ("TCP", tmp) == 0)
+ host->use_tcp = 1;
+ else
+ WARNING ("write_riemann plugin: The value "
+ "\"%s\" is not valid for the "
+ "\"Protocol\" option. Use "
+ "either \"UDP\" or \"TCP\".",
+ tmp);
} else if (strcasecmp ("StoreRates", child->key) == 0) {
status = cf_util_get_boolean (child, &host->store_rates);
if (status != 0)