blob: 74305472ba0203a080f8d3fc0d169425076b8a35 [file] [log] [blame]
// 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 <memory>
#include <string>
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<MetricSample> CrashSample(
const std::string& crash_name,
int num_samples);
// Deserializes a crash sample.
static std::unique_ptr<MetricSample> ParseCrash(
const std::string& serialized);
// Builds a histogram sample.
static std::unique_ptr<MetricSample> 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<MetricSample> ParseHistogram(
const std::string& serialized);
// Builds a sparse histogram sample.
static std::unique_ptr<MetricSample> SparseHistogramSample(
const std::string& histogram_name,
int sample,
int num_samples);
// Deserializes a sparse histogram sample.
static std::unique_ptr<MetricSample> ParseSparseHistogram(
const std::string& serialized);
// Builds a linear histogram sample.
static std::unique_ptr<MetricSample> LinearHistogramSample(
const std::string& histogram_name,
int sample,
int max,
int num_samples);
// Deserializes a linear histogram sample.
static std::unique_ptr<MetricSample> ParseLinearHistogram(
const std::string& serialized);
// Builds a user action sample.
static std::unique_ptr<MetricSample> UserActionSample(
const std::string& action_name,
int num_samples);
// Deserializes a user action sample.
static std::unique_ptr<MetricSample> 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_