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