aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/metrics/histogram_snapshot.cpp
diff options
context:
space:
mode:
authoraleksei-le <aleksei-le@yandex-team.com>2023-07-13 11:23:36 +0300
committeraleksei-le <aleksei-le@yandex-team.com>2023-07-13 11:23:36 +0300
commitdfdcf3308ce1eef73cc215b3bf2730292628ff63 (patch)
treecf80b3c5728b7601950e72f9c18abe18e0b889a2 /library/cpp/monlib/metrics/histogram_snapshot.cpp
parentf85ed558056c615312bc2d44a967e3487f3cc164 (diff)
downloadydb-dfdcf3308ce1eef73cc215b3bf2730292628ff63.tar.gz
metrics input: compress number hist buckets
Diffstat (limited to 'library/cpp/monlib/metrics/histogram_snapshot.cpp')
-rw-r--r--library/cpp/monlib/metrics/histogram_snapshot.cpp35
1 files changed, 29 insertions, 6 deletions
diff --git a/library/cpp/monlib/metrics/histogram_snapshot.cpp b/library/cpp/monlib/metrics/histogram_snapshot.cpp
index 75b5811546..65bb262b98 100644
--- a/library/cpp/monlib/metrics/histogram_snapshot.cpp
+++ b/library/cpp/monlib/metrics/histogram_snapshot.cpp
@@ -7,16 +7,39 @@
namespace NMonitoring {
- IHistogramSnapshotPtr ExplicitHistogramSnapshot(TConstArrayRef<TBucketBound> bounds, TConstArrayRef<TBucketValue> values) {
+ IHistogramSnapshotPtr ExplicitHistogramSnapshot(TConstArrayRef<TBucketBound> bounds, TConstArrayRef<TBucketValue> values, bool shrinkBuckets) {
Y_ENSURE(bounds.size() == values.size(),
"mismatched sizes: bounds(" << bounds.size() <<
") != buckets(" << values.size() << ')');
- auto snapshot = TExplicitHistogramSnapshot::New(bounds.size());
-
- for (size_t i = 0; i != bounds.size(); ++i) {
- (*snapshot)[i].first = bounds[i];
- (*snapshot)[i].second = values[i];
+ size_t requiredSize = shrinkBuckets ? std::min(bounds.size(), static_cast<size_t>(HISTOGRAM_MAX_BUCKETS_COUNT)) : bounds.size();
+ auto snapshot = TExplicitHistogramSnapshot::New(requiredSize);
+ if (requiredSize < bounds.size()) {
+ auto remains = bounds.size() % requiredSize;
+ auto divided = bounds.size() / requiredSize;
+ size_t idx{bounds.size()};
+
+ for (size_t i = requiredSize; i > 0; --i) {
+ Y_ENSURE(idx > 0);
+ (*snapshot)[i - 1].first = bounds[idx - 1];
+ (*snapshot)[i - 1].second = 0;
+
+ auto repeat = divided;
+ if (remains > 0) {
+ ++repeat;
+ --remains;
+ }
+ for (; repeat > 0; --repeat) {
+ Y_ENSURE(idx > 0);
+ (*snapshot)[i - 1].second += values[idx - 1];
+ --idx;
+ }
+ }
+ } else {
+ for (size_t i = 0; i != bounds.size(); ++i) {
+ (*snapshot)[i].first = bounds[i];
+ (*snapshot)[i].second = values[i];
+ }
}
return snapshot;