From a164e36b6ddd250fb5eb96f9700d178b9f8aa0ae Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 23 Feb 2024 10:24:00 +0000 Subject: [PATCH] add remove metric --- include/libs/monitorfw/taos_collector.h | 2 + .../libs/monitorfw/taos_collector_registry.h | 2 + source/libs/monitor/src/monFramework.c | 38 +++++++++------- source/libs/monitorfw/inc/taos_log.h | 4 +- source/libs/monitorfw/inc/taos_map_i.h | 2 + source/libs/monitorfw/src/taos_collector.c | 6 +++ .../monitorfw/src/taos_collector_registry.c | 19 +++++++- source/libs/monitorfw/src/taos_linked_list.c | 33 ++++++++++++++ source/libs/monitorfw/src/taos_map.c | 12 ++++- .../src/taos_metric_formatter_custom.c | 45 ++++++++++++++++--- 10 files changed, 138 insertions(+), 25 deletions(-) diff --git a/include/libs/monitorfw/taos_collector.h b/include/libs/monitorfw/taos_collector.h index 8fe304ed7d..c37cb612d2 100644 --- a/include/libs/monitorfw/taos_collector.h +++ b/include/libs/monitorfw/taos_collector.h @@ -76,6 +76,8 @@ int taos_collector_destroy_generic(void *gen); */ int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric); +int taos_collector_remove_metric(taos_collector_t *self, const char* key); + taos_metric_t* taos_collector_get_metric(taos_collector_t *self, char *metric_name); /** diff --git a/include/libs/monitorfw/taos_collector_registry.h b/include/libs/monitorfw/taos_collector_registry.h index 063e8afb50..81d1f8050c 100644 --- a/include/libs/monitorfw/taos_collector_registry.h +++ b/include/libs/monitorfw/taos_collector_registry.h @@ -86,6 +86,8 @@ taos_metric_t *taos_collector_registry_must_register_metric(taos_metric_t *metri */ int taos_collector_registry_register_metric(taos_metric_t *metric); +int taos_collector_registry_deregister_metric(const char *key); + taos_metric_t *taos_collector_registry_get_metric(char* metric_name); /** diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 06b4a3ee3b..9a2857d442 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -120,17 +120,6 @@ void monInitMonitorFW(){ taosHashPut(tsMonitor.metrics, metric[i], strlen(metric[i]), &gauge, sizeof(taos_gauge_t *)); } - int32_t vgroup_label_count = 3; - const char *vgroup_sample_labels[] = {"cluster_id", "vgroup_id", "database_name"}; - char *vgroup_metrics[] = {TABLES_NUM, STATUS}; - for(int32_t i = 0; i < 2; i++){ - gauge= taos_gauge_new(vgroup_metrics[i], "", vgroup_label_count, vgroup_sample_labels); - if(taos_collector_registry_register_metric(gauge) == 1){ - taos_counter_destroy(gauge); - } - taosHashPut(tsMonitor.metrics, vgroup_metrics[i], strlen(vgroup_metrics[i]), &gauge, sizeof(taos_gauge_t *)); - } - int32_t dnodes_label_count = 3; const char *dnodes_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep"}; char *dnodes_gauges[] = {UPTIME, CPU_ENGINE, CPU_SYSTEM, CPU_CORE, MEM_ENGINE, MEM_SYSTEM, @@ -316,6 +305,27 @@ void monGenVgroupInfoTable(SMonInfo *pMonitor){ SMonVgroupInfo *pInfo = &pMonitor->mmInfo.vgroup; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + int32_t vgroup_label_count = 3; + const char *vgroup_sample_labels[] = {"cluster_id", "vgroup_id", "database_name"}; + + if(taos_collector_registry_deregister_metric(TABLES_NUM) != 0){ + uError("failed to delete metric "TABLES_NUM); + } + + taos_gauge_t *tableNumGauge = taos_gauge_new(TABLES_NUM, "", vgroup_label_count, vgroup_sample_labels); + if(taos_collector_registry_register_metric(tableNumGauge) == 1){ + taos_counter_destroy(tableNumGauge); + } + + if(taos_collector_registry_deregister_metric(STATUS) != 0){ + uError("failed to delete metric "STATUS); + } + + taos_gauge_t *statusGauge = taos_gauge_new(STATUS, "", vgroup_label_count, vgroup_sample_labels); + if(taos_collector_registry_register_metric(statusGauge) == 1){ + taos_counter_destroy(statusGauge); + } + char cluster_id[TSDB_CLUSTER_ID_LEN] = {0}; snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%"PRId64, pMonitor->dmInfo.basic.cluster_id); @@ -329,15 +339,13 @@ void monGenVgroupInfoTable(SMonInfo *pMonitor){ taos_gauge_t **metric = NULL; - metric = taosHashGet(tsMonitor.metrics, TABLES_NUM, strlen(TABLES_NUM)); - taos_gauge_set(*metric, pVgroupDesc->tables_num, sample_labels); + taos_gauge_set(tableNumGauge, pVgroupDesc->tables_num, sample_labels); - metric = taosHashGet(tsMonitor.metrics, STATUS, strlen(STATUS)); int32_t status = 0; if(strcmp(pVgroupDesc->status, "ready") == 0){ status = 1; } - taos_gauge_set(*metric, status, sample_labels); + taos_gauge_set(statusGauge, status, sample_labels); } } diff --git a/source/libs/monitorfw/inc/taos_log.h b/source/libs/monitorfw/inc/taos_log.h index 6d6c9e1fb3..fecbda59e5 100644 --- a/source/libs/monitorfw/inc/taos_log.h +++ b/source/libs/monitorfw/inc/taos_log.h @@ -18,8 +18,10 @@ #ifndef TAOS_LOG_H #define TAOS_LOG_H +//#define TAOS_LOG_ENABLE + #ifdef TAOS_LOG_ENABLE -#define TAOS_LOG(msg) printf("%s %s %s %s %d %s\n", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__, msg); +#define TAOS_LOG(msg) printf("monitor_log %s %s %s %s %d %s\n", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__, msg); #else #define TAOS_LOG(msg) #endif // TAOS_LOG_ENABLE diff --git a/source/libs/monitorfw/inc/taos_map_i.h b/source/libs/monitorfw/inc/taos_map_i.h index 808548e96a..55f248b96a 100644 --- a/source/libs/monitorfw/inc/taos_map_i.h +++ b/source/libs/monitorfw/inc/taos_map_i.h @@ -24,6 +24,8 @@ int taos_map_set_free_value_fn(taos_map_t *self, taos_map_node_free_value_fn fre void *taos_map_get(taos_map_t *self, const char *key); +void *taos_map_get_withoutlock(taos_map_t *self, const char *key); + int taos_map_set(taos_map_t *self, const char *key, void *value); int taos_map_delete(taos_map_t *self, const char *key); diff --git a/source/libs/monitorfw/src/taos_collector.c b/source/libs/monitorfw/src/taos_collector.c index 997bf5587c..17d324462c 100644 --- a/source/libs/monitorfw/src/taos_collector.c +++ b/source/libs/monitorfw/src/taos_collector.c @@ -108,6 +108,12 @@ int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric) { return taos_map_set(self->metrics, metric->name, metric); } +int taos_collector_remove_metric(taos_collector_t *self, const char* key){ + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + return taos_map_delete(self->metrics, key); +} + taos_metric_t* taos_collector_get_metric(taos_collector_t *self, char *metric_name){ TAOS_ASSERT(self != NULL); if (self == NULL) return NULL; diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index acf2cb4248..55b08775b4 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -123,6 +123,19 @@ int taos_collector_registry_register_metric(taos_metric_t *metric) { return taos_collector_add_metric(default_collector, metric); } +int taos_collector_registry_deregister_metric(const char *key) { + TAOS_ASSERT(metric != NULL); + + taos_collector_t *default_collector = + (taos_collector_t *)taos_map_get(TAOS_COLLECTOR_REGISTRY_DEFAULT->collectors, "default"); + + if (default_collector == NULL) { + return 1; + } + + return taos_collector_remove_metric(default_collector, key); +} + taos_metric_t *taos_collector_registry_get_metric(char* metric_name){ TAOS_ASSERT(metric != NULL); @@ -232,7 +245,11 @@ const char *taos_collector_registry_bridge_new(taos_collector_registry_t *self, SJson* array = tjsonCreateArray(); tjsonAddItemToObject(item, "tables", array); - taos_metric_formatter_load_metrics_new(self->metric_formatter, self->collectors, ts, format, array); + if(taos_metric_formatter_load_metrics_new(self->metric_formatter, self->collectors, ts, format, array) != 0){ + TAOS_LOG("failed to load metrics"); + tjsonDelete(pJson); + return NULL; + } if(tjsonGetArraySize(array) == 0){ tjsonDelete(pJson); diff --git a/source/libs/monitorfw/src/taos_linked_list.c b/source/libs/monitorfw/src/taos_linked_list.c index ab4e23ff29..675400a6fa 100644 --- a/source/libs/monitorfw/src/taos_linked_list.c +++ b/source/libs/monitorfw/src/taos_linked_list.c @@ -147,9 +147,26 @@ int taos_linked_list_remove(taos_linked_list_t *self, void *item) { if (self == NULL) return 1; taos_linked_list_node_t *node; taos_linked_list_node_t *prev_node = NULL; +#ifdef TAOS_LOG_ENABLE + int32_t count = 0; + char tmp[200] = {0}; + + count = 0; + for (node = self->head; node != NULL; node = node->next) { + count++; + } + sprintf(tmp, "list count:%d", count); + TAOS_LOG(tmp); +#endif // Locate the node +#ifdef TAOS_LOG_ENABLE + count = 0; +#endif for (node = self->head; node != NULL; node = node->next) { +#ifdef TAOS_LOG_ENABLE + count++; +#endif if (self->compare_fn) { if ((*self->compare_fn)(node->item, item) == TAOS_EQUAL) { break; @@ -162,6 +179,11 @@ int taos_linked_list_remove(taos_linked_list_t *self, void *item) { prev_node = node; } +#ifdef TAOS_LOG_ENABLE + sprintf(tmp, "remove item:%d", count); + TAOS_LOG(tmp); +#endif + if (node == NULL) return 0; if (prev_node) { @@ -185,6 +207,17 @@ int taos_linked_list_remove(taos_linked_list_t *self, void *item) { taos_free(node); node = NULL; self->size--; + +#ifdef TAOS_LOG_ENABLE + count = 0; + for (node = self->head; node != NULL; node = node->next) { + count++; + } + + sprintf(tmp, "list count:%d", count); + TAOS_LOG(tmp); +#endif + return 0; } diff --git a/source/libs/monitorfw/src/taos_map.c b/source/libs/monitorfw/src/taos_map.c index fce308f11d..8f0b83884e 100644 --- a/source/libs/monitorfw/src/taos_map.c +++ b/source/libs/monitorfw/src/taos_map.c @@ -215,6 +215,14 @@ void *taos_map_get(taos_map_t *self, const char *key) { return payload; } +void *taos_map_get_withoutlock(taos_map_t *self, const char *key) { + TAOS_ASSERT(self != NULL); + int r = 0; + void *payload = + taos_map_get_internal(key, &self->size, &self->max_size, self->keys, self->addrs, self->free_value_fn); + return payload; +} + static int taos_map_set_internal(const char *key, void *value, size_t *size, size_t *max_size, taos_linked_list_t *keys, taos_linked_list_t **addrs, taos_map_node_free_value_fn free_value_fn, bool destroy_current_value) { @@ -368,10 +376,10 @@ static int taos_map_delete_internal(const char *key, size_t *size, size_t *max_s taos_map_node_t *current_map_node = (taos_map_node_t *)current_node->item; taos_linked_list_compare_t result = taos_linked_list_compare(list, current_map_node, temp_map_node); if (result == TAOS_EQUAL) { - r = taos_linked_list_remove(list, current_node); + r = taos_linked_list_remove(keys, (char*)current_map_node->key); if (r) return r; - r = taos_linked_list_remove(keys, (char *)current_map_node->key); + r = taos_linked_list_remove(list, current_node->item); if (r) return r; (*size)--; diff --git a/source/libs/monitorfw/src/taos_metric_formatter_custom.c b/source/libs/monitorfw/src/taos_metric_formatter_custom.c index d7650098e0..3b1318dfc0 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter_custom.c +++ b/source/libs/monitorfw/src/taos_metric_formatter_custom.c @@ -23,6 +23,7 @@ #include "taos_assert.h" #include "tdef.h" #include "taos_collector_t.h" +#include "taos_log.h" int taos_metric_formatter_load_sample_new(taos_metric_formatter_t *self, taos_metric_sample_t *sample, char *ts, char *format, char *metricName, int32_t metric_type, @@ -207,18 +208,50 @@ int taos_metric_formatter_load_metrics_new(taos_metric_formatter_t *self, taos_m //if(strcmp(collector->name, "custom") != 0 ){ + r = pthread_rwlock_wrlock(metrics->rwlock); + if (r) { + TAOS_LOG("failed to lock"); + return r; + } + +#ifdef TAOS_LOG_ENABLE + int32_t count = 0; +#endif for (taos_linked_list_node_t *current_node = metrics->keys->head; current_node != NULL; current_node = current_node->next) { +#ifdef TAOS_LOG_ENABLE + count++; +#endif const char *metric_name = (const char *)current_node->item; - taos_metric_t *metric = (taos_metric_t *)taos_map_get(metrics, metric_name); - if (metric == NULL) return 1; + taos_metric_t *metric = (taos_metric_t *)taos_map_get_withoutlock(metrics, metric_name); + if (metric == NULL) { +#ifdef TAOS_LOG_ENABLE + char tmp[200] = {0}; + sprintf(tmp, "fail to get metric(%d):%s", count, metric_name); + TAOS_LOG(tmp); +#endif + continue;; + } r = taos_metric_formatter_load_metric_new(self, metric, ts, format, tableArray); - if (r) return r; + if (r) { + TAOS_LOG("failed to load metric"); + continue; + } + } + +#ifdef TAOS_LOG_ENABLE + char tmp[20] = {0}; + sprintf(tmp, "list count:%d", count); + TAOS_LOG(tmp); +#endif + r = pthread_rwlock_unlock(metrics->rwlock); + if (r) { + TAOS_LOG("failed to unlock"); + return r; } - //} //else{ - + /* for (taos_linked_list_node_t *current_node = metrics->keys->head; current_node != NULL; current_node = current_node->next) { const char *metric_name = (const char *)current_node->item; @@ -227,7 +260,7 @@ int taos_metric_formatter_load_metrics_new(taos_metric_formatter_t *self, taos_m r = taos_metric_formatter_load_metric(self, metric, ts, format); if (r) return r; } - + */ //} } return r;