Merge pull request #2512 from Stackdriver/pri
[collectd.git] / src / utils_format_graphite.c
index 40bfff5..fbeff4f 100644 (file)
@@ -46,11 +46,11 @@ static int gr_format_values(char *ret, size_t ret_len, int ds_num,
 
 #define BUFFER_ADD(...)                                                        \
   do {                                                                         \
-    status = ssnprintf(ret + offset, ret_len - offset, __VA_ARGS__);           \
+    status = snprintf(ret + offset, ret_len - offset, __VA_ARGS__);            \
     if (status < 1) {                                                          \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else if (((size_t)status) >= (ret_len - offset)) {                       \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else                                                                     \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -60,7 +60,7 @@ static int gr_format_values(char *ret, size_t ret_len, int ds_num,
   else if (rates != NULL)
     BUFFER_ADD("%f", rates[ds_num]);
   else if (ds->ds[ds_num].type == DS_TYPE_COUNTER)
-    BUFFER_ADD("%llu", vl->values[ds_num].counter);
+    BUFFER_ADD("%" PRIu64, (uint64_t)vl->values[ds_num].counter);
   else if (ds->ds[ds_num].type == DS_TYPE_DERIVE)
     BUFFER_ADD("%" PRIi64, vl->values[ds_num].derive);
   else if (ds->ds[ds_num].type == DS_TYPE_ABSOLUTE)
@@ -68,16 +68,16 @@ static int gr_format_values(char *ret, size_t ret_len, int ds_num,
   else {
     ERROR("gr_format_values plugin: Unknown data source type: %i",
           ds->ds[ds_num].type);
-    return (-1);
+    return -1;
   }
 
 #undef BUFFER_ADD
 
-  return (0);
+  return 0;
 }
 
 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);
 
   if (src == NULL)
@@ -89,7 +89,8 @@ static void gr_copy_escape_part(char *dst, const char *src, size_t dst_len,
       break;
     }
 
-    if ((src[i] == '.') || isspace((int)src[i]) || iscntrl((int)src[i]))
+    if ((!preserve_separator && (src[i] == '.')) || isspace((int)src[i]) ||
+        iscntrl((int)src[i]))
       dst[i] = escape_char;
     else
       dst[i] = src[i];
@@ -115,38 +116,52 @@ static int gr_format_name(char *ret, int ret_len, value_list_t const *vl,
   if (postfix == NULL)
     postfix = "";
 
-  gr_copy_escape_part(n_host, vl->host, sizeof(n_host), escape_char);
-  gr_copy_escape_part(n_plugin, vl->plugin, sizeof(n_plugin), escape_char);
+  _Bool preserve_separator = (flags & GRAPHITE_PRESERVE_SEPARATOR) ? 1 : 0;
+
+  gr_copy_escape_part(n_host, vl->host, sizeof(n_host), escape_char,
+                      preserve_separator);
+  gr_copy_escape_part(n_plugin, vl->plugin, sizeof(n_plugin), escape_char,
+                      preserve_separator);
   gr_copy_escape_part(n_plugin_instance, vl->plugin_instance,
-                      sizeof(n_plugin_instance), escape_char);
-  gr_copy_escape_part(n_type, vl->type, sizeof(n_type), escape_char);
+                      sizeof(n_plugin_instance), escape_char,
+                      preserve_separator);
+  gr_copy_escape_part(n_type, vl->type, 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", n_plugin,
-              (flags & GRAPHITE_SEPARATE_INSTANCES) ? '.' : '-',
-              n_plugin_instance);
+    snprintf(tmp_plugin, sizeof(tmp_plugin), "%s%c%s", n_plugin,
+             (flags & GRAPHITE_SEPARATE_INSTANCES) ? '.' : '-',
+             n_plugin_instance);
   else
     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);
-  else
+  if (n_type_instance[0] != '\0') {
+    if ((flags & GRAPHITE_DROP_DUPE_FIELDS) && strcmp(n_plugin, n_type) == 0)
+      sstrncpy(tmp_type, n_type_instance, sizeof(tmp_type));
+    else
+      snprintf(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);
-  else
-    ssnprintf(ret, ret_len, "%s%s%s.%s.%s", prefix, n_host, postfix, tmp_plugin,
-              tmp_type);
+  if (ds_name != NULL) {
+    if ((flags & GRAPHITE_DROP_DUPE_FIELDS) &&
+        strcmp(tmp_plugin, tmp_type) == 0)
+      snprintf(ret, ret_len, "%s%s%s.%s.%s", prefix, n_host, postfix,
+               tmp_plugin, ds_name);
+    else
+      snprintf(ret, ret_len, "%s%s%s.%s.%s.%s", prefix, n_host, postfix,
+               tmp_plugin, tmp_type, ds_name);
+  } else
+    snprintf(ret, ret_len, "%s%s%s.%s.%s", prefix, n_host, postfix, tmp_plugin,
+             tmp_type);
 
-  return (0);
+  return 0;
 }
 
 static void escape_graphite_string(char *buffer, char escape_char) {
@@ -189,7 +204,7 @@ int format_graphite(char *buffer, size_t buffer_size, data_set_t const *ds,
     if (status != 0) {
       ERROR("format_graphite: error with gr_format_name");
       sfree(rates);
-      return (status);
+      return status;
     }
 
     escape_graphite_string(key, escape_char);
@@ -199,33 +214,31 @@ int format_graphite(char *buffer, size_t buffer_size, data_set_t const *ds,
     if (status != 0) {
       ERROR("format_graphite: error with gr_format_values");
       sfree(rates);
-      return (status);
+      return status;
     }
 
     /* Compute the graphite command */
     message_len =
-        (size_t)ssnprintf(message, sizeof(message), "%s %s %u\r\n", key, values,
-                          (unsigned int)CDTIME_T_TO_TIME_T(vl->time));
+        (size_t)snprintf(message, sizeof(message), "%s %s %u\r\n", key, values,
+                         (unsigned int)CDTIME_T_TO_TIME_T(vl->time));
     if (message_len >= sizeof(message)) {
       ERROR("format_graphite: message buffer too small: "
-            "Need %zu bytes.",
+            "Need %" PRIsz " bytes.",
             message_len + 1);
       sfree(rates);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     /* Append it in case we got multiple data set */
     if ((buffer_pos + message_len) >= buffer_size) {
       ERROR("format_graphite: target buffer too small");
       sfree(rates);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
     memcpy((void *)(buffer + buffer_pos), message, message_len);
     buffer_pos += message_len;
     buffer[buffer_pos] = '\0';
   }
   sfree(rates);
-  return (status);
+  return status;
 } /* int format_graphite */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */