Coverage Report

Created: 2026-09-01 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/brpc/src/bvar/window.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
// Date: Wed Jul 29 23:25:43 CST 2015
19
20
#ifndef  BVAR_WINDOW_H
21
#define  BVAR_WINDOW_H
22
23
#include <limits>                                 // std::numeric_limits
24
#include <math.h>                                 // round
25
#include <type_traits>                            // std::decay
26
#include <utility>                                // std::declval
27
#include <gflags/gflags_declare.h>
28
#include "butil/logging.h"                         // LOG
29
#include "bvar/detail/sampler.h"
30
#include "bvar/detail/series.h"
31
#include "bvar/variable.h"
32
33
namespace bvar {
34
35
DECLARE_int32(bvar_dump_interval);
36
37
enum SeriesFrequency {
38
    SERIES_IN_WINDOW = 0,
39
    SERIES_IN_SECOND = 1
40
};
41
42
namespace detail {
43
// Just for constructor reusing of Window<>
44
template <typename R, SeriesFrequency series_freq>
45
class WindowBase : public Variable {
46
public:
47
    typedef typename R::value_type value_type;
48
    typedef typename R::sampler_type sampler_type;
49
50
    // Type of the underlying var's operator, copied by value so that appending
51
    // to the series never dereferences the var.
52
    typedef typename std::decay<decltype(std::declval<R&>().op())>::type var_op_type;
53
54
    class SeriesSampler : public Sampler {
55
    public:
56
        // Holds a COPY of the underlying var's operator rather than a pointer to
57
        // the var. The operators of bvar (AddTo/MaxTo/AddStat/...) are stateless
58
        // functors, so copying is cheap and, more importantly, the sampling
59
        // thread never touches the var -- which may already be destructed if the
60
        // user let this Window outlive it.
61
        struct Op {
62
38
            explicit Op(const var_op_type& op) : _op(op) {}
bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::AddTo<double> const&)
Line
Count
Source
62
3
            explicit Op(const var_op_type& op) : _op(op) {}
bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::AddTo<unsigned long> const&)
Line
Count
Source
62
2
            explicit Op(const var_op_type& op) : _op(op) {}
bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::AddTo<long> const&)
Line
Count
Source
62
2
            explicit Op(const var_op_type& op) : _op(op) {}
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::detail::AddPercentileSamples const&)
bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::MaxTo<long> const&)
Line
Count
Source
62
2
            explicit Op(const var_op_type& op) : _op(op) {}
bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::AddStat const&)
Line
Count
Source
62
2
            explicit Op(const var_op_type& op) : _op(op) {}
bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::AddTo<long> const&)
Line
Count
Source
62
18
            explicit Op(const var_op_type& op) : _op(op) {}
bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::AddTo<int> const&)
Line
Count
Source
62
9
            explicit Op(const var_op_type& op) : _op(op) {}
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::AddTo<unsigned long> const&)
63
0
            void operator()(value_type& v1, const value_type& v2) const {
64
0
                _op(v1, v2);
65
0
            }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(bvar::Stat&, bvar::Stat const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(long&, long const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(bvar::detail::PercentileSamples<254ul>&, bvar::detail::PercentileSamples<254ul> const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(double&, double const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(unsigned long&, unsigned long const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(long&, long const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(int&, int const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(long&, long const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(unsigned long&, unsigned long const&) const
66
        private:
67
            var_op_type _op;
68
        };
69
70
        SeriesSampler(WindowBase* owner, const var_op_type& op)
71
38
            : _owner(owner), _series(Op(op)) {}
bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>*, bvar::detail::AddTo<double> const&)
Line
Count
Source
71
3
            : _owner(owner), _series(Op(op)) {}
bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>*, bvar::detail::AddTo<unsigned long> const&)
Line
Count
Source
71
2
            : _owner(owner), _series(Op(op)) {}
bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>*, bvar::detail::AddTo<long> const&)
Line
Count
Source
71
2
            : _owner(owner), _series(Op(op)) {}
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>*, bvar::detail::detail::AddPercentileSamples const&)
bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>*, bvar::detail::MaxTo<long> const&)
Line
Count
Source
71
2
            : _owner(owner), _series(Op(op)) {}
bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>*, bvar::detail::AddStat const&)
Line
Count
Source
71
2
            : _owner(owner), _series(Op(op)) {}
bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>*, bvar::detail::AddTo<long> const&)
Line
Count
Source
71
18
            : _owner(owner), _series(Op(op)) {}
bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>*, bvar::detail::AddTo<int> const&)
Line
Count
Source
71
9
            : _owner(owner), _series(Op(op)) {}
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>*, bvar::detail::AddTo<unsigned long> const&)
72
0
        ~SeriesSampler() override = default;
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
73
74
0
        void take_sample() override {
75
0
            if (series_freq == SERIES_IN_SECOND) {
76
                // Get one-second window value for PerSecond<>, otherwise the
77
                // "smoother" plot may hide peaks.
78
0
                _series.append(_owner->get_value(1));
79
0
            } else {
80
                // Get the value inside the full window. "get_value(1)" is 
81
                // incorrect when users intend to see aggregated values of
82
                // the full window in the plot.
83
0
                _series.append(_owner->get_value());
84
0
            }
85
0
        }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
86
0
        void describe(std::ostream& os) { _series.describe(os, nullptr); }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
87
    private:
88
        WindowBase* _owner;
89
        Series<value_type, Op> _series;
90
    };
91
    
92
    WindowBase(R* var, time_t window_size)
93
40
        : _var(var)
94
29
        , _var_op(var->op())
95
40
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
40
        , _sampler(var->get_sampler())
97
40
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
40
        _sampler->add_borrower();
102
40
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
40
    }
bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::WindowBase(bvar::PassiveStatus<double>*, long)
Line
Count
Source
93
3
        : _var(var)
94
3
        , _var_op(var->op())
95
3
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
3
        , _sampler(var->get_sampler())
97
3
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
3
        _sampler->add_borrower();
102
3
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
3
    }
bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::WindowBase(bvar::PassiveStatus<unsigned long>*, long)
Line
Count
Source
93
2
        : _var(var)
94
2
        , _var_op(var->op())
95
2
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
2
        , _sampler(var->get_sampler())
97
2
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
2
        _sampler->add_borrower();
102
2
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
2
    }
bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::WindowBase(bvar::PassiveStatus<long>*, long)
Line
Count
Source
93
2
        : _var(var)
94
2
        , _var_op(var->op())
95
2
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
2
        , _sampler(var->get_sampler())
97
2
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
2
        _sampler->add_borrower();
102
2
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
2
    }
bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::WindowBase(bvar::IntRecorder*, long)
Line
Count
Source
93
2
        : _var(var)
94
2
        , _var_op(var->op())
95
2
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
2
        , _sampler(var->get_sampler())
97
2
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
2
        _sampler->add_borrower();
102
2
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
2
    }
bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Maxer<long, void>*, long)
Line
Count
Source
93
2
        : _var(var)
94
2
        , _var_op(var->op())
95
2
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
2
        , _sampler(var->get_sampler())
97
2
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
2
        _sampler->add_borrower();
102
2
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
2
    }
bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::WindowBase(bvar::detail::Percentile*, long)
Line
Count
Source
93
2
        : _var(var)
94
2
        , _var_op(var->op())
95
2
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
2
        , _sampler(var->get_sampler())
97
2
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
2
        _sampler->add_borrower();
102
2
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
2
    }
bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Adder<long, void>*, long)
Line
Count
Source
93
18
        : _var(var)
94
18
        , _var_op(var->op())
95
18
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
18
        , _sampler(var->get_sampler())
97
18
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
18
        _sampler->add_borrower();
102
18
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
18
    }
bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Adder<int, void>*, long)
Line
Count
Source
93
9
        : _var(var)
94
9
        , _var_op(var->op())
95
9
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
96
9
        , _sampler(var->get_sampler())
97
9
        , _series_sampler(nullptr) {
98
        // Tell the borrowed sampler about us, so that destructing `var` before
99
        // this Window is detected and reported instead of silently leaving
100
        // `_sampler' dangling. See Sampler::add_borrower().
101
9
        _sampler->add_borrower();
102
9
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
103
9
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Adder<unsigned long, void>*, long)
104
    
105
0
    ~WindowBase() override {
106
0
        hide();
107
0
        if (_series_sampler) {
108
0
            _series_sampler->destroy();
109
0
            _series_sampler = nullptr;
110
0
        }
111
        // Safe even if `var` was destructed first: in that case destroy() marked
112
        // the sampler as leaked, so it was not deleted by the sampling thread.
113
0
        _sampler->remove_borrower();
114
0
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::~WindowBase()
115
116
0
    bool get_span(time_t window_size, Sample<value_type>* result) const {
117
0
        return _sampler->get_value(window_size, result);
118
0
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<bvar::Stat>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<long>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<bvar::detail::PercentileSamples<254ul> >*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<double>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<unsigned long>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<long>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<int>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<long>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<unsigned long>*) const
119
120
0
    bool get_span(Sample<value_type>* result) const {
121
0
        return get_span(_window_size, result);
122
0
    }
123
124
0
    virtual value_type get_value(time_t window_size) const {
125
0
        Sample<value_type> tmp;
126
0
        if (get_span(window_size, &tmp)) {
127
0
            return tmp.data;
128
0
        }
129
0
        return value_type();
130
0
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::get_value(long) const
131
132
0
    value_type get_value() const { return get_value(_window_size); }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::get_value() const
133
    
134
0
    void describe(std::ostream& os, bool quote_string) const override {
135
0
        if (butil::is_same<value_type, std::string>::value && quote_string) {
136
0
            os << '"' << get_value() << '"';
137
0
        } else {
138
0
            os << get_value();
139
0
        }
140
0
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
141
    
142
#ifdef BAIDU_INTERNAL
143
    void get_value(boost::any* value) const override { *value = get_value(); }
144
#endif
145
146
0
    time_t window_size() const { return _window_size; }
147
148
0
    int describe_series(std::ostream& os, const SeriesOptions& options) const override {
149
0
        if (_series_sampler == nullptr) {
150
0
            return 1;
151
0
        }
152
0
        if (!options.test_only) {
153
0
            _series_sampler->describe(os);
154
0
        }
155
0
        return 0;
156
0
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
157
158
0
    void get_samples(std::vector<value_type> *samples) const {
159
0
        samples->clear();
160
0
        samples->reserve(_window_size);
161
0
        return _sampler->get_samples(samples, _window_size);
162
0
    }
163
164
protected:
165
    int expose_impl(const butil::StringPiece& prefix,
166
                    const butil::StringPiece& name,
167
38
                    DisplayFilter display_filter) override {
168
38
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
38
        if (rc == 0 &&
170
38
            _series_sampler == nullptr &&
171
38
            FLAGS_save_series) {
172
38
            _series_sampler = new SeriesSampler(this, _var_op);
173
38
            _series_sampler->schedule();
174
38
        }
175
38
        return rc;
176
38
    }
bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
167
2
                    DisplayFilter display_filter) override {
168
2
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
2
        if (rc == 0 &&
170
2
            _series_sampler == nullptr &&
171
2
            FLAGS_save_series) {
172
2
            _series_sampler = new SeriesSampler(this, _var_op);
173
2
            _series_sampler->schedule();
174
2
        }
175
2
        return rc;
176
2
    }
bvar::detail::WindowBase<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
167
2
                    DisplayFilter display_filter) override {
168
2
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
2
        if (rc == 0 &&
170
2
            _series_sampler == nullptr &&
171
2
            FLAGS_save_series) {
172
2
            _series_sampler = new SeriesSampler(this, _var_op);
173
2
            _series_sampler->schedule();
174
2
        }
175
2
        return rc;
176
2
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
167
3
                    DisplayFilter display_filter) override {
168
3
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
3
        if (rc == 0 &&
170
3
            _series_sampler == nullptr &&
171
3
            FLAGS_save_series) {
172
3
            _series_sampler = new SeriesSampler(this, _var_op);
173
3
            _series_sampler->schedule();
174
3
        }
175
3
        return rc;
176
3
    }
bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
167
2
                    DisplayFilter display_filter) override {
168
2
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
2
        if (rc == 0 &&
170
2
            _series_sampler == nullptr &&
171
2
            FLAGS_save_series) {
172
2
            _series_sampler = new SeriesSampler(this, _var_op);
173
2
            _series_sampler->schedule();
174
2
        }
175
2
        return rc;
176
2
    }
bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
167
2
                    DisplayFilter display_filter) override {
168
2
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
2
        if (rc == 0 &&
170
2
            _series_sampler == nullptr &&
171
2
            FLAGS_save_series) {
172
2
            _series_sampler = new SeriesSampler(this, _var_op);
173
2
            _series_sampler->schedule();
174
2
        }
175
2
        return rc;
176
2
    }
bvar::detail::WindowBase<bvar::Adder<int, void>, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
167
9
                    DisplayFilter display_filter) override {
168
9
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
9
        if (rc == 0 &&
170
9
            _series_sampler == nullptr &&
171
9
            FLAGS_save_series) {
172
9
            _series_sampler = new SeriesSampler(this, _var_op);
173
9
            _series_sampler->schedule();
174
9
        }
175
9
        return rc;
176
9
    }
bvar::detail::WindowBase<bvar::Adder<long, void>, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
167
18
                    DisplayFilter display_filter) override {
168
18
        const int rc = Variable::expose_impl(prefix, name, display_filter);
169
18
        if (rc == 0 &&
170
18
            _series_sampler == nullptr &&
171
18
            FLAGS_save_series) {
172
18
            _series_sampler = new SeriesSampler(this, _var_op);
173
18
            _series_sampler->schedule();
174
18
        }
175
18
        return rc;
176
18
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long, void>, (bvar::SeriesFrequency)1>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
177
178
    // NOTE: `_var` is only dereferenced in the ctor (get_sampler()/op()). Do NOT
179
    // dereference it afterwards: the user may have destructed it already if this
180
    // Window outlives it (see the contract in comments of Window below).
181
    R* _var;
182
    var_op_type _var_op;
183
    time_t _window_size;
184
    sampler_type* _sampler;
185
    SeriesSampler* _series_sampler;
186
};
187
188
}  // namespace detail
189
190
// Get data within a time window.
191
// The time unit is 1 second fixed.
192
// Window relies on other bvar which should be constructed before this window
193
// and destructs after this window.
194
195
// R must:
196
// - have get_sampler() (not require thread-safe)
197
// - defined value_type and sampler_type
198
template <typename R, SeriesFrequency series_freq = SERIES_IN_WINDOW>
199
class Window : public detail::WindowBase<R, series_freq> {
200
    typedef detail::WindowBase<R, series_freq> Base;
201
    typedef typename R::value_type value_type;
202
    typedef typename R::sampler_type sampler_type;
203
public:
204
    // Different from PerSecond, we require window_size here because get_value
205
    // of Window is largely affected by window_size while PerSecond is not.
206
6
    Window(R* var, time_t window_size) : Base(var, window_size) {}
bvar::Window<bvar::IntRecorder, (bvar::SeriesFrequency)1>::Window(bvar::IntRecorder*, long)
Line
Count
Source
206
2
    Window(R* var, time_t window_size) : Base(var, window_size) {}
bvar::Window<bvar::Maxer<long, void>, (bvar::SeriesFrequency)1>::Window(bvar::Maxer<long, void>*, long)
Line
Count
Source
206
2
    Window(R* var, time_t window_size) : Base(var, window_size) {}
bvar::Window<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::Window(bvar::detail::Percentile*, long)
Line
Count
Source
206
2
    Window(R* var, time_t window_size) : Base(var, window_size) {}
207
    Window(const butil::StringPiece& name, R* var, time_t window_size)
208
        : Base(var, window_size) {
209
        this->expose(name);
210
    }
211
    Window(const butil::StringPiece& prefix,
212
           const butil::StringPiece& name, R* var, time_t window_size)
213
        : Base(var, window_size) {
214
        this->expose_as(prefix, name);
215
    }
216
};
217
218
// Get data per second within a time window.
219
// The only difference between PerSecond and Window is that PerSecond divides
220
// the data by time duration.
221
template <typename R>
222
class PerSecond : public detail::WindowBase<R, SERIES_IN_SECOND> {
223
    typedef detail::WindowBase<R, SERIES_IN_SECOND> Base;
224
    typedef typename R::value_type value_type;
225
    typedef typename R::sampler_type sampler_type;
226
public:
227
    // If window_size is non-positive or absent, use FLAGS_bvar_dump_interval.
228
5
    PerSecond(R* var) : Base(var, -1) {}
bvar::PerSecond<bvar::PassiveStatus<unsigned long> >::PerSecond(bvar::PassiveStatus<unsigned long>*)
Line
Count
Source
228
2
    PerSecond(R* var) : Base(var, -1) {}
bvar::PerSecond<bvar::PassiveStatus<double> >::PerSecond(bvar::PassiveStatus<double>*)
Line
Count
Source
228
1
    PerSecond(R* var) : Base(var, -1) {}
bvar::PerSecond<bvar::PassiveStatus<long> >::PerSecond(bvar::PassiveStatus<long>*)
Line
Count
Source
228
2
    PerSecond(R* var) : Base(var, -1) {}
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<long, void> >::PerSecond(bvar::Adder<long, void>*)
229
1
    PerSecond(R* var, time_t window_size) : Base(var, window_size) {}
230
27
    PerSecond(const butil::StringPiece& name, R* var) : Base(var, -1) {
231
27
        this->expose(name);
232
27
    }
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<double> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::PassiveStatus<double>*)
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<long> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::PassiveStatus<long>*)
bvar::PerSecond<bvar::Adder<int, void> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::Adder<int, void>*)
Line
Count
Source
230
9
    PerSecond(const butil::StringPiece& name, R* var) : Base(var, -1) {
231
9
        this->expose(name);
232
9
    }
bvar::PerSecond<bvar::Adder<long, void> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::Adder<long, void>*)
Line
Count
Source
230
18
    PerSecond(const butil::StringPiece& name, R* var) : Base(var, -1) {
231
18
        this->expose(name);
232
18
    }
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<unsigned long, void> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::Adder<unsigned long, void>*)
233
    PerSecond(const butil::StringPiece& name, R* var, time_t window_size)
234
0
        : Base(var, window_size) {
235
0
        this->expose(name);
236
0
    }
237
    PerSecond(const butil::StringPiece& prefix,
238
              const butil::StringPiece& name, R* var)
239
        : Base(var, -1) {
240
        this->expose_as(prefix, name);
241
    }
242
    PerSecond(const butil::StringPiece& prefix,
243
              const butil::StringPiece& name, R* var, time_t window_size)
244
1
        : Base(var, window_size) {
245
1
        this->expose_as(prefix, name);
246
1
    }
247
248
0
    value_type get_value(time_t window_size) const override {
249
0
        detail::Sample<value_type> s;
250
0
        this->get_span(window_size, &s);
251
        // We may test if the multiplication overflows and use integral ops
252
        // if possible. However signed/unsigned 32-bit/64-bit make the solution
253
        // complex. Since this function is not called often, we use floating
254
        // point for simplicity.
255
0
        if (s.time_us <= 0) {
256
0
            return static_cast<value_type>(0);
257
0
        }
258
0
        if (butil::is_floating_point<value_type>::value) {
259
0
            return static_cast<value_type>(s.data * 1000000.0 / s.time_us);
260
0
        } else {
261
0
            return static_cast<value_type>(round(s.data * 1000000.0 / s.time_us));
262
0
        }
263
0
    }
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<double> >::get_value(long) const
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<unsigned long> >::get_value(long) const
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<long> >::get_value(long) const
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<int, void> >::get_value(long) const
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<long, void> >::get_value(long) const
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<unsigned long, void> >::get_value(long) const
264
265
    value_type get_value() const { return Base::get_value(); }
266
};
267
268
namespace adapter {
269
270
template <typename R>
271
class WindowExType {
272
public:
273
    typedef R var_type;
274
    typedef bvar::Window<var_type > window_type;
275
    typedef typename R::value_type value_type;
276
    struct WindowExVar {
277
        WindowExVar(time_t window_size) : window(&var, window_size) {}
278
        var_type var;
279
        window_type window;
280
    };
281
};
282
283
template <typename R>
284
class PerSecondExType {
285
public:
286
    typedef R var_type;
287
    typedef bvar::PerSecond<var_type > window_type;
288
    typedef typename R::value_type value_type;
289
    struct WindowExVar {
290
        WindowExVar(time_t window_size) : window(&var, window_size) {}
291
        var_type var;
292
        window_type window;
293
    };
294
};
295
296
template <typename R, typename WindowType>
297
class WindowExAdapter : public Variable{
298
public:
299
    typedef typename R::value_type value_type;
300
    typedef typename WindowType::WindowExVar WindowExVar;
301
302
    WindowExAdapter(time_t window_size)
303
        : _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
304
        , _window_ex_var(_window_size) {
305
    }
306
307
    value_type get_value() const {
308
        return _window_ex_var.window.get_value();
309
    }
310
311
    template <typename ANT_TYPE>
312
    WindowExAdapter& operator<<(ANT_TYPE value) {
313
        _window_ex_var.var << value;
314
        return *this;
315
    }
316
317
    void describe(std::ostream& os, bool quote_string) const override {
318
        if (butil::is_same<value_type, std::string>::value && quote_string) {
319
            os << '"' << get_value() << '"';
320
        } else {
321
            os << get_value();
322
        }
323
    }
324
325
    ~WindowExAdapter() override {
326
        hide();
327
    }
328
329
private:
330
    time_t      _window_size;
331
    WindowExVar _window_ex_var;
332
};
333
334
}  // namespace adapter
335
336
// Get data within a time window.
337
// The time unit is 1 second fixed.
338
// Window not relies on other bvar.
339
340
// R must:
341
// - window_size must be a constant
342
template <typename R, time_t window_size = 0>
343
class WindowEx : public adapter::WindowExAdapter<R, adapter::WindowExType<R> > {
344
public:
345
    typedef adapter::WindowExAdapter<R, adapter::WindowExType<R> > Base;
346
347
    WindowEx() : Base(window_size) {}
348
349
    WindowEx(const butil::StringPiece& name) : Base(window_size) {
350
        this->expose(name);
351
    }
352
353
    WindowEx(const butil::StringPiece& prefix,
354
             const butil::StringPiece& name)
355
        : Base(window_size) {
356
        this->expose_as(prefix, name);
357
    }
358
};
359
360
// Get data per second within a time window.
361
// The only difference between PerSecondEx and WindowEx is that PerSecondEx divides
362
// the data by time duration.
363
364
// R must:
365
// - window_size must be a constant
366
template <typename R, time_t window_size = 0>
367
class PerSecondEx : public adapter::WindowExAdapter<R, adapter::PerSecondExType<R> > {
368
public:
369
    typedef adapter::WindowExAdapter<R, adapter::PerSecondExType<R> > Base;
370
371
    PerSecondEx() : Base(window_size) {}
372
373
    PerSecondEx(const butil::StringPiece& name) : Base(window_size) {
374
        this->expose(name);
375
    }
376
377
    PerSecondEx(const butil::StringPiece& prefix,
378
                const butil::StringPiece& name)
379
        : Base(window_size) {
380
        this->expose_as(prefix, name);
381
    }
382
};
383
384
}  // namespace bvar
385
386
#endif  //BVAR_WINDOW_H