// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_ #define COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_ #include <string> #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" namespace metrics { // This class is used by libmetrics (ChromeOS) to serialize // and deserialize measurements to send them to a metrics sending service. // It is meant to be a simple container with serialization functions. class MetricSample { public: // Types of metric sample used. enum SampleType { CRASH, HISTOGRAM, LINEAR_HISTOGRAM, SPARSE_HISTOGRAM, USER_ACTION }; ~MetricSample(); // Returns true if the sample is valid (can be serialized without ambiguity). // // This function should be used to filter bad samples before serializing them. bool IsValid() const; // Getters for type and name. All types of metrics have these so we do not // need to check the type. SampleType type() const { return type_; } const std::string& name() const { return name_; } // Getters for sample, min, max, bucket_count. // Check the metric type to make sure the request make sense. (ex: a crash // sample does not have a bucket_count so we crash if we call bucket_count() // on it.) const int sample() const; const int min() const; const int max() const; const int bucket_count() const; // Returns a serialized version of the sample. // // The serialized message for each type is: // crash: crash\0|name_|\0 // user action: useraction\0|name_|\0 // histogram: histogram\0|name_| |sample_| |min_| |max_| |bucket_count_|\0 // sparsehistogram: sparsehistogram\0|name_| |sample_|\0 // linearhistogram: linearhistogram\0|name_| |sample_| |max_|\0 std::string ToString() const; // Builds a crash sample. static scoped_ptr<MetricSample> CrashSample(const std::string& crash_name); // Builds a histogram sample. static scoped_ptr<MetricSample> HistogramSample( const std::string& histogram_name, int sample, int min, int max, int bucket_count); // Deserializes a histogram sample. static scoped_ptr<MetricSample> ParseHistogram(const std::string& serialized); // Builds a sparse histogram sample. static scoped_ptr<MetricSample> SparseHistogramSample( const std::string& histogram_name, int sample); // Deserializes a sparse histogram sample. static scoped_ptr<MetricSample> ParseSparseHistogram( const std::string& serialized); // Builds a linear histogram sample. static scoped_ptr<MetricSample> LinearHistogramSample( const std::string& histogram_name, int sample, int max); // Deserializes a linear histogram sample. static scoped_ptr<MetricSample> ParseLinearHistogram( const std::string& serialized); // Builds a user action sample. static scoped_ptr<MetricSample> UserActionSample( const std::string& action_name); // Returns true if sample and this object represent the same sample (type, // name, sample, min, max, bucket_count match). bool IsEqual(const MetricSample& sample); private: MetricSample(SampleType sample_type, const std::string& metric_name, const int sample, const int min, const int max, const int bucket_count); const SampleType type_; const std::string name_; const int sample_; const int min_; const int max_; const int bucket_count_; DISALLOW_COPY_AND_ASSIGN(MetricSample); }; } // namespace metrics #endif // COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_