Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_BASE_LOAD_LOG_UTIL_H_
      6 #define NET_BASE_LOAD_LOG_UTIL_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "net/base/load_log.h"
     13 
     14 namespace net {
     15 
     16 // The LoadLogUtil utility class contains methods to analyze and visualize
     17 // LoadLogs.
     18 
     19 class LoadLogUtil {
     20  public:
     21   struct EventDuration {
     22     LoadLog::EventType event;
     23     base::TimeDelta duration;
     24   };
     25   typedef std::vector<EventDuration> EventDurationList;
     26 
     27   // Builds a pretty printed ASCII tree showing the chronological order
     28   // of events.
     29   //
     30   // The indentation reflects hiearchy, with the duration of each indented
     31   // block noted on the right. The timestamp (tick count in milliseconds)
     32   // is noted in the left column.
     33   //
     34   // This detailed view of what went into servicing a request can be used
     35   // in logs, and is copy-pastable by users, for attaching to bug reports.
     36   //
     37   // Example A:
     38   //
     39   //     t=0: +Event1       [dt = 8]
     40   //     t=1:   +Event2     [dt = 0]
     41   //     t=1:      EventX
     42   //     t=1:   -Event2
     43   //     t=4:   +Event3     [dt = 2]
     44   //     t=6:   -Event3
     45   //     t=6:   +Event2     [dt = 1]
     46   //     t=7:   -Event2
     47   //     t=8:    EventY
     48   //     t=8: -Event1
     49   //
     50   // Here we can see that:
     51   //   - Event1 started at t=0 and ended at t=8; the duration was 8 time units.
     52   //   - Event2 took place while Event1 was in progress, and was repeated
     53   //     at t=1 and t=6.
     54   //   - EventX took place while (the first) Event2 was in progress.
     55   //   - Event3 started and ended at the same time, taking 0 time.
     56   //   - EventY took place right before Event1 finished, at t=8
     57   //
     58   // In general the rules are:
     59   //   - Log entries added by BeginEvent() are prefixed with a '+' and
     60   //     start an indentation block.
     61   //   - Log entries added by EndEvent() are prefixed with a '-' and
     62   //     finish an indentation block.
     63   //   - Log entries added by AddEvent() have no prefix.
     64   //   - Time units are given as milliseconds.
     65   //
     66   static std::string PrettyPrintAsEventTree(const LoadLog* log);
     67 
     68  private:
     69   DISALLOW_IMPLICIT_CONSTRUCTORS(LoadLogUtil);
     70 };
     71 
     72 }  // namespace net
     73 
     74 #endif  // NET_BASE_LOAD_LOG_UTIL_H_
     75