| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/flags_ui/flags_ui_metrics.h" |
| |
| #include <set> |
| #include <string> |
| |
| #include "base/logging.h" |
| #include "base/metrics/histogram_functions.h" |
| #include "base/metrics/metrics_hashes.h" |
| #include "base/notreached.h" |
| #include "base/strings/string_util.h" |
| |
| namespace flags_ui { |
| |
| namespace { |
| |
| // Records a set of feature switches (prefixed with "--"). |
| void ReportAboutFlagsHistogramSwitches(const std::string& uma_histogram_name, |
| const std::set<std::string>& switches) { |
| for (const std::string& flag : switches) { |
| int uma_id = testing::kBadSwitchFormatHistogramId; |
| if (base::StartsWith(flag, "--", base::CompareCase::SENSITIVE)) { |
| // Skip '--' before switch name. |
| std::string switch_name(flag.substr(2)); |
| |
| // Kill value, if any. |
| const size_t value_pos = switch_name.find('='); |
| if (value_pos != std::string::npos) |
| switch_name.resize(value_pos); |
| |
| uma_id = GetSwitchUMAId(switch_name); |
| } else { |
| NOTREACHED() << "ReportAboutFlagsHistogram(): flag '" << flag |
| << "' has incorrect format."; |
| } |
| DVLOG(1) << "ReportAboutFlagsHistogram(): histogram='" << uma_histogram_name |
| << "' '" << flag << "', uma_id=" << uma_id; |
| base::UmaHistogramSparse(uma_histogram_name, uma_id); |
| } |
| } |
| |
| // Records a set of FEATURE_VALUE_TYPE features (suffixed with ":enabled" or |
| // "disabled", depending on their state). |
| void ReportAboutFlagsHistogramFeatures(const std::string& uma_histogram_name, |
| const std::set<std::string>& features) { |
| for (const std::string& feature : features) { |
| int uma_id = GetSwitchUMAId(feature); |
| DVLOG(1) << "ReportAboutFlagsHistogram(): histogram='" << uma_histogram_name |
| << "' '" << feature << "', uma_id=" << uma_id; |
| base::UmaHistogramSparse(uma_histogram_name, uma_id); |
| } |
| } |
| |
| } // namespace |
| |
| base::HistogramBase::Sample GetSwitchUMAId(const std::string& switch_name) { |
| return static_cast<base::HistogramBase::Sample>( |
| base::HashMetricName(switch_name)); |
| } |
| |
| void ReportAboutFlagsHistogram(const std::string& uma_histogram_name, |
| const std::set<std::string>& switches, |
| const std::set<std::string>& features) { |
| ReportAboutFlagsHistogramSwitches(uma_histogram_name, switches); |
| ReportAboutFlagsHistogramFeatures(uma_histogram_name, features); |
| } |
| |
| namespace testing { |
| |
| const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0; |
| |
| } // namespace testing |
| |
| } // namespace flags_ui |