aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/metrics/log_histogram_snapshot.h
blob: 7673b43751e7f32f5bffcfdf9b455a75a85470a3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#pragma once

#include <util/generic/ptr.h>
#include <util/generic/vector.h>

#include <cmath>

namespace NMonitoring {

    constexpr ui32 LOG_HIST_MAX_BUCKETS = 100;

    class TLogHistogramSnapshot: public TAtomicRefCount<TLogHistogramSnapshot> {
    public:
        TLogHistogramSnapshot(double base, ui64 zerosCount, int startPower, TVector<double> buckets)
            : Base_(base)
            , ZerosCount_(zerosCount)
            , StartPower_(startPower)
            , Buckets_(std::move(buckets)) {
        }

        /**
         * @return buckets count.
         */
        ui32 Count() const noexcept {
            return Buckets_.size();
        }

        /**
         * @return upper bound for the bucket with particular index.
         */
        double UpperBound(int index) const noexcept {
            return std::pow(Base_, StartPower_ + index);
        }

        /**
         * @return value stored in the bucket with particular index.
         */
        double Bucket(ui32 index) const noexcept {
            return Buckets_[index];
        }

        /**
         * @return nonpositive values count
         */
        ui64 ZerosCount() const noexcept {
            return ZerosCount_;
        }

        double Base() const noexcept {
            return Base_;
        }

        int StartPower() const noexcept {
            return StartPower_;
        }

        ui64 MemorySizeBytes() const noexcept {
            return sizeof(*this) + Buckets_.capacity() * sizeof(double);
        }

    private:
        double Base_;
        ui64 ZerosCount_;
        int StartPower_;
        TVector<double> Buckets_;
    };

    using TLogHistogramSnapshotPtr = TIntrusivePtr<TLogHistogramSnapshot>;
}

std::ostream& operator<<(std::ostream& os, const NMonitoring::TLogHistogramSnapshot& hist);