1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/arc/metrics/arc_metrics_service_proxy.h"
#include "base/memory/singleton.h"
#include "base/metrics/histogram_functions.h"
#include "chrome/browser/ash/app_list/arc/arc_app_list_prefs_factory.h"
#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/ash/arc/session/arc_session_manager.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/memory/memory_kills_monitor.h"
#include "chrome/browser/memory/oom_kills_monitor.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chromeos/ash/experiences/arc/arc_browser_context_keyed_service_factory_base.h"
// Enable VLOG level 1.
#undef ENABLED_VLOG_LEVEL
#define ENABLED_VLOG_LEVEL 1
namespace arc {
namespace {
class ArcMetricsServiceProxyFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcMetricsServiceProxy,
ArcMetricsServiceProxyFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcMetricsServiceProxyFactory";
static ArcMetricsServiceProxyFactory* GetInstance() {
return base::Singleton<ArcMetricsServiceProxyFactory>::get();
}
private:
friend base::DefaultSingletonTraits<ArcMetricsServiceProxyFactory>;
ArcMetricsServiceProxyFactory() {
DependsOn(ArcAppListPrefsFactory::GetInstance());
DependsOn(ArcMetricsService::GetFactory());
}
~ArcMetricsServiceProxyFactory() override = default;
};
} // namespace
// static
ArcMetricsServiceProxy* ArcMetricsServiceProxy::GetForBrowserContext(
content::BrowserContext* context) {
return ArcMetricsServiceProxyFactory::GetForBrowserContext(context);
}
ArcMetricsServiceProxy::ArcMetricsServiceProxy(
content::BrowserContext* context,
ArcBridgeService* arc_bridge_service)
: arc_app_list_prefs_(ArcAppListPrefs::Get(context)),
arc_metrics_service_(ArcMetricsService::GetForBrowserContext(context)) {
arc_app_list_prefs_->AddObserver(this);
arc::ArcSessionManager::Get()->AddObserver(this);
arc_metrics_service_->AddAppKillObserver(this);
arc_metrics_service_->SetPrefService(g_browser_process->local_state());
}
void ArcMetricsServiceProxy::Shutdown() {
arc::ArcSessionManager::Get()->RemoveObserver(this);
arc_app_list_prefs_->RemoveObserver(this);
arc_metrics_service_->RemoveAppKillObserver(this);
}
void ArcMetricsServiceProxy::OnTaskCreated(int32_t task_id,
const std::string& package_name,
const std::string& activity,
const std::string& intent,
int32_t session_id) {
arc_metrics_service_->OnTaskCreated(task_id, package_name, activity, intent);
}
void ArcMetricsServiceProxy::OnTaskDestroyed(int32_t task_id) {
arc_metrics_service_->OnTaskDestroyed(task_id);
}
void ArcMetricsServiceProxy::OnArcStarted() {
arc_metrics_service_->OnArcStarted();
}
void ArcMetricsServiceProxy::OnArcSessionStopped(ArcStopReason stop_reason) {
const auto* profile = ProfileManager::GetPrimaryUserProfile();
if (arc::IsArcAllowedForProfile(profile)) {
std::string metric_name =
GetHistogramNameByUserType("Arc.Session.StopReason", profile);
base::UmaHistogramEnumeration(metric_name, stop_reason);
// Log the metric to facilitate finding feedback reports in Xamine.
VLOG(1) << metric_name << ": "
<< static_cast<std::underlying_type_t<ArcStopReason>>(stop_reason);
}
arc_metrics_service_->OnArcSessionStopped();
}
void ArcMetricsServiceProxy::OnArcLowMemoryKill() {
memory::MemoryKillsMonitor::LogLowMemoryKill("APP", 0);
}
void ArcMetricsServiceProxy::OnArcOOMKillCount(
unsigned long current_oom_kills) {
memory::OOMKillsMonitor::GetInstance().LogArcOOMKill(current_oom_kills);
}
void ArcMetricsServiceProxy::OnArcMemoryPressureKill(int count,
int estimated_freed_kb) {
// TODO(b/197040216): update kill metrics to separate tab discards, LMKD
// kills, and pressure kills.
for (int i = 0; i < count; i++) {
memory::MemoryKillsMonitor::LogLowMemoryKill("APP_PRESSURE", 0);
}
}
// static
void ArcMetricsServiceProxy::EnsureFactoryBuilt() {
ArcMetricsServiceProxyFactory::GetInstance();
}
} // namespace arc
|