From be831d7333b768d27414a71e51ea059397c80543 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Sun, 4 Feb 2024 18:40:08 +0800 Subject: [PATCH] fix(metrics): correct registered rolling counter entry ref count --- src/base/metrics.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/base/metrics.c b/src/base/metrics.c index 2179f911..50669979 100644 --- a/src/base/metrics.c +++ b/src/base/metrics.c @@ -263,8 +263,8 @@ int neu_metric_entries_add(neu_metric_entry_t **entries, const char *name, } if (NEU_METRIC_TYPE_ROLLING_COUNTER == type) { - entry->rcnt = neu_rolling_counter_new(init); - if (NULL == entry->rcnt) { + // only allocate rolling counter for nonzero time span + if (init > 0 && NULL == (entry->rcnt = neu_rolling_counter_new(init))) { free(entry); return -1; } @@ -311,9 +311,11 @@ int neu_metrics_register_entry(const char *name, const char *help, neu_metric_entry_t *e = NULL; pthread_rwlock_wrlock(&g_metrics_mtx_); + // use `value` field as reference counter, initialize to zero + // and we don't need to allocate rolling counter for register entries rv = neu_metric_entries_add(&g_metrics_.registered_metrics, name, help, - type, 1); - if (1 == rv) { + type, 0); + if (-1 != rv) { HASH_FIND_STR(g_metrics_.registered_metrics, name, e); ++e->value; rv = 0;