From f847b097adfcf967f5e2bc7d319768756c513ad5 Mon Sep 17 00:00:00 2001 From: Antoine Rose Date: Tue, 10 Aug 2021 11:12:22 +0200 Subject: [PATCH 1/3] [collector] add prom_collector_remove_metric --- prom/include/prom_collector.h | 8 ++++++++ prom/src/prom_collector.c | 10 ++++++++++ prom/test/prom_collector_test.c | 3 +++ 3 files changed, 21 insertions(+) diff --git a/prom/include/prom_collector.h b/prom/include/prom_collector.h index 1475f13..70e0392 100644 --- a/prom/include/prom_collector.h +++ b/prom/include/prom_collector.h @@ -87,6 +87,14 @@ int prom_collector_destroy_generic(void *gen); */ int prom_collector_add_metric(prom_collector_t *self, prom_metric_t *metric); +/** + * @brief Remove a metric from a collector + * @param self The target prom_collector_t* + * @param metric the prom_metric_t* to remove from the prom_collector_t* passed as self. + * @return A non-zero integer value upon failure. + */ +int prom_collector_remove_metric(prom_collector_t *self, prom_metric_t *metric); + /** * @brief The collect function is responsible for doing any work involving a set of metrics and then returning them * for metric exposition. diff --git a/prom/src/prom_collector.c b/prom/src/prom_collector.c index dce3bb4..8e6caf9 100644 --- a/prom/src/prom_collector.c +++ b/prom/src/prom_collector.c @@ -116,6 +116,16 @@ int prom_collector_add_metric(prom_collector_t *self, prom_metric_t *metric) { return prom_map_set(self->metrics, metric->name, metric); } +int prom_collector_remove_metric(prom_collector_t *self, prom_metric_t *metric) { + PROM_ASSERT(self != NULL); + if (self == NULL) return 1; + if (prom_map_get(self->metrics, metric->name) == NULL) { + PROM_LOG("metric not found in collector"); + return 1; + } + return prom_map_delete(self->metrics, metric->name); +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Process Collector diff --git a/prom/test/prom_collector_test.c b/prom/test/prom_collector_test.c index 0568d45..d351fb0 100644 --- a/prom/test/prom_collector_test.c +++ b/prom/test/prom_collector_test.c @@ -22,6 +22,9 @@ void test_prom_collector(void) { prom_collector_add_metric(collector, counter); prom_map_t *m = collector->collect_fn(collector); TEST_ASSERT_EQUAL_INT(1, prom_map_size(m)); + prom_counter_inc(counter, NULL); + prom_collector_remove_metric(collector, counter); + TEST_ASSERT_EQUAL_INT(0, prom_map_size(m)); prom_collector_destroy(collector); collector = NULL; } From bc200058bd255bd1b7d0c1f669dc407729986f30 Mon Sep 17 00:00:00 2001 From: Antoine Rose Date: Tue, 10 Aug 2021 11:12:38 +0200 Subject: [PATCH 2/3] [map] fix crash in prom_map_delete_internal --- prom/src/prom_map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prom/src/prom_map.c b/prom/src/prom_map.c index 3f21ba5..c55c40d 100644 --- a/prom/src/prom_map.c +++ b/prom/src/prom_map.c @@ -369,10 +369,10 @@ static int prom_map_delete_internal(const char *key, size_t *size, size_t *max_s prom_map_node_t *current_map_node = (prom_map_node_t *)current_node->item; prom_linked_list_compare_t result = prom_linked_list_compare(list, current_map_node, temp_map_node); if (result == PROM_EQUAL) { - r = prom_linked_list_remove(list, current_node); + r = prom_linked_list_remove(keys, (char *)current_map_node->key); if (r) return r; - r = prom_linked_list_remove(keys, (char *)current_map_node->key); + r = prom_linked_list_remove(list, current_node->item); if (r) return r; (*size)--; From 8e2e9f13598ba8b45d3aa86d752deb9e22bb9ce8 Mon Sep 17 00:00:00 2001 From: Antoine Rose Date: Tue, 10 Aug 2021 11:12:52 +0200 Subject: [PATCH 3/3] [collector] addprom_collector_registry_unregister_metric --- prom/include/prom_collector_registry.h | 9 +++++++++ prom/src/prom_collector_registry.c | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/prom/include/prom_collector_registry.h b/prom/include/prom_collector_registry.h index abb74ab..f4398e4 100644 --- a/prom/include/prom_collector_registry.h +++ b/prom/include/prom_collector_registry.h @@ -87,6 +87,15 @@ prom_metric_t *prom_collector_registry_must_register_metric(prom_metric_t *metri */ int prom_collector_registry_register_metric(prom_metric_t *metric); +/** + * @brief Unregisters a metric with the default collector on PROM_DEFAULT_COLLECTOR_REGISTRY. Returns an non-zero integer + * value on failure. + * + * @param metric The metric to unregister on PROM_DEFAULT_COLLECTOR_REGISTRY* + * @return A non-zero integer value upon failure + */ +int prom_collector_registry_unregister_metric(prom_metric_t *metric); + /** * @brief Register a collector with the given registry. Returns a non-zero integer value on failure. * @param self The target prom_collector_registry_t* diff --git a/prom/src/prom_collector_registry.c b/prom/src/prom_collector_registry.c index 4c2bc2d..874f103 100644 --- a/prom/src/prom_collector_registry.c +++ b/prom/src/prom_collector_registry.c @@ -143,6 +143,19 @@ int prom_collector_registry_register_metric(prom_metric_t *metric) { return prom_collector_add_metric(default_collector, metric); } +int prom_collector_registry_unregister_metric(prom_metric_t *metric) { + PROM_ASSERT(metric != NULL); + + prom_collector_t *default_collector = + (prom_collector_t *)prom_map_get(PROM_COLLECTOR_REGISTRY_DEFAULT->collectors, "default"); + + if (default_collector == NULL) { + return 1; + } + + return prom_collector_remove_metric(default_collector, metric); +} + prom_metric_t *prom_collector_registry_must_register_metric(prom_metric_t *metric) { int err = prom_collector_registry_register_metric(metric); if (err != 0) {