xref: /aosp_15_r20/external/cronet/components/metrics/serialization/metric_sample.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker namespace metrics {
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker // This class is used by libmetrics (ChromeOS) to serialize
14*6777b538SAndroid Build Coastguard Worker // and deserialize measurements to send them to a metrics sending service.
15*6777b538SAndroid Build Coastguard Worker // It is meant to be a simple container with serialization functions.
16*6777b538SAndroid Build Coastguard Worker class MetricSample {
17*6777b538SAndroid Build Coastguard Worker  public:
18*6777b538SAndroid Build Coastguard Worker   // Types of metric sample used.
19*6777b538SAndroid Build Coastguard Worker   enum SampleType {
20*6777b538SAndroid Build Coastguard Worker     CRASH,
21*6777b538SAndroid Build Coastguard Worker     HISTOGRAM,
22*6777b538SAndroid Build Coastguard Worker     LINEAR_HISTOGRAM,
23*6777b538SAndroid Build Coastguard Worker     SPARSE_HISTOGRAM,
24*6777b538SAndroid Build Coastguard Worker     USER_ACTION
25*6777b538SAndroid Build Coastguard Worker   };
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker   // Use one of the static methods in this class instead of calling the
28*6777b538SAndroid Build Coastguard Worker   // constructor directly.
29*6777b538SAndroid Build Coastguard Worker   //
30*6777b538SAndroid Build Coastguard Worker   // The constructor is exposed for std::make_unique.
31*6777b538SAndroid Build Coastguard Worker   MetricSample(SampleType sample_type,
32*6777b538SAndroid Build Coastguard Worker                const std::string& metric_name,
33*6777b538SAndroid Build Coastguard Worker                const int sample,
34*6777b538SAndroid Build Coastguard Worker                const int min,
35*6777b538SAndroid Build Coastguard Worker                const int max,
36*6777b538SAndroid Build Coastguard Worker                const int bucket_count,
37*6777b538SAndroid Build Coastguard Worker                const int num_samples);
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   MetricSample(const MetricSample&) = delete;
40*6777b538SAndroid Build Coastguard Worker   MetricSample& operator=(const MetricSample&) = delete;
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   ~MetricSample();
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   // Returns true if the sample is valid (can be serialized without ambiguity).
45*6777b538SAndroid Build Coastguard Worker   //
46*6777b538SAndroid Build Coastguard Worker   // This function should be used to filter bad samples before serializing them.
47*6777b538SAndroid Build Coastguard Worker   bool IsValid() const;
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   // Getters for type, name, and num_samples. All types of metrics have these so
50*6777b538SAndroid Build Coastguard Worker   // we do not need to check the type.
type()51*6777b538SAndroid Build Coastguard Worker   SampleType type() const { return type_; }
name()52*6777b538SAndroid Build Coastguard Worker   const std::string& name() const { return name_; }
num_samples()53*6777b538SAndroid Build Coastguard Worker   int num_samples() const { return num_samples_; }
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   // Getters for sample, min, max, bucket_count.
56*6777b538SAndroid Build Coastguard Worker   // Check the metric type to make sure the request make sense. (ex: a crash
57*6777b538SAndroid Build Coastguard Worker   // sample does not have a bucket_count so we crash if we call bucket_count()
58*6777b538SAndroid Build Coastguard Worker   // on it.)
59*6777b538SAndroid Build Coastguard Worker   int sample() const;
60*6777b538SAndroid Build Coastguard Worker   int min() const;
61*6777b538SAndroid Build Coastguard Worker   int max() const;
62*6777b538SAndroid Build Coastguard Worker   int bucket_count() const;
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   // Returns a serialized version of the sample.
65*6777b538SAndroid Build Coastguard Worker   //
66*6777b538SAndroid Build Coastguard Worker   // The serialized message for each type is:
67*6777b538SAndroid Build Coastguard Worker   // crash: crash\0|name_|\0
68*6777b538SAndroid Build Coastguard Worker   // user action: useraction\0|name_|\0
69*6777b538SAndroid Build Coastguard Worker   // histogram: histogram\0|name_| |sample_| |min_| |max_| |bucket_count_|\0
70*6777b538SAndroid Build Coastguard Worker   // sparsehistogram: sparsehistogram\0|name_| |sample_|\0
71*6777b538SAndroid Build Coastguard Worker   // linearhistogram: linearhistogram\0|name_| |sample_| |max_|\0
72*6777b538SAndroid Build Coastguard Worker   //
73*6777b538SAndroid Build Coastguard Worker   // Additionally, if num_samples is not 1, each type may have:
74*6777b538SAndroid Build Coastguard Worker   // ` |num_samples_|` immediately before the final null terminator.
75*6777b538SAndroid Build Coastguard Worker   std::string ToString() const;
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   // Builds a crash sample.
78*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> CrashSample(
79*6777b538SAndroid Build Coastguard Worker       const std::string& crash_name,
80*6777b538SAndroid Build Coastguard Worker       int num_samples);
81*6777b538SAndroid Build Coastguard Worker   // Deserializes a crash sample.
82*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> ParseCrash(
83*6777b538SAndroid Build Coastguard Worker       const std::string& serialized);
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker   // Builds a histogram sample.
86*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> HistogramSample(
87*6777b538SAndroid Build Coastguard Worker       const std::string& histogram_name,
88*6777b538SAndroid Build Coastguard Worker       int sample,
89*6777b538SAndroid Build Coastguard Worker       int min,
90*6777b538SAndroid Build Coastguard Worker       int max,
91*6777b538SAndroid Build Coastguard Worker       int bucket_count,
92*6777b538SAndroid Build Coastguard Worker       int num_samples);
93*6777b538SAndroid Build Coastguard Worker   // Deserializes a histogram sample.
94*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> ParseHistogram(
95*6777b538SAndroid Build Coastguard Worker       const std::string& serialized);
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker   // Builds a sparse histogram sample.
98*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> SparseHistogramSample(
99*6777b538SAndroid Build Coastguard Worker       const std::string& histogram_name,
100*6777b538SAndroid Build Coastguard Worker       int sample,
101*6777b538SAndroid Build Coastguard Worker       int num_samples);
102*6777b538SAndroid Build Coastguard Worker   // Deserializes a sparse histogram sample.
103*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> ParseSparseHistogram(
104*6777b538SAndroid Build Coastguard Worker       const std::string& serialized);
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   // Builds a linear histogram sample.
107*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> LinearHistogramSample(
108*6777b538SAndroid Build Coastguard Worker       const std::string& histogram_name,
109*6777b538SAndroid Build Coastguard Worker       int sample,
110*6777b538SAndroid Build Coastguard Worker       int max,
111*6777b538SAndroid Build Coastguard Worker       int num_samples);
112*6777b538SAndroid Build Coastguard Worker   // Deserializes a linear histogram sample.
113*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> ParseLinearHistogram(
114*6777b538SAndroid Build Coastguard Worker       const std::string& serialized);
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   // Builds a user action sample.
117*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> UserActionSample(
118*6777b538SAndroid Build Coastguard Worker       const std::string& action_name,
119*6777b538SAndroid Build Coastguard Worker       int num_samples);
120*6777b538SAndroid Build Coastguard Worker   // Deserializes a user action sample.
121*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MetricSample> ParseUserAction(
122*6777b538SAndroid Build Coastguard Worker       const std::string& serialized);
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker   // Returns true if sample and this object represent the same sample (type,
125*6777b538SAndroid Build Coastguard Worker   // name, sample, min, max, bucket_count match).
126*6777b538SAndroid Build Coastguard Worker   bool IsEqual(const MetricSample& sample);
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker  private:
129*6777b538SAndroid Build Coastguard Worker   const SampleType type_;
130*6777b538SAndroid Build Coastguard Worker   const std::string name_;
131*6777b538SAndroid Build Coastguard Worker   const int sample_;
132*6777b538SAndroid Build Coastguard Worker   const int min_;
133*6777b538SAndroid Build Coastguard Worker   const int max_;
134*6777b538SAndroid Build Coastguard Worker   const int bucket_count_;
135*6777b538SAndroid Build Coastguard Worker   const int num_samples_;
136*6777b538SAndroid Build Coastguard Worker };
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_METRICS_SERIALIZATION_METRIC_SAMPLE_H_
141