| Index: chrome/browser/metrics/renderer_uptime_tracker.cc
|
| diff --git a/chrome/browser/metrics/renderer_uptime_tracker.cc b/chrome/browser/metrics/renderer_uptime_tracker.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..94148a531a9b1d234c7671f8da723fac1c8e2f37
|
| --- /dev/null
|
| +++ b/chrome/browser/metrics/renderer_uptime_tracker.cc
|
| @@ -0,0 +1,114 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/metrics/renderer_uptime_tracker.h"
|
| +
|
| +#include "base/metrics/histogram_macros.h"
|
| +#include "content/public/browser/notification_service.h"
|
| +#include "content/public/browser/notification_types.h"
|
| +#include "content/public/browser/render_process_host.h"
|
| +#include "extensions/features/features.h"
|
| +
|
| +#if BUILDFLAG(ENABLE_EXTENSIONS)
|
| +#include "extensions/browser/process_map.h"
|
| +#endif
|
| +
|
| +namespace metrics {
|
| +
|
| +namespace {
|
| +
|
| +RendererUptimeTracker* g_instance = nullptr;
|
| +
|
| +} // namespace
|
| +
|
| +// static
|
| +void RendererUptimeTracker::Initialize() {
|
| + DCHECK(!g_instance);
|
| + g_instance = new RendererUptimeTracker;
|
| +}
|
| +
|
| +// static
|
| +RendererUptimeTracker* RendererUptimeTracker::Get() {
|
| + DCHECK(g_instance);
|
| + return g_instance;
|
| +}
|
| +
|
| +RendererUptimeTracker::RendererUptimeTracker() {
|
| + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
|
| + content::NotificationService::AllBrowserContextsAndSources());
|
| + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
|
| + content::NotificationService::AllBrowserContextsAndSources());
|
| + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
|
| + content::NotificationService::AllBrowserContextsAndSources());
|
| +}
|
| +
|
| +RendererUptimeTracker::~RendererUptimeTracker() {}
|
| +
|
| +void RendererUptimeTracker::OnRendererStarted(int pid) {
|
| + info_map_[pid] = RendererInfo{base::TimeTicks::Now(), 0};
|
| +}
|
| +
|
| +void RendererUptimeTracker::OnRendererTerminated(int pid) {
|
| + auto it = info_map_.find(pid);
|
| + // The pid may not exist when process fails to start up or when process is
|
| + // terminated without reuse.
|
| + if (it != info_map_.end()) {
|
| + auto uptime = base::TimeTicks::Now() - it->second.launched_at_;
|
| + UMA_HISTOGRAM_CUSTOM_TIMES("Memory.Experimental.Renderer.Uptime", uptime,
|
| + base::TimeDelta::FromHours(1),
|
| + base::TimeDelta::FromDays(7), 50);
|
| + UMA_HISTOGRAM_COUNTS_10000(
|
| + "Memory.Experimental.Renderer.LoadsInMainFrameDuringUptime",
|
| + it->second.num_loads_in_main_frame_);
|
| + info_map_.erase(it);
|
| + }
|
| +}
|
| +
|
| +void RendererUptimeTracker::OnLoadInMainFrame(int pid) {
|
| + auto it = info_map_.find(pid);
|
| + // The pid may not exist in an in-process browser test.
|
| + if (it != info_map_.end()) {
|
| + it->second.num_loads_in_main_frame_++;
|
| + }
|
| +}
|
| +
|
| +void RendererUptimeTracker::Observe(
|
| + int type,
|
| + const content::NotificationSource& source,
|
| + const content::NotificationDetails& details) {
|
| + switch (type) {
|
| + case content::NOTIFICATION_RENDERER_PROCESS_CREATED: {
|
| + content::RenderProcessHost* host =
|
| + content::Source<content::RenderProcessHost>(source).ptr();
|
| +#if BUILDFLAG(ENABLE_EXTENSIONS)
|
| + if (extensions::ProcessMap::Get(host->GetBrowserContext())
|
| + ->Contains(host->GetID())) {
|
| + break;
|
| + }
|
| +#endif
|
| + OnRendererStarted(host->GetID());
|
| + break;
|
| + }
|
| +
|
| + case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
|
| + content::RenderProcessHost* host =
|
| + content::Source<content::RenderProcessHost>(source).ptr();
|
| + OnRendererTerminated(host->GetID());
|
| + break;
|
| + }
|
| +
|
| + case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
|
| + content::RenderProcessHost* host =
|
| + content::Source<content::RenderProcessHost>(source).ptr();
|
| + OnRendererTerminated(host->GetID());
|
| + break;
|
| + }
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
| +
|
| +} // namespace metrics
|
|
|