diff options
author | aleksei-le <aleksei-le@yandex-team.com> | 2023-07-13 11:23:36 +0300 |
---|---|---|
committer | aleksei-le <aleksei-le@yandex-team.com> | 2023-07-13 11:23:36 +0300 |
commit | dfdcf3308ce1eef73cc215b3bf2730292628ff63 (patch) | |
tree | cf80b3c5728b7601950e72f9c18abe18e0b889a2 /library/cpp/monlib/metrics/histogram_snapshot.cpp | |
parent | f85ed558056c615312bc2d44a967e3487f3cc164 (diff) | |
download | ydb-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.cpp | 35 |
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; |