11#ifndef RTCTK_COMPONENTFRAMEWORK_DURATIONMONITOR_HPP
12#define RTCTK_COMPONENTFRAMEWORK_DURATIONMONITOR_HPP
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>
26namespace ba = boost::accumulators;
35template <
typename ClockType = std::chrono::steady_clock>
46 const std::string& desc,
47 const std::string& prefix =
"")
48 : m_start_time(ClockType::now()) {
51 path =
"duration_estimate";
53 path = prefix +
"/duration_estimate";
58 m_pc_duration_min_reg =
62 base_tags.
Extend({
"aggregation",
"min"}),
66 m_pc_duration_mean_reg =
70 base_tags.
Extend({
"aggregation",
"mean"}),
74 m_pc_duration_max_reg =
78 base_tags.
Extend({
"aggregation",
"max"}),
91 inline void Tick(std::chrono::duration<double, std::micro> elapsed)
noexcept {
92 using namespace std::chrono_literals;
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;
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));
106 m_accumulator(elapsed.count());
127 res.
min = m_pc_duration_min.Load();
128 res.
mean = m_pc_duration_mean.Load();
129 res.
max = m_pc_duration_max.Load();
139 m_pc_duration_min.Store(0);
140 m_pc_duration_mean.Store(0);
141 m_pc_duration_max.Store(0);
145 ba::accumulator_set<double,
146 ba::stats<ba::tag::mean, ba::tag::min, ba::tag::max, ba::tag::count>>
149 typename ClockType::time_point m_start_time;
151 perfc::CounterI64 m_pc_duration_min;
152 perfc::ScopedRegistration m_pc_duration_min_reg;
154 perfc::CounterI64 m_pc_duration_max;
155 perfc::ScopedRegistration m_pc_duration_max_reg;
157 perfc::CounterI64 m_pc_duration_mean;
158 perfc::ScopedRegistration m_pc_duration_mean_reg;
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