RTC Toolkit 4.0.1
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 std::string const& desc,
48 std::string const& 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 m_pc_occupancy_min_reg = metrics.AddCounter(
58 &m_pc_occupancy_min, CounterMetricInfo(path + "/min", desc + ", min [%]"));
59
60 m_pc_occupancy_mean_reg = metrics.AddCounter(
61 &m_pc_occupancy_mean, CounterMetricInfo(path + "/mean", desc + ", mean [%]"));
62
63 m_pc_occupancy_max_reg = metrics.AddCounter(
64 &m_pc_occupancy_max, CounterMetricInfo(path + "/max", desc + ", max [%]"));
65
66 m_pc_occupancy_global_max_reg =
67 metrics.AddCounter(&m_pc_occupancy_global_max,
68 CounterMetricInfo(path + "/global_max", desc + ", global max [%]"));
69 }
70
82 inline void Tick(size_t elements, size_t capacity) noexcept {
83 using namespace std::chrono_literals;
84
85 auto now_time = ClockType::now();
86 auto elapsed_time = now_time - m_start_time;
87 if (elapsed_time > 10s and ba::count(m_accumulator) > 0) {
88 m_start_time = now_time;
89
90 m_pc_occupancy_min.Store(ba::min(m_accumulator));
91 m_pc_occupancy_max.Store(ba::max(m_accumulator));
92 m_pc_occupancy_mean.Store(ba::mean(m_accumulator));
93 m_pc_occupancy_global_max.Store(
94 std::max(m_pc_occupancy_max.Load(), m_pc_occupancy_global_max.Load()));
95
96 m_accumulator = {};
97 }
98
99 size_t occupancy = 100.0 * static_cast<double>(elements) / capacity;
100 m_accumulator(occupancy);
101 }
102
103 struct Result {
104 size_t min; // [%]
105 size_t mean; // [%]
106 size_t max; // [%]
107 size_t global_max; // [%]
108 };
109
120 Result GetValue() const {
121 Result res;
122 res.min = m_pc_occupancy_min.Load();
123 res.mean = m_pc_occupancy_mean.Load();
124 res.max = m_pc_occupancy_max.Load();
125 res.global_max = m_pc_occupancy_global_max.Load();
126 return res;
127 }
128
134 void Reset() {
135 m_accumulator = {};
136 m_pc_occupancy_min.Store(0);
137 m_pc_occupancy_mean.Store(0);
138 m_pc_occupancy_max.Store(0);
139 m_pc_occupancy_global_max.Store(0);
140 }
141
142private:
143 typename ClockType::time_point m_start_time;
144
145 ba::accumulator_set<double,
146 ba::stats<ba::tag::mean, ba::tag::min, ba::tag::max, ba::tag::count>>
147 m_accumulator;
148
149 perfc::CounterI64 m_pc_occupancy_min;
150 perfc::ScopedRegistration m_pc_occupancy_min_reg;
151
152 perfc::CounterI64 m_pc_occupancy_max;
153 perfc::ScopedRegistration m_pc_occupancy_max_reg;
154
155 perfc::CounterI64 m_pc_occupancy_global_max;
156 perfc::ScopedRegistration m_pc_occupancy_global_max_reg;
157
158 perfc::CounterI64 m_pc_occupancy_mean;
159 perfc::ScopedRegistration m_pc_occupancy_mean_reg;
160};
161
162} // namespace rtctk::componentFramework
163
164#endif // RTCTK_COMPONENTFRAMEWORK_BUFFERMONITOR_HPP
Monitors min, mean and max occupation of a buffer and publishes them to OLDB.
Definition: bufferMonitor.hpp:37
Result GetValue() const
Method to get the measured durations in microseconds.
Definition: bufferMonitor.hpp:120
void Reset()
Method to reset the monitor.
Definition: bufferMonitor.hpp:134
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:82
BufferMonitor(ComponentMetricsIf &metrics, std::string const &desc, std::string const &prefix="")
Construct instance.
Definition: bufferMonitor.hpp:46
Component metrics interface.
Definition: componentMetricsIf.hpp:184
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:46
Header file for ComponentMetricsIf.
Definition: commandReplier.cpp:22
Definition: bufferMonitor.hpp:103
size_t min
Definition: bufferMonitor.hpp:104
size_t global_max
Definition: bufferMonitor.hpp:107
size_t mean
Definition: bufferMonitor.hpp:105
size_t max
Definition: bufferMonitor.hpp:106