Page Speed Optimization Libraries  1.7.30.4
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_in_place,
00241       bool supports_webp_rewritten_urls,
00242       bool supports_webplossless_alpha,
00243       bool is_bot,
00244       bool supports_split_html,
00245       bool can_preload_resources) = 0;
00246 
00248   void LogIsXhr(bool is_xhr);
00249 
00251   virtual void SetBackgroundRewriteInfo(
00252     bool log_urls,
00253     bool log_url_indices,
00254     int max_rewrite_info_log_size);
00255 
00257   virtual void SetTimingInfo(const RequestContext::TimingInfo& timing_info) {}
00258 
00259  protected:
00261   virtual void SetBlinkInfoImpl(const GoogleString& user_agent) {}
00262 
00264   virtual void SetCacheHtmlLoggingInfoImpl(const GoogleString& user_agent) {}
00267   virtual bool WriteLogImpl() = 0;
00268 
00272   RewriterInfo* SetRewriterLoggingStatusHelper(
00273       const char* rewriter_id, const GoogleString& url,
00274       RewriterApplication::Status status);
00275 
00276  private:
00278   void InitLogging();
00279 
00280   void PopulateUrl(
00281       const GoogleString& url, RewriteResourceInfo* rewrite_resource_info);
00282 
00285   void PopulateRewriterStatusCounts();
00286 
00289   scoped_ptr<AbstractMutex> mutex_;
00290 
00292   int rewriter_info_max_size_;
00293 
00295   bool allow_logging_urls_;
00296 
00298   bool log_url_indices_;
00299 
00301   StringIntMap url_index_map_;
00302 
00304   typedef std::map<RewriterApplication::Status, int> RewriteStatusCountMap;
00305   struct RewriterStatsInternal {
00306     RewriterHtmlApplication::Status html_status;
00307 
00309     RewriteStatusCountMap status_counts;
00310 
00311     RewriterStatsInternal()
00312         : html_status(RewriterHtmlApplication::UNKNOWN_STATUS) {}
00313   };
00314   typedef std::map<GoogleString, RewriterStatsInternal> RewriterStatsMap;
00315   RewriterStatsMap rewriter_stats_;
00316 
00317   DISALLOW_COPY_AND_ASSIGN(AbstractLogRecord);
00318 };
00319 
00321 class LogRecord : public AbstractLogRecord {
00322  public:
00323   explicit LogRecord(AbstractMutex* mutex);
00324 
00325   virtual ~LogRecord();
00326 
00327   LoggingInfo* logging_info() { return logging_info_.get(); }
00328 
00329   virtual void SetImageStats(int num_img_tags, int num_inlined_img_tags,
00330                              int num_critical_images_used) {}
00331 
00332   virtual void SetResourceCounts(int num_external_css, int num_scripts) {}
00333 
00334   virtual void AddFoundPropertyToCohortInfo(
00335       int page_type, const GoogleString& cohort,
00336       const GoogleString& property) {}
00337 
00338   virtual void AddRetrievedPropertyToCohortInfo(
00339       int page_type, const GoogleString& cohort,
00340       const GoogleString& property) {}
00341 
00342   void SetCacheStatusForCohortInfo(
00343       int page_type, const GoogleString& cohort, bool found, int key_state) {}
00344 
00345   virtual void LogImageRewriteActivity(
00346       const char* id,
00347       const GoogleString& url,
00348       RewriterApplication::Status status,
00349       bool is_image_inlined,
00350       bool is_critical_image,
00351       bool is_url_rewritten,
00352       int size,
00353       bool try_low_res_src_insertion,
00354       bool low_res_src_inserted,
00355       ImageType low_res_image_type,
00356       int low_res_data_size) {}
00357 
00358   virtual void LogDeviceInfo(
00359       int device_type,
00360       bool supports_image_inlining,
00361       bool supports_lazyload_images,
00362       bool supports_critical_images_beacon,
00363       bool supports_deferjs,
00364       bool supports_webp_in_place,
00365       bool supports_webp_rewritten_urls,
00366       bool supports_webplossless_alpha,
00367       bool is_bot,
00368       bool supports_split_html,
00369       bool can_preload_resources) {}
00370 
00371   bool WriteLogImpl() { return true; }
00372 
00373  private:
00374   scoped_ptr<LoggingInfo> logging_info_;
00375 };
00376 
00383 class CopyOnWriteLogRecord : public LogRecord {
00384  public:
00385   CopyOnWriteLogRecord(AbstractMutex* logging_mutex, LoggingInfo* logging_info)
00386       : LogRecord(logging_mutex), logging_info_copy_(logging_info) {}
00387 
00388  protected:
00389   virtual bool WriteLogImpl() {
00390     logging_info_copy_->CopyFrom(*logging_info());
00391     return true;
00392   }
00393 
00394  private:
00395   LoggingInfo* logging_info_copy_; 
00396 
00397   DISALLOW_COPY_AND_ASSIGN(CopyOnWriteLogRecord);
00398 };
00399 
00400 }  
00401 
00402 #endif  ///< NET_INSTAWEB_HTTP_PUBLIC_LOG_RECORD_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines