| Index: components/arc/metrics/arc_metrics_service.cc
|
| diff --git a/components/arc/metrics/arc_metrics_service.cc b/components/arc/metrics/arc_metrics_service.cc
|
| index 5ce5aa101ae122fde893bef49e0a3be45daae846..9aca98bd08402b742530c24ac060b086e6783d04 100644
|
| --- a/components/arc/metrics/arc_metrics_service.cc
|
| +++ b/components/arc/metrics/arc_metrics_service.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "components/arc/metrics/arc_metrics_service.h"
|
|
|
| +#include <string>
|
| +
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/strings/string_util.h"
|
| @@ -17,19 +19,24 @@ const char kArcProcessNamePrefix[] = "org.chromium.arc.";
|
| const char kGmsProcessNamePrefix[] = "com.google.android.gms";
|
| const char kBootProgressEnableScreen[] = "boot_progress_enable_screen";
|
|
|
| -} // namespace
|
| +} // namespace
|
|
|
| namespace arc {
|
|
|
| ArcMetricsService::ArcMetricsService(ArcBridgeService* bridge_service)
|
| - : ArcService(bridge_service), binding_(this), weak_ptr_factory_(this) {
|
| - arc_bridge_service()->AddObserver(this);
|
| + : ArcService(bridge_service),
|
| + binding_(this),
|
| + process_observer_(this),
|
| + weak_ptr_factory_(this) {
|
| + arc_bridge_service()->metrics()->AddObserver(this);
|
| + arc_bridge_service()->process()->AddObserver(&process_observer_);
|
| oom_kills_monitor_.Start();
|
| }
|
|
|
| ArcMetricsService::~ArcMetricsService() {
|
| DCHECK(CalledOnValidThread());
|
| - arc_bridge_service()->RemoveObserver(this);
|
| + arc_bridge_service()->process()->RemoveObserver(&process_observer_);
|
| + arc_bridge_service()->metrics()->RemoveObserver(this);
|
| }
|
|
|
| bool ArcMetricsService::CalledOnValidThread() {
|
| @@ -37,7 +44,7 @@ bool ArcMetricsService::CalledOnValidThread() {
|
| return thread_checker_.CalledOnValidThread();
|
| }
|
|
|
| -void ArcMetricsService::OnMetricsInstanceReady() {
|
| +void ArcMetricsService::OnInstanceReady() {
|
| VLOG(2) << "Start metrics service.";
|
| // Retrieve ARC start time from session manager.
|
| chromeos::SessionManagerClient* session_manager_client =
|
| @@ -47,7 +54,7 @@ void ArcMetricsService::OnMetricsInstanceReady() {
|
| weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| -void ArcMetricsService::OnMetricsInstanceClosed() {
|
| +void ArcMetricsService::OnInstanceClosed() {
|
| VLOG(2) << "Close metrics service.";
|
| DCHECK(CalledOnValidThread());
|
| if (binding_.is_bound())
|
| @@ -56,11 +63,9 @@ void ArcMetricsService::OnMetricsInstanceClosed() {
|
|
|
| void ArcMetricsService::OnProcessInstanceReady() {
|
| VLOG(2) << "Start updating process list.";
|
| - timer_.Start(
|
| - FROM_HERE,
|
| - base::TimeDelta::FromMinutes(kRequestProcessListPeriodInMinutes),
|
| - this,
|
| - &ArcMetricsService::RequestProcessList);
|
| + timer_.Start(FROM_HERE,
|
| + base::TimeDelta::FromMinutes(kRequestProcessListPeriodInMinutes),
|
| + this, &ArcMetricsService::RequestProcessList);
|
| }
|
|
|
| void ArcMetricsService::OnProcessInstanceClosed() {
|
| @@ -70,16 +75,15 @@ void ArcMetricsService::OnProcessInstanceClosed() {
|
|
|
| void ArcMetricsService::RequestProcessList() {
|
| mojom::ProcessInstance* process_instance =
|
| - arc_bridge_service()->process_instance();
|
| + arc_bridge_service()->process()->instance();
|
| if (!process_instance) {
|
| LOG(ERROR) << "No process instance found before RequestProcessList";
|
| return;
|
| }
|
|
|
| VLOG(2) << "RequestProcessList";
|
| - process_instance->RequestProcessList(
|
| - base::Bind(&ArcMetricsService::ParseProcessList,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| + process_instance->RequestProcessList(base::Bind(
|
| + &ArcMetricsService::ParseProcessList, weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| void ArcMetricsService::ParseProcessList(
|
| @@ -109,12 +113,17 @@ void ArcMetricsService::ParseProcessList(
|
| }
|
|
|
| void ArcMetricsService::OnArcStartTimeRetrieved(
|
| - bool success, base::TimeTicks arc_start_time) {
|
| + bool success,
|
| + base::TimeTicks arc_start_time) {
|
| DCHECK(CalledOnValidThread());
|
| if (!success) {
|
| LOG(ERROR) << "Failed to retrieve ARC start timeticks.";
|
| return;
|
| }
|
| + if (!arc_bridge_service()->metrics()->instance()) {
|
| + LOG(ERROR) << "ARC metrics instance went away while retrieving start time.";
|
| + return;
|
| + }
|
|
|
| // The binding of host interface is deferred until the ARC start time is
|
| // retrieved here because it prevents race condition of the ARC start
|
| @@ -122,7 +131,7 @@ void ArcMetricsService::OnArcStartTimeRetrieved(
|
| if (!binding_.is_bound()) {
|
| mojom::MetricsHostPtr host_ptr;
|
| binding_.Bind(mojo::GetProxy(&host_ptr));
|
| - arc_bridge_service()->metrics_instance()->Init(std::move(host_ptr));
|
| + arc_bridge_service()->metrics()->instance()->Init(std::move(host_ptr));
|
| }
|
| arc_start_time_ = arc_start_time;
|
| VLOG(2) << "ARC start @" << arc_start_time_;
|
| @@ -134,27 +143,36 @@ void ArcMetricsService::ReportBootProgress(
|
| int64_t arc_start_time_in_ms =
|
| (arc_start_time_ - base::TimeTicks()).InMilliseconds();
|
| for (const auto& event : events) {
|
| - VLOG(2) << "Report boot progress event:"
|
| - << event->event << "@" << event->uptimeMillis;
|
| + VLOG(2) << "Report boot progress event:" << event->event << "@"
|
| + << event->uptimeMillis;
|
| std::string title = "Arc." + event->event.get();
|
| base::TimeDelta elapsed_time = base::TimeDelta::FromMilliseconds(
|
| event->uptimeMillis - arc_start_time_in_ms);
|
| // Note: This leaks memory, which is expected behavior.
|
| - base::HistogramBase* histogram =
|
| - base::Histogram::FactoryTimeGet(
|
| - title,
|
| - base::TimeDelta::FromMilliseconds(1),
|
| - base::TimeDelta::FromSeconds(30),
|
| - 50,
|
| - base::HistogramBase::kUmaTargetedHistogramFlag);
|
| + base::HistogramBase* histogram = base::Histogram::FactoryTimeGet(
|
| + title, base::TimeDelta::FromMilliseconds(1),
|
| + base::TimeDelta::FromSeconds(30), 50,
|
| + base::HistogramBase::kUmaTargetedHistogramFlag);
|
| histogram->AddTime(elapsed_time);
|
| if (event->event.get().compare(kBootProgressEnableScreen) == 0)
|
| - UMA_HISTOGRAM_CUSTOM_TIMES("Arc.AndroidBootTime",
|
| - elapsed_time,
|
| + UMA_HISTOGRAM_CUSTOM_TIMES("Arc.AndroidBootTime", elapsed_time,
|
| base::TimeDelta::FromMilliseconds(1),
|
| - base::TimeDelta::FromSeconds(30),
|
| - 50);
|
| + base::TimeDelta::FromSeconds(30), 50);
|
| }
|
| }
|
|
|
| +ArcMetricsService::ProcessObserver::ProcessObserver(
|
| + ArcMetricsService* arc_metrics_service)
|
| + : arc_metrics_service_(arc_metrics_service) {}
|
| +
|
| +ArcMetricsService::ProcessObserver::~ProcessObserver() = default;
|
| +
|
| +void ArcMetricsService::ProcessObserver::OnInstanceReady() {
|
| + arc_metrics_service_->OnProcessInstanceReady();
|
| +}
|
| +
|
| +void ArcMetricsService::ProcessObserver::OnInstanceClosed() {
|
| + arc_metrics_service_->OnProcessInstanceClosed();
|
| +}
|
| +
|
| } // namespace arc
|
|
|