summaryrefslogtreecommitdiff
path: root/chromium/components/arc/metrics/arc_metrics_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/arc/metrics/arc_metrics_service.cc')
-rw-r--r--chromium/components/arc/metrics/arc_metrics_service.cc80
1 files changed, 55 insertions, 25 deletions
diff --git a/chromium/components/arc/metrics/arc_metrics_service.cc b/chromium/components/arc/metrics/arc_metrics_service.cc
index 52867ee63f3..ee6d25cc317 100644
--- a/chromium/components/arc/metrics/arc_metrics_service.cc
+++ b/chromium/components/arc/metrics/arc_metrics_service.cc
@@ -8,18 +8,21 @@
#include <utility>
#include "base/logging.h"
+#include "base/memory/singleton.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_util.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/session_manager_client.h"
#include "components/arc/arc_bridge_service.h"
+#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
namespace arc {
namespace {
constexpr base::TimeDelta kUmaMinTime = base::TimeDelta::FromMilliseconds(1);
+constexpr base::TimeDelta kUmaMaxTime = base::TimeDelta::FromSeconds(60);
constexpr int kUmaNumBuckets = 50;
constexpr base::TimeDelta kRequestProcessListPeriod =
@@ -31,7 +34,7 @@ constexpr char kBootProgressEnableScreen[] = "boot_progress_enable_screen";
std::string BootTypeToString(mojom::BootType boot_type) {
switch (boot_type) {
case mojom::BootType::UNKNOWN:
- return ""; // for backward compatibility.
+ break;
case mojom::BootType::FIRST_BOOT:
return ".FirstBoot";
case mojom::BootType::FIRST_BOOT_AFTER_UPDATE:
@@ -43,26 +46,54 @@ std::string BootTypeToString(mojom::BootType boot_type) {
return "";
}
+// Singleton factory for ArcMetricsService.
+class ArcMetricsServiceFactory
+ : public internal::ArcBrowserContextKeyedServiceFactoryBase<
+ ArcMetricsService,
+ ArcMetricsServiceFactory> {
+ public:
+ // Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
+ static constexpr const char* kName = "ArcMetricsServiceFactory";
+
+ static ArcMetricsServiceFactory* GetInstance() {
+ return base::Singleton<ArcMetricsServiceFactory>::get();
+ }
+
+ private:
+ friend base::DefaultSingletonTraits<ArcMetricsServiceFactory>;
+ ArcMetricsServiceFactory() = default;
+ ~ArcMetricsServiceFactory() override = default;
+};
+
} // namespace
-ArcMetricsService::ArcMetricsService(ArcBridgeService* bridge_service)
- : ArcService(bridge_service),
+// static
+ArcMetricsService* ArcMetricsService::GetForBrowserContext(
+ content::BrowserContext* context) {
+ return ArcMetricsServiceFactory::GetForBrowserContext(context);
+}
+
+ArcMetricsService::ArcMetricsService(content::BrowserContext* context,
+ ArcBridgeService* bridge_service)
+ : arc_bridge_service_(bridge_service),
binding_(this),
process_observer_(this),
weak_ptr_factory_(this) {
- arc_bridge_service()->metrics()->AddObserver(this);
- arc_bridge_service()->process()->AddObserver(&process_observer_);
+ arc_bridge_service_->metrics()->AddObserver(this);
+ arc_bridge_service_->process()->AddObserver(&process_observer_);
}
ArcMetricsService::~ArcMetricsService() {
- DCHECK(CalledOnValidThread());
- arc_bridge_service()->process()->RemoveObserver(&process_observer_);
- arc_bridge_service()->metrics()->RemoveObserver(this);
-}
-
-bool ArcMetricsService::CalledOnValidThread() {
- // Make sure access to the Chrome clipboard is happening in the UI thread.
- return thread_checker_.CalledOnValidThread();
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ // TODO(hidehiko): Currently, the lifetime of ArcBridgeService and
+ // BrowserContextKeyedService is not nested.
+ // If ArcServiceManager::Get() returns nullptr, it is already destructed,
+ // so do not touch it.
+ if (ArcServiceManager::Get()) {
+ arc_bridge_service_->process()->RemoveObserver(&process_observer_);
+ arc_bridge_service_->metrics()->RemoveObserver(this);
+ }
}
void ArcMetricsService::OnInstanceReady() {
@@ -76,8 +107,8 @@ void ArcMetricsService::OnInstanceReady() {
}
void ArcMetricsService::OnInstanceClosed() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
VLOG(2) << "Close metrics service.";
- DCHECK(CalledOnValidThread());
if (binding_.is_bound())
binding_.Unbind();
}
@@ -95,7 +126,7 @@ void ArcMetricsService::OnProcessInstanceClosed() {
void ArcMetricsService::RequestProcessList() {
mojom::ProcessInstance* process_instance = ARC_GET_INSTANCE_FOR_METHOD(
- arc_bridge_service()->process(), RequestProcessList);
+ arc_bridge_service_->process(), RequestProcessList);
if (!process_instance)
return;
VLOG(2) << "RequestProcessList";
@@ -132,13 +163,13 @@ void ArcMetricsService::ParseProcessList(
void ArcMetricsService::OnArcStartTimeRetrieved(
bool success,
base::TimeTicks arc_start_time) {
- DCHECK(CalledOnValidThread());
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!success) {
LOG(ERROR) << "Failed to retrieve ARC start timeticks.";
return;
}
auto* instance =
- ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service()->metrics(), Init);
+ ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->metrics(), Init);
if (!instance)
return;
@@ -157,26 +188,25 @@ void ArcMetricsService::OnArcStartTimeRetrieved(
void ArcMetricsService::ReportBootProgress(
std::vector<mojom::BootProgressEventPtr> events,
mojom::BootType boot_type) {
- DCHECK(CalledOnValidThread());
- // TODO(yusukes): Return immediately with with LOG(ERROR) when |boot_type| is
- // UNKNOWN. Once the container is updated, we'll never see the boot type.
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ if (boot_type == mojom::BootType::UNKNOWN) {
+ LOG(WARNING) << "boot_type is unknown. Skip recording UMA.";
+ return;
+ }
int64_t arc_start_time_in_ms =
(arc_start_time_ - base::TimeTicks()).InMilliseconds();
const std::string suffix = BootTypeToString(boot_type);
- // TODO(yusukes): Define kUmaMaxTime and always use 60s.
- const base::TimeDelta max_time = base::TimeDelta::FromSeconds(
- boot_type == mojom::BootType::UNKNOWN ? 30 : 60);
for (const auto& event : events) {
VLOG(2) << "Report boot progress event:" << event->event << "@"
<< event->uptimeMillis;
const std::string name = "Arc." + event->event + suffix;
const base::TimeDelta elapsed_time = base::TimeDelta::FromMilliseconds(
event->uptimeMillis - arc_start_time_in_ms);
- base::UmaHistogramCustomTimes(name, elapsed_time, kUmaMinTime, max_time,
+ base::UmaHistogramCustomTimes(name, elapsed_time, kUmaMinTime, kUmaMaxTime,
kUmaNumBuckets);
if (event->event.compare(kBootProgressEnableScreen) == 0) {
base::UmaHistogramCustomTimes("Arc.AndroidBootTime" + suffix,
- elapsed_time, kUmaMinTime, max_time,
+ elapsed_time, kUmaMinTime, kUmaMaxTime,
kUmaNumBuckets);
}
}