| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MISSIVE_ANALYTICS_METRICS_H_ |
| #define MISSIVE_ANALYTICS_METRICS_H_ |
| |
| #include <string> |
| #include <type_traits> |
| |
| #include <base/memory/scoped_refptr.h> |
| #include <base/task/sequenced_task_runner.h> |
| #include <metrics/metrics_library.h> |
| |
| namespace reporting::analytics { |
| |
| // Provides access to `MetricsLibrary`. Guarantees that all calls to Send*ToUMA |
| // happen on the same task sequence. |
| // |
| // To use this class, call its Send*ToUMA methods just like `MetricsLibrary`: |
| // |
| // Metrics::SendToUMA(....); |
| // Metrics::SendLinearToUMA(....); |
| // |
| // It is safe to use this class alongside other instances of `MetricsLibrary`. |
| // More specifically, it can be safely included in the missive client which may |
| // run in other processes that have their own instance of `MetricsLibrary`. |
| class Metrics { |
| public: |
| class TestEnvironment; |
| |
| Metrics() = delete; |
| Metrics(const Metrics&) = delete; |
| Metrics& operator=(const Metrics&) = delete; |
| // Metrics should never be instantiated, no matter what. |
| virtual ~Metrics() = 0; |
| |
| // Initialize the metrics instance. |
| static void Initialize(); |
| |
| // Proxy of `MetricsLibraryInterface::SendBoolToUMA`. |
| static bool SendBoolToUMA(const std::string& name, bool sample); |
| |
| // Proxy of `MetricsLibraryInterface::SendEnumToUMA`. |
| static bool SendEnumToUMA(const std::string& name, |
| int sample, |
| int exclusive_max); |
| |
| // A convenient wrapper of `SendEnumToUMA` that accepts an enum type directly. |
| // Note that its behavior is different from |
| // `MetricsLibraryInterface::SendEnumToUMA(const std::string& name, T |
| // sample)`, where `T::kMaxValue` is an inclusive max (i.e., sample can equal |
| // `T::kMaxValue`), whereas here sample can only be smaller than |
| // `T::kMaxValue`. |
| template <typename T> |
| static bool SendEnumToUMA(const std::string& name, |
| T sample, |
| T exclusive_max = T::kMaxValue) { |
| static_assert(std::is_enum_v<T>, "T is not an enum."); |
| CHECK_LT(static_cast<int>(sample), static_cast<int>(exclusive_max)); |
| return SendEnumToUMA(name, static_cast<int>(sample), |
| static_cast<int>(exclusive_max)); |
| } |
| |
| // Proxy of `MetricsLibraryInterface::SendPercentageToUMA`. |
| static bool SendPercentageToUMA(const std::string& name, int sample); |
| |
| // Proxy of `MetricsLibraryInterface::SendLinearToUMA`. |
| static bool SendLinearToUMA(const std::string& name, int sample, int max); |
| |
| // Proxy of `MetricsLibraryInterface::SendSparseToUMA`. |
| static bool SendSparseToUMA(const std::string& name, int sample); |
| |
| // Proxy of `MetricsLibraryInterface::SendToUMA`. |
| static bool SendToUMA( |
| const std::string& name, int sample, int min, int max, int nbuckets); |
| |
| // Add new proxy methods here when you need to use |
| // `MetricsLibrary::Send*ToUMA` methods that are not proxied above. |
| |
| private: |
| friend class TestEnvironment; |
| |
| // Sends data to UMA. |
| template <typename FuncType, typename... ArgTypes> |
| static bool PostUMATask(FuncType send_to_uma_func, ArgTypes... args); |
| |
| // Get reference to the metrics library pointer for testing. |
| static MetricsLibraryInterface*& GetMetricsLibraryForTest(); |
| // Get reference to the sequence task runner for testing. |
| static scoped_refptr<base::SequencedTaskRunner>& |
| GetMetricsTaskRunnerForTest(); |
| }; |
| } // namespace reporting::analytics |
| |
| #endif // MISSIVE_ANALYTICS_METRICS_H_ |