RTC Toolkit 6.0.0-pre2
Loading...
Searching...
No Matches
bufferMonitor.hpp
Go to the documentation of this file.
1
12#ifndef RTCTK_COMPONENTFRAMEWORK_BUFFERMONITOR_HPP
13#define RTCTK_COMPONENTFRAMEWORK_BUFFERMONITOR_HPP
14
15#include <boost/accumulators/accumulators.hpp>
16#include <boost/accumulators/statistics/count.hpp>
17#include <boost/accumulators/statistics/max.hpp>
18#include <boost/accumulators/statistics/mean.hpp>
19#include <boost/accumulators/statistics/min.hpp>
20#include <boost/accumulators/statistics/stats.hpp>
22
23#include <chrono>
24#include <string>
26
27namespace ba = boost::accumulators;
28
36template <typename ClockType = std::chrono::steady_clock>
38public:
47 const std::string& desc,
48 const std::string& prefix = "")
49 : m_start_time(ClockType::now()), m_accumulator{} {
50 std::string path;
51 if (prefix == "") {
52 path = "buffer_occupancy";
53 } else {
54 path = prefix + "/buffer_occupancy";
55 }
56
57 const InfluxTagMap base_tags = {
58 {"prefix", prefix}
59 };
60
61 m_pc_occupancy_min_reg = metrics.AddCounter(
62 &m_pc_occupancy_min, CounterMetricInfo(
63 path + "/min",
64 desc + ", min [%]",
65 base_tags.Extend({"aggregation", "min"}),
66 "buffer_occupancy",
68 )
69 );
70
71 m_pc_occupancy_mean_reg = metrics.AddCounter(
72 &m_pc_occupancy_mean, CounterMetricInfo(
73 path + "/mean",
74 desc + ", mean [%]",
75 base_tags.Extend({"aggregation", "mean"}),
76 "buffer_occupancy",
78 )
79 );
80
81 m_pc_occupancy_max_reg = metrics.AddCounter(
82 &m_pc_occupancy_max, CounterMetricInfo(
83 path + "/max",
84 desc + ", max [%]",
85 base_tags.Extend({"aggregation", "max"}),
86 "buffer_occupancy",
88 )
89 );
90
91 m_pc_occupancy_global_max_reg = metrics.AddCounter(
92 &m_pc_occupancy_global_max, CounterMetricInfo(
93 path + "/global_max",
94 desc + ", global max [%]",
95 base_tags.Extend({"aggregation", "global_max"}),
96 "buffer_occupancy",
98 )
99 );
100 }
101
113 inline void Tick(size_t elements, size_t capacity) noexcept {
114 using namespace std::chrono_literals;
115
116 auto now_time = ClockType::now();
117 auto elapsed_time = now_time - m_start_time;
118 if (elapsed_time > 10s and ba::count(m_accumulator) > 0) {
119 m_start_time = now_time;
120
121 m_pc_occupancy_min.Store(ba::min(m_accumulator));
122 m_pc_occupancy_max.Store(ba::max(m_accumulator));
123 m_pc_occupancy_mean.Store(ba::mean(m_accumulator));
124 m_pc_occupancy_global_max.Store(
125 std::max(m_pc_occupancy_max.Load(), m_pc_occupancy_global_max.Load()));
126
127 m_accumulator = {};
128 }
129
130 size_t occupancy = 100.0 * static_cast<double>(elements) / capacity;
131 m_accumulator(occupancy);
132 }
133
134 struct Result {
135 size_t min; // [%]
136 size_t mean; // [%]
137 size_t max; // [%]
138 size_t global_max; // [%]
139 };
140
151 Result GetValue() const {
152 Result res;
153 res.min = m_pc_occupancy_min.Load();
154 res.mean = m_pc_occupancy_mean.Load();
155 res.max = m_pc_occupancy_max.Load();
156 res.global_max = m_pc_occupancy_global_max.Load();
157 return res;
158 }
159
165 void Reset() {
166 m_accumulator = {};
167 m_pc_occupancy_min.Store(0);
168 m_pc_occupancy_mean.Store(0);
169 m_pc_occupancy_max.Store(0);
170 m_pc_occupancy_global_max.Store(0);
171 }
172
173private:
174 typename ClockType::time_point m_start_time;
175
176 ba::accumulator_set<double,
177 ba::stats<ba::tag::mean, ba::tag::min, ba::tag::max, ba::tag::count>>
178 m_accumulator;
179
180 perfc::CounterDouble m_pc_occupancy_min;
181 perfc::ScopedRegistration m_pc_occupancy_min_reg;
182
183 perfc::CounterDouble m_pc_occupancy_max;
184 perfc::ScopedRegistration m_pc_occupancy_max_reg;
185
186 perfc::CounterDouble m_pc_occupancy_global_max;
187 perfc::ScopedRegistration m_pc_occupancy_global_max_reg;
188
189 perfc::CounterDouble m_pc_occupancy_mean;
190 perfc::ScopedRegistration m_pc_occupancy_mean_reg;
191};
192
193} // namespace rtctk::componentFramework
194
195#endif // RTCTK_COMPONENTFRAMEWORK_BUFFERMONITOR_HPP
Result GetValue() const
Method to get the measured durations in microseconds.
Definition bufferMonitor.hpp:151
void Reset()
Method to reset the monitor.
Definition bufferMonitor.hpp:165
BufferMonitor(ComponentMetricsIf &metrics, const std::string &desc, const std::string &prefix="")
Construct instance.
Definition bufferMonitor.hpp:46
void Tick(size_t elements, size_t capacity) noexcept
Method to be called repeatedly from within the hot loop that should be measured.
Definition bufferMonitor.hpp:113
Component metrics interface.
Definition componentMetricsIf.hpp:164
virtual perfc::ScopedRegistration AddCounter(CounterVariant counter, CounterMetricInfo info)=0
Add a counter to be included in component metrics, identified by its address, together with info to t...
Defines auxiliary information associated with each counter registered with ComponentMetricsIf.
Definition componentMetricsIf.hpp:49
Helper class for passing tags in Telegraf.
Definition influxTagMap.hpp:27
InfluxTagMap Extend(const std::string &key, const std::string &value) const
Definition influxTagMap.cpp:26
Header file for ComponentMetricsIf.
Definition commandReplier.cpp:22
Definition bufferMonitor.hpp:134
size_t min
Definition bufferMonitor.hpp:135
size_t global_max
Definition bufferMonitor.hpp:138
size_t mean
Definition bufferMonitor.hpp:136
size_t max
Definition bufferMonitor.hpp:137
static constexpr std::string PERCENT
Definition componentMetricsIf.hpp:257