xref: /aosp_15_r20/external/cronet/net/dns/httpssvc_metrics.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2020 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 #ifndef NET_DNS_HTTPSSVC_METRICS_H_
6 #define NET_DNS_HTTPSSVC_METRICS_H_
7 
8 #include <optional>
9 #include <string>
10 #include <string_view>
11 #include <vector>
12 
13 #include "base/containers/flat_set.h"
14 #include "base/time/time.h"
15 #include "net/base/net_export.h"
16 
17 namespace net {
18 
19 // These values are persisted to logs. Entries should not be renumbered and
20 // numeric values should never be reused. (See HttpssvcDnsRcode in
21 // tools/metrics/histograms/enums.xml.)
22 enum HttpssvcDnsRcode {
23   kTimedOut = 0,
24   kUnrecognizedRcode,
25   kMissingDnsResponse,
26   kNoError,
27   kFormErr,
28   kServFail,
29   kNxDomain,
30   kNotImp,
31   kRefused,
32   kMaxValue = kRefused,
33 };
34 
35 // Translate an RCODE value to the |HttpssvcDnsRcode| enum, which is used for
36 // HTTPSSVC experimentation. The goal is to keep these values in a small,
37 // contiguous range in order to satisfy the UMA enumeration function's
38 // requirements. This function never returns |kTimedOut| |kUnrecognizedRcode|,
39 // or |kMissingDnsResponse|.
40 enum HttpssvcDnsRcode TranslateDnsRcodeForHttpssvcExperiment(uint8_t rcode);
41 
42 // Tool for aggregating HTTPS RR metrics. Accumulates metrics via the Save*
43 // methods. Records metrics to UMA on destruction.
44 // TODO(crbug.com/1366422): Rework this class once we've finished with
45 // HTTPS-related rollouts and have decided what metrics we want to keep
46 // permanently.
47 class NET_EXPORT_PRIVATE HttpssvcMetrics {
48  public:
49   explicit HttpssvcMetrics(bool secure);
50   ~HttpssvcMetrics();
51   HttpssvcMetrics(HttpssvcMetrics&) = delete;
52   HttpssvcMetrics(HttpssvcMetrics&&) = delete;
53 
54   // May be called many times.
55   void SaveForAddressQuery(base::TimeDelta resolve_time,
56                            enum HttpssvcDnsRcode rcode);
57 
58   // Save the fact that the non-integrity queries failed. Prevents metrics from
59   // being recorded.
60   void SaveAddressQueryFailure();
61 
62   // Must only be called once.
63   void SaveForHttps(enum HttpssvcDnsRcode rcode,
64                     const std::vector<bool>& condensed_records,
65                     base::TimeDelta https_resolve_time);
66 
67  private:
68   std::string BuildMetricName(std::string_view leaf_name) const;
69 
70   // Records all the aggregated metrics to UMA.
71   void RecordMetrics();
72 
73   const bool secure_;
74   // RecordIntegrityMetrics() will do nothing when |disqualified_| is true.
75   bool disqualified_ = false;
76   bool already_recorded_ = false;
77   std::optional<enum HttpssvcDnsRcode> rcode_https_;
78   size_t num_https_records_ = 0;
79   std::optional<bool> is_https_parsable_;
80   // We never make multiple HTTPS queries per DnsTask, so we only need
81   // one TimeDelta for the HTTPS query.
82   std::optional<base::TimeDelta> https_resolve_time_;
83   std::vector<base::TimeDelta> address_resolve_times_;
84 };
85 
86 }  // namespace net
87 
88 #endif  // NET_DNS_HTTPSSVC_METRICS_H_
89