1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker namespace metrics { 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker // This class is used by libmetrics (ChromeOS) to serialize 14*6777b538SAndroid Build Coastguard Worker // and deserialize measurements to send them to a metrics sending service. 15*6777b538SAndroid Build Coastguard Worker // It is meant to be a simple container with serialization functions. 16*6777b538SAndroid Build Coastguard Worker class MetricSample { 17*6777b538SAndroid Build Coastguard Worker public: 18*6777b538SAndroid Build Coastguard Worker // Types of metric sample used. 19*6777b538SAndroid Build Coastguard Worker enum SampleType { 20*6777b538SAndroid Build Coastguard Worker CRASH, 21*6777b538SAndroid Build Coastguard Worker HISTOGRAM, 22*6777b538SAndroid Build Coastguard Worker LINEAR_HISTOGRAM, 23*6777b538SAndroid Build Coastguard Worker SPARSE_HISTOGRAM, 24*6777b538SAndroid Build Coastguard Worker USER_ACTION 25*6777b538SAndroid Build Coastguard Worker }; 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker // Use one of the static methods in this class instead of calling the 28*6777b538SAndroid Build Coastguard Worker // constructor directly. 29*6777b538SAndroid Build Coastguard Worker // 30*6777b538SAndroid Build Coastguard Worker // The constructor is exposed for std::make_unique. 31*6777b538SAndroid Build Coastguard Worker MetricSample(SampleType sample_type, 32*6777b538SAndroid Build Coastguard Worker const std::string& metric_name, 33*6777b538SAndroid Build Coastguard Worker const int sample, 34*6777b538SAndroid Build Coastguard Worker const int min, 35*6777b538SAndroid Build Coastguard Worker const int max, 36*6777b538SAndroid Build Coastguard Worker const int bucket_count, 37*6777b538SAndroid Build Coastguard Worker const int num_samples); 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker MetricSample(const MetricSample&) = delete; 40*6777b538SAndroid Build Coastguard Worker MetricSample& operator=(const MetricSample&) = delete; 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker ~MetricSample(); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // Returns true if the sample is valid (can be serialized without ambiguity). 45*6777b538SAndroid Build Coastguard Worker // 46*6777b538SAndroid Build Coastguard Worker // This function should be used to filter bad samples before serializing them. 47*6777b538SAndroid Build Coastguard Worker bool IsValid() const; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // Getters for type, name, and num_samples. All types of metrics have these so 50*6777b538SAndroid Build Coastguard Worker // we do not need to check the type. type()51*6777b538SAndroid Build Coastguard Worker SampleType type() const { return type_; } name()52*6777b538SAndroid Build Coastguard Worker const std::string& name() const { return name_; } num_samples()53*6777b538SAndroid Build Coastguard Worker int num_samples() const { return num_samples_; } 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Getters for sample, min, max, bucket_count. 56*6777b538SAndroid Build Coastguard Worker // Check the metric type to make sure the request make sense. (ex: a crash 57*6777b538SAndroid Build Coastguard Worker // sample does not have a bucket_count so we crash if we call bucket_count() 58*6777b538SAndroid Build Coastguard Worker // on it.) 59*6777b538SAndroid Build Coastguard Worker int sample() const; 60*6777b538SAndroid Build Coastguard Worker int min() const; 61*6777b538SAndroid Build Coastguard Worker int max() const; 62*6777b538SAndroid Build Coastguard Worker int bucket_count() const; 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker // Returns a serialized version of the sample. 65*6777b538SAndroid Build Coastguard Worker // 66*6777b538SAndroid Build Coastguard Worker // The serialized message for each type is: 67*6777b538SAndroid Build Coastguard Worker // crash: crash\0|name_|\0 68*6777b538SAndroid Build Coastguard Worker // user action: useraction\0|name_|\0 69*6777b538SAndroid Build Coastguard Worker // histogram: histogram\0|name_| |sample_| |min_| |max_| |bucket_count_|\0 70*6777b538SAndroid Build Coastguard Worker // sparsehistogram: sparsehistogram\0|name_| |sample_|\0 71*6777b538SAndroid Build Coastguard Worker // linearhistogram: linearhistogram\0|name_| |sample_| |max_|\0 72*6777b538SAndroid Build Coastguard Worker // 73*6777b538SAndroid Build Coastguard Worker // Additionally, if num_samples is not 1, each type may have: 74*6777b538SAndroid Build Coastguard Worker // ` |num_samples_|` immediately before the final null terminator. 75*6777b538SAndroid Build Coastguard Worker std::string ToString() const; 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker // Builds a crash sample. 78*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> CrashSample( 79*6777b538SAndroid Build Coastguard Worker const std::string& crash_name, 80*6777b538SAndroid Build Coastguard Worker int num_samples); 81*6777b538SAndroid Build Coastguard Worker // Deserializes a crash sample. 82*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> ParseCrash( 83*6777b538SAndroid Build Coastguard Worker const std::string& serialized); 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Builds a histogram sample. 86*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> HistogramSample( 87*6777b538SAndroid Build Coastguard Worker const std::string& histogram_name, 88*6777b538SAndroid Build Coastguard Worker int sample, 89*6777b538SAndroid Build Coastguard Worker int min, 90*6777b538SAndroid Build Coastguard Worker int max, 91*6777b538SAndroid Build Coastguard Worker int bucket_count, 92*6777b538SAndroid Build Coastguard Worker int num_samples); 93*6777b538SAndroid Build Coastguard Worker // Deserializes a histogram sample. 94*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> ParseHistogram( 95*6777b538SAndroid Build Coastguard Worker const std::string& serialized); 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker // Builds a sparse histogram sample. 98*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> SparseHistogramSample( 99*6777b538SAndroid Build Coastguard Worker const std::string& histogram_name, 100*6777b538SAndroid Build Coastguard Worker int sample, 101*6777b538SAndroid Build Coastguard Worker int num_samples); 102*6777b538SAndroid Build Coastguard Worker // Deserializes a sparse histogram sample. 103*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> ParseSparseHistogram( 104*6777b538SAndroid Build Coastguard Worker const std::string& serialized); 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker // Builds a linear histogram sample. 107*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> LinearHistogramSample( 108*6777b538SAndroid Build Coastguard Worker const std::string& histogram_name, 109*6777b538SAndroid Build Coastguard Worker int sample, 110*6777b538SAndroid Build Coastguard Worker int max, 111*6777b538SAndroid Build Coastguard Worker int num_samples); 112*6777b538SAndroid Build Coastguard Worker // Deserializes a linear histogram sample. 113*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> ParseLinearHistogram( 114*6777b538SAndroid Build Coastguard Worker const std::string& serialized); 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker // Builds a user action sample. 117*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> UserActionSample( 118*6777b538SAndroid Build Coastguard Worker const std::string& action_name, 119*6777b538SAndroid Build Coastguard Worker int num_samples); 120*6777b538SAndroid Build Coastguard Worker // Deserializes a user action sample. 121*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricSample> ParseUserAction( 122*6777b538SAndroid Build Coastguard Worker const std::string& serialized); 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker // Returns true if sample and this object represent the same sample (type, 125*6777b538SAndroid Build Coastguard Worker // name, sample, min, max, bucket_count match). 126*6777b538SAndroid Build Coastguard Worker bool IsEqual(const MetricSample& sample); 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker private: 129*6777b538SAndroid Build Coastguard Worker const SampleType type_; 130*6777b538SAndroid Build Coastguard Worker const std::string name_; 131*6777b538SAndroid Build Coastguard Worker const int sample_; 132*6777b538SAndroid Build Coastguard Worker const int min_; 133*6777b538SAndroid Build Coastguard Worker const int max_; 134*6777b538SAndroid Build Coastguard Worker const int bucket_count_; 135*6777b538SAndroid Build Coastguard Worker const int num_samples_; 136*6777b538SAndroid Build Coastguard Worker }; 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker } // namespace metrics 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_ 141