X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fwrite_tsdb.c;h=ee4db2384a2848b9466b3bbedf155579f3225877;hb=40e77dd34f9a8466165a8b7d724faeb337c90414;hp=2855b3566358cd0980ac697d1bdeb71e9df0e978;hpb=b9f4405301f31bf0fe282095654658a4f3ccdf19;p=collectd.git
diff --git a/src/write_tsdb.c b/src/write_tsdb.c
index 2855b356..ee4db238 100644
--- a/src/write_tsdb.c
+++ b/src/write_tsdb.c
@@ -36,7 +36,6 @@
*
* Host "localhost"
* Port "4242"
- * Prefix "sys"
* HostTags "status=production deviceclass=www"
*
*
@@ -48,7 +47,6 @@
#include "configfile.h"
#include "utils_cache.h"
-#include "utils_parse_option.h"
#include
#include
@@ -80,12 +78,9 @@ struct wt_callback
char *node;
char *service;
- char *prefix;
char *host_tags;
- char escape_char;
_Bool store_rates;
- _Bool separate_instances;
_Bool always_append_ds;
char send_buf[WT_SEND_BUF_SIZE];
@@ -217,7 +212,6 @@ static int wt_callback_init(struct wt_callback *cb)
ERROR("write_tsdb plugin: Connecting to %s:%s failed. "
"The last error was: %s", node, service,
sstrerror (errno, errbuf, sizeof(errbuf)));
- close(cb->sock_fd);
return -1;
}
@@ -244,7 +238,6 @@ static void wt_callback_free(void *data)
sfree(cb->node);
sfree(cb->service);
- sfree(cb->prefix);
sfree(cb->host_tags);
pthread_mutex_destroy(&cb->send_lock);
@@ -314,7 +307,7 @@ static int wt_format_values(char *ret, size_t ret_len,
} while (0)
if (ds->ds[ds_num].type == DS_TYPE_GAUGE)
- BUFFER_ADD("%f", vl->values[ds_num].gauge);
+ BUFFER_ADD(GAUGE_FORMAT, vl->values[ds_num].gauge);
else if (store_rates)
{
if (rates == NULL)
@@ -325,7 +318,7 @@ static int wt_format_values(char *ret, size_t ret_len,
"uc_get_rate failed.");
return -1;
}
- BUFFER_ADD("%f", rates[ds_num]);
+ BUFFER_ADD(GAUGE_FORMAT, rates[ds_num]);
}
else if (ds->ds[ds_num].type == DS_TYPE_COUNTER)
BUFFER_ADD("%llu", vl->values[ds_num].counter);
@@ -352,65 +345,108 @@ static int wt_format_name(char *ret, int ret_len,
const struct wt_callback *cb,
const char *ds_name)
{
- char *prefix;
-
- prefix = cb->prefix;
- if (prefix == NULL)
- prefix = "";
+ int status;
+ char *temp = NULL;
+ char *prefix = "";
+ const char *meta_prefix = "tsdb_prefix";
+
+ if (vl->meta) {
+ status = meta_data_get_string(vl->meta, meta_prefix, &temp);
+ if (status == -ENOENT) {
+ /* defaults to empty string */
+ } else if (status < 0) {
+ sfree(temp);
+ return status;
+ } else {
+ prefix = temp;
+ }
+ }
if (ds_name != NULL) {
if (vl->plugin_instance[0] == '\0') {
- ssnprintf(ret, ret_len, "%s.%s.%s",
- prefix, vl->plugin, ds_name);
- } else if (vl->type_instance == '\0') {
- ssnprintf(ret, ret_len, "%s.%s.%s.%s.%s",
- prefix, vl->plugin, vl->plugin_instance,
- vl->type_instance, ds_name);
- } else {
- ssnprintf(ret, ret_len, "%s.%s.%s.%s.%s",
- prefix, vl->plugin, vl->plugin_instance, vl->type,
- ds_name);
+ if (vl->type_instance[0] == '\0') {
+ ssnprintf(ret, ret_len, "%s%s.%s.%s", prefix, vl->plugin,
+ vl->type, ds_name);
+ } else {
+ ssnprintf(ret, ret_len, "%s%s.%s.%s.%s", prefix, vl->plugin,
+ vl->type, vl->type_instance, ds_name);
+ }
+ } else { /* vl->plugin_instance != "" */
+ if (vl->type_instance[0] == '\0') {
+ ssnprintf(ret, ret_len, "%s%s.%s.%s.%s", prefix, vl->plugin,
+ vl->plugin_instance, vl->type, ds_name);
+ } else {
+ ssnprintf(ret, ret_len, "%s%s.%s.%s.%s.%s", prefix,
+ vl->plugin, vl->plugin_instance, vl->type,
+ vl->type_instance, ds_name);
+ }
+ }
+ } else { /* ds_name == NULL */
+ if (vl->plugin_instance[0] == '\0') {
+ if (vl->type_instance[0] == '\0') {
+ ssnprintf(ret, ret_len, "%s%s.%s", prefix, vl->plugin,
+ vl->type);
+ } else {
+ ssnprintf(ret, ret_len, "%s%s.%s.%s", prefix, vl->plugin,
+ vl->type_instance, vl->type);
+ }
+ } else { /* vl->plugin_instance != "" */
+ if (vl->type_instance[0] == '\0') {
+ ssnprintf(ret, ret_len, "%s%s.%s.%s", prefix, vl->plugin,
+ vl->plugin_instance, vl->type);
+ } else {
+ ssnprintf(ret, ret_len, "%s%s.%s.%s.%s", prefix, vl->plugin,
+ vl->plugin_instance, vl->type, vl->type_instance);
+ }
}
- } else if (vl->plugin_instance[0] == '\0') {
- if (vl->type_instance[0] == '\0')
- ssnprintf(ret, ret_len, "%s.%s.%s",
- prefix, vl->plugin, vl->type);
- else
- ssnprintf(ret, ret_len, "%s.%s.%s",
- prefix, vl->plugin, vl->type_instance);
- } else if (vl->type_instance[0] == '\0') {
- ssnprintf(ret, ret_len, "%s.%s.%s.%s",
- prefix, vl->plugin, vl->plugin_instance, vl->type);
- } else {
- ssnprintf(ret, ret_len, "%s.%s.%s.%s",
- prefix, vl->plugin, vl->plugin_instance, vl->type_instance);
}
+ sfree(temp);
return 0;
}
static int wt_send_message (const char* key, const char* value,
cdtime_t time, struct wt_callback *cb,
- const char* host)
+ const char* host, meta_data_t *md)
{
int status;
int message_len;
- const char *message_fmt;
+ char *temp = NULL;
+ char *tags = "";
char message[1024];
+ char *host_tags = cb->host_tags ? cb->host_tags : "";
+ const char *meta_tsdb = "tsdb_tags";
/* skip if value is NaN */
if (value[0] == 'n')
return 0;
- message_fmt = "put %s %u %s fqdn=%s %s\r\n";
- message_len = ssnprintf (message, sizeof(message),
- message_fmt,
- key,
- (unsigned int)CDTIME_T_TO_TIME_T(
- time),
- value,
- host,
- cb->host_tags);
+ if (md) {
+ status = meta_data_get_string(md, meta_tsdb, &temp);
+ if (status == -ENOENT) {
+ /* defaults to empty string */
+ } else if (status < 0) {
+ ERROR("write_tsdb plugin: tags metadata get failure");
+ sfree(temp);
+ pthread_mutex_unlock(&cb->send_lock);
+ return status;
+ } else {
+ tags = temp;
+ }
+ }
+
+ message_len = ssnprintf (message,
+ sizeof(message),
+ "put %s %.0f %s fqdn=%s %s %s\r\n",
+ key,
+ CDTIME_T_TO_DOUBLE(time),
+ value,
+ host,
+ tags,
+ host_tags);
+
+ sfree(temp);
+
if (message_len >= sizeof(message)) {
ERROR("write_tsdb plugin: message buffer too small: "
"Need %d bytes.", message_len + 1);
@@ -506,7 +542,7 @@ static int wt_write_messages(const data_set_t *ds, const value_list_t *vl,
}
/* Send the message to tsdb */
- status = wt_send_message(key, values, vl->time, cb, vl->host);
+ status = wt_send_message(key, values, vl->time, cb, vl->host, vl->meta);
if (status != 0)
{
ERROR("write_tsdb plugin: error with "
@@ -534,37 +570,6 @@ static int wt_write(const data_set_t *ds, const value_list_t *vl,
return status;
}
-static int config_set_char(char *dest,
- oconfig_item_t *ci)
-{
- char buffer[4];
- int status;
-
- memset(buffer, 0, sizeof(buffer));
-
- status = cf_util_get_string_buffer(ci, buffer, sizeof(buffer));
- if (status != 0)
- return (status);
-
- if (buffer[0] == 0)
- {
- ERROR("write_tsdb plugin: Cannot use an empty string for the "
- "\"EscapeCharacter\" option.");
- return -1;
- }
-
- if (buffer[1] != 0)
- {
- WARNING("write_tsdb plugin: Only the first character of the "
- "\"EscapeCharacter\" option ('%c') will be used.",
- (int) buffer[0]);
- }
-
- *dest = buffer[0];
-
- return 0;
-}
-
static int wt_config_tsd(oconfig_item_t *ci)
{
struct wt_callback *cb;
@@ -582,10 +587,8 @@ static int wt_config_tsd(oconfig_item_t *ci)
cb->sock_fd = -1;
cb->node = NULL;
cb->service = NULL;
- cb->prefix = NULL;
cb->host_tags = NULL;
- cb->escape_char = WT_DEFAULT_ESCAPE;
- cb->store_rates = 1;
+ cb->store_rates = 0;
pthread_mutex_init (&cb->send_lock, NULL);
@@ -597,18 +600,12 @@ static int wt_config_tsd(oconfig_item_t *ci)
cf_util_get_string(child, &cb->node);
else if (strcasecmp("Port", child->key) == 0)
cf_util_get_service(child, &cb->service);
- else if (strcasecmp("Prefix", child->key) == 0)
- cf_util_get_string(child, &cb->prefix);
else if (strcasecmp("HostTags", child->key) == 0)
cf_util_get_string(child, &cb->host_tags);
else if (strcasecmp("StoreRates", child->key) == 0)
cf_util_get_boolean(child, &cb->store_rates);
- else if (strcasecmp("SeparateInstances", child->key) == 0)
- cf_util_get_boolean(child, &cb->separate_instances);
else if (strcasecmp("AlwaysAppendDS", child->key) == 0)
cf_util_get_boolean(child, &cb->always_append_ds);
- else if (strcasecmp("EscapeCharacter", child->key) == 0)
- config_set_char(&cb->escape_char, child);
else
{
ERROR("write_tsdb plugin: Invalid configuration "