1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/metrics/structured/event.h"
#include <map>
#include <memory>
#include <string>
#include "base/uuid.h"
#include "base/values.h"
namespace metrics::structured {
Event::MetricValue::MetricValue(MetricType type, base::Value value)
: type(type), value(std::move(value)) {}
Event::MetricValue::MetricValue(Event::MetricValue&& other) = default;
Event::MetricValue& Event::MetricValue::operator=(Event::MetricValue&& other) =
default;
bool Event::MetricValue::operator==(const Event::MetricValue& rhs) const {
return type == rhs.type && value == rhs.value;
}
Event::MetricValue::~MetricValue() = default;
Event::EventSequenceMetadata::EventSequenceMetadata(int reset_counter)
: reset_counter(reset_counter),
event_unique_id(base::Uuid::GenerateRandomV4().AsLowercaseString()) {}
Event::EventSequenceMetadata::EventSequenceMetadata(
const Event::EventSequenceMetadata& other) = default;
Event::EventSequenceMetadata& Event::EventSequenceMetadata::operator=(
const Event::EventSequenceMetadata& other) = default;
Event::EventSequenceMetadata::~EventSequenceMetadata() = default;
Event::Event() = default;
Event::Event(const std::string& project_name, const std::string& event_name)
: project_name_(project_name), event_name_(event_name) {}
Event::Event(const std::string& project_name,
const std::string& event_name,
bool is_event_sequence)
: project_name_(project_name),
event_name_(event_name),
is_event_sequence_(is_event_sequence) {}
Event::~Event() = default;
Event::Event(Event&& other)
: project_name_(std::move(other.project_name_)),
event_name_(std::move(other.event_name_)),
metric_values_(std::move(other.metric_values_)),
recorded_time_since_boot_(std::move(other.recorded_time_since_boot_)),
event_sequence_metadata_(std::move(other.event_sequence_metadata_)),
is_event_sequence_(other.is_event_sequence_) {}
Event& Event::operator=(Event&& other) {
project_name_ = std::move(other.project_name_);
event_name_ = std::move(other.event_name_);
metric_values_ = std::move(other.metric_values_);
recorded_time_since_boot_ = std::move(other.recorded_time_since_boot_);
event_sequence_metadata_ = std::move(other.event_sequence_metadata_);
is_event_sequence_ = other.is_event_sequence_;
return *this;
}
bool Event::IsEventSequenceType() const {
return is_event_sequence_;
}
Event Event::Clone() const {
auto clone = Event(project_name_, event_name_, is_event_sequence_);
for (const auto& metric : metric_values()) {
const Event::MetricValue& metric_value = metric.second;
clone.AddMetric(metric.first, metric_value.type,
metric_value.value.Clone());
}
clone.recorded_time_since_boot_ = recorded_time_since_boot_;
clone.event_sequence_metadata_ = event_sequence_metadata_;
return clone;
}
const Event::EventSequenceMetadata& Event::event_sequence_metadata() const {
CHECK(event_sequence_metadata_.has_value());
return event_sequence_metadata_.value();
}
const base::TimeDelta Event::recorded_time_since_boot() const {
CHECK(recorded_time_since_boot_.has_value());
return recorded_time_since_boot_.value();
}
bool Event::AddMetric(const std::string& metric_name,
Event::MetricType type,
base::Value&& value) {
bool valid = true;
switch (type) {
case MetricType::kHmac:
valid = value.is_string();
break;
// no base::LongValue so int64_t is encoded in a string.
case MetricType::kLong:
valid = value.is_string();
break;
case MetricType::kInt:
valid = value.is_int();
break;
case MetricType::kDouble:
valid = value.is_double();
break;
case MetricType::kRawString:
valid = value.is_string();
break;
case MetricType::kBoolean:
valid = value.is_bool();
break;
}
if (!valid) {
return false;
}
auto pair =
metric_values_.emplace(metric_name, MetricValue(type, std::move(value)));
return pair.second;
}
void Event::SetEventSequenceMetadata(
const Event::EventSequenceMetadata& event_sequence_metadata) {
event_sequence_metadata_ = event_sequence_metadata;
}
void Event::SetRecordedTimeSinceBoot(base::TimeDelta recorded_time_since_boot) {
recorded_time_since_boot_ = recorded_time_since_boot;
}
} // namespace metrics::structured
|