/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 |