X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fwrite_graphite.c;h=0de419f2b635960d99e89c61c4737b35a0d5b312;hb=a53a376a490902c088b343ae6bcd3df89bd46c97;hp=9f7e5e74c75cbafba981e1caaee3c2c9d3a8eac6;hpb=6c16a604aacf313751cac123ddc04dbf626788f8;p=collectd.git diff --git a/src/write_graphite.c b/src/write_graphite.c index 9f7e5e74..0de419f2 100644 --- a/src/write_graphite.c +++ b/src/write_graphite.c @@ -51,10 +51,10 @@ #include #ifndef WG_FORMAT_NAME -#define WG_FORMAT_NAME(ret, ret_len, vl, prefix, name) \ +#define WG_FORMAT_NAME(ret, ret_len, vl, cb, name) \ wg_format_name (ret, ret_len, (vl)->host, (vl)->plugin, \ (vl)->plugin_instance, (vl)->type, \ - (vl)->type_instance, prefix, name) + (vl)->type_instance, (cb)->prefix, name, (cb)->dotchar) #endif #ifndef WG_SEND_BUF_SIZE @@ -72,6 +72,7 @@ struct wg_callback char *host; int port; char *prefix; + char dotchar; char send_buf[WG_SEND_BUF_SIZE]; size_t send_buf_free; @@ -308,7 +309,8 @@ static int wg_format_values (char *ret, size_t ret_len, return (0); } -static int mangle_dots (char *dst, const char *src) +static int swap_chars (char *dst, const char *src, + const char from, const char to) { size_t i; @@ -316,9 +318,9 @@ static int mangle_dots (char *dst, const char *src) for (i = 0; i < strlen(src) ; i++) { - if (src[i] == '.') + if (src[i] == from) { - dst[i] = '_'; + dst[i] = to; ++reps; } else @@ -333,11 +335,11 @@ static int wg_format_name (char *ret, int ret_len, const char *hostname, const char *plugin, const char *plugin_instance, const char *type, const char *type_instance, - const char *prefix, const char *ds_name) + const char *prefix, const char *ds_name, const char dotchar) { int status; char *n_hostname = 0; - char *n_ds_name = 0; + char *n_type_instance = 0; assert (plugin != NULL); assert (type != NULL); @@ -348,14 +350,19 @@ static int wg_format_name (char *ret, int ret_len, return (-1); } - if (mangle_dots(n_hostname, hostname) == -1) + if (swap_chars(n_hostname, hostname, '.', dotchar) == -1) { ERROR ("Unable to normalize hostname"); return (-1); } - if (ds_name && ds_name[0] != '\0') { - if (mangle_dots(n_ds_name, ds_name) == -1) + if (type_instance && type_instance[0] != '\0') { + if ((n_type_instance = malloc(strlen(type_instance)+1)) == NULL) + { + ERROR ("Unable to allocate memory for normalized datasource name buffer"); + return (-1); + } + if (swap_chars(n_type_instance, type_instance, '.', dotchar) == -1) { ERROR ("Unable to normalize datasource name"); return (-1); @@ -364,30 +371,30 @@ static int wg_format_name (char *ret, int ret_len, if ((plugin_instance == NULL) || (plugin_instance[0] == '\0')) { - if ((type_instance == NULL) || (type_instance[0] == '\0')) + if ((n_type_instance == NULL) || (n_type_instance[0] == '\0')) { if ((ds_name == NULL) || (ds_name[0] == '\0')) status = ssnprintf (ret, ret_len, "%s.%s.%s.%s", prefix, n_hostname, plugin, type); else status = ssnprintf (ret, ret_len, "%s.%s.%s.%s.%s", - prefix, n_hostname, plugin, type, n_ds_name); + prefix, n_hostname, plugin, type, ds_name); } else { if ((ds_name == NULL) || (ds_name[0] == '\0')) status = ssnprintf (ret, ret_len, "%s.%s.%s.%s-%s", prefix, n_hostname, plugin, type, - type_instance); + n_type_instance); else status = ssnprintf (ret, ret_len, "%s.%s.%s.%s-%s.%s", prefix, n_hostname, plugin, type, - type_instance, n_ds_name); + n_type_instance, ds_name); } } else { - if ((type_instance == NULL) || (type_instance[0] == '\0')) + if ((n_type_instance == NULL) || (n_type_instance[0] == '\0')) { if ((ds_name == NULL) || (ds_name[0] == '\0')) status = ssnprintf (ret, ret_len, "%s.%s.%s.%s.%s", @@ -396,23 +403,23 @@ static int wg_format_name (char *ret, int ret_len, else status = ssnprintf (ret, ret_len, "%s.%s.%s.%s.%s.%s", prefix, n_hostname, plugin, - plugin_instance, type, n_ds_name); + plugin_instance, type, ds_name); } else { if ((ds_name == NULL) || (ds_name[0] == '\0')) status = ssnprintf (ret, ret_len, "%s.%s.%s.%s.%s-%s", prefix, n_hostname, plugin, - plugin_instance, type, type_instance); + plugin_instance, type, n_type_instance); else status = ssnprintf (ret, ret_len, "%s.%s.%s.%s.%s-%s.%s", prefix, n_hostname, plugin, - plugin_instance, type, type_instance, n_ds_name); + plugin_instance, type, n_type_instance, ds_name); } } sfree(n_hostname); - sfree(n_ds_name); + sfree(n_type_instance); if ((status < 1) || (status >= ret_len)) return (-1); @@ -502,8 +509,7 @@ static int wg_write_messages (const data_set_t *ds, const value_list_t *vl, for (i = 0; i < ds->ds_num; i++) { /* Copy the identifier to `key' and escape it. */ - status = WG_FORMAT_NAME (key, sizeof (key), vl, cb->prefix, \ - ds->ds[i].name); + status = WG_FORMAT_NAME (key, sizeof (key), vl, cb, ds->ds[i].name); if (status != 0) { ERROR ("write_graphite plugin: error with format_name"); @@ -534,7 +540,7 @@ static int wg_write_messages (const data_set_t *ds, const value_list_t *vl, else { /* Copy the identifier to `key' and escape it. */ - status = WG_FORMAT_NAME (key, sizeof (key), vl, cb->prefix, NULL); + status = WG_FORMAT_NAME (key, sizeof (key), vl, cb, NULL); if (status != 0) { ERROR ("write_graphite plugin: error with format_name"); @@ -596,6 +602,21 @@ static int config_set_number (int *dest, return (0); } +static int config_set_char (char *dest, + oconfig_item_t *ci) +{ + if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) + { + WARNING ("write_graphite plugin: The `%s' config option " + "needs exactly one string argument.", ci->key); + return (-1); + } + + *dest = ci->values[0].value.string[0]; + + return (0); +} + static int config_set_string (char **ret_string, oconfig_item_t *ci) { @@ -641,6 +662,7 @@ static int wg_config_carbon (oconfig_item_t *ci) cb->port = 2003; cb->prefix = NULL; cb->server = NULL; + cb->dotchar = '_'; pthread_mutex_init (&cb->send_lock, /* attr = */ NULL); @@ -654,6 +676,8 @@ static int wg_config_carbon (oconfig_item_t *ci) config_set_number (&cb->port, child); else if (strcasecmp ("Prefix", child->key) == 0) config_set_string (&cb->prefix, child); + else if (strcasecmp ("DotCharacter", child->key) == 0) + config_set_char (&cb->dotchar, child); else { ERROR ("write_graphite plugin: Invalid configuration "