xref: /aosp_15_r20/external/cronet/components/metrics/structured/mojom/event_mojom_traits.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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