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