1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "components/metrics/structured/mojom/event_mojom_traits.h" 6 7 #include <map> 8 #include <optional> 9 #include <string> 10 11 #include "base/strings/string_number_conversions.h" 12 #include "base/time/time.h" 13 #include "base/values.h" 14 #include "components/metrics/structured/event.h" 15 #include "components/metrics/structured/mojom/event.mojom.h" 16 17 namespace mojo { 18 19 // static 20 metrics::structured::mojom::MetricValueDataView::Tag 21 UnionTraits<metrics::structured::mojom::MetricValueDataView, 22 metrics::structured::Event::MetricValue>:: GetTag(const metrics::structured::Event::MetricValue & metric_value)23 GetTag(const metrics::structured::Event::MetricValue& metric_value) { 24 switch (metric_value.type) { 25 case metrics::structured::Event::MetricType::kHmac: 26 return metrics::structured::mojom::MetricValueDataView::Tag::kHmacValue; 27 case metrics::structured::Event::MetricType::kLong: 28 return metrics::structured::mojom::MetricValueDataView::Tag::kLongValue; 29 case metrics::structured::Event::MetricType::kInt: 30 return metrics::structured::mojom::MetricValueDataView::Tag::kIntValue; 31 case metrics::structured::Event::MetricType::kDouble: 32 return metrics::structured::mojom::MetricValueDataView::Tag::kDoubleValue; 33 case metrics::structured::Event::MetricType::kRawString: 34 return metrics::structured::mojom::MetricValueDataView::Tag::kRawStrValue; 35 case metrics::structured::Event::MetricType::kBoolean: 36 return metrics::structured::mojom::MetricValueDataView::Tag::kBoolValue; 37 } 38 } 39 40 // static 41 bool UnionTraits<metrics::structured::mojom::MetricValueDataView, 42 metrics::structured::Event::MetricValue>:: Read(metrics::structured::mojom::MetricValueDataView metric,metrics::structured::Event::MetricValue * out)43 Read(metrics::structured::mojom::MetricValueDataView metric, 44 metrics::structured::Event::MetricValue* out) { 45 switch (metric.tag()) { 46 case metrics::structured::mojom::MetricValueDataView::Tag::kHmacValue: { 47 std::string hmac_value; 48 if (!metric.ReadHmacValue(&hmac_value)) 49 return false; 50 out->type = metrics::structured::Event::MetricType::kHmac; 51 out->value = base::Value(std::move(hmac_value)); 52 break; 53 } 54 case metrics::structured::mojom::MetricValueDataView::Tag::kLongValue: 55 out->type = metrics::structured::Event::MetricType::kLong; 56 out->value = base::Value(base::NumberToString(metric.long_value())); 57 break; 58 case metrics::structured::mojom::MetricValueDataView::Tag::kIntValue: 59 out->type = metrics::structured::Event::MetricType::kInt; 60 out->value = base::Value(metric.int_value()); 61 break; 62 case metrics::structured::mojom::MetricValueDataView::Tag::kDoubleValue: 63 out->type = metrics::structured::Event::MetricType::kDouble; 64 out->value = base::Value(metric.double_value()); 65 break; 66 case metrics::structured::mojom::MetricValueDataView::Tag::kRawStrValue: { 67 std::string raw_str_value; 68 if (!metric.ReadRawStrValue(&raw_str_value)) 69 return false; 70 out->type = metrics::structured::Event::MetricType::kRawString; 71 out->value = base::Value(std::move(raw_str_value)); 72 break; 73 } 74 case metrics::structured::mojom::MetricValueDataView::Tag::kBoolValue: 75 out->type = metrics::structured::Event::MetricType::kBoolean; 76 out->value = base::Value(metric.bool_value()); 77 break; 78 } 79 return true; 80 } 81 82 // static 83 std::optional<base::TimeDelta> StructTraits< 84 metrics::structured::mojom::EventDataView, system_uptime(const metrics::structured::Event & event)85 metrics::structured::Event>::system_uptime(const metrics::structured::Event& 86 event) { 87 if (event.IsEventSequenceType()) 88 return event.recorded_time_since_boot(); 89 return std::nullopt; 90 } 91 92 // static 93 bool StructTraits<metrics::structured::mojom::EventDataView, 94 metrics::structured::Event>:: Read(metrics::structured::mojom::EventDataView event,metrics::structured::Event * out)95 Read(metrics::structured::mojom::EventDataView event, 96 metrics::structured::Event* out) { 97 std::string project_name, event_name; 98 std::map<std::string, metrics::structured::Event::MetricValue> metrics; 99 std::optional<base::TimeDelta> system_uptime; 100 bool is_event_sequence = event.is_event_sequence(); 101 102 if (!event.ReadProjectName(&project_name) || 103 !event.ReadEventName(&event_name) || !event.ReadMetrics(&metrics) || 104 !event.ReadSystemUptime(&system_uptime)) 105 return false; 106 107 *out = 108 metrics::structured::Event(project_name, event_name, is_event_sequence); 109 110 if (system_uptime.has_value()) 111 out->SetRecordedTimeSinceBoot(system_uptime.value()); 112 113 for (auto&& metric : metrics) { 114 if (!out->AddMetric(metric.first, metric.second.type, 115 std::move(metric.second.value))) 116 return false; 117 } 118 return true; 119 } 120 121 } // namespace mojo 122