Home | History | Annotate | Download | only in chromeos
      1 // Copyright 2014 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 COMPONENTS_METRICS_CHROMEOS_METRIC_SAMPLE_H_
      6 #define COMPONENTS_METRICS_CHROMEOS_METRIC_SAMPLE_H_
      7 
      8 #include <string>
      9 
     10 #include "base/gtest_prod_util.h"
     11 #include "base/macros.h"
     12 #include "base/memory/scoped_ptr.h"
     13 
     14 namespace metrics {
     15 
     16 // This class is used by libmetrics (ChromeOS) to serialize
     17 // and deserialize measurements to send them to a metrics sending service.
     18 // It is meant to be a simple container with serialization functions.
     19 class MetricSample {
     20  public:
     21   // Types of metric sample used.
     22   enum SampleType {
     23     CRASH,
     24     HISTOGRAM,
     25     LINEAR_HISTOGRAM,
     26     SPARSE_HISTOGRAM,
     27     USER_ACTION
     28   };
     29 
     30   ~MetricSample();
     31 
     32   // Returns true if the sample is valid (can be serialized without ambiguity).
     33   //
     34   // This function should be used to filter bad samples before serializing them.
     35   bool IsValid() const;
     36 
     37   // Getters for type and name. All types of metrics have these so we do not
     38   // need to check the type.
     39   SampleType type() const { return type_; }
     40   const std::string& name() const { return name_; }
     41 
     42   // Getters for sample, min, max, bucket_count.
     43   // Check the metric type to make sure the request make sense. (ex: a crash
     44   // sample does not have a bucket_count so we crash if we call bucket_count()
     45   // on it.)
     46   const int sample() const;
     47   const int min() const;
     48   const int max() const;
     49   const int bucket_count() const;
     50 
     51   // Returns a serialized version of the sample.
     52   //
     53   // The serialized message for each type is:
     54   // crash: crash\0|name_|\0
     55   // user action: useraction\0|name_|\0
     56   // histogram: histogram\0|name_| |sample_| |min_| |max_| |bucket_count_|\0
     57   // sparsehistogram: sparsehistogram\0|name_| |sample_|\0
     58   // linearhistogram: linearhistogram\0|name_| |sample_| |max_|\0
     59   std::string ToString() const;
     60 
     61   // Builds a crash sample.
     62   static scoped_ptr<MetricSample> CrashSample(const std::string& crash_name);
     63 
     64   // Builds a histogram sample.
     65   static scoped_ptr<MetricSample> HistogramSample(
     66       const std::string& histogram_name,
     67       int sample,
     68       int min,
     69       int max,
     70       int bucket_count);
     71   // Deserializes a histogram sample.
     72   static scoped_ptr<MetricSample> ParseHistogram(const std::string& serialized);
     73 
     74   // Builds a sparse histogram sample.
     75   static scoped_ptr<MetricSample> SparseHistogramSample(
     76       const std::string& histogram_name,
     77       int sample);
     78   // Deserializes a sparse histogram sample.
     79   static scoped_ptr<MetricSample> ParseSparseHistogram(
     80       const std::string& serialized);
     81 
     82   // Builds a linear histogram sample.
     83   static scoped_ptr<MetricSample> LinearHistogramSample(
     84       const std::string& histogram_name,
     85       int sample,
     86       int max);
     87   // Deserializes a linear histogram sample.
     88   static scoped_ptr<MetricSample> ParseLinearHistogram(
     89       const std::string& serialized);
     90 
     91   // Builds a user action sample.
     92   static scoped_ptr<MetricSample> UserActionSample(
     93       const std::string& action_name);
     94 
     95   // Returns true if sample and this object represent the same sample (type,
     96   // name, sample, min, max, bucket_count match).
     97   bool IsEqual(const MetricSample& sample);
     98 
     99  private:
    100   MetricSample(SampleType sample_type,
    101                const std::string& metric_name,
    102                const int sample,
    103                const int min,
    104                const int max,
    105                const int bucket_count);
    106 
    107   const SampleType type_;
    108   const std::string name_;
    109   const int sample_;
    110   const int min_;
    111   const int max_;
    112   const int bucket_count_;
    113 
    114   DISALLOW_COPY_AND_ASSIGN(MetricSample);
    115 };
    116 
    117 }  // namespace metrics
    118 
    119 #endif  // COMPONENTS_METRICS_CHROMEOS_METRIC_SAMPLE_H_
    120