RTC Toolkit 6.0.0
Loading...
Searching...
No Matches
bufferMonitor.hpp
Go to the documentation of this file.
1
11#ifndef RTCTK_COMPONENTFRAMEWORK_BUFFERMONITOR_HPP
12#define RTCTK_COMPONENTFRAMEWORK_BUFFERMONITOR_HPP
13
14#include <boost/accumulators/accumulators.hpp>
15#include <boost/accumulators/statistics/count.hpp>
16#include <boost/accumulators/statistics/max.hpp>
17#include <boost/accumulators/statistics/mean.hpp>
18#include <boost/accumulators/statistics/min.hpp>
19#include <boost/accumulators/statistics/stats.hpp>
21
22#include <chrono>
23#include <string>
25
26namespace ba = boost::accumulators;
27
35template <typename ClockType = std::chrono::steady_clock>
37public:
46 const std::string& desc,
47 const std::string& prefix = "")
48 : m_start_time(ClockType::now()), m_accumulator{} {
49 std::string path;
50 if (prefix == "") {
51 path = "buffer_occupancy";
52 } else {
53 path = prefix + "/buffer_occupancy";
54 }
55
56 const InfluxTagMap base_tags = {{"prefix", prefix}};
57
58 m_pc_occupancy_min_reg =
59 metrics.AddCounter(&m_pc_occupancy_min,
60 CounterMetricInfo(path + "/min",
61 desc + ", min [%]",
62 base_tags.Extend({"aggregation", "min"}),
63 "buffer_occupancy",
65
66 m_pc_occupancy_mean_reg =
67 metrics.AddCounter(&m_pc_occupancy_mean,
68 CounterMetricInfo(path + "/mean",
69 desc + ", mean [%]",
70 base_tags.Extend({"aggregation", "mean"}),
71 "buffer_occupancy",
73
74 m_pc_occupancy_max_reg =
75 metrics.AddCounter(&m_pc_occupancy_max,
76 CounterMetricInfo(path + "/max",
77 desc + ", max [%]",
78 base_tags.Extend({"aggregation", "max"}),
79 "buffer_occupancy",
81
82 m_pc_occupancy_global_max_reg =
83 metrics.AddCounter(&m_pc_occupancy_global_max,
84 CounterMetricInfo(path + "/global_max",
85 desc + ", global max [%]",
86 base_tags.Extend({"aggregation", "global_max"}),
87 "buffer_occupancy",
89 }
90
102 inline void Tick(size_t elements, size_t capacity) noexcept {
103 using namespace std::chrono_literals;
104
105 auto now_time = ClockType::now();
106 auto elapsed_time = now_time - m_start_time;
107 if (elapsed_time > 10s and ba::count(m_accumulator) > 0) {
108 m_start_time = now_time;
109
110 m_pc_occupancy_min.Store(ba::min(m_accumulator));
111 m_pc_occupancy_max.Store(ba::max(m_accumulator));
112 m_pc_occupancy_mean.Store(ba::mean(m_accumulator));
113 m_pc_occupancy_global_max.Store(
114 std::max(m_pc_occupancy_max.Load(), m_pc_occupancy_global_max.Load()));
115
116 m_accumulator = {};
117 }
118
119 size_t occupancy = 100.0 * static_cast<double>(elements) / capacity;
120 m_accumulator(occupancy);
121 }
122
123 struct Result {
124 size_t min; // [%]
125 size_t mean; // [%]
126 size_t max; // [%]
127 size_t global_max; // [%]
128 };
129
140 Result GetValue() const {
141 Result res;
142 res.min = m_pc_occupancy_min.Load();
143 res.mean = m_pc_occupancy_mean.Load();
144 res.max = m_pc_occupancy_max.Load();
145 res.global_max = m_pc_occupancy_global_max.Load();
146 return res;
147 }
148
154 void Reset() {
155 m_accumulator = {};
156 m_pc_occupancy_min.Store(0);
157 m_pc_occupancy_mean.Store(0);
158 m_pc_occupancy_max.Store(0);
159 m_pc_occupancy_global_max.Store(0);
160 }
161
162private:
163 typename ClockType::time_point m_start_time;
164
165 ba::accumulator_set<double,
166 ba::stats<ba::tag::mean, ba::tag::min, ba::tag::max, ba::tag::count>>
167 m_accumulator;
168
169 perfc::CounterDouble m_pc_occupancy_min;
170 perfc::ScopedRegistration m_pc_occupancy_min_reg;
171
172 perfc::CounterDouble m_pc_occupancy_max;
173 perfc::ScopedRegistration m_pc_occupancy_max_reg;
174
175 perfc::CounterDouble m_pc_occupancy_global_max;
176 perfc::ScopedRegistration m_pc_occupancy_global_max_reg;
177
178 perfc::CounterDouble m_pc_occupancy_mean;
179 perfc::ScopedRegistration m_pc_occupancy_mean_reg;
180};
181
182} // namespace rtctk::componentFramework
183
184#endif // RTCTK_COMPONENTFRAMEWORK_BUFFERMONITOR_HPP
Result GetValue() const
Method to get the measured durations in microseconds.
Definition bufferMonitor.hpp:140
void Reset()
Method to reset the monitor.
Definition bufferMonitor.hpp:154
BufferMonitor(ComponentMetricsIf &metrics, const std::string &desc, const std::string &prefix="")
Construct instance.
Definition bufferMonitor.hpp:45
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:102
Component metrics interface.
Definition componentMetricsIf.hpp:163
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:48
Helper class for passing tags in Telegraf.
Definition influxTagMap.hpp:26
InfluxTagMap Extend(const std::string &key, const std::string &value) const
Definition influxTagMap.cpp:26
Header file for ComponentMetricsIf.
Definition commandReplier.cpp:21
Definition bufferMonitor.hpp:123
size_t min
Definition bufferMonitor.hpp:124
size_t global_max
Definition bufferMonitor.hpp:127
size_t mean
Definition bufferMonitor.hpp:125
size_t max
Definition bufferMonitor.hpp:126
static constexpr std::string PERCENT
Definition componentMetricsIf.hpp:256