aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/messagebus/duration_histogram.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/messagebus/duration_histogram.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/messagebus/duration_histogram.cpp')
-rw-r--r--library/cpp/messagebus/duration_histogram.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/library/cpp/messagebus/duration_histogram.cpp b/library/cpp/messagebus/duration_histogram.cpp
new file mode 100644
index 0000000000..32a0001d41
--- /dev/null
+++ b/library/cpp/messagebus/duration_histogram.cpp
@@ -0,0 +1,74 @@
+#include "duration_histogram.h"
+
+#include <util/generic/singleton.h>
+#include <util/stream/str.h>
+
+namespace {
+ ui64 SecondsRound(TDuration d) {
+ if (d.MilliSeconds() % 1000 >= 500) {
+ return d.Seconds() + 1;
+ } else {
+ return d.Seconds();
+ }
+ }
+
+ ui64 MilliSecondsRound(TDuration d) {
+ if (d.MicroSeconds() % 1000 >= 500) {
+ return d.MilliSeconds() + 1;
+ } else {
+ return d.MilliSeconds();
+ }
+ }
+
+ ui64 MinutesRound(TDuration d) {
+ if (d.Seconds() % 60 >= 30) {
+ return d.Minutes() + 1;
+ } else {
+ return d.Minutes();
+ }
+ }
+
+}
+
+namespace {
+ struct TMarks {
+ std::array<TDuration, TDurationHistogram::Buckets> Marks;
+
+ TMarks() {
+ Marks[0] = TDuration::Zero();
+ for (unsigned i = 1; i < TDurationHistogram::Buckets; ++i) {
+ if (i >= TDurationHistogram::SecondBoundary) {
+ Marks[i] = TDuration::Seconds(1) * (1 << (i - TDurationHistogram::SecondBoundary));
+ } else {
+ Marks[i] = TDuration::Seconds(1) / (1 << (TDurationHistogram::SecondBoundary - i));
+ }
+ }
+ }
+ };
+}
+
+TString TDurationHistogram::LabelBefore(unsigned i) {
+ Y_VERIFY(i < Buckets);
+
+ TDuration d = Singleton<TMarks>()->Marks[i];
+
+ TStringStream ss;
+ if (d == TDuration::Zero()) {
+ ss << "0";
+ } else if (d < TDuration::Seconds(1)) {
+ ss << MilliSecondsRound(d) << "ms";
+ } else if (d < TDuration::Minutes(1)) {
+ ss << SecondsRound(d) << "s";
+ } else {
+ ss << MinutesRound(d) << "m";
+ }
+ return ss.Str();
+}
+
+TString TDurationHistogram::PrintToString() const {
+ TStringStream ss;
+ for (auto time : Times) {
+ ss << time << "\n";
+ }
+ return ss.Str();
+}