Home | History | Annotate | Download | only in performance_monitor
      1 // Copyright (c) 2012 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 CHROME_BROWSER_UI_WEBUI_PERFORMANCE_MONITOR_PERFORMANCE_MONITOR_UI_UTIL_H_
      6 #define CHROME_BROWSER_UI_WEBUI_PERFORMANCE_MONITOR_PERFORMANCE_MONITOR_UI_UTIL_H_
      7 
      8 #include "chrome/browser/performance_monitor/database.h"
      9 #include "chrome/browser/ui/webui/performance_monitor/performance_monitor_ui_constants.h"
     10 
     11 namespace performance_monitor {
     12 
     13 typedef std::vector<Database::MetricVector> VectorOfMetricVectors;
     14 
     15 class PerformanceMonitorUtilTest;
     16 
     17 // This is an interface for the various aggregation functions. The base class
     18 // will handle the separation of the metrics vector into the various intervals,
     19 // and each derived class represents a different method of aggregation.
     20 class Aggregator {
     21  public:
     22   Aggregator();
     23   virtual ~Aggregator();
     24 
     25   // Aggregate a full metric vector into a vector of metric vectors, with each
     26   // metric vector representing the aggregation for an active interval. |start|
     27   // is the start time of the metrics to aggregate, |intervals| is the vector
     28   // of all intervals for which the database was active for the span to
     29   // aggregate, and |resolution| is the time distance between aggregated points.
     30   scoped_ptr<VectorOfMetricVectors> AggregateMetrics(
     31       MetricType metric_type,
     32       const Database::MetricVector* metrics,
     33       const base::Time& start,
     34       const std::vector<TimeRange>& intervals,
     35       const base::TimeDelta& resolution);
     36 
     37  protected:
     38   friend class PerformanceMonitorUtilTest;
     39 
     40   // Aggregate only a single interval, advancing the |metric| iterator to the
     41   // end of the active interval (or the end of the vector). |metric| points to
     42   // the start of the section to be aggregated, |metric_end| is the hard-limit
     43   // for the end of the vector (so we don't advance past it), |time_start| and
     44   // |time_end| represent the interval to aggregate, and |resolution| is the
     45   // time distance between aggregated points.
     46   virtual scoped_ptr<Database::MetricVector> AggregateInterval(
     47       MetricType metric_type,
     48       Database::MetricVector::const_iterator* metric,
     49       const Database::MetricVector::const_iterator& metric_end,
     50       const base::Time& time_start,
     51       const base::Time& time_end,
     52       const base::TimeDelta& resolution) = 0;
     53 };
     54 
     55 // Aggregation method classes.
     56 class NoAggregation : public Aggregator {
     57  private:
     58   virtual scoped_ptr<Database::MetricVector> AggregateInterval(
     59       MetricType metric_type,
     60       Database::MetricVector::const_iterator* metric,
     61       const Database::MetricVector::const_iterator& metric_end,
     62       const base::Time& time_start,
     63       const base::Time& time_end,
     64       const base::TimeDelta& resolution) OVERRIDE;
     65 };
     66 
     67 class MedianAggregation : public Aggregator {
     68  private:
     69   virtual scoped_ptr<Database::MetricVector> AggregateInterval(
     70       MetricType metric_type,
     71       Database::MetricVector::const_iterator* metric,
     72       const Database::MetricVector::const_iterator& metric_end,
     73       const base::Time& time_start,
     74       const base::Time& time_end,
     75       const base::TimeDelta& resolution) OVERRIDE;
     76 };
     77 
     78 class MeanAggregation : public Aggregator {
     79  private:
     80   virtual scoped_ptr<Database::MetricVector> AggregateInterval(
     81       MetricType metric_type,
     82       Database::MetricVector::const_iterator* metric,
     83       const Database::MetricVector::const_iterator& metric_end,
     84       const base::Time& time_start,
     85       const base::Time& time_end,
     86       const base::TimeDelta& resolution) OVERRIDE;
     87 };
     88 
     89 // Return the factor by which all metrics should be multiplied in order to be in
     90 // the preferred unit (e.g., memory usage is in bytes, but we display it in
     91 // megabytes, so we return 1/1024^2).
     92 double GetConversionFactor(UnitDetails from, UnitDetails to);
     93 
     94 // Metric data can be either dense or sporadic, so AggregateMetric() normalizes
     95 // the metric data in time. |metrics| must be sorted in increasing time.
     96 // AggregateMetrics() will perform the aggregation according to the |strategy|
     97 // provided.
     98 //
     99 // Median: Use the median of sample values from the window, ignoring
    100 //         irregularity in sample timings.
    101 // Mean: Use the mean value within the window.
    102 // None: Return all samples from the window.
    103 //
    104 // In the methods which do aggregation, sampling windows start and end at an
    105 // integer multiple of |resolution| away from |start| and data points are
    106 // omitted if there are no points to resample. The time associated with each
    107 // slice is the time at the end of the slice. This aggregation is performed for
    108 // each interval within |intervals|.
    109 //
    110 // Returns a pointer to a vector of MetricVectors, with one MetricVector per
    111 // interval given, NULL if |metrics| is empty.
    112 scoped_ptr<std::vector<Database::MetricVector> > AggregateMetric(
    113     MetricType type,
    114     const Database::MetricVector* metrics,
    115     const base::Time& start,
    116     const std::vector<TimeRange>& intervals,
    117     const base::TimeDelta& resolution,
    118     AggregationMethod method);
    119 
    120 }  // namespace performance_monitor
    121 
    122 #endif  // CHROME_BROWSER_UI_WEBUI_PERFORMANCE_MONITOR_PERFORMANCE_MONITOR_UI_UTIL_H_
    123