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