chromium/tools/metrics/histograms/metadata/stability/histograms.xml

<!--
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 &quot;pageloads&quot; 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 &quot;Total pageloads&quot;
    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 &quot;unplugged&quot;
    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>