// Copyright 2014 The Chromium Authors // 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 #include 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 }; // Use one of the static methods in this class instead of calling the // constructor directly. // // The constructor is exposed for std::make_unique. MetricSample(SampleType sample_type, const std::string& metric_name, const int sample, const int min, const int max, const int bucket_count, const int num_samples); MetricSample(const MetricSample&) = delete; MetricSample& operator=(const MetricSample&) = delete; ~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, name, and num_samples. 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_; } int num_samples() const { return num_samples_; } // 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.) int sample() const; int min() const; int max() 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 // // Additionally, if num_samples is not 1, each type may have: // ` |num_samples_|` immediately before the final null terminator. std::string ToString() const; // Builds a crash sample. static std::unique_ptr CrashSample( const std::string& crash_name, int num_samples); // Deserializes a crash sample. static std::unique_ptr ParseCrash( const std::string& serialized); // Builds a histogram sample. static std::unique_ptr HistogramSample( const std::string& histogram_name, int sample, int min, int max, int bucket_count, int num_samples); // Deserializes a histogram sample. static std::unique_ptr ParseHistogram( const std::string& serialized); // Builds a sparse histogram sample. static std::unique_ptr SparseHistogramSample( const std::string& histogram_name, int sample, int num_samples); // Deserializes a sparse histogram sample. static std::unique_ptr ParseSparseHistogram( const std::string& serialized); // Builds a linear histogram sample. static std::unique_ptr LinearHistogramSample( const std::string& histogram_name, int sample, int max, int num_samples); // Deserializes a linear histogram sample. static std::unique_ptr ParseLinearHistogram( const std::string& serialized); // Builds a user action sample. static std::unique_ptr UserActionSample( const std::string& action_name, int num_samples); // Deserializes a user action sample. static std::unique_ptr ParseUserAction( const std::string& serialized); // 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: const SampleType type_; const std::string name_; const int sample_; const int min_; const int max_; const int bucket_count_; const int num_samples_; }; } // namespace metrics #endif // COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_