* 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) &&
(strcmp("filestore", state->stack[state->depth - 2]) == 0) &&
(strcmp("journal_wr_bytes", state->stack[state->depth - 1]) == 0) &&
(strcmp("avgcount", state->key) == 0)) {
}
/* 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) {
}
static void cut_suffix(char *buffer, size_t buffer_size, char const *str,
- char const *suffix) {
+ char const *suffix) {
size_t str_len = strlen(str);
size_t suffix_len = strlen(suffix);
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");
- } else {
- sstrncpy(tmp, key_str, sizeof(tmp));
+ 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);
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;
}
struct cconn *io = io_array + i;
ret = cconn_prepare(io, fds + nfds);
if (ret < 0) {
- WARNING("ceph plugin: cconn_prepare(name=%s,i=%zu,st=%d)=%d",
+ WARNING("ceph plugin: cconn_prepare(name=%s,i=%" PRIsz ",st=%d)=%d",
io->d->name, i, io->state, ret);
cconn_close(io);
io->request_type = ASOK_REQ_NONE;