blob: 3c5adf9bfdd1d24a28f9b2ae9ec8cab3372cee46 [file] [log] [blame]
// Copyright 2014 The Chromium OS 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 METRICS_SERIALIZATION_METRIC_SAMPLE_H_
#define METRICS_SERIALIZATION_METRIC_SAMPLE_H_
#include <string>
#include "base/gtest_prod_util.h"
#include "base/macros.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 {
INVALID,
CRASH,
HISTOGRAM,
LINEAR_HISTOGRAM,
SPARSE_HISTOGRAM,
USER_ACTION,
};
// Constructs an invalid sample. Use the factory functions below to create
// samples carrying actual data.
MetricSample() {}
~MetricSample() = default;
// Allow copy and move construction. Assignment is not available because all
// data members are constant.
MetricSample(const MetricSample& other) = default;
MetricSample(MetricSample&& other) = default;
// 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, num_samples.
// 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;
int num_samples() 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 MetricSample CrashSample(const std::string& crash_name);
// Builds a histogram sample.
// Chrome doesn't support repeated samples yet, non-one counts
// can only be used (outside of unit tests) when
// conditional compile flag USE_METRICS_UPLOADER is 1.
static MetricSample HistogramSample(const std::string& histogram_name,
int sample,
int min,
int max,
int bucket_count,
int num_samples = 1);
// Deserializes a histogram sample.
static MetricSample ParseHistogram(const std::string& serialized);
// Builds a sparse histogram sample.
static MetricSample SparseHistogramSample(const std::string& histogram_name,
int sample);
// Deserializes a sparse histogram sample.
static MetricSample ParseSparseHistogram(const std::string& serialized);
// Builds a linear histogram sample.
static MetricSample LinearHistogramSample(const std::string& histogram_name,
int sample,
int max);
// Deserializes a linear histogram sample.
static MetricSample ParseLinearHistogram(const std::string& serialized);
// Builds a user action sample.
static 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) const;
private:
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 = 1);
const SampleType type_ = INVALID;
const std::string name_;
const int sample_ = 0;
const int min_ = 0;
const int max_ = 0;
const int bucket_count_ = 0;
const int num_samples_ = 0;
};
} // namespace metrics
#endif // METRICS_SERIALIZATION_METRIC_SAMPLE_H_