X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_format_graphite.c;h=85f5917c8ea807f849476b29f91f139824f4abdb;hb=0a8741b9061f8df4a78a448c021612db06e17425;hp=e523420415a78521210f3fc3f932aa6e76cfaaf4;hpb=ec9ed6fe4108f7fd3d4ef84e887bb6d3dc022e14;p=collectd.git diff --git a/src/utils_format_graphite.c b/src/utils_format_graphite.c index e5234204..85f5917c 100644 --- a/src/utils_format_graphite.c +++ b/src/utils_format_graphite.c @@ -83,7 +83,7 @@ static int gr_format_values (char *ret, size_t ret_len, } static void gr_copy_escape_part (char *dst, const char *src, size_t dst_len, - char escape_char) + char escape_char, _Bool preserve_separator) { memset (dst, 0, dst_len); @@ -98,7 +98,7 @@ static void gr_copy_escape_part (char *dst, const char *src, size_t dst_len, break; } - if ((src[i] == '.') + if ((!preserve_separator && (src[i] == '.')) || isspace ((int) src[i]) || iscntrl ((int) src[i])) dst[i] = escape_char; @@ -130,16 +130,18 @@ static int gr_format_name (char *ret, int ret_len, if (postfix == NULL) postfix = ""; + _Bool preserve_separator = (flags & GRAPHITE_PRESERVE_SEPARATOR) ? 1 : 0; + gr_copy_escape_part (n_host, vl->host, - sizeof (n_host), escape_char); + sizeof (n_host), escape_char, preserve_separator); gr_copy_escape_part (n_plugin, vl->plugin, - sizeof (n_plugin), escape_char); + sizeof (n_plugin), escape_char, preserve_separator); gr_copy_escape_part (n_plugin_instance, vl->plugin_instance, - sizeof (n_plugin_instance), escape_char); + sizeof (n_plugin_instance), escape_char, preserve_separator); gr_copy_escape_part (n_type, vl->type, - sizeof (n_type), escape_char); + sizeof (n_type), escape_char, preserve_separator); gr_copy_escape_part (n_type_instance, vl->type_instance, - sizeof (n_type_instance), escape_char); + sizeof (n_type_instance), escape_char, preserve_separator); if (n_plugin_instance[0] != '\0') ssnprintf (tmp_plugin, sizeof (tmp_plugin), "%s%c%s", @@ -150,18 +152,29 @@ static int gr_format_name (char *ret, int ret_len, sstrncpy (tmp_plugin, n_plugin, sizeof (tmp_plugin)); if (n_type_instance[0] != '\0') - ssnprintf (tmp_type, sizeof (tmp_type), "%s%c%s", - n_type, - (flags & GRAPHITE_SEPARATE_INSTANCES) ? '.' : '-', - n_type_instance); + { + if ((flags & GRAPHITE_DROP_DUPE_FIELDS) && strcmp(n_plugin, n_type) == 0) + sstrncpy (tmp_type, n_type_instance, sizeof (tmp_type)); + else + ssnprintf (tmp_type, sizeof (tmp_type), "%s%c%s", + n_type, + (flags & GRAPHITE_SEPARATE_INSTANCES) ? '.' : '-', + n_type_instance); + } else sstrncpy (tmp_type, n_type, sizeof (tmp_type)); /* Assert always_append_ds -> ds_name */ assert (!(flags & GRAPHITE_ALWAYS_APPEND_DS) || (ds_name != NULL)); if (ds_name != NULL) - ssnprintf (ret, ret_len, "%s%s%s.%s.%s.%s", - prefix, n_host, postfix, tmp_plugin, tmp_type, ds_name); + { + if ((flags & GRAPHITE_DROP_DUPE_FIELDS) && strcmp(tmp_plugin, tmp_type) == 0) + ssnprintf (ret, ret_len, "%s%s%s.%s.%s", + prefix, n_host, postfix, tmp_plugin, ds_name); + else + ssnprintf (ret, ret_len, "%s%s%s.%s.%s.%s", + prefix, n_host, postfix, tmp_plugin, tmp_type, ds_name); + } else ssnprintf (ret, ret_len, "%s%s%s.%s.%s", prefix, n_host, postfix, tmp_plugin, tmp_type); @@ -246,6 +259,7 @@ int format_graphite (char *buffer, size_t buffer_size, } memcpy((void *) (buffer + buffer_pos), message, message_len); buffer_pos += message_len; + buffer[buffer_pos] = '\0'; } sfree (rates); return (status);