| // Copyright 2024 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "fbpreprocessor/metrics.h" | |
| #include <memory> | |
| #include <string_view> | |
| #include <utility> | |
| #include <base/containers/fixed_flat_map.h> | |
| #include <base/strings/strcat.h> | |
| #include <fbpreprocessor/proto_bindings/fbpreprocessor.pb.h> | |
| #include <metrics/metrics_library.h> | |
| #include "fbpreprocessor/firmware_dump.h" | |
| #include "fbpreprocessor/pseudonymization_manager.h" | |
| namespace fbpreprocessor { | |
| namespace { | |
| // Type of firmware dumps reported to UMA. These values are persisted to logs. | |
| // Entries should not be renumbered and numeric values should never be reused | |
| // since they will be used by UMA to interpret the data. The values of this enum | |
| // must be kept in sync with the type definitions in fbpreprocessor.proto. | |
| enum class UMAFirmwareType { | |
| kUnknown = DebugDump::TYPE_UNSPECIFIED, | |
| kWiFi = DebugDump::WIFI, | |
| kMaxValue = kWiFi, | |
| }; | |
| constexpr std::string_view kPrefix{"Platform.FbPreprocessor."}; | |
| constexpr auto kDumpTypeName = | |
| base::MakeFixedFlatMap<FirmwareDump::Type, std::string_view>({ | |
| {FirmwareDump::Type::kWiFi, "WiFi"}, | |
| }); | |
| std::string_view ToString(FirmwareDump::Type type) { | |
| if (kDumpTypeName.contains(type)) { | |
| return kDumpTypeName.at(type); | |
| } | |
| return "UnknownType"; | |
| } | |
| UMAFirmwareType ConvertToUMAType(fbpreprocessor::FirmwareDump::Type type) { | |
| switch (type) { | |
| case FirmwareDump::Type::kWiFi: | |
| return UMAFirmwareType::kWiFi; | |
| } | |
| } | |
| } // namespace | |
| Metrics::Metrics() : library_(std::make_unique<MetricsLibrary>()) {} | |
| Metrics::~Metrics() = default; | |
| void Metrics::SetLibraryForTesting( | |
| std::unique_ptr<MetricsLibraryInterface> lib) { | |
| library_ = std::move(lib); | |
| } | |
| bool Metrics::SendNumberOfAvailableDumps(FirmwareDump::Type fw_type, int num) { | |
| return library_->SendLinearToUMA( | |
| base::StrCat({kPrefix, ToString(fw_type), ".Output.Number"}), num, | |
| PseudonymizationManager::kMaxProcessedDumps + 1); | |
| } | |
| bool Metrics::SendAllowedStatus(FirmwareDump::Type fw_type, | |
| CollectionAllowedStatus status) { | |
| return library_->SendEnumToUMA( | |
| base::StrCat({kPrefix, ToString(fw_type), ".Collection.Allowed"}), | |
| status); | |
| } | |
| bool Metrics::SendPseudonymizationFirmwareType(FirmwareDump::Type fw_type) { | |
| return library_->SendEnumToUMA( | |
| base::StrCat({kPrefix, "Pseudonymization.DumpType"}), | |
| ConvertToUMAType(fw_type)); | |
| } | |
| bool Metrics::SendPseudonymizationResult(FirmwareDump::Type fw_type, | |
| PseudonymizationResult result) { | |
| return library_->SendEnumToUMA( | |
| base::StrCat({kPrefix, ToString(fw_type), ".Pseudonymization.Result"}), | |
| result); | |
| } | |
| } // namespace fbpreprocessor |