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

Unified Diff: components/startup_metric_utils/browser/startup_metric_utils.cc

Issue 2117373003: Add SameVersionStartupCounts suffix to multiple startup histograms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: CR gab #12 (restore comments) Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/trace_event/common/trace_event_common.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/startup_metric_utils/browser/startup_metric_utils.cc
diff --git a/components/startup_metric_utils/browser/startup_metric_utils.cc b/components/startup_metric_utils/browser/startup_metric_utils.cc
index 00edc15ce6309537373d60fa5406ccc1302c2ead..b2852722466a28b7b95408af5bf24439a9205242 100644
--- a/components/startup_metric_utils/browser/startup_metric_utils.cc
+++ b/components/startup_metric_utils/browser/startup_metric_utils.cc
@@ -56,6 +56,9 @@ base::LazyInstance<base::Time>::Leaky g_browser_main_entry_point_time =
StartupTemperature g_startup_temperature = UNDETERMINED_STARTUP_TEMPERATURE;
+constexpr int kUndeterminedStartupsWithCurrentVersion = 0;
+int g_startups_with_current_version = kUndeterminedStartupsWithCurrentVersion;
+
#if defined(OS_WIN)
// These values are taken from the Startup.BrowserMessageLoopStartHardFaultCount
@@ -108,35 +111,35 @@ typedef NTSTATUS (WINAPI *NtQuerySystemInformationPtr)(
UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, \
base::TimeDelta::FromDays(30).InMinutes(), 50)
-// Helper macro for splitting out an UMA histogram based on cold or warm start.
+// Helper macro for splitting out an UMA histogram based on startup temperature.
// |type| is the histogram type, and corresponds to an UMA macro like
// UMA_HISTOGRAM_LONG_TIMES. It must itself be a macro that only takes two
// parameters.
// |basename| is the basename of the histogram. A histogram of this name will
-// always be recorded to. If the startup is either cold or warm then a value
-// will also be recorded to the histogram with name |basename| and suffix
-// ".ColdStart" or ".WarmStart", as appropriate.
+// always be recorded to. If the startup temperature is known then a value will
+// also be recorded to the histogram with name |basename| and suffix
+// ".ColdStart", ".WarmStart" or ".LukewarmStartup" as appropriate.
// |value_expr| is an expression evaluating to the value to be recorded. This
// will be evaluated exactly once and cached, so side effects are not an issue.
// A metric logged using this macro must have an affected-histogram entry in the
// definition of the StartupTemperature suffix in histograms.xml.
// This macro must only be used in code that runs after |g_startup_temperature|
// has been initialized.
-#define UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(type, basename, value_expr) \
- { \
- const auto kValue = value_expr; \
+#define UMA_HISTOGRAM_WITH_TEMPERATURE(type, basename, value_expr) \
+ do { \
+ const auto value = value_expr; \
/* Always record to the base histogram. */ \
- type(basename, kValue); \
+ type(basename, value); \
/* Record to the cold/warm/lukewarm suffixed histogram as appropriate. */ \
switch (g_startup_temperature) { \
case COLD_STARTUP_TEMPERATURE: \
- type(basename ".ColdStartup", kValue); \
+ type(basename ".ColdStartup", value); \
break; \
case WARM_STARTUP_TEMPERATURE: \
- type(basename ".WarmStartup", kValue); \
+ type(basename ".WarmStartup", value); \
break; \
case LUKEWARM_STARTUP_TEMPERATURE: \
- type(basename ".LukewarmStartup", kValue); \
+ type(basename ".LukewarmStartup", value); \
break; \
case UNDETERMINED_STARTUP_TEMPERATURE: \
break; \
@@ -144,21 +147,80 @@ typedef NTSTATUS (WINAPI *NtQuerySystemInformationPtr)(
NOTREACHED(); \
break; \
} \
- }
+ } while (0)
+
+// Records |value_expr| to the histogram with name |basename| suffixed with the
+// number of startups with the current version in addition to all histograms
+// recorded by UMA_HISTOGRAM_WITH_TEMPERATURE.
+// A metric logged using this macro must have affected-histogram entries in the
+// definition of the StartupTemperature and SameVersionStartupCounts suffixes in
+// histograms.xml.
+// This macro must only be used in code that runs after |g_startup_temperature|
+// and |g_startups_with_current_version| have been initialized.
+#define UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(type, basename, \
+ value_expr) \
+ do { \
+ const auto value_same_version_count = value_expr; \
+ /* Record to the base histogram and to a histogram suffixed with the \
+ startup temperature. */ \
+ UMA_HISTOGRAM_WITH_TEMPERATURE(type, basename, value_same_version_count); \
+ /* Record to a histogram suffixed with the number of startups for the \
+ current version. Since the number of startups for the current version \
+ is set once per process, using a histogram macro which expects a \
+ constant histogram name across invocations is fine. */ \
+ const auto same_version_startup_count_suffix = \
+ GetSameVersionStartupCountSuffix(); \
+ if (!same_version_startup_count_suffix.empty()) { \
+ type(basename + same_version_startup_count_suffix, \
+ value_same_version_count); \
+ } \
+ } while (0)
-#define UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE( \
- type, basename, begin_ticks, end_ticks) \
- { \
- UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(type, basename, \
- end_ticks - begin_ticks) \
+#define UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE(type, basename, begin_ticks, \
+ end_ticks) \
+ do { \
+ UMA_HISTOGRAM_WITH_TEMPERATURE(type, basename, end_ticks - begin_ticks); \
TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( \
"startup", basename, 0, begin_ticks.ToInternalValue(), "Temperature", \
g_startup_temperature); \
TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP1( \
"startup", basename, 0, end_ticks.ToInternalValue(), "Temperature", \
g_startup_temperature); \
+ } while (0)
+
+#define UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( \
+ type, basename, begin_ticks, end_ticks) \
+ do { \
+ UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( \
+ type, basename, end_ticks - begin_ticks); \
+ TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP2( \
+ "startup", basename, 0, begin_ticks.ToInternalValue(), "Temperature", \
+ g_startup_temperature, "Startups with current version", \
+ g_startups_with_current_version); \
+ TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP2( \
+ "startup", basename, 0, end_ticks.ToInternalValue(), "Temperature", \
+ g_startup_temperature, "Startups with current version", \
+ g_startups_with_current_version); \
+ } while (0)
+
+std::string GetSameVersionStartupCountSuffix() {
+ // TODO(fdoray): Remove this once crbug.com/580207 is fixed.
+ if (g_startups_with_current_version ==
+ kUndeterminedStartupsWithCurrentVersion) {
+ return std::string();
}
+ // The suffix is |g_startups_with_current_version| up to
+ // |kMaxSameVersionCountRecorded|. Higher counts are grouped in the ".Over"
+ // suffix. Make sure to reflect changes to |kMaxSameVersionCountRecorded| in
+ // the "SameVersionStartupCounts" histogram suffix.
+ constexpr int kMaxSameVersionCountRecorded = 9;
+ DCHECK_GE(g_startups_with_current_version, 1);
+ if (g_startups_with_current_version > kMaxSameVersionCountRecorded)
+ return ".Over";
+ return std::string(".") + base::IntToString(g_startups_with_current_version);
+}
+
// Returns the system uptime on process launch.
base::TimeDelta GetSystemUptimeOnProcessLaunch() {
// Process launch time is not available on Android.
@@ -178,16 +240,15 @@ void RecordSystemUptimeHistogram() {
if (system_uptime_on_process_launch.is_zero())
return;
- UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(UMA_HISTOGRAM_LONG_TIMES_100,
- "Startup.SystemUptime",
- GetSystemUptimeOnProcessLaunch());
+ UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
+ UMA_HISTOGRAM_LONG_TIMES_100, "Startup.SystemUptime",
+ GetSystemUptimeOnProcessLaunch());
}
// On Windows, records the number of hard-faults that have occurred in the
-// current chrome.exe process since it was started. A version of the histograms
-// recorded in this method suffixed by |same_version_startup_count| will also be
-// recorded. This is a nop on other platforms.
-void RecordHardFaultHistogram(int same_version_startup_count) {
+// current chrome.exe process since it was started. This is a nop on other
+// platforms.
+void RecordHardFaultHistogram() {
#if defined(OS_WIN)
uint32_t hard_fault_count = 0;
@@ -195,20 +256,8 @@ void RecordHardFaultHistogram(int same_version_startup_count) {
if (!GetHardFaultCountForCurrentProcess(&hard_fault_count))
return;
- // Histograms below will be suffixed by |same_version_startup_count| up to
- // |kMaxSameVersionCountRecorded|, higher counts will be grouped in the
- // ".Over" suffix. Make sure to reflect changes to
- // kMaxSameVersionCountRecorded in the "SameVersionStartupCounts" histogram
- // suffix.
- std::string same_version_startup_count_suffix(".");
- constexpr int kMaxSameVersionCountRecorded = 9;
- DCHECK_GE(same_version_startup_count, 1);
- if (same_version_startup_count <= kMaxSameVersionCountRecorded) {
- same_version_startup_count_suffix.append(
- base::IntToString(same_version_startup_count));
- } else {
- same_version_startup_count_suffix.append("Over");
- }
+ const std::string same_version_startup_count_suffix(
+ GetSameVersionStartupCountSuffix());
// Hard fault counts are expected to be in the thousands range,
// corresponding to faulting in ~10s of MBs of code ~10s of KBs at a time.
@@ -334,7 +383,7 @@ void RecordRendererMainEntryHistogram() {
if (!browser_main_entry_point_ticks.is_null() &&
!renderer_main_entry_point_ticks.is_null()) {
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserMainToRendererMain",
browser_main_entry_point_ticks, renderer_main_entry_point_ticks);
}
@@ -377,7 +426,7 @@ void AddStartupEventsForTelemetry()
// last startup from |pref_service| and overwrites it with the timestamp of the
// current startup. If the startup temperature has been set by
// RecordBrowserMainMessageLoopStart, the time since last startup is also logged
-// to an histogram suffixed with the startup temperature.
+// to a histogram suffixed with the startup temperature.
void RecordTimeSinceLastStartup(PrefService* pref_service) {
#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
DCHECK(pref_service);
@@ -399,7 +448,7 @@ void RecordTimeSinceLastStartup(PrefService* pref_service) {
// Ignore negative values, which can be caused by system clock changes.
if (minutes_since_last_startup >= 0) {
- UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_TIME_IN_MINUTES_MONTH_RANGE,
"Startup.TimeSinceLastStartup", minutes_since_last_startup);
}
@@ -413,29 +462,28 @@ void RecordTimeSinceLastStartup(PrefService* pref_service) {
// Logs the Startup.SameVersionStartupCount histogram. Relies on |pref_service|
// to know information about the previous startups and store information for
-// future ones. Returns the number of startups with the same version count that
-// was logged.
-int RecordSameVersionStartupCount(PrefService* pref_service) {
+// future ones. Stores the logged value in |g_startups_with_current_version|.
+void RecordSameVersionStartupCount(PrefService* pref_service) {
DCHECK(pref_service);
+ DCHECK_EQ(kUndeterminedStartupsWithCurrentVersion,
+ g_startups_with_current_version);
const std::string current_version = version_info::GetVersionNumber();
- int startups_with_current_version = 0;
if (current_version == pref_service->GetString(prefs::kLastStartupVersion)) {
- startups_with_current_version =
+ g_startups_with_current_version =
pref_service->GetInteger(prefs::kSameVersionStartupCount);
- ++startups_with_current_version;
+ ++g_startups_with_current_version;
pref_service->SetInteger(prefs::kSameVersionStartupCount,
- startups_with_current_version);
+ g_startups_with_current_version);
} else {
- startups_with_current_version = 1;
+ g_startups_with_current_version = 1;
pref_service->SetString(prefs::kLastStartupVersion, current_version);
pref_service->SetInteger(prefs::kSameVersionStartupCount, 1);
}
UMA_HISTOGRAM_COUNTS_100("Startup.SameVersionStartupCount",
- startups_with_current_version);
- return startups_with_current_version;
+ g_startups_with_current_version);
}
} // namespace
@@ -543,11 +591,10 @@ void RecordBrowserMainMessageLoopStart(const base::TimeTicks& ticks,
PrefService* pref_service) {
DCHECK(pref_service);
- const int same_version_startup_count =
- RecordSameVersionStartupCount(pref_service);
+ RecordSameVersionStartupCount(pref_service);
// Keep RecordHardFaultHistogram() first as much as possible as many other
// histograms depend on it setting |g_startup_temperature|.
- RecordHardFaultHistogram(same_version_startup_count);
+ RecordHardFaultHistogram();
AddStartupEventsForTelemetry();
RecordTimeSinceLastStartup(pref_service);
RecordSystemUptimeHistogram();
@@ -556,7 +603,7 @@ void RecordBrowserMainMessageLoopStart(const base::TimeTicks& ticks,
const base::TimeTicks& process_creation_ticks =
g_process_creation_ticks.Get();
if (!is_first_run && !process_creation_ticks.is_null()) {
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserMessageLoopStartTime",
process_creation_ticks, ticks);
}
@@ -573,12 +620,12 @@ void RecordBrowserMainMessageLoopStart(const base::TimeTicks& ticks,
// * Only measure launches that occur 7 minutes after boot to try to avoid
// cases where Chrome is auto-started and IO is heavily loaded.
if (is_first_run) {
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE(
UMA_HISTOGRAM_LONG_TIMES,
"Startup.BrowserMessageLoopStartTimeFromMainEntry.FirstRun",
g_browser_main_entry_point_ticks.Get(), ticks);
} else {
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES,
"Startup.BrowserMessageLoopStartTimeFromMainEntry",
g_browser_main_entry_point_ticks.Get(), ticks);
@@ -590,18 +637,18 @@ void RecordBrowserMainMessageLoopStart(const base::TimeTicks& ticks,
const base::TimeTicks exe_main_ticks = ExeMainEntryPointTicks();
if (!exe_main_ticks.is_null()) {
// Process create to chrome.exe:main().
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ProcessCreateToExeMain",
process_creation_ticks, exe_main_ticks);
// chrome.exe:main() to chrome.dll:main().
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ExeMainToDllMain",
exe_main_ticks, g_browser_main_entry_point_ticks.Get());
// Process create to chrome.dll:main(). Reported as a histogram only as
// the other two events above are sufficient for tracing purposes.
- UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ProcessCreateToDllMain",
g_browser_main_entry_point_ticks.Get() - process_creation_ticks);
}
@@ -616,7 +663,7 @@ void RecordBrowserWindowDisplay(const base::TimeTicks& ticks) {
if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null())
return;
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES, "Startup.BrowserWindowDisplay",
g_process_creation_ticks.Get(), ticks);
}
@@ -627,8 +674,8 @@ void RecordBrowserOpenTabsDelta(const base::TimeDelta& delta) {
return;
is_first_call = false;
- UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(UMA_HISTOGRAM_LONG_TIMES_100,
- "Startup.BrowserOpenTabs", delta);
+ UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
+ UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserOpenTabs", delta);
}
void RecordRendererMainEntryTime(const base::TimeTicks& ticks) {
@@ -646,7 +693,7 @@ void RecordFirstWebContentsMainFrameLoad(const base::TimeTicks& ticks) {
if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null())
return;
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES_100, "Startup.FirstWebContents.MainFrameLoad2",
g_process_creation_ticks.Get(), ticks);
}
@@ -664,7 +711,7 @@ void RecordFirstWebContentsNonEmptyPaint(const base::TimeTicks& ticks) {
if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null())
return;
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES_100, "Startup.FirstWebContents.NonEmptyPaint2",
g_process_creation_ticks.Get(), ticks);
}
@@ -677,7 +724,7 @@ void RecordFirstWebContentsMainNavigationStart(const base::TimeTicks& ticks) {
if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null())
return;
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES_100,
"Startup.FirstWebContents.MainNavigationStart",
g_process_creation_ticks.Get(), ticks);
@@ -692,7 +739,7 @@ void RecordFirstWebContentsMainNavigationFinished(
if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null())
return;
- UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
+ UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
UMA_HISTOGRAM_LONG_TIMES_100,
"Startup.FirstWebContents.MainNavigationFinished",
g_process_creation_ticks.Get(), ticks);
« no previous file with comments | « base/trace_event/common/trace_event_common.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698