diff options
| -rw-r--r-- | include/fieldstat/fieldstat.h | 3 | ||||
| -rw-r--r-- | src/fieldstat.c | 30 | ||||
| -rw-r--r-- | test/test_metric_counter.cpp | 30 |
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[]) { |
