summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/fieldstat/fieldstat.h3
-rw-r--r--src/fieldstat.c30
-rw-r--r--test/test_metric_counter.cpp30
3 files changed, 63 insertions, 0 deletions
diff --git a/include/fieldstat/fieldstat.h b/include/fieldstat/fieldstat.h
index 6f44d6a..4832a06 100644
--- a/include/fieldstat/fieldstat.h
+++ b/include/fieldstat/fieldstat.h
@@ -124,6 +124,9 @@ int fieldstat_register_hist(struct fieldstat *instance, const char *metric_name,
*/
int fieldstat_counter_incrby(struct fieldstat *instance, int cube_id, int metric_id, const struct fieldstat_tag *tags, size_t n_tag, long long increment);
+int fieldstat_counter_incrby_batch(struct fieldstat *instance,
+ int cube_id, int metric_ids[], const struct fieldstat_tag *tags, size_t n_tag, long long increments[], int n_metric);
+
/*
* @brief let the value of counter metric equal to value. Other annotations refer to fieldstat_counter_incrby.
* @return Refer to fieldstat_counter_incrby. What's more, be cautious to call this function if the metric is a primary metric of a topk cube,
diff --git a/src/fieldstat.c b/src/fieldstat.c
index 210103e..2e71952 100644
--- a/src/fieldstat.c
+++ b/src/fieldstat.c
@@ -608,6 +608,36 @@ int fieldstat_counter_incrby(struct fieldstat *instance, int cube_id, int metric
return FS_OK;
}
+int fieldstat_counter_incrby_batch(struct fieldstat *instance, int cube_id, int metric_ids[], const struct fieldstat_tag *tags, size_t n_tag, long long increments[], int n_metric)
+{
+ int ret = check_before_add(instance, cube_id, metric_ids[0], METRIC_TYPE_COUNTER);
+ if (ret != FS_OK) {
+ return ret;
+ }
+ const struct fs_cube *cube = instance->cube[cube_id];
+ long long occurrence = 0;
+ if (cube->sampling_mode == SAMPLING_MODE_TOPK) {
+ for (int i = 0; i < n_metric; i++) {
+ if (metric_ids[i] == cube->primary_metric_id) {
+ if (increments[i] < 0) {
+ return FS_ERR_INVALID_PARAM;
+ }
+ occurrence += increments[i];
+ }
+ }
+ }
+ int cell_id = fieldstat_cube_add(instance, cube_id, tags, n_tag, occurrence);
+ if (cell_id < 0) {
+ return FS_ERR_TOO_MANY_CELLS;
+ }
+
+ for (int i = 0; i < n_metric; i++) {
+ struct metric *metric = find_or_add_metric(instance, cube_id, metric_ids[i]);
+ metric_counter_incrby(metric, cell_id, increments[i]);
+ }
+ return FS_OK;
+}
+
int fieldstat_counter_set(struct fieldstat *instance, int cube_id, int metric_id, const struct fieldstat_tag *tags, size_t n_tag, long long value)
{
int ret = check_before_add(instance, cube_id, metric_id, METRIC_TYPE_COUNTER);
diff --git a/test/test_metric_counter.cpp b/test/test_metric_counter.cpp
index 97b83ae..647b0c2 100644
--- a/test/test_metric_counter.cpp
+++ b/test/test_metric_counter.cpp
@@ -301,6 +301,36 @@ TEST(metric_test_counter, topk_set_and_test_accuracy)
fieldstat_free(instance);
}
+TEST(metric_test_counter, batch_incyby)
+{
+ struct fieldstat *instance = fieldstat_new();
+ int cube_id = fieldstat_create_cube(instance, &TEST_SHARED_TAG, 1, SAMPLING_MODE_TOPK, 10);
+ int metric_ids[3];
+ metric_ids[0] = fieldstat_register_counter(instance, "primary");
+ metric_ids[1] = fieldstat_register_counter(instance, "2");
+ metric_ids[2] = fieldstat_register_counter(instance, "3");
+
+ struct fieldstat_tag tags[3];
+ tags[0] = TEST_TAG_INT;
+ tags[1] = TEST_TAG_INT;
+ tags[2] = TEST_TAG_INT;
+
+ long long increments[3];
+ increments[0] = 1;
+ increments[1] = 2;
+ increments[2] = 3;
+
+ int ret = fieldstat_counter_incrby_batch(instance, cube_id, metric_ids, tags, 3, increments, 3);
+ EXPECT_EQ(ret, FS_OK);
+
+ struct fieldstat_tag_list tag_list = {tags, 3};
+
+ EXPECT_EQ(my_fieldstat_counter_get(instance, cube_id, metric_ids[0], &tag_list), 1);
+ EXPECT_EQ(my_fieldstat_counter_get(instance, cube_id, metric_ids[1], &tag_list), 2);
+ EXPECT_EQ(my_fieldstat_counter_get(instance, cube_id, metric_ids[2], &tag_list), 3);
+
+ fieldstat_free(instance);
+}
int main(int argc, char *argv[])
{