| // Copyright 2022 The Chromium OS 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 <base/check.h> |
| #include <base/logging.h> |
| #include <dbus/dlcservice/dbus-constants.h> |
| #include <dbus/modemfwd/dbus-constants.h> |
| |
| #include "modemfwd/error.h" |
| #include "modemfwd/logging.h" |
| #include "modemfwd/metrics.h" |
| |
| using modemfwd::metrics::CheckForWedgedModemResult; |
| using modemfwd::metrics::DlcInstallResult; |
| using modemfwd::metrics::DlcUninstallResult; |
| using modemfwd::metrics::FwInstallResult; |
| using modemfwd::metrics::FwUpdateLocation; |
| using std::string; |
| |
| namespace modemfwd { |
| |
| namespace { |
| |
| template <typename MetricEnum> |
| MetricEnum GetMetricFromInnerErrorCode( |
| const brillo::Error* err, std::map<std::string, MetricEnum>& result_map) { |
| MetricEnum res = MetricEnum::kUnknownError; |
| const brillo::Error* err_it = err; |
| // Iterate over all errors in the chain and get the deepest error that has a |
| // match in the metrics map. |
| while (err_it) { |
| auto it = result_map.find(err_it->GetCode()); |
| if (it != result_map.end()) |
| res = it->second; |
| err_it = err_it->GetInnerError(); |
| } |
| return res; |
| } |
| |
| } // namespace |
| |
| namespace metrics { |
| |
| const char kMetricCheckForWedgedModemResult[] = |
| "Platform.Modemfwd.CheckForWedgedModemResult"; |
| const char kMetricDlcInstallResult[] = "Platform.Modemfwd.DlcInstallResult"; |
| const char kMetricDlcUninstallResult[] = "Platform.Modemfwd.DlcUninstallResult"; |
| const char kMetricFwUpdateLocation[] = "Platform.Modemfwd.FWUpdateLocation"; |
| const char kMetricFwInstallResult[] = "Platform.Modemfwd.FWInstallResult"; |
| |
| } // namespace metrics |
| |
| // IMPORTANT: To obsolete a metric enum value, just remove it from the map |
| // initialization and comment it out on the Enum. |
| Metrics::DlcInstallResultMap Metrics::install_result_ = { |
| {dlcservice::kErrorInvalidDlc, |
| DlcInstallResult::kDlcServiceReturnedInvalidDlc}, // dbus error |
| {dlcservice::kErrorAllocation, |
| DlcInstallResult::kDlcServiceReturnedAllocation}, // dbus error |
| {dlcservice::kErrorNoImageFound, |
| DlcInstallResult::kDlcServiceReturnedNoImageFound}, // dbus error |
| {dlcservice::kErrorNeedReboot, |
| DlcInstallResult::kDlcServiceReturnedNeedReboot}, // dbus error |
| {dlcservice::kErrorBusy, |
| DlcInstallResult::kDlcServiceReturnedBusy}, // dbus error |
| {error::kUnexpectedDlcState, DlcInstallResult::kFailedUnexpectedDlcState}, |
| {error::kTimeoutWaitingForDlcService, |
| DlcInstallResult::kFailedTimeoutWaitingForDlcService}, |
| {error::kTimeoutWaitingForDlcInstall, |
| DlcInstallResult::kFailedTimeoutWaitingForDlcInstall}, |
| {error::kTimeoutWaitingForInstalledState, |
| DlcInstallResult::kFailedTimeoutWaitingForInstalledState}, |
| {error::kDlcServiceReturnedErrorOnInstall, |
| DlcInstallResult::kDlcServiceReturnedErrorOnInstall}, |
| {error::kDlcServiceReturnedErrorOnGetDlcState, |
| DlcInstallResult::kDlcServiceReturnedErrorOnGetDlcState}, |
| {error::kUnexpectedEmptyDlcId, DlcInstallResult::kUnexpectedEmptyDlcId}, |
| }; |
| |
| Metrics::DlcUninstallResultMap Metrics::uninstall_result_ = { |
| {dlcservice::kErrorInvalidDlc, |
| DlcUninstallResult::kDlcServiceReturnedInvalidDlc}, // dbus error |
| {dlcservice::kErrorAllocation, |
| DlcUninstallResult::kDlcServiceReturnedAllocation}, // dbus error |
| {dlcservice::kErrorNoImageFound, |
| DlcUninstallResult::kDlcServiceReturnedNoImageFound}, // dbus error |
| {dlcservice::kErrorNeedReboot, |
| DlcUninstallResult::kDlcServiceReturnedNeedReboot}, // dbus error |
| {dlcservice::kErrorBusy, |
| DlcUninstallResult::kDlcServiceReturnedBusy}, // dbus error |
| {error::kDlcServiceReturnedErrorOnGetExistingDlcs, |
| DlcUninstallResult::kDlcServiceReturnedErrorOnGetExistingDlcs}, |
| {error::kDlcServiceReturnedErrorOnPurge, |
| DlcUninstallResult::kDlcServiceReturnedErrorOnPurge}, |
| {error::kUnexpectedEmptyVariant, |
| DlcUninstallResult::kUnexpectedEmptyVariant}, |
| }; |
| |
| Metrics::FwInstallResultMap Metrics::fw_install_result_ = { |
| {kErrorResultInitFailure, FwInstallResult::kInitFailure}, // dbus error |
| {kErrorResultInitManifestFailure, |
| FwInstallResult::kInitManifestFailure}, // dbus error |
| {kErrorResultFailedToPrepareFirmwareFile, |
| FwInstallResult::kFailedToPrepareFirmwareFile}, // dbus error |
| {kErrorResultFlashFailure, FwInstallResult::kFlashFailure}, // dbus error |
| {kErrorResultFailureReturnedByHelper, |
| FwInstallResult::kFailureReturnedByHelper}, // dbus error |
| {kErrorResultInitJournalFailure, |
| FwInstallResult::kInitJournalFailure}, // dbus error |
| }; |
| |
| void Metrics::Init() { |
| metrics_library_->Init(); |
| } |
| |
| void Metrics::SendDlcInstallResultSuccess() { |
| SendDlcInstallResult(DlcInstallResult::kSuccess); |
| } |
| |
| void Metrics::SendDlcInstallResultFailure(const brillo::Error* err) { |
| DCHECK(err); |
| DlcInstallResult res = GetMetricFromInnerErrorCode(err, install_result_); |
| SendDlcInstallResult(res); |
| } |
| |
| void Metrics::SendDlcInstallResult(DlcInstallResult result) { |
| ELOG(INFO) << "SendDlcInstallResult:" << static_cast<int>(result); |
| metrics_library_->SendEnumToUMA( |
| metrics::kMetricDlcInstallResult, static_cast<int>(result), |
| static_cast<int>(DlcInstallResult::kNumConstants)); |
| } |
| |
| void Metrics::SendDlcUninstallResultSuccess() { |
| SendDlcUninstallResult(DlcUninstallResult::kSuccess); |
| } |
| |
| void Metrics::SendDlcUninstallResultFailure(const brillo::Error* err) { |
| DCHECK(err); |
| DlcUninstallResult res = GetMetricFromInnerErrorCode(err, uninstall_result_); |
| SendDlcUninstallResult(res); |
| } |
| |
| void Metrics::SendDlcUninstallResult(DlcUninstallResult result) { |
| ELOG(INFO) << "SendDlcUninstallResult:" << static_cast<int>(result); |
| metrics_library_->SendEnumToUMA( |
| metrics::kMetricDlcUninstallResult, static_cast<int>(result), |
| static_cast<int>(DlcUninstallResult::kNumConstants)); |
| } |
| |
| // Sends the |FwUpdateLocation| value. |
| void Metrics::SendFwUpdateLocation(FwUpdateLocation location) { |
| ELOG(INFO) << "SendFwUpdateLocation:" << static_cast<int>(location); |
| metrics_library_->SendEnumToUMA( |
| metrics::kMetricFwUpdateLocation, static_cast<int>(location), |
| static_cast<int>(FwUpdateLocation::kNumConstants)); |
| } |
| |
| void Metrics::SendFwInstallResultSuccess() { |
| SendFwInstallResult(FwInstallResult::kSuccess); |
| } |
| |
| void Metrics::SendFwInstallResultFailure(const brillo::Error* err) { |
| DCHECK(err); |
| FwInstallResult res = GetMetricFromInnerErrorCode(err, fw_install_result_); |
| SendFwInstallResult(res); |
| } |
| |
| void Metrics::SendFwInstallResult(FwInstallResult result) { |
| ELOG(INFO) << "SendFwInstallResult:" << static_cast<int>(result); |
| metrics_library_->SendEnumToUMA( |
| metrics::kMetricFwInstallResult, static_cast<int>(result), |
| static_cast<int>(FwInstallResult::kNumConstants)); |
| } |
| |
| void Metrics::SendCheckForWedgedModemResult(CheckForWedgedModemResult result) { |
| ELOG(INFO) << "SendCheckForWedgedModemResult:" << static_cast<int>(result); |
| metrics_library_->SendEnumToUMA( |
| metrics::kMetricCheckForWedgedModemResult, static_cast<int>(result), |
| static_cast<int>(CheckForWedgedModemResult::kNumConstants)); |
| } |
| } // namespace modemfwd |