Page Speed Optimization Libraries
1.2.24.1
|
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_