Page Speed Optimization Libraries  1.7.30.3
net/instaweb/http/public/log_record.h
Go to the documentation of this file.
00001 /*
00002  * Copyright 2012 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_HTTP_PUBLIC_LOG_RECORD_H_
00020 #define NET_INSTAWEB_HTTP_PUBLIC_LOG_RECORD_H_
00021 
00022 #include <map>
00024 #include "net/instaweb/util/enums.pb.h"
00025 #include "net/instaweb/http/public/logging_proto.h"
00026 #include "net/instaweb/http/public/logging_proto_impl.h"
00028 #include "net/instaweb/http/public/request_context.h"  
00029 #include "net/instaweb/rewriter/image_types.pb.h"
00030 #include "net/instaweb/util/public/basictypes.h"
00031 #include "net/instaweb/util/public/gtest_prod.h"
00032 #include "net/instaweb/util/public/scoped_ptr.h"
00033 #include "net/instaweb/util/public/string.h"
00034 #include "net/instaweb/util/public/string_util.h"
00035 
00039 
00040 
00041 namespace net_instaweb {
00042 
00043 class AbstractMutex;
00044 
00058 
00061 class AbstractLogRecord  {
00062  public:
00065   explicit AbstractLogRecord(AbstractMutex* mutex);
00066   virtual ~AbstractLogRecord();
00067 
00072   GoogleString AppliedRewritersString();
00073 
00078   RewriterInfo* NewRewriterInfo(const char* rewriter_id);
00079 
00082   void SetRewriterLoggingStatus(
00083       const char* rewriter_id, RewriterApplication::Status status);
00084 
00087   void SetRewriterLoggingStatus(
00088       const char* rewriter_id, const GoogleString& url,
00089       RewriterApplication::Status status) {
00090     SetRewriterLoggingStatusHelper(rewriter_id, url, status);
00091   }
00092 
00096   void LogRewriterHtmlStatus(const char* rewriter_id,
00097                              RewriterHtmlApplication::Status status);
00098 
00101   void LogRewriterApplicationStatus(
00102       const char* rewriter_id, RewriterApplication::Status status);
00103 
00107   virtual LoggingInfo* logging_info() = 0;
00108 
00111 
00115   void LogImageBackgroundRewriteActivity(
00116       RewriterApplication::Status status,
00117       const GoogleString& url,
00118       const char* id,
00119       int original_size,
00120       int optimized_size,
00121       bool is_recompressed,
00122       ImageType original_image_type,
00123       ImageType optimized_image_type,
00124       bool is_resized,
00125       int original_width,
00126       int original_height,
00127       bool is_resized_using_rendered_dimensions,
00128       int resized_width,
00129       int resized_height);
00130 
00132   void SetIsHtml(bool is_html);
00133 
00136   virtual void AddFoundPropertyToCohortInfo(
00137       int page_type, const GoogleString& cohort,
00138       const GoogleString& property) = 0;
00139 
00142   virtual void AddRetrievedPropertyToCohortInfo(
00143       int page_type, const GoogleString& cohort,
00144       const GoogleString& property) = 0;
00145 
00147   virtual void SetCacheStatusForCohortInfo(
00148       int page_type, const GoogleString& cohort,
00149       bool found, int key_state) = 0;
00150 
00154   void SetBlinkRequestFlow(int flow);
00155   void SetCacheHtmlRequestFlow(int flow);
00156   void SetIsOriginalResourceCacheable(bool cacheable);
00157 
00159   void SetBlinkInfo(const GoogleString& user_agent);
00160 
00162   void SetCacheHtmlLoggingInfo(const GoogleString& user_agent);
00163 
00165   void LogFlushEarlyActivity(
00166       const char* id,
00167       const GoogleString& url,
00168       RewriterApplication::Status status,
00169       FlushEarlyResourceInfo::ContentType content_type,
00170       FlushEarlyResourceInfo::ResourceType resource_type,
00171       bool is_bandwidth_affected,
00172       bool in_head);
00173 
00175   virtual void LogImageRewriteActivity(
00176       const char* id,
00177       const GoogleString& url,
00178       RewriterApplication::Status status,
00179       bool is_image_inlined,
00180       bool is_critical_image,
00181       bool is_url_rewritten,
00182       int size,
00183       bool try_low_res_src_insertion,
00184       bool low_res_src_inserted,
00185       ImageType low_res_image_type,
00186       int low_res_data_size) = 0;
00187 
00189   void LogJsDisableFilter(const char* id, bool has_pagespeed_no_defer);
00190 
00191   void LogLazyloadFilter(const char* id,
00192                          RewriterApplication::Status status,
00193                          bool is_blacklisted, bool is_critical);
00194 
00197   bool WriteLog();
00198 
00201   AbstractMutex* mutex() { return mutex_.get(); }
00202 
00205   void SetRewriterInfoMaxSize(int x);
00206 
00209   void SetAllowLoggingUrls(bool allow_logging_urls);
00210 
00213   void SetLogUrlIndices(bool log_url_indices);
00214 
00216   void SetNumHtmlCriticalImages(int num_html_critical_images);
00217 
00219   void SetNumCssCriticalImages(int num_css_critical_images);
00220 
00222   virtual void SetImageStats(int num_img_tags, int num_inlined_img_tags,
00223                              int num_critical_images_used) = 0;
00224 
00226   virtual void SetResourceCounts(int num_external_css, int num_scripts) = 0;
00227 
00229   void SetCriticalCssInfo(int critical_inlined_bytes,
00230                           int original_external_bytes,
00231                           int overhead_bytes);
00232 
00234   virtual void LogDeviceInfo(
00235       int device_type,
00236       bool supports_image_inlining,
00237       bool supports_lazyload_images,
00238       bool supports_critical_images_beacon,
00239       bool supports_deferjs,
00240       bool supports_webp,
00241       bool supports_webplossless_alpha,
00242       bool is_bot,
00243       bool supports_split_html,
00244       bool can_preload_resources) = 0;
00245 
00247   void LogIsXhr(bool is_xhr);
00248 
00250   virtual void SetBackgroundRewriteInfo(
00251     bool log_urls,
00252     bool log_url_indices,
00253     int max_rewrite_info_log_size);
00254 
00256   virtual void SetTimingInfo(const RequestContext::TimingInfo& timing_info) {}
00257 
00258  protected:
00260   virtual void SetBlinkInfoImpl(const GoogleString& user_agent) {}
00261 
00263   virtual void SetCacheHtmlLoggingInfoImpl(const GoogleString& user_agent) {}
00266   virtual bool WriteLogImpl() = 0;
00267 
00271   RewriterInfo* SetRewriterLoggingStatusHelper(
00272       const char* rewriter_id, const GoogleString& url,
00273       RewriterApplication::Status status);
00274 
00275  private:
00277   void InitLogging();
00278 
00279   void PopulateUrl(
00280       const GoogleString& url, RewriteResourceInfo* rewrite_resource_info);
00281 
00284   void PopulateRewriterStatusCounts();
00285 
00288   scoped_ptr<AbstractMutex> mutex_;
00289 
00291   int rewriter_info_max_size_;
00292 
00294   bool allow_logging_urls_;
00295 
00297   bool log_url_indices_;
00298 
00300   StringIntMap url_index_map_;
00301 
00303   typedef std::map<RewriterApplication::Status, int> RewriteStatusCountMap;
00304   struct RewriterStatsInternal {
00305     RewriterHtmlApplication::Status html_status;
00306 
00308     RewriteStatusCountMap status_counts;
00309 
00310     RewriterStatsInternal()
00311         : html_status(RewriterHtmlApplication::UNKNOWN_STATUS) {}
00312   };
00313   typedef std::map<GoogleString, RewriterStatsInternal> RewriterStatsMap;
00314   RewriterStatsMap rewriter_stats_;
00315 
00316   DISALLOW_COPY_AND_ASSIGN(AbstractLogRecord);
00317 };
00318 
00320 class LogRecord : public AbstractLogRecord {
00321  public:
00322   explicit LogRecord(AbstractMutex* mutex);
00323 
00324   virtual ~LogRecord();
00325 
00326   LoggingInfo* logging_info() { return logging_info_.get(); }
00327 
00328   virtual void SetImageStats(int num_img_tags, int num_inlined_img_tags,
00329                              int num_critical_images_used) {}
00330 
00331   virtual void SetResourceCounts(int num_external_css, int num_scripts) {}
00332 
00333   virtual void AddFoundPropertyToCohortInfo(
00334       int page_type, const GoogleString& cohort,
00335       const GoogleString& property) {}
00336 
00337   virtual void AddRetrievedPropertyToCohortInfo(
00338       int page_type, const GoogleString& cohort,
00339       const GoogleString& property) {}
00340 
00341   void SetCacheStatusForCohortInfo(
00342       int page_type, const GoogleString& cohort, bool found, int key_state) {}
00343 
00344   virtual void LogImageRewriteActivity(
00345       const char* id,
00346       const GoogleString& url,
00347       RewriterApplication::Status status,
00348       bool is_image_inlined,
00349       bool is_critical_image,
00350       bool is_url_rewritten,
00351       int size,
00352       bool try_low_res_src_insertion,
00353       bool low_res_src_inserted,
00354       ImageType low_res_image_type,
00355       int low_res_data_size) {}
00356 
00357   virtual void LogDeviceInfo(
00358       int device_type,
00359       bool supports_image_inlining,
00360       bool supports_lazyload_images,
00361       bool supports_critical_images_beacon,
00362       bool supports_deferjs,
00363       bool supports_webp,
00364       bool supports_webplossless_alpha,
00365       bool is_bot,
00366       bool supports_split_html,
00367       bool can_preload_resources) {}
00368 
00369   bool WriteLogImpl() { return true; }
00370 
00371  private:
00372   scoped_ptr<LoggingInfo> logging_info_;
00373 };
00374 
00381 class CopyOnWriteLogRecord : public LogRecord {
00382  public:
00383   CopyOnWriteLogRecord(AbstractMutex* logging_mutex, LoggingInfo* logging_info)
00384       : LogRecord(logging_mutex), logging_info_copy_(logging_info) {}
00385 
00386  protected:
00387   virtual bool WriteLogImpl() {
00388     logging_info_copy_->CopyFrom(*logging_info());
00389     return true;
00390   }
00391 
00392  private:
00393   LoggingInfo* logging_info_copy_; 
00394 
00395   DISALLOW_COPY_AND_ASSIGN(CopyOnWriteLogRecord);
00396 };
00397 
00398 }  
00399 
00400 #endif  ///< NET_INSTAWEB_HTTP_PUBLIC_LOG_RECORD_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines