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