Track execution phase of browser process and track it as
a UMA histogram. As a first attempt, tracked the following - Before starting metrics service, - Before creating profile - Before starting startup time bomb - Before starting thread watcher - Before starting main message loop - Before starting shutdown time bomb - clean shutdown. R=jar@chromium.org Review URL: https://codereview.chromium.org/28283002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@231334 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
chrome
browser
common
chrome_frame/test/reliability
@@ -1098,6 +1098,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
|
|||||||
// application is in the foreground or not. Do not start here.
|
// application is in the foreground or not. Do not start here.
|
||||||
#if !defined(OS_ANDROID)
|
#if !defined(OS_ANDROID)
|
||||||
// Now that the file thread has been started, start recording.
|
// Now that the file thread has been started, start recording.
|
||||||
|
MetricsService::SetExecutionPhase(MetricsService::START_METRICS_RECORDING);
|
||||||
StartMetricsRecording();
|
StartMetricsRecording();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1244,6 +1245,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
|
|||||||
// calls to GetDefaultProfile().
|
// calls to GetDefaultProfile().
|
||||||
ProfileManager::AllowGetDefaultProfile();
|
ProfileManager::AllowGetDefaultProfile();
|
||||||
|
|
||||||
|
MetricsService::SetExecutionPhase(MetricsService::CREATE_PROFILE);
|
||||||
profile_ = CreateProfile(parameters(), user_data_dir_, parsed_command_line());
|
profile_ = CreateProfile(parameters(), user_data_dir_, parsed_command_line());
|
||||||
if (!profile_)
|
if (!profile_)
|
||||||
return content::RESULT_CODE_NORMAL_EXIT;
|
return content::RESULT_CODE_NORMAL_EXIT;
|
||||||
@@ -1428,6 +1430,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
|
|||||||
// Start watching for hangs during startup. We disarm this hang detector when
|
// Start watching for hangs during startup. We disarm this hang detector when
|
||||||
// ThreadWatcher takes over or when browser is shutdown or when
|
// ThreadWatcher takes over or when browser is shutdown or when
|
||||||
// startup_watcher_ is deleted.
|
// startup_watcher_ is deleted.
|
||||||
|
MetricsService::SetExecutionPhase(MetricsService::STARTUP_TIMEBOMB_ARM);
|
||||||
startup_watcher_->Arm(base::TimeDelta::FromSeconds(300));
|
startup_watcher_->Arm(base::TimeDelta::FromSeconds(300));
|
||||||
|
|
||||||
// On mobile, need for clean shutdown arises only when the application comes
|
// On mobile, need for clean shutdown arises only when the application comes
|
||||||
@@ -1449,6 +1452,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Start watching all browser threads for responsiveness.
|
// Start watching all browser threads for responsiveness.
|
||||||
|
MetricsService::SetExecutionPhase(MetricsService::THREAD_WATCHER_START);
|
||||||
ThreadWatcherList::StartWatchingAll(parsed_command_line());
|
ThreadWatcherList::StartWatchingAll(parsed_command_line());
|
||||||
|
|
||||||
#if !defined(DISABLE_NACL)
|
#if !defined(DISABLE_NACL)
|
||||||
@@ -1620,6 +1624,7 @@ bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) {
|
|||||||
|
|
||||||
performance_monitor::PerformanceMonitor::GetInstance()->StartGatherCycle();
|
performance_monitor::PerformanceMonitor::GetInstance()->StartGatherCycle();
|
||||||
|
|
||||||
|
MetricsService::SetExecutionPhase(MetricsService::MAIN_MESSAGE_LOOP_RUN);
|
||||||
run_loop.Run();
|
run_loop.Run();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1636,6 +1641,7 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() {
|
|||||||
|
|
||||||
// Start watching for jank during shutdown. It gets disarmed when
|
// Start watching for jank during shutdown. It gets disarmed when
|
||||||
// |shutdown_watcher_| object is destructed.
|
// |shutdown_watcher_| object is destructed.
|
||||||
|
MetricsService::SetExecutionPhase(MetricsService::SHUTDOWN_TIMEBOMB_ARM);
|
||||||
shutdown_watcher_->Arm(base::TimeDelta::FromSeconds(300));
|
shutdown_watcher_->Arm(base::TimeDelta::FromSeconds(300));
|
||||||
|
|
||||||
// Disarm the startup hang detector time bomb if it is still Arm'ed.
|
// Disarm the startup hang detector time bomb if it is still Arm'ed.
|
||||||
|
@@ -329,6 +329,8 @@ int MapCrashExitCodeForHistogram(int exit_code) {
|
|||||||
void MarkAppCleanShutdownAndCommit() {
|
void MarkAppCleanShutdownAndCommit() {
|
||||||
PrefService* pref = g_browser_process->local_state();
|
PrefService* pref = g_browser_process->local_state();
|
||||||
pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
|
pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
|
||||||
|
pref->SetInteger(prefs::kStabilityExecutionPhase,
|
||||||
|
MetricsService::CLEAN_SHUTDOWN);
|
||||||
// Start writing right away (write happens on a different thread).
|
// Start writing right away (write happens on a different thread).
|
||||||
pref->CommitPendingWrite();
|
pref->CommitPendingWrite();
|
||||||
}
|
}
|
||||||
@@ -339,6 +341,9 @@ void MarkAppCleanShutdownAndCommit() {
|
|||||||
MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ =
|
MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ =
|
||||||
MetricsService::CLEANLY_SHUTDOWN;
|
MetricsService::CLEANLY_SHUTDOWN;
|
||||||
|
|
||||||
|
MetricsService::ExecutionPhase MetricsService::execution_phase_ =
|
||||||
|
MetricsService::CLEAN_SHUTDOWN;
|
||||||
|
|
||||||
// This is used to quickly log stats from child process related notifications in
|
// This is used to quickly log stats from child process related notifications in
|
||||||
// MetricsService::child_stats_buffer_. The buffer's contents are transferred
|
// MetricsService::child_stats_buffer_. The buffer's contents are transferred
|
||||||
// out when Local State is periodically saved. The information is then
|
// out when Local State is periodically saved. The information is then
|
||||||
@@ -409,6 +414,8 @@ void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) {
|
|||||||
registry->RegisterStringPref(prefs::kStabilityStatsVersion, std::string());
|
registry->RegisterStringPref(prefs::kStabilityStatsVersion, std::string());
|
||||||
registry->RegisterInt64Pref(prefs::kStabilityStatsBuildTime, 0);
|
registry->RegisterInt64Pref(prefs::kStabilityStatsBuildTime, 0);
|
||||||
registry->RegisterBooleanPref(prefs::kStabilityExitedCleanly, true);
|
registry->RegisterBooleanPref(prefs::kStabilityExitedCleanly, true);
|
||||||
|
registry->RegisterIntegerPref(prefs::kStabilityExecutionPhase,
|
||||||
|
CLEAN_SHUTDOWN);
|
||||||
registry->RegisterBooleanPref(prefs::kStabilitySessionEndCompleted, true);
|
registry->RegisterBooleanPref(prefs::kStabilitySessionEndCompleted, true);
|
||||||
registry->RegisterIntegerPref(prefs::kMetricsSessionID, -1);
|
registry->RegisterIntegerPref(prefs::kMetricsSessionID, -1);
|
||||||
registry->RegisterIntegerPref(prefs::kStabilityLaunchCount, 0);
|
registry->RegisterIntegerPref(prefs::kStabilityLaunchCount, 0);
|
||||||
@@ -445,6 +452,7 @@ void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) {
|
|||||||
// static
|
// static
|
||||||
void MetricsService::DiscardOldStabilityStats(PrefService* local_state) {
|
void MetricsService::DiscardOldStabilityStats(PrefService* local_state) {
|
||||||
local_state->SetBoolean(prefs::kStabilityExitedCleanly, true);
|
local_state->SetBoolean(prefs::kStabilityExitedCleanly, true);
|
||||||
|
local_state->SetInteger(prefs::kStabilityExecutionPhase, CLEAN_SHUTDOWN);
|
||||||
local_state->SetBoolean(prefs::kStabilitySessionEndCompleted, true);
|
local_state->SetBoolean(prefs::kStabilitySessionEndCompleted, true);
|
||||||
|
|
||||||
local_state->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0);
|
local_state->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0);
|
||||||
@@ -773,6 +781,7 @@ void MetricsService::OnAppEnterBackground() {
|
|||||||
void MetricsService::OnAppEnterForeground() {
|
void MetricsService::OnAppEnterForeground() {
|
||||||
PrefService* pref = g_browser_process->local_state();
|
PrefService* pref = g_browser_process->local_state();
|
||||||
pref->SetBoolean(prefs::kStabilityExitedCleanly, false);
|
pref->SetBoolean(prefs::kStabilityExitedCleanly, false);
|
||||||
|
pref->SetInteger(prefs::kStabilityExecutionPhase, execution_phase_);
|
||||||
|
|
||||||
StartSchedulerIfNecessary();
|
StartSchedulerIfNecessary();
|
||||||
}
|
}
|
||||||
@@ -780,6 +789,7 @@ void MetricsService::OnAppEnterForeground() {
|
|||||||
void MetricsService::LogNeedForCleanShutdown() {
|
void MetricsService::LogNeedForCleanShutdown() {
|
||||||
PrefService* pref = g_browser_process->local_state();
|
PrefService* pref = g_browser_process->local_state();
|
||||||
pref->SetBoolean(prefs::kStabilityExitedCleanly, false);
|
pref->SetBoolean(prefs::kStabilityExitedCleanly, false);
|
||||||
|
pref->SetInteger(prefs::kStabilityExecutionPhase, execution_phase_);
|
||||||
// Redundant setting to be sure we call for a clean shutdown.
|
// Redundant setting to be sure we call for a clean shutdown.
|
||||||
clean_shutdown_status_ = NEED_TO_SHUTDOWN;
|
clean_shutdown_status_ = NEED_TO_SHUTDOWN;
|
||||||
}
|
}
|
||||||
@@ -898,6 +908,13 @@ void MetricsService::InitializeMetricsState() {
|
|||||||
// Reset flag, and wait until we call LogNeedForCleanShutdown() before
|
// Reset flag, and wait until we call LogNeedForCleanShutdown() before
|
||||||
// monitoring.
|
// monitoring.
|
||||||
pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
|
pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
|
||||||
|
|
||||||
|
// TODO(rtenneti): On windows, consider saving/getting execution_phase from
|
||||||
|
// the registry.
|
||||||
|
int execution_phase = pref->GetInteger(prefs::kStabilityExecutionPhase);
|
||||||
|
UMA_HISTOGRAM_SPARSE_SLOWLY("Chrome.Browser.ExecutionPhase",
|
||||||
|
execution_phase);
|
||||||
|
pref->SetInteger(prefs::kStabilityExecutionPhase, CLEAN_SHUTDOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
@@ -1670,6 +1687,9 @@ void MetricsService::LogCleanShutdown() {
|
|||||||
clean_shutdown_status_ = CLEANLY_SHUTDOWN;
|
clean_shutdown_status_ = CLEANLY_SHUTDOWN;
|
||||||
|
|
||||||
RecordBooleanPrefValue(prefs::kStabilityExitedCleanly, true);
|
RecordBooleanPrefValue(prefs::kStabilityExitedCleanly, true);
|
||||||
|
PrefService* pref = g_browser_process->local_state();
|
||||||
|
pref->SetInteger(prefs::kStabilityExecutionPhase,
|
||||||
|
MetricsService::CLEAN_SHUTDOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OS_CHROMEOS)
|
#if defined(OS_CHROMEOS)
|
||||||
|
@@ -74,6 +74,17 @@ class MetricsService
|
|||||||
public net::URLFetcherDelegate,
|
public net::URLFetcherDelegate,
|
||||||
public MetricsServiceBase {
|
public MetricsServiceBase {
|
||||||
public:
|
public:
|
||||||
|
// The execution phase of the browser.
|
||||||
|
enum ExecutionPhase {
|
||||||
|
CLEAN_SHUTDOWN = 0,
|
||||||
|
START_METRICS_RECORDING = 100,
|
||||||
|
CREATE_PROFILE = 200,
|
||||||
|
STARTUP_TIMEBOMB_ARM = 300,
|
||||||
|
THREAD_WATCHER_START = 400,
|
||||||
|
MAIN_MESSAGE_LOOP_RUN = 500,
|
||||||
|
SHUTDOWN_TIMEBOMB_ARM = 600,
|
||||||
|
};
|
||||||
|
|
||||||
MetricsService();
|
MetricsService();
|
||||||
virtual ~MetricsService();
|
virtual ~MetricsService();
|
||||||
|
|
||||||
@@ -164,6 +175,9 @@ class MetricsService
|
|||||||
static void LogNeedForCleanShutdown();
|
static void LogNeedForCleanShutdown();
|
||||||
#endif // defined(OS_ANDROID) || defined(OS_IOS)
|
#endif // defined(OS_ANDROID) || defined(OS_IOS)
|
||||||
|
|
||||||
|
static void SetExecutionPhase(ExecutionPhase execution_phase) {
|
||||||
|
execution_phase_ = execution_phase;
|
||||||
|
}
|
||||||
// Saves in the preferences if the crash report registration was successful.
|
// Saves in the preferences if the crash report registration was successful.
|
||||||
// This count is eventually send via UMA logs.
|
// This count is eventually send via UMA logs.
|
||||||
void RecordBreakpadRegistration(bool success);
|
void RecordBreakpadRegistration(bool success);
|
||||||
@@ -495,6 +509,9 @@ class MetricsService
|
|||||||
// Stores the time of the last call to |GetIncrementalUptime()|.
|
// Stores the time of the last call to |GetIncrementalUptime()|.
|
||||||
base::TimeTicks last_updated_time_;
|
base::TimeTicks last_updated_time_;
|
||||||
|
|
||||||
|
// Execution phase the browser is in.
|
||||||
|
static ExecutionPhase execution_phase_;
|
||||||
|
|
||||||
// Reduntant marker to check that we completed our shutdown, and set the
|
// Reduntant marker to check that we completed our shutdown, and set the
|
||||||
// exited-cleanly bit in the prefs.
|
// exited-cleanly bit in the prefs.
|
||||||
static ShutdownCleanliness clean_shutdown_status_;
|
static ShutdownCleanliness clean_shutdown_status_;
|
||||||
|
@@ -1377,6 +1377,10 @@ const char kVariationsSeedDate[] = "variations_seed_date";
|
|||||||
// SHA-1 hash of the serialized variations seed data.
|
// SHA-1 hash of the serialized variations seed data.
|
||||||
const char kVariationsSeedHash[] = "variations_seed_hash";
|
const char kVariationsSeedHash[] = "variations_seed_hash";
|
||||||
|
|
||||||
|
// An enum value to indicate the execution phase the browser was in.
|
||||||
|
const char kStabilityExecutionPhase[] =
|
||||||
|
"user_experience_metrics.stability.execution_phase";
|
||||||
|
|
||||||
// True if the previous run of the program exited cleanly.
|
// True if the previous run of the program exited cleanly.
|
||||||
const char kStabilityExitedCleanly[] =
|
const char kStabilityExitedCleanly[] =
|
||||||
"user_experience_metrics.stability.exited_cleanly";
|
"user_experience_metrics.stability.exited_cleanly";
|
||||||
|
@@ -456,6 +456,7 @@ extern const char kProfilesNumCreated[];
|
|||||||
extern const char kProfileInfoCache[];
|
extern const char kProfileInfoCache[];
|
||||||
extern const char kProfileCreatedByVersion[];
|
extern const char kProfileCreatedByVersion[];
|
||||||
|
|
||||||
|
extern const char kStabilityExecutionPhase[];
|
||||||
extern const char kStabilityExitedCleanly[];
|
extern const char kStabilityExitedCleanly[];
|
||||||
extern const char kStabilityStatsVersion[];
|
extern const char kStabilityStatsVersion[];
|
||||||
extern const char kStabilityStatsBuildTime[];
|
extern const char kStabilityStatsBuildTime[];
|
||||||
|
@@ -136,6 +136,7 @@ class PageLoadTest : public testing::Test {
|
|||||||
int crash_dump_count;
|
int crash_dump_count;
|
||||||
// These are stability metrics recorded by Chrome itself
|
// These are stability metrics recorded by Chrome itself
|
||||||
bool browser_clean_exit;
|
bool browser_clean_exit;
|
||||||
|
int browser_execution_phase;
|
||||||
int browser_launch_count;
|
int browser_launch_count;
|
||||||
int page_load_count;
|
int page_load_count;
|
||||||
int browser_crash_count;
|
int browser_crash_count;
|
||||||
@@ -446,6 +447,7 @@ class PageLoadTest : public testing::Test {
|
|||||||
return;
|
return;
|
||||||
scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple();
|
scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple();
|
||||||
registry->RegisterBooleanPref(prefs::kStabilityExitedCleanly, false);
|
registry->RegisterBooleanPref(prefs::kStabilityExitedCleanly, false);
|
||||||
|
registry->RegisterIntegerPref(prefs::kStabilityExecutionPhase, 0);
|
||||||
registry->RegisterIntegerPref(prefs::kStabilityLaunchCount, -1);
|
registry->RegisterIntegerPref(prefs::kStabilityLaunchCount, -1);
|
||||||
registry->RegisterIntegerPref(prefs::kStabilityPageLoadCount, -1);
|
registry->RegisterIntegerPref(prefs::kStabilityPageLoadCount, -1);
|
||||||
registry->RegisterIntegerPref(prefs::kStabilityCrashCount, 0);
|
registry->RegisterIntegerPref(prefs::kStabilityCrashCount, 0);
|
||||||
@@ -457,6 +459,8 @@ class PageLoadTest : public testing::Test {
|
|||||||
|
|
||||||
metrics->browser_clean_exit =
|
metrics->browser_clean_exit =
|
||||||
local_state->GetBoolean(prefs::kStabilityExitedCleanly);
|
local_state->GetBoolean(prefs::kStabilityExitedCleanly);
|
||||||
|
metrics->browser_execution_phase =
|
||||||
|
local_state->GetInteger(prefs::kStabilityExecutionPhase);
|
||||||
metrics->browser_launch_count =
|
metrics->browser_launch_count =
|
||||||
local_state->GetInteger(prefs::kStabilityLaunchCount);
|
local_state->GetInteger(prefs::kStabilityLaunchCount);
|
||||||
metrics->page_load_count =
|
metrics->page_load_count =
|
||||||
|
Reference in New Issue
Block a user