<!--
Copyright 2020 The Chromium Authors
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<!--
This file is used to generate a comprehensive list of Stability histograms
along with a detailed description for each histogram.
For best practices on writing histogram descriptions, see
https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md
Please follow the instructions in the OWNERS file in this directory to find a
reviewer. If no OWNERS file exists, please consider signing up at
go/reviewing-metrics (Googlers only), as all subdirectories are expected to
have an OWNERS file. As a last resort you can send the CL to
[email protected].
-->
<histogram-configuration>
<histograms>
<histogram name="ChildProcess.Crashed.UtilityProcessExitCode"
enum="WindowsExitCode" expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when a crash occurs in a Utility process. On crash, the exit code
will indicate the exception code of the crash.
</summary>
</histogram>
<histogram name="ChildProcess.Crashed.UtilityProcessHash"
enum="UtilityProcessNameHash" expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of child utility process crashes, bucketed by the hash of their
process name. The process name is typically the service name of the mojo
service. Recorded when a Utility process crashes.
</summary>
</histogram>
<histogram name="ChildProcess.Crashed2" enum="ProcessType2"
expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>Count of child process crashes grouped by process type.</summary>
</histogram>
<histogram name="ChildProcess.DisconnectedAlive2" enum="ProcessType2"
expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->
<owner>[email protected]</owner>
<summary>
Count of child process abnormal channel disconnects that are not classified
and reported because we took the exit code too early. Grouped by process
type.
</summary>
</histogram>
<histogram name="ChildProcess.Killed2" enum="ProcessType2"
expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>Count of child process kills grouped by process type.</summary>
</histogram>
<histogram name="ChildProcess.Launched.UtilityProcessHash"
enum="UtilityProcessNameHash" expires_after="2025-02-10">
<owner>[email protected]</owner>
<summary>
Count of child utility process launches, bucketed by the hash of their
process name. The process name is typically the service name of the mojo
service.
</summary>
</histogram>
<histogram name="ChildProcess.LaunchFailed.UtilityProcessErrorCode"
enum="LaunchErrorCodes" expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
A platform-specific error code returned from the attempt to launch a Utility
process. Recorded when a Utility process fails to launch.
</summary>
</histogram>
<histogram name="ChildProcess.LaunchFailed.UtilityProcessHash"
enum="UtilityProcessNameHash" expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of child utility process launch failures, bucketed by the hash of
their process name. The process name is typically the service name of the
mojo service. Recorded when a Utility process fails to launch.
</summary>
</histogram>
<histogram name="ChildProcess.LaunchFailed.WinLastError" enum="WinGetLastError"
expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
An extended Windows error code returned from GetLastError when failing to
launch a utility process. Recorded when a Utility process fails to launch on
Windows.
</summary>
</histogram>
<histogram name="ChildProcess.ProcessLifetime.Utility" units="ms"
expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
The time elapsed between the creation and destruction of a utility process.
Recorded when the process is recorded as destroyed in PerformanceManager.
</summary>
</histogram>
<histogram name="Stability.Android.MinidumpUploadingTime" units="ms"
expires_after="2023-12-24">
<owner>[email protected]</owner>
<owner>src/components/minidump_uploader/OWNERS</owner>
<summary>
Records the time (uptimeMillis) taken by a minidump uploading task to
complete. Recorded when the task finished callback is invoked.
</summary>
</histogram>
<histogram name="Stability.Android.ProcessedCrashCounts"
enum="AndroidProcessedCrashCounts" expires_after="never">
<!-- expires-never: Critical stability metric that includes OOM rate. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Individual enum counts specific conditions of child process terminations.
There are too many individual states to enumerate into a single histogram,
so this effectively does the aggregration that normally happens on the
server side in the client instead. The benefit is this is easily extensible
in the future, and downside is that it does not allow additional server side
analysis. Note a single child process termination may fall into multiple
enums.
</summary>
</histogram>
<histogram name="Stability.Android.ProcessedRealMinidumps"
enum="AndroidProcessedMinidumps" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>src/components/minidump_uploader/OWNERS</owner>
<summary>
Records the number of non-simulated minidumps processed by Crashpad, split
by process type. This metric is similar to one that could be computed
server-side based on received crash uploads; but the client-side metric also
includes any minidumps that were not successfully uploaded.
</summary>
</histogram>
<histogram name="Stability.Android.RendererCrash" enum="Boolean"
expires_after="2025-02-10">
<owner>[email protected]</owner>
<summary>
Counts renderer crashes including OOMs. Android only. Mirrors old stability
proto renderer crashes.
</summary>
</histogram>
<histogram base="true" name="Stability.Android.SystemExitReason"
enum="AndroidProcessExitReason" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Reason given by Android ActivityManager for the exit of the process, only
recorded in Android R+. Recorded on the next browser startup for browser
exits, or right after the process died for child processes.
</summary>
</histogram>
<histogram name="Stability.BadMessageTerminated.Chrome"
enum="BadMessageReasonChrome" expires_after="never">
<!-- expires-never: Monitoring renderer kills triggered by //chrome. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of processes killed by chrome/browser because they sent an IPC that
couldn't be properly handled. Categories are the reasons (code locations)
for the kills.
</summary>
</histogram>
<histogram name="Stability.BadMessageTerminated.Content"
enum="BadMessageReasonContent" expires_after="never">
<!-- expires-never: Monitoring renderer kills triggered by //content. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of child processes killed because they sent an IPC that couldn't be
properly handled. Categories are the reasons (code locations) for the kills.
</summary>
</histogram>
<histogram name="Stability.BadMessageTerminated.Extensions"
enum="BadMessageReasonExtensions" expires_after="never">
<!-- expires-never: Monitoring renderer kills triggered by //extensions. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of extension processes killed because they sent an IPC that couldn't
be properly handled. Categories are the reasons (code locations) for the
kills.
</summary>
</histogram>
<histogram name="Stability.BadMessageTerminated.GuestView"
enum="BadMessageReasonGuestView" expires_after="never">
<!-- expires-never: Monitoring renderer kills triggered by GuestView. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of processes killed because they sent a bad IPC that couldn't be
properly handled. Categories are the reasons (code locations) for the kills.
Warning: this histogram was expired from M85 to M97; data may be missing.
</summary>
</histogram>
<histogram name="Stability.BadMessageTerminated.NaCl"
enum="BadMessageReasonNaCl" expires_after="never">
<!-- expires-never: Monitoring renderer kills triggered by NaCl. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of processes killed because they sent a NaCl IPC that couldn't be
properly handled. Categories are the reasons (code locations) for the kills.
Warning: this histogram was expired from 2020-11-01 to 2021-12-07; data may
be missing.
</summary>
</histogram>
<histogram name="Stability.BadMessageTerminated.PasswordManager"
enum="BadMessageReasonPasswordManager" expires_after="never">
<!-- expires-never: Monitoring renderer kills triggered by password manager. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Count of processes killed because they sent a bad IPC that couldn't be
properly handled. Categories are the reasons (code locations) for the kills.
Warning: this histogram was expired from M85 to M97; data may be missing.
</summary>
</histogram>
<histogram name="Stability.BrowserExitCodes" enum="WindowsExitCode"
expires_after="never">
<!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Records the exit code of the browser process (on Windows) from the previous
launch. On crash, the exit code will indicate the exception code of the
crash. This is emitted in stability data with the first report on a
subsequent launch. Note: Due to https://crbug.com/805754, the enum labels
for RESULT_CODE_* are off by 1 for M56 and earlier.
</summary>
</histogram>
<histogram name="Stability.ChildFrameCrash.ShownAfterCrashingReason"
enum="ShownAfterCrashingReason" expires_after="2025-02-16">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Logs the reason that a crashed subframe was shown. Logged at most once per
crash, and only if the subframe was hidden when it crashed and became
visible later.
</summary>
</histogram>
<histogram name="Stability.ChildFrameCrash.TabMarkedForReload"
enum="BooleanMarkedForReload" expires_after="2025-02-16">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Logs whether or not a tab is marked for reload when a cross-process subframe
crashes. Logged once per subframe process crash.
</summary>
</histogram>
<histogram name="Stability.ChildFrameCrash.TabMarkedForReload.Visibility"
enum="FrameVisibility" expires_after="2025-02-16">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Logs the visibility of a subframe when a subframe process crashes and the
corresponding tab is marked for reload. This indicates whether the crashed
subframe was visible or scrolled out of view at the time of crash.
</summary>
</histogram>
<histogram name="Stability.ChildFrameCrash.Visibility" enum="CrashVisibility"
expires_after="2025-02-16">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Logged after detecting that a sad subframe is shown (logged at most once per
crash).
</summary>
</histogram>
<histogram name="Stability.Counts2" enum="StabilityEventType"
expires_after="never">
<!--
expires-never: Critical stability metrics. go/chrome-browser-guardrail-metrics.
-->
<owner>[email protected]</owner>
<owner>src/base/metrics/OWNERS</owner>
<owner>[email protected]</owner>
<improvement direction="LOWER_IS_BETTER"/>
<summary>
Collects various counters related to stability. The majority of them are
crash types.
In M129 we are more accurately tracking renderer process launch failures,
and expect to find a significant spike in volume for this bucket.
</summary>
</histogram>
<histogram name="Stability.DebugScenario.Navigation" enum="DebugScenario"
expires_after="2023-08-08">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Logged at the time when a complex debugging scenario is encountered. The
enum value is the type of scenario encountered. This metric will give us two
benefits: 1. It will tell us the magnitute of the scenario being debugged
since crash reports are throttled client side and cannot presently expess
magnitude. 2. If the client is configured to report traces based on this
metric, it will upload Chrometto trace for analysis by developers.
</summary>
</histogram>
<histogram name="Stability.DumpWithoutCrashingStatus"
enum="DumpWithoutCrashingStatus" expires_after="never">
<!-- expires-never: Used for monitoring the throttling frequency of
DumpWithoutCrashing. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Keeps a count of number of times uploading the dump was throttled when
calling DumpWithoutCrashing.
</summary>
</histogram>
<histogram name="Stability.Experimental.PageLoads" enum="StabilityPageLoadType"
expires_after="2025-02-23">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Counts "pageloads" by type. This is recorded when a page stops
loading, i.e. from WebContentsObserver::DidStopLoading. The sum of all
buckets of this histogram should be equal to the "Total pageloads"
shown on Stability dashboards and can be used to diagnose changes to this
value.
</summary>
</histogram>
<histogram
name="Stability.Internals.FileMetricsProvider.BrowserMetrics.UnsentFilesCount"
units="counts" expires_after="M89">
<owner>[email protected]</owner>
<owner>src/base/metrics/OWNERS</owner>
<summary>
The number of unsent files. Emitted when the stability is recorded.
</summary>
</histogram>
<histogram
name="Stability.Internals.FileMetricsProvider.BrowserMetrics.UnsentSamplesCount"
units="samples" expires_after="M89">
<owner>[email protected]</owner>
<owner>src/base/metrics/OWNERS</owner>
<summary>
The total number of samples that will be lost if ASSOCIATE_INTERNAL_PROFILE
hasn't been enabled since the previous stability recorded. This is different
than the previous browser run because one file was just uploaded before the
stability is recorded.
</summary>
</histogram>
<histogram name="Stability.Internals.SystemCrashCount" units="crashes"
expires_after="never">
<!-- expires-never: Necessary context for understanding stability metrics. -->
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Number of times a browser crash was detected, where the browser was last
known to be alive in a Windows system session that terminated abnormally.
</summary>
</histogram>
<histogram name="Stability.IOS.Crashpad.Initialized" enum="BooleanSuccess"
expires_after="2025-05-01">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Records whether Crashpad init was successful. Recorded on every app startup.
</summary>
</histogram>
<histogram name="Stability.IOS.Experimental.Counts2"
enum="IOSStabilityUserVisibleTerminationType" expires_after="2025-02-12">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when iOS app has started after a crash caused by system signal or
hang. Not recorded when app has started after UTE / XTE or started after
Chrome update. See go/bling-stability-101 for information about signal
crashes, hangs, UTEs and XTEs. This metric intends to complement
Stability.Counts. Stability.Counts does include UTEs / XTEs and thus is a
noisy metric which significantly overcounts user-visible crashes.
Stability.IOS.Experimental.Counts2 is not recorded on OOM crashes, so it
does not represent all user-visible crashes, but OOMs are so rare in Chrome
for iOS that Stability.IOS.Experimental.Counts2 is still a good proxy for
user-visible crashes. IOS.MetricKit.ForegroundExitData includes OOM crashes
(iOS 14 and higher) and can be used in conjunction with this metric.
</summary>
</histogram>
<histogram name="Stability.IOS.PostCrashAction" enum="IOSPostCrashAction"
expires_after="2025-02-04">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when the app is foregrounded. Records what action is taken after an
unclear shutdown (likely a crash).
</summary>
</histogram>
<histogram name="Stability.iOS.TabCountBefore{Event}" units="tabs"
expires_after="2025-02-10">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
The number of tabs opened in the previous session when the app starts after
{Event}. Can be used to understand if there is a correlation between
increase of number of tabs and decline in stability. iOS Only.
</summary>
<token key="Event">
<variant name="CleanShutdown" summary="a clean shutdown"/>
<variant name="Crash"
summary="a crash. This metric is a superset of these 3 metrics:
Stability.iOS.TabCountBeforeFreeze,
Stability.iOS.TabCountBeforeSignalCrash,
Stability.iOS.TabCountBeforeUTE"/>
<variant name="Freeze" summary="a UI thread freeze"/>
<variant name="SignalCrash" summary="a signal crash"/>
<variant name="UTE" summary="a crash (UTE or XTE)"/>
</token>
</histogram>
<histogram name="Stability.IOS.UTE.AppWillTerminateWasCalledInForeground"
enum="Boolean" expires_after="2024-10-09">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded on iOS when applicationWillTerminate callback is called when app is
in the foreground. When this happens the app will not write clean exit
beacon and shutdown will not be clean.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.BatteryCharge" units="%"
expires_after="2024-11-03">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
The last known battery charge before a crash occurred. This will only be
logged for devices which were last known to be in the "unplugged"
state because the intention is to identify devices which may have died
leading to unexpected terminations. Logged on application launch if the last
session terminated in an unclean state.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.DeviceThermalState"
enum="IOSDeviceThermalState" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
The thermal state of the device when a crash occured. Logged on application
launch if the last session terminated in an unclean state.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.HasPossibleExplanation"
enum="BooleanHasPossibleExplanation" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Indicates whether or not one of the Stability.iOS.UTE.* metrics could
explain the cause of the UTE which terminated the previous session. Logged
on application launch if the last session terminated in an unclean state.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.MobileSessionAppState" enum="IOSAppState"
expires_after="2024-11-03">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when app starts after Unexplained Termination Event (UTE) or
Explained Termination Event (XTE). Values other than Active indicate that
prefs::kLastSessionExitedCleanly was not properly stored.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.MobileSessionAppWillTerminateWasReceived"
enum="AppWillTerminateReceived" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when app starts after Unexplained Termination Event (UTE) or
Explained Termination Event (XTE). UTEs/XTEs can happen when app did not
finish writing prefs. This histogram should help to understand if prefs did
not get written during normal app termination sequence when
ApplicationWillTerminate notification was called.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.MobileSessionOOMShutdownHint"
enum="OOMShutdownHint" expires_after="2024-04-24">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when app starts after Unexplained Termination Event (UTE) or
Explained Termination Event (XTE). UTEs/XTEs can be caused by large memory
allocations and this histogram provides information which memory heavy
operation has being performed before UTE/XTE.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.OSRestartedAfterPreviousSession"
enum="BooleanRebooted" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
true if OS was restarted after the previous session. Logged on application
launch if the last session terminated in an unclean state. If this is false
then UTE was not caused by OS restart or shutdown.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.OSVersion" enum="VersionComparison"
expires_after="2025-05-01">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Logged on the session following a crash with the result of a comparison
between the OS version of the session which crashed and the current OS
version. Logged on application launch if the last session terminated in an
unclean state.
</summary>
</histogram>
<histogram name="Stability.iOS.UTE.TimeBetweenUTEAndNextLaunch" units="ms"
expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
The estimated amount of time between when a crash occurred and when the user
relaunched the application. Logged on application launch if the last session
terminated in an unclean state.
</summary>
</histogram>
<histogram name="Stability.MobileSessionShutdownType"
enum="MobileSessionShutdownType" expires_after="2024-12-08">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Type of the shutdown. This histogram is recorded at startup and logs a
sample for the previous session. A clean shutdown is one where the app
enters the background before being killed. Other shutdowns are all some sort
of crash. The absence of a crash log indicates that the app was killed by
the OS, normally due to memory pressure. If memory pressure is extremely
high, the app may not have had a chance to response to a memory warning
before being killed. For first launch after upgrade, the crash reports may
be discarded before this histogram is written to so it's not possible to
determine if there's a valid crash log present or not.
</summary>
</histogram>
<histogram name="Stability.MobileSessionShutdownType2"
enum="MobileSessionShutdownType" expires_after="2025-02-10">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Type of the shutdown. This histogram is recorded after processing Crashpad
intermediate dumps, and is otherwise identical to
Stability.MobileSessionShutdownType, which is recorded at startup and before
Crashpad dumps are processed. Because this histogram is not recorded in time
for the initial stability log, the histogram will appear in a log that lists
the current Chrome version (and other browser metadata), not the Chrome
version at the time the crash occurred. The earlier histogram
Stability.MobileSessionShutdownType should be in the stability log, which
will list the Chrome version at the time of the crash.
</summary>
</histogram>
<histogram name="Stability.RendererAbnormalTermination2.HostedContentType"
enum="RendererHostedContentType" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when a renderer process exits abnormally. The value describes the
type of content hosted by the renderer at the time of abnormal exit.
</summary>
</histogram>
<histogram name="Stability.RendererAbnormalTermination2.{HostedContentType}"
enum="TerminationStatus" expires_after="2025-01-05">
<owner>[email protected]</owner>
<owner>[email protected]</owner>
<summary>
Recorded when a renderer process hosting {HostedContentType} exits
abnormally. The value describes the exit reason.
</summary>
<token key="HostedContentType">
<variant name="BackgroundFrame"
summary="an active background frame (but no active foreground frame)"/>
<variant name="Extension" summary="an extension"/>
<variant name="ForegroundMainFrame"
summary="an active foreground main frame"/>
<variant name="ForegroundSubframe"
summary="an active foreground subframe (but no active foreground main
frame)"/>
<variant name="InactiveFrame"
summary="an inactive frame (but no active frame)"/>
<variant name="NoFrameOrExtension" summary="no frame or extension"/>
</token>
</histogram>
</histograms>
</histogram-configuration>