blob: f5effbb20c88abe90d7131b6069fc8979cd2d550 [file] [log] [blame] [edit]
// 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/logging.h>
#include <base/time/time.h>
#include "minios/metrics_reporter.h"
#include "minios/utils.h"
namespace minios {
const char kRecoveryDurationMinutes[] = "Installer.Recovery.NbrDurationMinutes";
const char kRecoveryReason[] = "Installer.Recovery.Reason";
const char kStatefulEventsPath[] = "/stateful/.recovery_histograms";
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(
ProcessManagerInterface* process_manager,
std::unique_ptr<MetricsLibraryInterface> metrics_lib)
: process_manager_(process_manager) {
if (metrics_lib)
metrics_lib_ = std::move(metrics_lib);
else
metrics_lib_ = std::make_unique<MetricsLibrary>();
metrics_lib_->Init();
}
void MetricsReporter::RecordNBRStart() {
start_time_ = base::Time::Now();
}
void MetricsReporter::ReportNBRComplete() {
base::FilePath console = GetLogConsole();
if (!process_manager_ ||
process_manager_->RunCommand(
{"/usr/bin/stateful_partition_for_recovery", "--mount"},
ProcessManager::IORedirection{
.input = console.value(),
.output = console.value(),
})) {
PLOG(WARNING)
<< "Failed to mount stateful partition, skip metrics reporting.";
return;
}
metrics_lib_->SetOutputFile(kStatefulEventsPath);
// 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