RTC Toolkit 6.0.0
Loading...
Searching...
No Matches
durationMonitor.hpp
Go to the documentation of this file.
1
11#ifndef RTCTK_COMPONENTFRAMEWORK_DURATIONMONITOR_HPP
12#define RTCTK_COMPONENTFRAMEWORK_DURATIONMONITOR_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>
24
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()) {
49 std::string path;
50 if (prefix == "") {
51 path = "duration_estimate";
52 } else {
53 path = prefix + "/duration_estimate";
54 }
55
56 const InfluxTagMap base_tags = {{"prefix", prefix}};
57
58 m_pc_duration_min_reg =
59 metrics.AddCounter(&m_pc_duration_min,
60 CounterMetricInfo(path + "/min",
61 desc + ", min [us]",
62 base_tags.Extend({"aggregation", "min"}),
63 "duration_estimate",
65
66 m_pc_duration_mean_reg =
67 metrics.AddCounter(&m_pc_duration_mean,
68 CounterMetricInfo(path + "/mean",
69 desc + ", mean [us]",
70 base_tags.Extend({"aggregation", "mean"}),
71 "duration_estimate",
73
74 m_pc_duration_max_reg =
75 metrics.AddCounter(&m_pc_duration_max,
76 CounterMetricInfo(path + "/max",
77 desc + ", max [us]",
78 base_tags.Extend({"aggregation", "max"}),
79 "duration_estimate",
81 }
82
91 inline void Tick(std::chrono::duration<double, std::micro> elapsed) noexcept {
92 using namespace std::chrono_literals;
93
94 auto now_time = ClockType::now();
95 typename ClockType::duration elapsed_time = now_time - m_start_time;
96 if (elapsed_time > 10s and ba::count(m_accumulator) > 0) {
97 m_start_time = now_time;
98
99 m_pc_duration_min.Store(ba::min(m_accumulator));
100 m_pc_duration_max.Store(ba::max(m_accumulator));
101 m_pc_duration_mean.Store(ba::mean(m_accumulator));
102
103 m_accumulator = {};
104 }
105
106 m_accumulator(elapsed.count());
107 }
108
109 struct Result {
110 int64_t min; // [us]
111 int64_t mean; // [us]
112 int64_t max; // [us]
113 };
114
125 Result GetValue() const {
126 Result res;
127 res.min = m_pc_duration_min.Load();
128 res.mean = m_pc_duration_mean.Load();
129 res.max = m_pc_duration_max.Load();
130 return res;
131 }
132
137 void Reset() {
138 m_accumulator = {};
139 m_pc_duration_min.Store(0);
140 m_pc_duration_mean.Store(0);
141 m_pc_duration_max.Store(0);
142 }
143
144private:
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 typename ClockType::time_point m_start_time;
150
151 perfc::CounterI64 m_pc_duration_min;
152 perfc::ScopedRegistration m_pc_duration_min_reg;
153
154 perfc::CounterI64 m_pc_duration_max;
155 perfc::ScopedRegistration m_pc_duration_max_reg;
156
157 perfc::CounterI64 m_pc_duration_mean;
158 perfc::ScopedRegistration m_pc_duration_mean_reg;
159};
160
161} // namespace rtctk::componentFramework
162
163#endif // RTCTK_COMPONENTFRAMEWORK_DURATIONMONITOR_HPP
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
void Reset()
Method to reset the monitor.
Definition durationMonitor.hpp:137
DurationMonitor(ComponentMetricsIf &metrics, const std::string &desc, const std::string &prefix="")
Construct instance.
Definition durationMonitor.hpp:45
Result GetValue() const
Method to get the measured durations in microseconds.
Definition durationMonitor.hpp:125
void Tick(std::chrono::duration< double, std::micro > elapsed) noexcept
Method to be called repeatedly from within the hot loop that should be measured.
Definition durationMonitor.hpp:91
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 durationMonitor.hpp:109
int64_t max
Definition durationMonitor.hpp:112
int64_t min
Definition durationMonitor.hpp:110
int64_t mean
Definition durationMonitor.hpp:111
static constexpr std::string MICRO_SECONDS
Definition componentMetricsIf.hpp:257