blob: c0b285344e1f353362e082ab93e6d2605508f6df [file] [log] [blame]
// 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.
#include <memory>
#include <utility>
#include <base/files/file.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/time/time.h>
#include "minios/metrics_reporter.h"
namespace minios {
const char kRecoveryDurationMinutes[] = "Installer.Recovery.NbrDurationMinutes";
const char kRecoveryReason[] = "Installer.Recovery.Reason";
const base::FilePath kEventsFile{".recovery_histograms"};
// NOTE: The metrics should be renamed if the following settings are changed.
const int kRecoveryDurationMinutes_Buckets = 50;
const int kRecoveryDurationMinutes_MAX = 10 * 24 * 60; // 10 days
const int kRecoveryReasonCode_NBR = 200;
const int kRecoveryReasonCode_MAX = 255;
MetricsReporter::MetricsReporter(
std::unique_ptr<MetricsLibraryInterface> metrics_lib,
const base::FilePath& stateful_path)
: stateful_path_(stateful_path) {
if (metrics_lib)
metrics_lib_ = std::move(metrics_lib);
else
metrics_lib_ = std::make_unique<MetricsLibrary>();
}
void MetricsReporter::RecordNBRStart() {
start_time_ = base::Time::Now();
}
void MetricsReporter::ReportNBRComplete() {
if (!base::PathExists(stateful_path_)) {
LOG(WARNING) << "Stateful not mounted, skipping metrics reporting.";
return;
}
metrics_lib_->SetOutputFile(stateful_path_.Append(kEventsFile).value());
// Report recovery reason code.
metrics_lib_->SendEnumToUMA(kRecoveryReason, kRecoveryReasonCode_NBR,
kRecoveryReasonCode_MAX);
// Report duration.
base::TimeDelta duration = base::Time::Now() - start_time_;
metrics_lib_->SendToUMA(kRecoveryDurationMinutes, duration.InMinutes(),
/*min=*/0, kRecoveryDurationMinutes_MAX,
kRecoveryDurationMinutes_Buckets);
}
} // namespace minios