blob: e3d64e26eae50a6d36e58614d0126a6d1b5a268c [file] [log] [blame]
// 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