Home | History | Annotate | Download | only in metrics
      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 // StatisticsRecorder holds all Histograms and BucketRanges that are used by
      6 // Histograms in the system. It provides a general place for
      7 // Histograms/BucketRanges to register, and supports a global API for accessing
      8 // (i.e., dumping, or graphing) the data.
      9 
     10 #ifndef BASE_METRICS_STATISTICS_RECORDER_H_
     11 #define BASE_METRICS_STATISTICS_RECORDER_H_
     12 
     13 #include <list>
     14 #include <map>
     15 #include <string>
     16 #include <vector>
     17 
     18 #include "base/base_export.h"
     19 #include "base/basictypes.h"
     20 #include "base/gtest_prod_util.h"
     21 #include "base/lazy_instance.h"
     22 
     23 namespace base {
     24 
     25 class BucketRanges;
     26 class HistogramBase;
     27 class Lock;
     28 
     29 class BASE_EXPORT StatisticsRecorder {
     30  public:
     31   typedef std::vector<HistogramBase*> Histograms;
     32 
     33   // Initializes the StatisticsRecorder system.
     34   static void Initialize();
     35 
     36   // Find out if histograms can now be registered into our list.
     37   static bool IsActive();
     38 
     39   // Register, or add a new histogram to the collection of statistics. If an
     40   // identically named histogram is already registered, then the argument
     41   // |histogram| will deleted.  The returned value is always the registered
     42   // histogram (either the argument, or the pre-existing registered histogram).
     43   static HistogramBase* RegisterOrDeleteDuplicate(HistogramBase* histogram);
     44 
     45   // Register, or add a new BucketRanges. If an identically BucketRanges is
     46   // already registered, then the argument |ranges| will deleted. The returned
     47   // value is always the registered BucketRanges (either the argument, or the
     48   // pre-existing one).
     49   static const BucketRanges* RegisterOrDeleteDuplicateRanges(
     50       const BucketRanges* ranges);
     51 
     52   // Methods for printing histograms.  Only histograms which have query as
     53   // a substring are written to output (an empty string will process all
     54   // registered histograms).
     55   static void WriteHTMLGraph(const std::string& query, std::string* output);
     56   static void WriteGraph(const std::string& query, std::string* output);
     57 
     58   // Method for extracting histograms which were marked for use by UMA.
     59   static void GetHistograms(Histograms* output);
     60 
     61   // Method for extracting BucketRanges used by all histograms registered.
     62   static void GetBucketRanges(std::vector<const BucketRanges*>* output);
     63 
     64   // Find a histogram by name. It matches the exact name. This method is thread
     65   // safe.  It returns NULL if a matching histogram is not found.
     66   static HistogramBase* FindHistogram(const std::string& name);
     67 
     68   // GetSnapshot copies some of the pointers to registered histograms into the
     69   // caller supplied vector (Histograms).  Only histograms with names matching
     70   // query are returned. The query must be a substring of histogram name for its
     71   // pointer to be copied.
     72   static void GetSnapshot(const std::string& query, Histograms* snapshot);
     73 
     74  private:
     75   // We keep all registered histograms in a map, from name to histogram.
     76   typedef std::map<std::string, HistogramBase*> HistogramMap;
     77 
     78   // We keep all |bucket_ranges_| in a map, from checksum to a list of
     79   // |bucket_ranges_|.  Checksum is calculated from the |ranges_| in
     80   // |bucket_ranges_|.
     81   typedef std::map<uint32, std::list<const BucketRanges*>*> RangesMap;
     82 
     83   friend struct DefaultLazyInstanceTraits<StatisticsRecorder>;
     84   friend class HistogramBaseTest;
     85   friend class HistogramTest;
     86   friend class SparseHistogramTest;
     87   friend class StatisticsRecorderTest;
     88 
     89   // The constructor just initializes static members. Usually client code should
     90   // use Initialize to do this. But in test code, you can friend this class and
     91   // call destructor/constructor to get a clean StatisticsRecorder.
     92   StatisticsRecorder();
     93   ~StatisticsRecorder();
     94 
     95   static void DumpHistogramsToVlog(void* instance);
     96 
     97   static HistogramMap* histograms_;
     98   static RangesMap* ranges_;
     99 
    100   // Lock protects access to above maps.
    101   static base::Lock* lock_;
    102 
    103   DISALLOW_COPY_AND_ASSIGN(StatisticsRecorder);
    104 };
    105 
    106 }  // namespace base
    107 
    108 #endif  // BASE_METRICS_STATISTICS_RECORDER_H_
    109