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