Page Speed Optimization Libraries  1.5.27.2
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 
00127   void SetIsHtml(bool is_html);
00128 
00130   int AddPropertyCohortInfo(const GoogleString& cohort);
00131 
00134   void AddFoundPropertyToCohortInfo(int index, const GoogleString& property);
00135 
00138   void SetCacheStatusForCohortInfo(int index, bool found, int key_state);
00139 
00142   void SetDeviceAndCacheTypeForCohortInfo(
00143       int index, int device_type, int cache_type);
00144 
00148   void SetBlinkRequestFlow(int flow);
00149   void SetCacheHtmlRequestFlow(int flow);
00150   void SetIsOriginalResourceCacheable(bool cacheable);
00151 
00153   void SetBlinkInfo(const GoogleString& user_agent);
00154 
00156   void SetCacheHtmlLoggingInfo(const GoogleString& user_agent);
00157 
00159   void LogFlushEarlyActivity(
00160       const char* id,
00161       const GoogleString& url,
00162       RewriterApplication::Status status,
00163       FlushEarlyResourceInfo::ContentType content_type,
00164       FlushEarlyResourceInfo::ResourceType resource_type,
00165       bool is_bandwidth_affected,
00166       bool in_head);
00167 
00169   void LogImageRewriteActivity(
00170       const char* id,
00171       const GoogleString& url,
00172       RewriterApplication::Status status,
00173       bool is_image_inlined,
00174       bool is_critical_image,
00175       bool try_low_res_src_insertion,
00176       bool low_res_src_inserted,
00177       int low_res_data_size);
00178 
00180   void LogJsDisableFilter(const char* id, bool has_pagespeed_no_defer);
00181 
00182   void LogLazyloadFilter(const char* id,
00183                          RewriterApplication::Status status,
00184                          bool is_blacklisted, bool is_critical);
00185 
00188   bool WriteLog();
00189 
00192   AbstractMutex* mutex() { return mutex_.get(); }
00193 
00196   void SetRewriterInfoMaxSize(int x);
00197 
00200   void SetAllowLoggingUrls(bool allow_logging_urls);
00201 
00204   void SetLogUrlIndices(bool log_url_indices);
00205 
00207   void SetNumHtmlCriticalImages(int num_html_critical_images);
00208 
00210   void SetNumCssCriticalImages(int num_css_critical_images);
00211 
00213   virtual void SetImageStats(int num_img_tags, int num_inlined_img_tags,
00214                              int num_critical_images_used) = 0;
00215 
00217   virtual void SetResourceCounts(int num_external_css, int num_scripts) = 0;
00218 
00220   void SetCriticalCssInfo(int critical_inlined_bytes,
00221                           int original_external_bytes,
00222                           int overhead_bytes);
00223 
00225   void LogDeviceInfo(
00226       int device_type,
00227       bool supports_image_inlining,
00228       bool supports_lazyload_images,
00229       bool supports_critical_images_beacon,
00230       bool supports_deferjs,
00231       bool supports_webp,
00232       bool supports_webplossless_alpha,
00233       bool is_bot,
00234       bool supports_split_html,
00235       bool can_preload_resources);
00236 
00238   void LogIsXhr(bool is_xhr);
00239 
00241   virtual void SetBackgroundRewriteInfo(
00242     bool log_urls,
00243     bool log_url_indices,
00244     int max_rewrite_info_log_size);
00245 
00249   void SetTimeToStartProcessing(int64 end_ms) {
00250     SetTimeFromRequestStart(
00251         &TimingInfo::set_time_to_start_processing_ms, end_ms);
00252   }
00253 
00255   void SetTimeToStartParse(int64 end_ms) {
00256     SetTimeFromRequestStart(
00257         &TimingInfo::set_time_to_start_parse_ms, end_ms);
00258   }
00259 
00262   void SetTimeToPcacheStart(int64 end_ms) {
00263     SetTimeFromRequestStart(
00264         &TimingInfo::set_time_to_pcache_lookup_start_ms, end_ms);
00265   }
00266 
00269   void SetTimeToPcacheEnd(int64 end_ms) {
00270     SetTimeFromRequestStart(
00271         &TimingInfo::set_time_to_pcache_lookup_end_ms, end_ms);
00272   }
00273 
00275   virtual void SetTimingInfo(const RequestContext::TimingInfo& timing_info) {}
00276 
00277  protected:
00279   virtual void SetBlinkInfoImpl(const GoogleString& user_agent) {}
00280 
00282   virtual void SetCacheHtmlLoggingInfoImpl(const GoogleString& user_agent) {}
00285   virtual bool WriteLogImpl() = 0;
00286 
00287  private:
00288   typedef void (TimingInfo::*SetTimeFromStartFn)(int64);
00289 
00291   void InitLogging();
00292 
00293   void PopulateUrl(
00294       const GoogleString& url, RewriteResourceInfo* rewrite_resource_info);
00295 
00298   void PopulateRewriterStatusCounts();
00299 
00300   void SetTimeFromRequestStart(SetTimeFromStartFn fn, int64 end_ms);
00301 
00305   RewriterInfo* SetRewriterLoggingStatusHelper(
00306       const char* rewriter_id, const GoogleString& url,
00307       RewriterApplication::Status status);
00308 
00311   scoped_ptr<AbstractMutex> mutex_;
00312 
00314   int rewriter_info_max_size_;
00315 
00317   bool allow_logging_urls_;
00318 
00320   bool log_url_indices_;
00321 
00323   StringIntMap url_index_map_;
00324 
00326   typedef std::map<RewriterApplication::Status, int> RewriteStatusCountMap;
00327   struct RewriterStatsInternal {
00328     RewriterHtmlApplication::Status html_status;
00329 
00331     RewriteStatusCountMap status_counts;
00332 
00333     RewriterStatsInternal()
00334         : html_status(RewriterHtmlApplication::UNKNOWN_STATUS) {}
00335   };
00336   typedef std::map<GoogleString, RewriterStatsInternal> RewriterStatsMap;
00337   RewriterStatsMap rewriter_stats_;
00338 
00339   DISALLOW_COPY_AND_ASSIGN(AbstractLogRecord);
00340 };
00341 
00343 class LogRecord : public AbstractLogRecord {
00344  public:
00345   explicit LogRecord(AbstractMutex* mutex);
00346 
00347   virtual ~LogRecord();
00348 
00349   LoggingInfo* logging_info() { return logging_info_.get(); }
00350 
00351   virtual void SetImageStats(int num_img_tags, int num_inlined_img_tags,
00352                              int num_critical_images_used) {}
00353 
00354   virtual void SetResourceCounts(int num_external_css, int num_scripts) {}
00355 
00356   bool WriteLogImpl() { return true; }
00357 
00358  private:
00359   scoped_ptr<LoggingInfo> logging_info_;
00360 };
00361 
00368 class CopyOnWriteLogRecord : public LogRecord {
00369  public:
00370   CopyOnWriteLogRecord(AbstractMutex* logging_mutex, LoggingInfo* logging_info)
00371       : LogRecord(logging_mutex), logging_info_copy_(logging_info) {}
00372 
00373  protected:
00374   virtual bool WriteLogImpl() {
00375     logging_info_copy_->CopyFrom(*logging_info());
00376     return true;
00377   }
00378 
00379  private:
00380   LoggingInfo* logging_info_copy_; 
00381 
00382   DISALLOW_COPY_AND_ASSIGN(CopyOnWriteLogRecord);
00383 };
00384 
00385 }  
00386 
00387 #endif  ///< NET_INSTAWEB_HTTP_PUBLIC_LOG_RECORD_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines