X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fceph.c;h=5ea90499ae2090a35d646a2d4284768e4a80fc43;hb=f68cb4a273127e2e448a5e1beff5a7e7bef2be64;hp=421c7eff9dbe60eafe6e42c896a317f580699bdf;hpb=afead086f0bfb4a5cc2a032257d5085d2f74c6f3;p=collectd.git diff --git a/src/ceph.c b/src/ceph.c index 421c7eff..5ea90499 100644 --- a/src/ceph.c +++ b/src/ceph.c @@ -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,21 +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 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. */ @@ -518,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; + + 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); @@ -930,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; }