Coverage Report

Created: 2025-09-17 06:57

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 <gflags/gflags_declare.h>
26
#include "butil/logging.h"                         // LOG
27
#include "bvar/detail/sampler.h"
28
#include "bvar/detail/series.h"
29
#include "bvar/variable.h"
30
31
namespace bvar {
32
33
DECLARE_int32(bvar_dump_interval);
34
35
enum SeriesFrequency {
36
    SERIES_IN_WINDOW = 0,
37
    SERIES_IN_SECOND = 1
38
};
39
40
namespace detail {
41
// Just for constructor reusing of Window<>
42
template <typename R, SeriesFrequency series_freq>
43
class WindowBase : public Variable {
44
public:
45
    typedef typename R::value_type value_type;
46
    typedef typename R::sampler_type sampler_type;
47
48
    class SeriesSampler : public detail::Sampler {
49
    public:
50
        struct Op {
51
0
            explicit Op(R* var) : _var(var) {}
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::PassiveStatus<double>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::PassiveStatus<unsigned long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::Adder<long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::Adder<int>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::PassiveStatus<long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::detail::Percentile*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::Maxer<long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::IntRecorder*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::Op(bvar::Adder<unsigned long>*)
52
0
            void operator()(value_type& v1, const value_type& v2) const {
53
0
                _var->op()(v1, v2);
54
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>, (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::Adder<int>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(int&, int const&) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(long&, long 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<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::Op::operator()(unsigned long&, unsigned long const&) const
55
        private:
56
            R* _var;
57
        };
58
        SeriesSampler(WindowBase* owner, R* var)
59
0
            : _owner(owner), _series(Op(var)) {}
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>*, bvar::PassiveStatus<double>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>*, bvar::PassiveStatus<unsigned long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Adder<long>, (bvar::SeriesFrequency)1>*, bvar::Adder<long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Adder<int>, (bvar::SeriesFrequency)1>*, bvar::Adder<int>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>*, bvar::PassiveStatus<long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>*, bvar::detail::Percentile*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Maxer<long>, (bvar::SeriesFrequency)1>*, bvar::Maxer<long>*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>*, bvar::IntRecorder*)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::SeriesSampler(bvar::detail::WindowBase<bvar::Adder<unsigned long>, (bvar::SeriesFrequency)1>*, bvar::Adder<unsigned long>*)
60
0
        ~SeriesSampler() {}
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::Adder<long>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int>, (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>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::~SeriesSampler()
61
0
        void take_sample() override {
62
0
            if (series_freq == SERIES_IN_SECOND) {
63
                // Get one-second window value for PerSecond<>, otherwise the
64
                // "smoother" plot may hide peaks.
65
0
                _series.append(_owner->get_value(1));
66
0
            } else {
67
                // Get the value inside the full window. "get_value(1)" is 
68
                // incorrect when users intend to see aggregated values of
69
                // the full window in the plot.
70
0
                _series.append(_owner->get_value());
71
0
            }
72
0
        }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long>, (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::Adder<int>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (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<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::take_sample()
73
0
        void describe(std::ostream& os) { _series.describe(os, NULL); }
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>, (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::Adder<int>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (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<unsigned long>, (bvar::SeriesFrequency)1>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
74
    private:
75
        WindowBase* _owner;
76
        detail::Series<value_type, Op> _series;
77
    };
78
    
79
    WindowBase(R* var, time_t window_size)
80
0
        : _var(var)
81
0
        , _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
82
0
        , _sampler(var->get_sampler())
83
0
        , _series_sampler(NULL) {
84
0
        CHECK_EQ(0, _sampler->set_window_size(_window_size));
85
0
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<double>, (bvar::SeriesFrequency)1>::WindowBase(bvar::PassiveStatus<double>*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<unsigned long>, (bvar::SeriesFrequency)1>::WindowBase(bvar::PassiveStatus<unsigned long>*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Adder<long>*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Adder<int>*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::PassiveStatus<long>, (bvar::SeriesFrequency)1>::WindowBase(bvar::PassiveStatus<long>*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::WindowBase(bvar::IntRecorder*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Maxer<long>*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::WindowBase(bvar::detail::Percentile*, long)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long>, (bvar::SeriesFrequency)1>::WindowBase(bvar::Adder<unsigned long>*, long)
86
    
87
0
    ~WindowBase() {
88
0
        hide();
89
0
        if (_series_sampler) {
90
0
            _series_sampler->destroy();
91
0
            _series_sampler = NULL;
92
0
        }
93
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::Adder<long>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int>, (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>, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::~WindowBase()
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<unsigned long>, (bvar::SeriesFrequency)1>::~WindowBase()
94
95
0
    bool get_span(time_t window_size, detail::Sample<value_type>* result) const {
96
0
        return _sampler->get_value(window_size, result);
97
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::Adder<int>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<int>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<long>*) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long>, (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<unsigned long>, (bvar::SeriesFrequency)1>::get_span(long, bvar::detail::Sample<unsigned long>*) const
98
99
0
    bool get_span(detail::Sample<value_type>* result) const {
100
0
        return get_span(_window_size, result);
101
0
    }
102
103
0
    virtual value_type get_value(time_t window_size) const {
104
0
        detail::Sample<value_type> tmp;
105
0
        if (get_span(window_size, &tmp)) {
106
0
            return tmp.data;
107
0
        }
108
0
        return value_type();
109
0
    }
Unexecuted instantiation: bvar::detail::WindowBase<bvar::IntRecorder, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (bvar::SeriesFrequency)1>::get_value(long) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<long>, (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<unsigned long>, (bvar::SeriesFrequency)1>::get_value(long) const
110
111
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>, (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::Adder<int>, (bvar::SeriesFrequency)1>::get_value() const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (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<unsigned long>, (bvar::SeriesFrequency)1>::get_value() const
112
    
113
0
    void describe(std::ostream& os, bool quote_string) const override {
114
0
        if (butil::is_same<value_type, std::string>::value && quote_string) {
115
0
            os << '"' << get_value() << '"';
116
0
        } else {
117
0
            os << get_value();
118
0
        }
119
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>, (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::Adder<int>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<long>, (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<unsigned long>, (bvar::SeriesFrequency)1>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
120
    
121
#ifdef BAIDU_INTERNAL
122
    void get_value(boost::any* value) const override { *value = get_value(); }
123
#endif
124
125
0
    time_t window_size() const { return _window_size; }
126
127
0
    int describe_series(std::ostream& os, const SeriesOptions& options) const override {
128
0
        if (_series_sampler == NULL) {
129
0
            return 1;
130
0
        }
131
0
        if (!options.test_only) {
132
0
            _series_sampler->describe(os);
133
0
        }
134
0
        return 0;
135
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>, (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::Adder<int>, (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>, (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<unsigned long>, (bvar::SeriesFrequency)1>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
136
137
0
    void get_samples(std::vector<value_type> *samples) const {
138
0
        samples->clear();
139
0
        samples->reserve(_window_size);
140
0
        return _sampler->get_samples(samples, _window_size);
141
0
    }
142
143
protected:
144
    int expose_impl(const butil::StringPiece& prefix,
145
                    const butil::StringPiece& name,
146
0
                    DisplayFilter display_filter) override {
147
0
        const int rc = Variable::expose_impl(prefix, name, display_filter);
148
0
        if (rc == 0 &&
149
0
            _series_sampler == NULL &&
150
0
            FLAGS_save_series) {
151
0
            _series_sampler = new SeriesSampler(this, _var);
152
0
            _series_sampler->schedule();
153
0
        }
154
0
        return rc;
155
0
    }
Unexecuted instantiation: 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)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Maxer<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)
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)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<int>, (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)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<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)
Unexecuted instantiation: 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)
Unexecuted instantiation: 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)
Unexecuted instantiation: 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)
Unexecuted instantiation: bvar::detail::WindowBase<bvar::Adder<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)
156
157
    R* _var;
158
    time_t _window_size;
159
    sampler_type* _sampler;
160
    SeriesSampler* _series_sampler;
161
};
162
163
}  // namespace detail
164
165
// Get data within a time window.
166
// The time unit is 1 second fixed.
167
// Window relies on other bvar which should be constructed before this window
168
// and destructs after this window.
169
170
// R must:
171
// - have get_sampler() (not require thread-safe)
172
// - defined value_type and sampler_type
173
template <typename R, SeriesFrequency series_freq = SERIES_IN_WINDOW>
174
class Window : public detail::WindowBase<R, series_freq> {
175
    typedef detail::WindowBase<R, series_freq> Base;
176
    typedef typename R::value_type value_type;
177
    typedef typename R::sampler_type sampler_type;
178
public:
179
    // Different from PerSecond, we require window_size here because get_value
180
    // of Window is largely affected by window_size while PerSecond is not.
181
0
    Window(R* var, time_t window_size) : Base(var, window_size) {}
Unexecuted instantiation: bvar::Window<bvar::IntRecorder, (bvar::SeriesFrequency)1>::Window(bvar::IntRecorder*, long)
Unexecuted instantiation: bvar::Window<bvar::Maxer<long>, (bvar::SeriesFrequency)1>::Window(bvar::Maxer<long>*, long)
Unexecuted instantiation: bvar::Window<bvar::detail::Percentile, (bvar::SeriesFrequency)1>::Window(bvar::detail::Percentile*, long)
182
    Window(const butil::StringPiece& name, R* var, time_t window_size)
183
        : Base(var, window_size) {
184
        this->expose(name);
185
    }
186
    Window(const butil::StringPiece& prefix,
187
           const butil::StringPiece& name, R* var, time_t window_size)
188
        : Base(var, window_size) {
189
        this->expose_as(prefix, name);
190
    }
191
};
192
193
// Get data per second within a time window.
194
// The only difference between PerSecond and Window is that PerSecond divides
195
// the data by time duration.
196
template <typename R>
197
class PerSecond : public detail::WindowBase<R, SERIES_IN_SECOND> {
198
    typedef detail::WindowBase<R, SERIES_IN_SECOND> Base;
199
    typedef typename R::value_type value_type;
200
    typedef typename R::sampler_type sampler_type;
201
public:
202
    // If window_size is non-positive or absent, use FLAGS_bvar_dump_interval.
203
0
    PerSecond(R* var) : Base(var, -1) {}
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<unsigned long> >::PerSecond(bvar::PassiveStatus<unsigned long>*)
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<double> >::PerSecond(bvar::PassiveStatus<double>*)
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<long> >::PerSecond(bvar::Adder<long>*)
Unexecuted instantiation: bvar::PerSecond<bvar::PassiveStatus<long> >::PerSecond(bvar::PassiveStatus<long>*)
204
0
    PerSecond(R* var, time_t window_size) : Base(var, window_size) {}
205
0
    PerSecond(const butil::StringPiece& name, R* var) : Base(var, -1) {
206
0
        this->expose(name);
207
0
    }
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<int> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::Adder<int>*)
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<long> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::Adder<long>*)
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>*)
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<unsigned long> >::PerSecond(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::Adder<unsigned long>*)
208
    PerSecond(const butil::StringPiece& name, R* var, time_t window_size)
209
0
        : Base(var, window_size) {
210
0
        this->expose(name);
211
0
    }
212
    PerSecond(const butil::StringPiece& prefix,
213
              const butil::StringPiece& name, R* var)
214
        : Base(var, -1) {
215
        this->expose_as(prefix, name);
216
    }
217
    PerSecond(const butil::StringPiece& prefix,
218
              const butil::StringPiece& name, R* var, time_t window_size)
219
0
        : Base(var, window_size) {
220
0
        this->expose_as(prefix, name);
221
0
    }
222
223
0
    value_type get_value(time_t window_size) const override {
224
0
        detail::Sample<value_type> s;
225
0
        this->get_span(window_size, &s);
226
        // We may test if the multiplication overflows and use integral ops
227
        // if possible. However signed/unsigned 32-bit/64-bit make the solution
228
        // complex. Since this function is not called often, we use floating
229
        // point for simplicity.
230
0
        if (s.time_us <= 0) {
231
0
            return static_cast<value_type>(0);
232
0
        }
233
0
        if (butil::is_floating_point<value_type>::value) {
234
0
            return static_cast<value_type>(s.data * 1000000.0 / s.time_us);
235
0
        } else {
236
0
            return static_cast<value_type>(round(s.data * 1000000.0 / s.time_us));
237
0
        }
238
0
    }
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<int> >::get_value(long) const
Unexecuted instantiation: bvar::PerSecond<bvar::Adder<long> >::get_value(long) const
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<unsigned long> >::get_value(long) const
239
240
    value_type get_value() const { return Base::get_value(); }
241
};
242
243
namespace adapter {
244
245
template <typename R>
246
class WindowExType {
247
public:
248
    typedef R var_type;
249
    typedef bvar::Window<var_type > window_type;
250
    typedef typename R::value_type value_type;
251
    struct WindowExVar {
252
        WindowExVar(time_t window_size) : window(&var, window_size) {}
253
        var_type var;
254
        window_type window;
255
    };
256
};
257
258
template <typename R>
259
class PerSecondExType {
260
public:
261
    typedef R var_type;
262
    typedef bvar::PerSecond<var_type > window_type;
263
    typedef typename R::value_type value_type;
264
    struct WindowExVar {
265
        WindowExVar(time_t window_size) : window(&var, window_size) {}
266
        var_type var;
267
        window_type window;
268
    };
269
};
270
271
template <typename R, typename WindowType>
272
class WindowExAdapter : public Variable{
273
public:
274
    typedef typename R::value_type value_type;
275
    typedef typename WindowType::WindowExVar WindowExVar;
276
277
    WindowExAdapter(time_t window_size)
278
        : _window_size(window_size > 0 ? window_size : FLAGS_bvar_dump_interval)
279
        , _window_ex_var(_window_size) {
280
    }
281
282
    value_type get_value() const {
283
        return _window_ex_var.window.get_value();
284
    }
285
286
    template <typename ANT_TYPE>
287
    WindowExAdapter& operator<<(ANT_TYPE value) {
288
        _window_ex_var.var << value;
289
        return *this;
290
    }
291
292
    // Implement Variable::describe()
293
    void describe(std::ostream& os, bool quote_string) const {
294
        if (butil::is_same<value_type, std::string>::value && quote_string) {
295
            os << '"' << get_value() << '"';
296
        } else {
297
            os << get_value();
298
        }
299
    }
300
301
    virtual ~WindowExAdapter() {
302
        hide();
303
    }
304
305
private:
306
    time_t      _window_size;
307
    WindowExVar _window_ex_var;
308
};
309
310
}  // namespace adapter
311
312
// Get data within a time window.
313
// The time unit is 1 second fixed.
314
// Window not relies on other bvar.
315
316
// R must:
317
// - window_size must be a constant
318
template <typename R, time_t window_size = 0>
319
class WindowEx : public adapter::WindowExAdapter<R, adapter::WindowExType<R> > {
320
public:
321
    typedef adapter::WindowExAdapter<R, adapter::WindowExType<R> > Base;
322
323
    WindowEx() : Base(window_size) {}
324
325
    WindowEx(const butil::StringPiece& name) : Base(window_size) {
326
        this->expose(name);
327
    }
328
329
    WindowEx(const butil::StringPiece& prefix,
330
             const butil::StringPiece& name)
331
        : Base(window_size) {
332
        this->expose_as(prefix, name);
333
    }
334
};
335
336
// Get data per second within a time window.
337
// The only difference between PerSecondEx and WindowEx is that PerSecondEx divides
338
// the data by time duration.
339
340
// R must:
341
// - window_size must be a constant
342
template <typename R, time_t window_size = 0>
343
class PerSecondEx : public adapter::WindowExAdapter<R, adapter::PerSecondExType<R> > {
344
public:
345
    typedef adapter::WindowExAdapter<R, adapter::PerSecondExType<R> > Base;
346
347
    PerSecondEx() : Base(window_size) {}
348
349
    PerSecondEx(const butil::StringPiece& name) : Base(window_size) {
350
        this->expose(name);
351
    }
352
353
    PerSecondEx(const butil::StringPiece& prefix,
354
                const butil::StringPiece& name)
355
        : Base(window_size) {
356
        this->expose_as(prefix, name);
357
    }
358
};
359
360
}  // namespace bvar
361
362
#endif  //BVAR_WINDOW_H