Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(762)

Side by Side Diff: chrome/browser/metrics/renderer_uptime_tracker.cc

Issue 2697323004: Adds UMA metrics for renderer uptime (Closed)
Patch Set: fix Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/metrics/renderer_uptime_tracker.h"
6
7 #include "base/metrics/histogram_macros.h"
8 #include "content/public/browser/notification_service.h"
9 #include "content/public/browser/notification_types.h"
10 #include "content/public/browser/render_process_host.h"
11 #include "extensions/features/features.h"
12
13 #if BUILDFLAG(ENABLE_EXTENSIONS)
14 #include "extensions/browser/process_map.h"
15 #endif
16
17 namespace metrics {
18
19 namespace {
20
21 RendererUptimeTracker* g_instance = nullptr;
22
23 } // namespace
24
25 // static
26 void RendererUptimeTracker::Initialize() {
27 DCHECK(!g_instance);
28 g_instance = new RendererUptimeTracker;
29 }
30
31 // static
32 RendererUptimeTracker* RendererUptimeTracker::Get() {
33 DCHECK(g_instance);
34 return g_instance;
35 }
36
37 RendererUptimeTracker::RendererUptimeTracker() {
38 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
39 content::NotificationService::AllBrowserContextsAndSources());
40 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
41 content::NotificationService::AllBrowserContextsAndSources());
42 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
43 content::NotificationService::AllBrowserContextsAndSources());
44 }
45
46 RendererUptimeTracker::~RendererUptimeTracker() {}
47
48 void RendererUptimeTracker::OnRendererStarted(int pid) {
49 info_map_[pid] = RendererInfo{base::TimeTicks::Now(), 0};
50 }
51
52 void RendererUptimeTracker::OnRendererTerminated(int pid) {
53 auto it = info_map_.find(pid);
54 // The pid may not exist when process fails to start up or when process is
55 // terminated without reuse.
56 if (it != info_map_.end()) {
57 auto uptime = base::TimeTicks::Now() - it->second.launched_at_;
58 UMA_HISTOGRAM_CUSTOM_TIMES("Memory.Experimental.Renderer.Uptime", uptime,
59 base::TimeDelta::FromHours(1),
60 base::TimeDelta::FromDays(7), 50);
61 UMA_HISTOGRAM_COUNTS_10000(
62 "Memory.Experimental.Renderer.LoadsInMainFrameDuringUptime",
63 it->second.num_loads_in_main_frame_);
64 info_map_.erase(it);
65 }
66 }
67
68 void RendererUptimeTracker::OnLoadInMainFrame(int pid) {
69 auto it = info_map_.find(pid);
70 // The pid may not exist in an in-process browser test.
71 if (it != info_map_.end()) {
keishi 2017/03/02 12:06:23 Turns out, for in process browser tests, this gets
72 it->second.num_loads_in_main_frame_++;
73 }
74 }
75
76 void RendererUptimeTracker::Observe(
77 int type,
78 const content::NotificationSource& source,
79 const content::NotificationDetails& details) {
80 switch (type) {
81 case content::NOTIFICATION_RENDERER_PROCESS_CREATED: {
82 content::RenderProcessHost* host =
83 content::Source<content::RenderProcessHost>(source).ptr();
84 #if BUILDFLAG(ENABLE_EXTENSIONS)
85 if (extensions::ProcessMap::Get(host->GetBrowserContext())
86 ->Contains(host->GetID())) {
87 break;
88 }
89 #endif
90 OnRendererStarted(host->GetID());
91 break;
92 }
93
94 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
95 content::RenderProcessHost* host =
96 content::Source<content::RenderProcessHost>(source).ptr();
97 #if BUILDFLAG(ENABLE_EXTENSIONS)
98 if (extensions::ProcessMap::Get(host->GetBrowserContext())
99 ->Contains(host->GetID())) {
100 break;
101 }
102 #endif
103 OnRendererTerminated(host->GetID());
104 break;
105 }
106
107 case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
108 content::RenderProcessHost* host =
109 content::Source<content::RenderProcessHost>(source).ptr();
110 #if BUILDFLAG(ENABLE_EXTENSIONS)
111 if (extensions::ProcessMap::Get(host->GetBrowserContext())
112 ->Contains(host->GetID())) {
113 break;
114 }
115 #endif
116 OnRendererTerminated(host->GetID());
117 break;
118 }
119
120 default:
121 NOTREACHED();
122 break;
123 }
124 }
125
126 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698