Page Speed Optimization Libraries  1.2.24.1
net/instaweb/util/public/statistics.h
Go to the documentation of this file.
00001 /*
00002  * Copyright 2010 Google Inc.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http:///www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
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 <set>
00024 #include "base/logging.h"
00025 #include "net/instaweb/util/public/abstract_mutex.h"
00026 #include "net/instaweb/util/public/basictypes.h"
00027 #include "net/instaweb/util/public/null_mutex.h"
00028 #include "net/instaweb/util/public/string.h"
00029 #include "net/instaweb/util/public/string_util.h"
00030 
00031 namespace net_instaweb {
00032 
00033 class MessageHandler;
00034 class Timer;
00035 class Writer;
00036 
00037 class Variable {
00038  public:
00039   virtual ~Variable();
00040 
00049   virtual int64 SetReturningPreviousValue(int64 value);
00050 
00051   virtual void Set(int64 value) = 0;
00052   virtual int64 Get() const = 0;
00055   virtual StringPiece GetName() const = 0;
00056 
00059   virtual int64 Add(int delta) {
00060     int64 value = Get() + delta;
00061     Set(value);
00062     return value;
00063   }
00064 
00065   void Clear() { Set(0); }
00066 };
00067 
00069 class ConsoleStatisticsLogger {
00070   public:
00071     virtual ~ConsoleStatisticsLogger();
00074     virtual void UpdateAndDumpIfRequired() = 0;
00077     virtual void DumpJSON(const std::set<GoogleString>& var_titles,
00078                           const std::set<GoogleString>& hist_titles,
00079                           int64 startTime, int64 endTime, int64 granularity_ms,
00080                           Writer* writer,
00081                           MessageHandler* message_handler) const = 0;
00082     virtual Timer* timer() = 0;
00083 };
00084 
00085 class Histogram {
00086  public:
00087   virtual ~Histogram();
00089   virtual void Add(double value) = 0;
00091   virtual void Clear() = 0;
00093   bool Empty() {
00094     ScopedMutex hold(lock());
00095     return CountInternal() == 0;
00096   }
00108   virtual void Render(int index, Writer* writer, MessageHandler* handler);
00109 
00111   virtual int NumBuckets() = 0;
00113   virtual void EnableNegativeBuckets() = 0;
00115   virtual void SetMinValue(double value) = 0;
00119   virtual void SetMaxValue(double value) = 0;
00120 
00123   virtual void SetSuggestedNumBuckets(int i) = 0;
00124 
00126   double Average() {
00127     ScopedMutex hold(lock());
00128     return AverageInternal();
00129   }
00133   double Percentile(const double perc) {
00134     ScopedMutex hold(lock());
00135     return PercentileInternal(perc);
00136   }
00137   double StandardDeviation() {
00138     ScopedMutex hold(lock());
00139     return StandardDeviationInternal();
00140   }
00141   double Count() {
00142     ScopedMutex hold(lock());
00143     return CountInternal();
00144   }
00145   double Maximum() {
00146     ScopedMutex hold(lock());
00147     return MaximumInternal();
00148   }
00149   double Minimum() {
00150     ScopedMutex hold(lock());
00151     return MinimumInternal();
00152   }
00153   double Median() {
00154     return Percentile(50);
00155   }
00156 
00163   GoogleString HtmlTableRow(const GoogleString& title, int index);
00164 
00168   virtual double BucketStart(int index) = 0;
00170   virtual double BucketLimit(int index) {
00171     return BucketStart(index + 1);
00172   }
00174   virtual double BucketCount(int index) = 0;
00175 
00176  protected:
00177   Histogram() {}
00178 
00180   virtual double AverageInternal() = 0;
00181   virtual double PercentileInternal(const double perc) = 0;
00182   virtual double StandardDeviationInternal() = 0;
00183   virtual double CountInternal() = 0;
00184   virtual double MaximumInternal() = 0;
00185   virtual double MinimumInternal() = 0;
00186 
00187   virtual AbstractMutex* lock() = 0;
00188 
00195   void WriteRawHistogramData(Writer* writer, MessageHandler* handler);
00196 
00197  private:
00198   DISALLOW_COPY_AND_ASSIGN(Histogram);
00199 };
00200 
00201 class NullHistogram : public Histogram {
00202  public:
00203   NullHistogram() {}
00204   virtual ~NullHistogram();
00205   virtual void Add(const double value) { }
00206   virtual void Clear() { }
00207   virtual int NumBuckets() { return 0; }
00208   virtual void EnableNegativeBuckets() { }
00209   virtual void SetMinValue(double value) { }
00210   virtual void SetMaxValue(double value) { }
00211   virtual void SetSuggestedNumBuckets(int i) { }
00212   virtual GoogleString GetName() const { return ""; }
00213 
00214  protected:
00215   virtual AbstractMutex* lock() { return &mutex_; }
00216   virtual double AverageInternal() { return 0.0; }
00217   virtual double PercentileInternal(const double perc) { return 0.0; }
00218   virtual double StandardDeviationInternal() { return 0.0; }
00219   virtual double CountInternal() { return 0.0; }
00220   virtual double MaximumInternal() { return 0.0; }
00221   virtual double MinimumInternal() { return 0.0; }
00222   virtual double BucketStart(int index) { return 0.0; }
00223   virtual double BucketCount(int index) { return 0.0; }
00224 
00225  private:
00226   NullMutex mutex_;
00227 
00228   DISALLOW_COPY_AND_ASSIGN(NullHistogram);
00229 };
00230 
00234 class TimedVariable {
00235  public:
00237   enum Levels { TENSEC, MINUTE, HOUR, START };
00238   virtual ~TimedVariable();
00240   virtual void IncBy(int64 delta) = 0;
00243   virtual int64 Get(int level) = 0;
00245   virtual void Clear() = 0;
00246 };
00247 
00249 class FakeTimedVariable : public TimedVariable {
00250  public:
00251   explicit FakeTimedVariable(Variable* var) : var_(var) {
00252   }
00253   virtual ~FakeTimedVariable();
00255   virtual void IncBy(int64 delta) {
00256     var_->Add(delta);
00257   }
00260   virtual int64 Get(int level) {
00264     if (level == START) {
00265       return var_->Get();
00266     }
00267     return 0;
00268   }
00270   virtual void Clear() {
00271     return var_->Clear();
00272   }
00273 
00274  protected:
00275   Variable* var_;
00276 };
00277 
00279 class Statistics {
00280  public:
00281   virtual ~Statistics();
00282 
00286   virtual Variable* AddVariable(const StringPiece& name) = 0;
00287 
00291   virtual Variable* AddGlobalVariable(const StringPiece& name);
00292 
00294   virtual Variable* FindVariable(const StringPiece& name) const = 0;
00295 
00297   Variable* GetVariable(const StringPiece& name) const {
00298     Variable* var = FindVariable(name);
00299     CHECK(var != NULL) << "Variable not found: " << name;
00300     return var;
00301   }
00302 
00306   virtual Histogram* AddHistogram(const StringPiece& name) = 0;
00308   virtual Histogram* FindHistogram(const StringPiece& name) const = 0;
00310   Histogram* GetHistogram(const StringPiece& name) const {
00311     Histogram* hist = FindHistogram(name);
00312     CHECK(hist != NULL) << "Histogram not found: " << name;
00313     return hist;
00314   }
00315 
00320   virtual TimedVariable* AddTimedVariable(
00321       const StringPiece& name, const StringPiece& group) = 0;
00323   virtual TimedVariable* FindTimedVariable(
00324       const StringPiece& name) const = 0;
00326   TimedVariable* GetTimedVariable(
00327       const StringPiece& name) const {
00328     TimedVariable* stat = FindTimedVariable(name);
00329     CHECK(stat != NULL) << "TimedVariable not found: " << name;
00330     return stat;
00331   }
00333   virtual const StringVector& HistogramNames() = 0;
00335   virtual const std::map<GoogleString, StringVector>& TimedVariableMap() = 0;
00337   virtual void Dump(Writer* writer, MessageHandler* handler) = 0;
00345   virtual void DumpConsoleVarsToWriter(
00346       int64 current_time_ms, Writer* writer, MessageHandler* message_handler) {}
00347   virtual void RenderTimedVariables(Writer* writer,
00348                                     MessageHandler* handler);
00350   virtual void RenderHistograms(Writer* writer, MessageHandler* handler);
00353   virtual void Clear() = 0;
00354 
00359   virtual ConsoleStatisticsLogger* console_logger() const { return NULL; }
00360 
00361  protected:
00363   FakeTimedVariable* NewFakeTimedVariable(const StringPiece& name, int index);
00364 };
00365 
00366 }  
00367 
00368 #endif  ///< NET_INSTAWEB_UTIL_PUBLIC_STATISTICS_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines