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_SERIALIZATION_METRIC_SAMPLE_H_ 6 #define COMPONENTS_METRICS_SERIALIZATION_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. type()39 SampleType type() const { return type_; } name()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_SERIALIZATION_METRIC_SAMPLE_H_ 120