// Custom includes
#include <cmath>
+#include <cstdlib>
#include <sstream>
-#include <senf/Utils/Console/Console.hh>
#include <senf/Utils/Format.hh>
#include "StatisticsTargets.hh"
//#include "Statistics.mpp"
#define prefix_
-///////////////////////////////cc.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::StatisticsBase
-prefix_ void senf::StatisticsBase::enter(float min, float avg, float max, float dev)
+prefix_ void senf::StatisticsBase::enter(unsigned n, float min, float avg, float max, float dev)
{
min_ = min;
avg_ = avg;
max_ = max;
dev_ = dev;
- generateOutput();
- signalChildren();
+ for (unsigned i (0); i < n; ++i)
+ generateOutput();
+ Children::iterator i (children_.begin());
+ Children::iterator const i_end (children_.end());
+ for (; i != i_end; ++i)
+ i->second.enter(n, min_, avg_, max_, dev_);
}
prefix_ senf::Collector & senf::StatisticsBase::operator[](unsigned rank)
return i->second;
}
+prefix_ senf::Collector const & senf::StatisticsBase::operator[](unsigned rank)
+ const
+{
+ Children::const_iterator i (children_.find(rank));
+ if (i == children_.end())
+ throw InvalidRankException();
+ return i->second;
+}
+
prefix_ senf::Collector & senf::StatisticsBase::collect(unsigned rank)
{
std::pair<Children::iterator, bool> state (
}
}
-prefix_ void senf::StatisticsBase::signalChildren()
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::StatisticsBase::OutputEntry
+
+prefix_ void senf::StatisticsBase::OutputEntry::consoleList(std::ostream & os)
{
- Children::iterator i (children_.begin());
- Children::iterator const i_end (children_.end());
- for (; i != i_end; ++i)
- i->second.enter(min_, avg_, max_, dev_);
+ for (boost::ptr_vector<TargetBase>::iterator i (targets_.begin());
+ i != targets_.end(); ++i)
+ if (! i->label.empty())
+ os << i->label << "\n";
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::Statistics
prefix_ senf::Statistics::Statistics()
#endif
{
#ifndef SENF_DISABLE_CONSOLE
- namespace fty = senf::console::factory;
+ namespace fty = console::factory;
dir.add("list", fty::Command(&Statistics::consoleList, this)
.doc("List statistics collection intervals and current values.\n"
"the last 5 minutes.")
.arg("rank","Rank chain selecting the value to generate output for")
.arg("window","Optional size of sliding average window",
- senf::console::kw::default_value = 1u) );
+ console::kw::default_value = 1u) );
#endif
}
return "";
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::Collector
-prefix_ void senf::Collector::enter(float min, float avg, float max, float dev)
+prefix_ void senf::Collector::enter(unsigned n, float min, float avg, float max, float dev)
{
- accSum_ += avg;
- accSumSq_ += avg*avg + dev*dev;
if (min < accMin_) accMin_ = min;
if (max > accMax_) accMax_ = max;
- if (++i_ >= rank_) {
- float accAvg (accSum_ / i_);
- float accDev (std::sqrt(std::max(0.0f,accSumSq_ / i_ - accAvg*accAvg)));
- StatisticsBase::enter(accMin_, accAvg, accMax_, accDev);
- i_ = 0;
+
+ if (i_ + n >= rank_) {
+ accSum_ += (rank_-i_)*avg;
+ accSumSq_ += (rank_-i_)*(rank_-i_)*(avg*avg + dev*dev);
+ float accAvg (accSum_ / rank_);
+ float accDev (std::sqrt(std::max(0.0f,accSumSq_ / rank_ - accAvg*accAvg)));
+ StatisticsBase::enter(1, accMin_, accAvg, accMax_, accDev);
accMin_ = FLT_MAX;
accSum_ = 0.0f;
accSumSq_ = 0.0f;
accMax_ = -FLT_MAX;
+ n -= (rank_ - i_);
+ i_ = 0;
+
+ if (n >= rank_) {
+ std::div_t d (std::div(int(n), int(rank_)));
+ StatisticsBase::enter(d.quot, min, avg, max, dev);
+ n = d.rem;
+ }
+ }
+
+ if (n>0) {
+ accSum_ += n*avg;
+ accSumSq_ += n*n*(avg*avg+dev*dev);
+ i_ += n;
+ if (min < accMin_) accMin_ = min;
+ if (max > accMax_) accMax_ = max;
}
}
return owner_->path() + "-" + senf::str(rank_);
}
-///////////////////////////////cc.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#undef prefix_
//#include "Statistics.mpp"