Merge branch 'collectd-5.7' into collectd-5.8
[collectd.git] / src / ceph.c
index f7c9772..5ea9049 100644 (file)
@@ -280,8 +280,10 @@ static int ceph_cb_number(void *ctx, const char *number_val,
    * the same type of other "Bytes". Instead of keeping an "average" or
    * "rate", use the "sum" in the pair and assign that to the derive
    * value. */
-  if (convert_special_metrics && (state->depth >= 2) &&
+  if (convert_special_metrics && (state->depth > 2) &&
+      state->stack[state->depth - 2] &&
       (strcmp("filestore", state->stack[state->depth - 2]) == 0) &&
+      state->stack[state->depth - 1] &&
       (strcmp("journal_wr_bytes", state->stack[state->depth - 1]) == 0) &&
       (strcmp("avgcount", state->key) == 0)) {
     DEBUG("ceph plugin: Skipping avgcount for filestore.JournalWrBytes");
@@ -396,7 +398,7 @@ static void ceph_daemon_free(struct ceph_daemon *d) {
 }
 
 /* compact_ds_name removed the special characters ":", "_", "-" and "+" from the
- * intput string. Characters following these special characters are capitalized.
+ * input string. Characters following these special characters are capitalized.
  * Trailing "+" and "-" characters are replaces with the strings "Plus" and
  * "Minus". */
 static int compact_ds_name(char *buffer, size_t buffer_size, char const *src) {
@@ -485,20 +487,19 @@ static _Bool has_suffix(char const *str, char const *suffix) {
   return 0;
 }
 
-static int cut_suffix(char new_str[], size_t new_str_len, char const *str, char const *suffix) {
+static void cut_suffix(char *buffer, size_t buffer_size, char const *str,
+                       char const *suffix) {
 
-  size_t str_len = strlen (str);
-  size_t suffix_len = strlen (suffix);
+  size_t str_len = strlen(str);
+  size_t suffix_len = strlen(suffix);
 
   size_t offset = str_len - suffix_len + 1;
 
-  if (offset > new_str_len) {
-    offset = new_str_len;
+  if (offset > buffer_size) {
+    offset = buffer_size;
   }
 
-  sstrncpy(new_str,str,offset);
-
-  return 0;
+  sstrncpy(buffer, str, offset);
 }
 
 /* count_parts returns the number of elements a "foo.bar.baz" style key has. */
@@ -517,23 +518,22 @@ static size_t count_parts(char const *key) {
 static int parse_keys(char *buffer, size_t buffer_size, const char *key_str) {
   char tmp[2 * buffer_size];
   size_t tmp_size = sizeof(tmp);
+  const char *cut_suffixes[] = {".type", ".avgcount", ".sum", ".avgtime"};
 
   if (buffer == NULL || buffer_size == 0 || key_str == NULL ||
       strlen(key_str) == 0)
     return EINVAL;
-/* Strip suffix if it is ".type" or one of latency metric suffix. */
+
+  sstrncpy(tmp, key_str, tmp_size);
+
+  /* Strip suffix if it is ".type" or one of latency metric suffix. */
   if (count_parts(key_str) > 2) {
-    if (has_suffix(key_str, ".type")) {
-      cut_suffix(tmp, tmp_size, key_str, ".type");
-    } else if (has_suffix(key_str, ".avgcount")) {
-      cut_suffix(tmp, tmp_size, key_str, ".avgcount");
-    } else if (has_suffix(key_str, ".sum")) {
-      cut_suffix(tmp, tmp_size, key_str, ".sum");
-    } else if (has_suffix(key_str, ".avgtime")) {
-      cut_suffix(tmp, tmp_size, key_str, ".avgtime");
+    for (size_t i = 0; i < STATIC_ARRAY_SIZE(cut_suffixes); i++) {
+      if (has_suffix(key_str, cut_suffixes[i])) {
+        cut_suffix(tmp, tmp_size, key_str, cut_suffixes[i]);
+        break;
+      }
     }
-  } else {
-    sstrncpy(tmp, key_str, sizeof(tmp));
   }
 
   return compact_ds_name(buffer, buffer_size, tmp);
@@ -929,7 +929,13 @@ static int node_handler_fetch_data(void *arg, const char *val,
       uv.gauge = result;
       vtmp->latency_index = (vtmp->latency_index + 1);
     } else if (has_suffix(key, ".avgtime")) {
-      // skip this step if no need in long run latency
+
+      /* The "avgtime" metric reports ("sum" / "avgcount"), i.e. the average
+       * time per request since the start of the Ceph daemon. Report this only
+       * when the user has configured "long running average". Otherwise, use the
+       * rate of "sum" and "avgcount" to calculate the current latency.
+       */
+
       if (!long_run_latency_avg) {
         return 0;
       }