diff options
Diffstat (limited to 'chromium/components/arc/metrics/arc_metrics_service.cc')
-rw-r--r-- | chromium/components/arc/metrics/arc_metrics_service.cc | 80 |
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); } } |