11 #ifndef __DERIVED_STATS_ALGO_H__
12 #define __DERIVED_STATS_ALGO_H__
18 #include <sandesh/derived_stats_results_types.h>
19 #include <sandesh/derived_stats.h>
20 #include <boost/assign/list_of.hpp>
21 #include <boost/scoped_ptr.hpp>
34 template <
typename ElemT>
39 virtual void Update(
const ElemT& raw) = 0;
44 template <
typename ElemT>
50 alpha_ = (double) strtod(annotation.c_str(), NULL);
52 errstr = std::string(
"Invalid alpha ") + annotation;
66 std::ostringstream meanstr, stddevstr;
72 res.set_state(boost::assign::map_list_of(
73 std::string(
"mean"), meanstr.str())(
74 std::string(
"stddev"), stddevstr.str()));
89 virtual void Update(
const ElemT& raw) {
101 template <
typename ElemT,
class AnomalyResT>
105 size_t rpos = annotation.find(
':');
107 algo_ = annotation.substr(0,rpos);
108 config_ = annotation.substr(rpos+1, string::npos);
109 if (
algo_.compare(
"EWM") == 0) {
123 ret =
impl_->FillResult(res);
135 void Update(
const ElemT& raw, uint64_t mono_usec) {
148 boost::scoped_ptr<DSAnomalyIf<ElemT> >
impl_;
151 template <
typename ElemT,
class EWMResT>
154 DSEWM(
const std::string &annotation):
157 alpha_ = (double) strtod(annotation.c_str(), NULL);
159 error_ = std::string(
"Disabled");
163 error_ = std::string(
"Invalid alpha ") + annotation;
187 void Update(
const ElemT& raw, uint64_t mono_usec) {
189 if (!
error_.empty())
return;
198 template <
typename ElemT,
class NullResT>
214 void Update(
const ElemT& raw, uint64_t mono_usec) {
221 template <
typename ElemT,
class NullResT>
233 void Update(
const ElemT& raw, uint64_t mono_usec) {
238 template <
typename ElemT,
class NullResT>
248 void Update(
const ElemT& raw, uint64_t mono_usec) {
253 template <
typename ElemT,
class NullResT>
265 void Update(
const ElemT& raw, uint64_t mono_usec) {
271 template <
typename ElemT,
class SumResT>
277 if (annotation.empty()) {
280 range_usecs_ = ((uint64_t) strtoul(annotation.c_str(), NULL, 10)) * 1000000;
296 static SumResT empty_val;
316 virtual void Purge(uint64_t mono_usec) {
318 for (
typename map<uint64_t, pair<uint64_t,ElemT> >::iterator it =
321 if (end_range <= mono_usec) {
331 virtual void Update(
const ElemT& raw, uint64_t mono_usec) {
348 typename map<uint64_t, pair<uint64_t,ElemT> >::iterator ut =
353 ut->second.second = ut->second.second + raw;
361 template <
typename ElemT,
class AvgResT>
364 DSAvg(
const std::string &annotation):
DSSum<ElemT,AvgResT>(annotation) {}
380 #endif // #define __DERIVED_STATS_ALGO_H__
void Update(const ElemT &raw, uint64_t mono_usec)
DSReturnType FillResult(NullResT &res) const
DSReturnType FillResult(NullResT &res) const
void Update(const ElemT &raw, uint64_t mono_usec)
DSReturnType FillResult(EWMResT &res) const
virtual void Update(const ElemT &raw)
virtual void Purge(uint64_t mono_usec)
void Update(const ElemT &raw, uint64_t mono_usec)
boost::scoped_ptr< DSAnomalyIf< ElemT > > impl_
DSNon0(const std::string &annotation)
virtual void Update(const ElemT &raw, uint64_t mono_usec)
void Update(const ElemT &raw, uint64_t mono_usec)
virtual DSReturnType FillResult(AnomalyResult &res) const =0
DSReturnType FillResult(NullResT &res) const
DSReturnType FillResult(NullResT &res) const
void Update(const ElemT &raw, uint64_t mono_usec)
DSSum(const std::string &annotation)
DSAnomaly(const std::string &annotation)
virtual void Update(const ElemT &raw)=0
DSChange(const std::string &annotation)
virtual DSReturnType FillResult(AnomalyResult &res) const
virtual DSReturnType FillResult(SumResT &res) const
DSEWM(const std::string &annotation)
DSAvg(const std::string &annotation)
void Update(const ElemT &raw, uint64_t mono_usec)
DSReturnType FillResult(AnomalyResT &res) const
DSNull(const std::string &annotation)
DSNone(const std::string &annotation)
DSAnomalyEWM(const std::string &annotation, std::string &errstr)
virtual DSReturnType FillResult(AvgResT &res) const
map< uint64_t, pair< uint64_t, ElemT > > history_buf_