00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_STATISTICS_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_STATISTICS_H_
00021
00022 #include <map>
00023 #include "base/logging.h"
00024 #include "net/instaweb/util/public/abstract_mutex.h"
00025 #include "net/instaweb/util/public/basictypes.h"
00026 #include "net/instaweb/util/public/null_mutex.h"
00027 #include "net/instaweb/util/public/string.h"
00028 #include "net/instaweb/util/public/string_util.h"
00029
00030 namespace net_instaweb {
00031
00032 class MessageHandler;
00033 class Writer;
00034
00035 class Variable {
00036 public:
00037 virtual ~Variable();
00039 virtual int Get() const = 0;
00040 virtual void Set(int delta) = 0;
00041 virtual int64 Get64() const = 0;
00042
00043 virtual void Add(int delta) { Set(delta + Get()); }
00044 void Clear() { Set(0); }
00045 };
00046
00047 class Histogram {
00048 public:
00049 virtual ~Histogram();
00051 virtual void Add(double value) = 0;
00053 virtual void Clear() = 0;
00055 virtual bool Empty() {
00056 ScopedMutex hold(lock());
00057 return CountInternal() == 0;
00058 }
00070 virtual void Render(const StringPiece& title, Writer* writer,
00071 MessageHandler* handler);
00074 virtual int MaxBuckets() = 0;
00076 virtual void EnableNegativeBuckets() = 0;
00078 virtual void SetMinValue(double value) = 0;
00082 virtual void SetMaxValue(double value) = 0;
00084 virtual void SetMaxBuckets(int i) = 0;
00086 virtual double Average() {
00087 ScopedMutex hold(lock());
00088 return AverageInternal();
00089 }
00093 virtual double Percentile(const double perc) {
00094 ScopedMutex hold(lock());
00095 return PercentileInternal(perc);
00096 }
00097 virtual double StandardDeviation() {
00098 ScopedMutex hold(lock());
00099 return StandardDeviationInternal();
00100 }
00101 virtual double Count() {
00102 ScopedMutex hold(lock());
00103 return CountInternal();
00104 }
00105 virtual double Maximum() {
00106 ScopedMutex hold(lock());
00107 return MaximumInternal();
00108 }
00109 virtual double Minimum() {
00110 ScopedMutex hold(lock());
00111 return MinimumInternal();
00112 }
00113 virtual double Median() {
00114 return Percentile(50);
00115 }
00116
00117 protected:
00118 virtual AbstractMutex* lock() = 0;
00119 virtual double AverageInternal() = 0;
00120 virtual double PercentileInternal(const double perc) = 0;
00121 virtual double StandardDeviationInternal() = 0;
00122 virtual double CountInternal() = 0;
00123 virtual double MaximumInternal() = 0;
00124 virtual double MinimumInternal() = 0;
00128 virtual double BucketStart(int index) = 0;
00130 virtual double BucketLimit(int index) {
00131 return BucketStart(index + 1);
00132 }
00134 virtual double BucketCount(int index) = 0;
00140 virtual void WriteRawHistogramData(Writer* writer, MessageHandler* handler);
00141 };
00142
00143 class NullHistogram : public Histogram {
00144 public:
00145 NullHistogram() {}
00146 virtual ~NullHistogram();
00147 virtual void Add(const double value) { }
00148 virtual void Clear() { }
00149 virtual bool Empty() { return true; }
00150 virtual int MaxBuckets() { return 0; }
00151 virtual void EnableNegativeBuckets() { }
00152 virtual void SetMinValue(double value) { }
00153 virtual void SetMaxValue(double value) { }
00154 virtual void SetMaxBuckets(int i) { }
00155
00156 protected:
00157 virtual AbstractMutex* lock() { return &mutex_; }
00158 virtual double AverageInternal() { return 0.0; }
00159 virtual double PercentileInternal(const double perc) { return 0.0; }
00160 virtual double StandardDeviationInternal() { return 0.0; }
00161 virtual double CountInternal() { return 0.0; }
00162 virtual double MaximumInternal() { return 0.0; }
00163 virtual double MinimumInternal() { return 0.0; }
00164 virtual double BucketStart(int index) { return 0.0; }
00165 virtual double BucketCount(int index) { return 0.0; }
00166
00167 private:
00168 NullMutex mutex_;
00169
00170 DISALLOW_COPY_AND_ASSIGN(NullHistogram);
00171 };
00172
00176 class TimedVariable {
00177 public:
00179 enum Levels { TENSEC, MINUTE, HOUR, START };
00180 virtual ~TimedVariable();
00182 virtual void IncBy(int64 delta) = 0;
00185 virtual int64 Get(int level) = 0;
00187 virtual void Clear() = 0;
00188 };
00189
00191 class FakeTimedVariable : public TimedVariable {
00192 public:
00193 explicit FakeTimedVariable(Variable* var) : var_(var) {
00194 }
00195 virtual ~FakeTimedVariable();
00197 virtual void IncBy(int64 delta) {
00198 var_->Add(delta);
00199 }
00202 virtual int64 Get(int level) {
00206 if (level == START) {
00207 return var_->Get64();
00208 }
00209 return 0;
00210 }
00212 virtual void Clear() {
00213 return var_->Clear();
00214 }
00215
00216 protected:
00217 Variable* var_;
00218 };
00219
00221 class Statistics {
00222 public:
00223 virtual ~Statistics();
00224
00228 virtual Variable* AddVariable(const StringPiece& name) = 0;
00229
00231 virtual Variable* FindVariable(const StringPiece& name) const = 0;
00232
00234 Variable* GetVariable(const StringPiece& name) const {
00235 Variable* var = FindVariable(name);
00236 CHECK(var != NULL) << "Variable not found: " << name;
00237 return var;
00238 }
00239
00243 virtual Histogram* AddHistogram(const StringPiece& name) = 0;
00245 virtual Histogram* FindHistogram(const StringPiece& name) const = 0;
00247 Histogram* GetHistogram(const StringPiece& name) const {
00248 Histogram* hist = FindHistogram(name);
00249 CHECK(hist != NULL) << "Histogram not found: " << name;
00250 return hist;
00251 }
00252
00257 virtual TimedVariable* AddTimedVariable(
00258 const StringPiece& name, const StringPiece& group) = 0;
00260 virtual TimedVariable* FindTimedVariable(
00261 const StringPiece& name) const = 0;
00263 TimedVariable* GetTimedVariable(
00264 const StringPiece& name) const {
00265 TimedVariable* stat = FindTimedVariable(name);
00266 CHECK(stat != NULL) << "TimedVariable not found: " << name;
00267 return stat;
00268 }
00270 virtual const StringVector& HistogramNames() = 0;
00272 virtual const std::map<GoogleString, StringVector>& TimedVariableMap() = 0;
00274 virtual void Dump(Writer* writer, MessageHandler* handler) = 0;
00277 virtual void RenderTimedVariables(Writer* writer,
00278 MessageHandler* handler);
00280 virtual void RenderHistograms(Writer* writer, MessageHandler* handler);
00283 virtual void Clear() = 0;
00284
00285 protected:
00287 FakeTimedVariable* NewFakeTimedVariable(const StringPiece& name, int index);
00288 };
00289
00290 }
00291
00292 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_STATISTICS_H_