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