// 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 #include #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& 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& 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::HashMetricName(switch_name)); } void ReportAboutFlagsHistogram(const std::string& uma_histogram_name, const std::set& switches, const std::set& features) { ReportAboutFlagsHistogramSwitches(uma_histogram_name, switches); ReportAboutFlagsHistogramFeatures(uma_histogram_name, features); } namespace testing { const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0; } // namespace testing } // namespace flags_ui