xref: /aosp_15_r20/external/cronet/components/metrics/structured/event.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 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_STRUCTURED_EVENT_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_STRUCTURED_EVENT_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <map>
9*6777b538SAndroid Build Coastguard Worker #include <memory>
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker #include <string>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
15*6777b538SAndroid Build Coastguard Worker #include "components/metrics/structured/enums.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker // Builder classes for sending events are generated in
18*6777b538SAndroid Build Coastguard Worker // //components/metrics/structured/structured_events.h based on XML
19*6777b538SAndroid Build Coastguard Worker // configuration.
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker namespace metrics::structured {
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker // Event to be built and sent by StructuredMetrics clients. Builder
24*6777b538SAndroid Build Coastguard Worker // classes will be codegen'd from metrics definitions in structured.xml, but
25*6777b538SAndroid Build Coastguard Worker // clients may choose to use this class directly to build Events.
26*6777b538SAndroid Build Coastguard Worker class Event {
27*6777b538SAndroid Build Coastguard Worker  public:
28*6777b538SAndroid Build Coastguard Worker   // There should be a 1-1 mapping between MetricType and the mojom enums.
29*6777b538SAndroid Build Coastguard Worker   //
30*6777b538SAndroid Build Coastguard Worker   // kInt is used to represent enums.
31*6777b538SAndroid Build Coastguard Worker   //
32*6777b538SAndroid Build Coastguard Worker   // TODO(jongahn): Move this into common enum file.
33*6777b538SAndroid Build Coastguard Worker   enum class MetricType {
34*6777b538SAndroid Build Coastguard Worker     kHmac = 0,
35*6777b538SAndroid Build Coastguard Worker     kLong = 1,
36*6777b538SAndroid Build Coastguard Worker     kInt = 2,
37*6777b538SAndroid Build Coastguard Worker     kDouble = 3,
38*6777b538SAndroid Build Coastguard Worker     kRawString = 4,
39*6777b538SAndroid Build Coastguard Worker     kBoolean = 5,
40*6777b538SAndroid Build Coastguard Worker   };
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   // Holds the value and the type of the metric encoded.
43*6777b538SAndroid Build Coastguard Worker   struct MetricValue {
44*6777b538SAndroid Build Coastguard Worker     MetricValue() = default;
45*6777b538SAndroid Build Coastguard Worker     MetricValue(MetricType type, base::Value value);
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker     MetricValue(MetricValue&& other);
48*6777b538SAndroid Build Coastguard Worker     MetricValue& operator=(MetricValue&& other);
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker     bool operator==(const MetricValue& rhs) const;
51*6777b538SAndroid Build Coastguard Worker     ~MetricValue();
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker     MetricType type;
54*6777b538SAndroid Build Coastguard Worker     base::Value value;
55*6777b538SAndroid Build Coastguard Worker   };
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // Special metadata if event is a sequence project.
58*6777b538SAndroid Build Coastguard Worker   struct EventSequenceMetadata {
59*6777b538SAndroid Build Coastguard Worker     explicit EventSequenceMetadata(int reset_counter);
60*6777b538SAndroid Build Coastguard Worker     ~EventSequenceMetadata();
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker     EventSequenceMetadata(const EventSequenceMetadata& other);
63*6777b538SAndroid Build Coastguard Worker     EventSequenceMetadata& operator=(const EventSequenceMetadata& other);
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker     // Reset counter used for sequencing events across resets.
66*6777b538SAndroid Build Coastguard Worker     int reset_counter;
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker     // UUIDv4 generated for every event. This does not contain any timestamp
69*6777b538SAndroid Build Coastguard Worker     // information.
70*6777b538SAndroid Build Coastguard Worker     std::string event_unique_id;
71*6777b538SAndroid Build Coastguard Worker   };
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   Event();
74*6777b538SAndroid Build Coastguard Worker   Event(const std::string& project_name, const std::string& event_name);
75*6777b538SAndroid Build Coastguard Worker   Event(const std::string& project_name,
76*6777b538SAndroid Build Coastguard Worker         const std::string& event_name,
77*6777b538SAndroid Build Coastguard Worker         bool is_event_sequence);
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker   Event(Event&& other);
80*6777b538SAndroid Build Coastguard Worker   Event& operator=(Event&& other);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   virtual ~Event();
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   // Whether |this| event part of a sequence.
85*6777b538SAndroid Build Coastguard Worker   bool IsEventSequenceType() const;
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker   Event Clone() const;
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker   // Returns true if the value was added successfully. |type| and type of
90*6777b538SAndroid Build Coastguard Worker   // |value| must be consistent and will be enforced. If the data in |value| and
91*6777b538SAndroid Build Coastguard Worker   // |type| do match, then |value| will be moved into |this| when called.
92*6777b538SAndroid Build Coastguard Worker   bool AddMetric(const std::string& metric_name,
93*6777b538SAndroid Build Coastguard Worker                  MetricType type,
94*6777b538SAndroid Build Coastguard Worker                  base::Value&& value);
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   // Sets the metadata into |this|. If |IsEventSequenceType()| is false, then
97*6777b538SAndroid Build Coastguard Worker   // this will no-op.
98*6777b538SAndroid Build Coastguard Worker   void SetEventSequenceMetadata(
99*6777b538SAndroid Build Coastguard Worker       const EventSequenceMetadata& event_sequence_metadata);
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   // Explicitly set the system uptime.
102*6777b538SAndroid Build Coastguard Worker   void SetRecordedTimeSinceBoot(base::TimeDelta recorded_time_since_boot);
103*6777b538SAndroid Build Coastguard Worker 
project_name()104*6777b538SAndroid Build Coastguard Worker   const std::string& project_name() const { return project_name_; }
event_name()105*6777b538SAndroid Build Coastguard Worker   const std::string& event_name() const { return event_name_; }
is_event_sequence()106*6777b538SAndroid Build Coastguard Worker   bool is_event_sequence() const { return is_event_sequence_; }
metric_values()107*6777b538SAndroid Build Coastguard Worker   const std::map<std::string, MetricValue>& metric_values() const {
108*6777b538SAndroid Build Coastguard Worker     return metric_values_;
109*6777b538SAndroid Build Coastguard Worker   }
has_system_uptime()110*6777b538SAndroid Build Coastguard Worker   bool has_system_uptime() const {
111*6777b538SAndroid Build Coastguard Worker     return recorded_time_since_boot_.has_value();
112*6777b538SAndroid Build Coastguard Worker   }
113*6777b538SAndroid Build Coastguard Worker   const base::TimeDelta recorded_time_since_boot() const;
114*6777b538SAndroid Build Coastguard Worker   const EventSequenceMetadata& event_sequence_metadata() const;
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker  private:
117*6777b538SAndroid Build Coastguard Worker   std::string project_name_;
118*6777b538SAndroid Build Coastguard Worker   std::string event_name_;
119*6777b538SAndroid Build Coastguard Worker   std::map<std::string, MetricValue> metric_values_;
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   // System uptime for which the event was recorded.
122*6777b538SAndroid Build Coastguard Worker   std::optional<base::TimeDelta> recorded_time_since_boot_;
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker   std::optional<EventSequenceMetadata> event_sequence_metadata_;
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   // Returns true if part of a sequence.
127*6777b538SAndroid Build Coastguard Worker   bool is_event_sequence_ = false;
128*6777b538SAndroid Build Coastguard Worker };
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker }  // namespace metrics::structured
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_METRICS_STRUCTURED_EVENT_H_
133