1 2 /* Web Polygraph http://www.web-polygraph.org/ 3 * Copyright 2003-2011 The Measurement Factory 4 * Licensed under the Apache License, Version 2.0 */ 5 6 #ifndef POLYGRAPH__LOGANALYZERS_POINTSTEX_H 7 #define POLYGRAPH__LOGANALYZERS_POINTSTEX_H 8 9 #include "xstd/String.h" 10 #include "xstd/gadgets.h" 11 #include "base/StatIntvlRec.h" 12 #include "loganalyzers/StexBase.h" 13 14 // an algorithm of extracting a single value statistics out of 15 // interval stats record 16 class PointStex: public StexBase<double, StatIntvlRec> { 17 public: PointStex(const String & aKey,const String & aName,const String & aUnit)18 PointStex(const String &aKey, const String &aName, const String &aUnit): 19 StexBase<double,StatIntvlRec>(aKey, aName, aUnit) {} 20 21 virtual bool valueKnown(const StatIntvlRec &rec) const = 0; 22 virtual double value(const StatIntvlRec &rec) const = 0; 23 }; 24 25 class AggrPointStex: public PointStex { 26 public: 27 typedef AggrStat StatIntvlRec::*AggrPtr; 28 29 public: AggrPointStex(const String & aKey,const String & aName,const String & aUnit,AggrPtr anAggrPtr)30 AggrPointStex(const String &aKey, const String &aName, const String &aUnit, 31 AggrPtr anAggrPtr): PointStex(aKey, aName, aUnit), 32 theAggrPtr(anAggrPtr) {} 33 aggr(const StatIntvlRec & rec)34 const AggrStat &aggr(const StatIntvlRec &rec) const { 35 return rec.*theAggrPtr; } 36 valueKnown(const StatIntvlRec & rec)37 virtual bool valueKnown(const StatIntvlRec &rec) const { 38 return (rec.*theAggrPtr).known(); } 39 40 protected: 41 AggrPtr theAggrPtr; 42 }; 43 44 class HRPointStex: public PointStex { 45 public: 46 typedef HRStat StatIntvlRec::*HRPtr; 47 48 public: HRPointStex(const String & aKey,const String & aName,const String & aUnit,HRPtr anHRPtr)49 HRPointStex(const String &aKey, const String &aName, const String &aUnit, 50 HRPtr anHRPtr): PointStex(aKey, aName, aUnit), 51 theHRPtr(anHRPtr) {} 52 stats(const StatIntvlRec & rec)53 const HRStat &stats(const StatIntvlRec &rec) const { 54 return rec.*theHRPtr; } 55 valueKnown(const StatIntvlRec & rec)56 virtual bool valueKnown(const StatIntvlRec &rec) const { 57 return stats(rec).active(); } 58 59 protected: 60 HRPtr theHRPtr; 61 }; 62 63 class MeanAggrPointStex: public AggrPointStex { 64 public: MeanAggrPointStex(const String & aKey,const String & aName,const String & aUnit,AggrPtr anAggrPtr)65 MeanAggrPointStex(const String &aKey, const String &aName, const String &aUnit, 66 AggrPtr anAggrPtr): AggrPointStex(aKey, aName, aUnit, anAggrPtr){} 67 value(const StatIntvlRec & rec)68 virtual double value(const StatIntvlRec &rec) const { 69 return aggr(rec).mean(); } 70 }; 71 72 class DhpPointStex: public HRPointStex { 73 public: DhpPointStex(const String & aKey,const String & aName,HRPtr anHRPtr)74 DhpPointStex(const String &aKey, const String &aName, 75 HRPtr anHRPtr): HRPointStex(aKey, aName, "%", anHRPtr){} 76 value(const StatIntvlRec & rec)77 virtual double value(const StatIntvlRec &rec) const { 78 return stats(rec).dhp(); } 79 }; 80 81 class BhpPointStex: public HRPointStex { 82 public: BhpPointStex(const String & aKey,const String & aName,HRPtr anHRPtr)83 BhpPointStex(const String &aKey, const String &aName, 84 HRPtr anHRPtr): HRPointStex(aKey, aName, "%", anHRPtr){} 85 value(const StatIntvlRec & rec)86 virtual double value(const StatIntvlRec &rec) const { 87 return stats(rec).bhp(); } 88 }; 89 90 class LoadPointStex: public PointStex { 91 public: 92 typedef double (StatIntvlRec::*StatPtr)() const; 93 94 public: LoadPointStex(const String & aKey,const String & aName,const String & aUnit,StatPtr aStatPtr)95 LoadPointStex(const String &aKey, const String &aName, const String &aUnit, 96 StatPtr aStatPtr): PointStex(aKey, aName, aUnit), 97 theStatPtr(aStatPtr) {} 98 valueKnown(const StatIntvlRec & rec)99 virtual bool valueKnown(const StatIntvlRec &rec) const { 100 return rec.theDuration > 0; } 101 value(const StatIntvlRec & rec)102 virtual double value(const StatIntvlRec &rec) const { 103 return (rec.*theStatPtr)(); } 104 105 protected: 106 StatPtr theStatPtr; 107 }; 108 109 class PipelineProbPointStex: public PointStex { 110 public: PipelineProbPointStex()111 PipelineProbPointStex(): PointStex("pprob", 112 "portion of pipelined connections", "%") {} 113 valueKnown(const StatIntvlRec & rec)114 virtual bool valueKnown(const StatIntvlRec &rec) const { 115 return rec.theConnUseCnt.known(); } 116 value(const StatIntvlRec & rec)117 virtual double value(const StatIntvlRec &rec) const { 118 return Percent(rec.theConnPipelineDepth.count(), 119 rec.theConnUseCnt.count()); 120 } 121 }; 122 123 class MeanRptmPointStex: public PointStex { 124 public: MeanRptmPointStex()125 MeanRptmPointStex(): PointStex("mean-rptm", 126 "mean response time", "msec") {} 127 valueKnown(const StatIntvlRec & rec)128 virtual bool valueKnown(const StatIntvlRec &rec) const { 129 return rec.repTime().known(); } 130 value(const StatIntvlRec & rec)131 virtual double value(const StatIntvlRec &rec) const { 132 return rec.repTime().mean(); } 133 }; 134 135 #endif 136