<!--
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 Platform 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
chromium-metrics-reviews@google.com.
-->

<histogram-configuration>

<histograms>

<variants name="ChromePressureLevel">
  <variant name="Critical" summary="Critical"/>
  <variant name="Moderate" summary="Moderate"/>
  <variant name="None" summary="None"/>
</variants>

<variants name="FirmwareTypes">
  <variant name="Bluetooth"/>
  <variant name="UnknownType"/>
  <variant name="WiFi"/>
</variants>

<variants name="PartitionTypes">
  <variant name="EncStateful"/>
  <variant name="Stateful"/>
  <variant name="UserData"/>
</variants>

<variants name="ProcessMemoryType">
  <variant name=".Anon" summary="Measures anonymous RSS."/>
  <variant name=".File" summary="Measures file RSS."/>
  <variant name=".Shmem" summary="Measures shmem RSS."/>
  <variant name=".Swap" summary="Measures swap in use."/>
  <variant name=".Total" summary="Measures total RSS."/>
</variants>

<histogram name="Platform.BootMode.DevSwitch"
    enum="Platform.BootMode.SwitchStatus" expires_after="2025-03-09">
  <owner>enlightened@chromium.org</owner>
  <owner>chromeos-hardening@google.com</owner>
  <summary>
    Indicates the status of the developer switch on Chrome OS hardware. The
    developer switch allows users to run their own code on the device.

    Warning: this histogram was expired from 2022-04-03 to 2023-11-15 ; data may
    be missing.
  </summary>
</histogram>

<histogram name="Platform.BootMode.FirmwareWriteProtect.{FirmwareType}"
    enum="Platform.BootMode.FirmwareWriteProtect" expires_after="2026-11-29">
  <owner>enlightened@chromium.org</owner>
  <owner>chromeos-hardening@google.com</owner>
  <summary>
    On Chrome OS hardware, indicates whether flash write protection is enabled
    for the {FirmwareType} firmware.

    Warning: this histogram was expired from 2022-04-17 to 2023-11-15 ; data may
    be missing.
  </summary>
  <token key="FirmwareType">
    <variant name="EC" summary="Embedded Controller"/>
    <variant name="Main" summary="Main processor"/>
    <variant name="PD" summary="USB Power Delivery controller"/>
  </token>
</histogram>

<histogram name="Platform.BootMode.WriteProtectSwitch"
    enum="Platform.BootMode.SwitchStatus" expires_after="2027-01-09">
  <owner>enlightened@chromium.org</owner>
  <owner>chromeos-hardening@google.com</owner>
  <summary>
    Indicates the status of the hardware write protect switch on Chrome OS
    hardware. The write protect switch protects firmware from being rewritten.

    Warning: this histogram was expired from 2021-09-05 to 2023-11-15 ; data may
    be missing.
  </summary>
</histogram>

<histogram name="Platform.Chaps.ReinitializingToken"
    enum="ChapsReinitializingToken" expires_after="2026-10-11">
  <owner>chenyian@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the status code when Chaps needs to reinitializing token.
  </summary>
</histogram>

<histogram name="Platform.Chaps.Session.{Operation}" enum="ChapsSessionStatus"
    expires_after="2027-01-03">
  <owner>chenyian@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the return value of a chaps session &quot;{Operation}&quot;
    operation. The return code is defined in pkcs11 specification. There is
    exactly one sample logged for every chaps session &quot;{Operation}&quot;
    operation.
  </summary>
  <token key="Operation">
    <variant name="Decrypt"/>
    <variant name="DeriveKey"/>
    <variant name="Digest"/>
    <variant name="Encrypt"/>
    <variant name="Sign"/>
    <variant name="UnwrapKey"/>
    <variant name="UnwrapKeyWithChaps"/>
    <variant name="Verify"/>
    <variant name="WrapKey"/>
    <variant name="WrapKeyWithChaps"/>
  </token>
</histogram>

<histogram name="Platform.Chaps.TokenManager.LoadToken"
    enum="TokenManagerStatus" expires_after="2027-02-14">
  <owner>chenyian@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the return value of a chaps token manager load token
    operation. There is exactly one sample logged for every call to
    SlotManagerImpl::LoadToken().
  </summary>
</histogram>

<histogram name="Platform.Chaps.TokenManager.UnloadToken"
    enum="TokenManagerStatus" expires_after="2027-01-31">
  <owner>chenyian@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the return value of a chaps token manager unload token
    operation. There is exactly one sample logged for every call to
    SlotManagerImpl::UnloadToken().
  </summary>
</histogram>

<histogram name="Platform.Chaps.TPMAvailability" enum="ChapsTPMAvailability"
    expires_after="2027-02-14">
  <owner>chenyian@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>Each sample is the TPM Availability status.</summary>
</histogram>

<histogram name="Platform.CoralService.ClusteringEngine.GeneratedGroupCount"
    units="count" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The number of groups generated by the clustering engine that are greater
    than or equal to the required group size for coral feature (4 currently).
    This is recorded everytime the clustering engine finishes the clustering
    process successfully.
  </summary>
</histogram>

<histogram name="Platform.CoralService.ClusteringEngine.GroupItemCount"
    units="count" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The number of items in each cluster, generated by the clustering engine.
    This is recorded everytime the clustering engine finishes the clustering
    process successfully.
  </summary>
</histogram>

<histogram name="Platform.CoralService.ClusteringEngine.InputCount"
    units="count" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The number of input items in the Group request when it reaches the
    clustering engine. This is recorded everytime the clustering engine starts
    processing a Group request.
  </summary>
</histogram>

<histogram name="Platform.CoralService.EmbeddingEngine.CacheHit"
    enum="BooleanCacheHit" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the embedding cache is hit for each item in the Group request to the
    coral service. This isn't recorded during PrepareResource or CacheEmbeddings
    calls because what we care about is how frequent the cache is hit when the
    user-facing feature is triggered (which issues a Group request). This is
    recorded when embedding engine is processing each entity in a Group request
    and checks whether it is present in the embedding cache database.
  </summary>
</histogram>

<histogram name="Platform.CoralService.EmbeddingEngine.DatabaseEntriesCount"
    units="count" expires_after="2026-09-27">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The number of embedding vector entries persisted in the on-device database.
    This is recorded everytime the database is initialized, which is everytime a
    primary user session starts (i.e., a user logs in as primary user).
  </summary>
</histogram>

<histogram name="Platform.CoralService.EmbeddingEngine.FilteredCount"
    units="count" expires_after="2026-01-18">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The number of input items in the Group request filtered out by the embedding
    engine. There could be multiple reasons an item is filtered, including
    unsupported language or safety violation. This is recorded everytime the
    clustering engine starts processing a Group request.
  </summary>
</histogram>

<histogram
    name="Platform.CoralService.EmbeddingEngine.LanguageDetectionCacheHit"
    enum="BooleanCacheHit" expires_after="2025-11-19">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the language detection result cache is hit for each item in the
    Group request to the coral service. This isn't recorded during
    PrepareResource or CacheEmbeddings calls because what we care about is how
    frequent the cache is hit when the user-facing feature is triggered (which
    issues a Group request). This is recorded when embedding engine is
    processing each entity in a Group request and checks whether it is present
    in the embedding cache database.
  </summary>
</histogram>

<histogram name="Platform.CoralService.EmbeddingEngine.LanguageSupported"
    enum="BooleanSupported" expires_after="2026-01-18">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the language detection result for each item in the Group request is
    a supported language. This is recorded when embedding engine is processing
    each entity in a Group request and checks whether the language is
    unsupported and needs to be discarded.
  </summary>
</histogram>

<histogram name="Platform.CoralService.EmbeddingEngine.ModelLoaded"
    enum="BooleanLoaded" expires_after="2026-09-27">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the embedding model is already loaded when coral service receives a
    Group request. This isn't recorded during PrepareResource or CacheEmbeddings
    calls because what we care about is how frequent the model needs to be
    loaded when the user-facing feature is triggered (which issues a Group
    request). This is recorded when embedding engine is processing a Group
    request and reaches the step that it needs to check whether the model is
    already loded.
  </summary>
</histogram>

<histogram name="Platform.CoralService.EmbeddingEngine.SafetyVerdict"
    enum="CoralSafetyVerdict" expires_after="2026-11-29">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The safety verdict for each item in the Group request. This is recorded when
    embedding engine is processing each entity in a Group request and checks
    whether the safety check doesn't pass and needs to be discarded.
  </summary>
</histogram>

<histogram name="Platform.CoralService.EmbeddingEngine.SafetyVerdictCacheHit"
    enum="BooleanCacheHit" expires_after="2026-01-18">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the safety verdict cache is hit for each item in the Group request
    to the coral service. This isn't recorded during PrepareResource or
    CacheEmbeddings calls because what we care about is how frequent the cache
    is hit when the user-facing feature is triggered (which issues a Group
    request). This is recorded when embedding engine is processing each entity
    in a Group request and checks whether it is present in the embedding cache
    database.
  </summary>
</histogram>

<histogram name="Platform.CoralService.Error.{EngineType}" enum="CoralStatus"
    expires_after="2026-09-27">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The return value of a Group request to the coral service for individual
    engines of the service. The coral service is a pipeline of 3 engines:
    Embedding, Clustering, and TitleGeneration. If any engine returns an error
    when processing the request, the service returns the corresponding error as
    response. It is recorded when the {EngineType} finishes processing a request
    (success or failure).
  </summary>
  <token key="EngineType">
    <variant name="ClusteringEngine"/>
    <variant name="EmbeddingEngine"/>
    <variant name="TitleGenerationEngine"/>
  </token>
</histogram>

<histogram name="Platform.CoralService.Error.{OperationType}"
    enum="CoralStatus" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The return value of a {OperationType} request to the coral service, hosted
    by the odml daemon. It is recorded when any request to coral service
    completes (success or failure).
  </summary>
  <token key="OperationType">
    <variant name="CacheEmbeddings"/>
    <variant name="Group"/>
  </token>
</histogram>

<histogram name="Platform.CoralService.Group.InputCount" units="count"
    expires_after="2025-11-19">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The number of input items in the Group request. This is recorded everytime
    the backend receives a Group request.
  </summary>
</histogram>

<histogram
    name="Platform.CoralService.Latency.EmbeddingEngine.GenerateEmbedding"
    units="ms" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Milliseconds taken by the generate embedding step of the embedding engine in
    coral service. This only counts the latency of the inference itself; model
    loading latency isn't counted. This is recorded when a generate embedding
    operation completes with a successful return status.
  </summary>
</histogram>

<histogram name="Platform.CoralService.Latency.EmbeddingEngine.LoadModel"
    units="ms" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Milliseconds taken by the load model step of the embedding engine in coral
    service. The embedding model needs to be loaded for the embedding engine to
    process requests, so a load model operation will be instantiated if the
    engine receives a request while the model hasn't been loaded. This is
    recorded when a load model operation completes with a successful return
    status.
  </summary>
</histogram>

<histogram
    name="Platform.CoralService.Latency.TitleGenerationEngine.GenerateTitle"
    units="ms" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Milliseconds taken by the generate title step of the title generation engine
    in coral service. This only counts the latency of the inference itself;
    model loading latency isn't counted. This is recorded when a generate title
    operation completes with a successful return status.
  </summary>
</histogram>

<histogram name="Platform.CoralService.Latency.TitleGenerationEngine.LoadModel"
    units="ms" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Milliseconds taken by the load model step of the title generation engine in
    coral service. The title generation model needs to be loaded for the engine
    to process requests, so a load model operation will be instantiated if the
    engine receives a request while the model hasn't been loaded. This is
    recorded when a load model operation completes with a successful return
    status.
  </summary>
</histogram>

<histogram name="Platform.CoralService.Latency.{EngineType}" units="ms"
    expires_after="2026-09-27">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Milliseconds taken by a Group request to the coral service for individual
    engines of the service. The coral service is a pipeline of 3 engines:
    Embedding, Clustering, and TitleGeneration, and the latency of the service
    is roughly the summation of all 3 engines. This is a breakdown of latency
    taken by individual engines. It is recorded when the {EngineType} finishes
    processing a Group request with successful return status.
  </summary>
  <token key="EngineType">
    <variant name="ClusteringEngine"/>
    <variant name="EmbeddingEngine"/>
    <variant name="TitleGenerationEngine"/>
  </token>
</histogram>

<histogram name="Platform.CoralService.Latency.{OperationType}" units="ms"
    expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Milliseconds taken by a {OperationType} request to the coral service, hosted
    by the odml daemon. It is recorded when any request to coral service
    completes with successful return status.
  </summary>
  <token key="OperationType">
    <variant name="CacheEmbeddings"/>
    <variant name="Group"/>
  </token>
</histogram>

<histogram
    name="Platform.CoralService.TitleGenerationEngine.CacheDifferenceRatio"
    units="%" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The minimum difference ratio of each group returned from the clustering
    engine, compared with all groups in the title cache. When this ratio is
    lower than a threshold, the cache will be hit and the title will be reused,
    and this metrics can help us understand what is the most suitable value of
    that ratio. This is recorded when title generation engine is processing each
    entity in a Group request and checks whether it is similar enough to any
    groups in the title cache (reported regardless of cache hit or not).
  </summary>
</histogram>

<histogram name="Platform.CoralService.TitleGenerationEngine.CacheHit"
    enum="BooleanCacheHit" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the title cache is hit for each item in the Group request to the
    coral service. This is recorded when title generation engine is processing
    each entity in a Group request and checks whether it is present in the title
    cache.
  </summary>
</histogram>

<histogram name="Platform.CoralService.TitleGenerationEngine.GenerationResult"
    enum="CoralTitleGenerationResult" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The success or failure result of each title generation. This is recorded
    exactly once when title generation engine is processing each group returned
    from the clustering engine.
  </summary>
</histogram>

<histogram name="Platform.CoralService.TitleGenerationEngine.InputTokenSize"
    units="tokens" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The length of each model inference prompt formed by the title generation
    engine, in tokens (the unit of text representation in our on device models).
    This is reported for each group returned from the clustering engine, that is
    processed in the model inference step.
  </summary>
</histogram>

<histogram
    name="Platform.CoralService.TitleGenerationEngine.LengthInCharacters"
    units="characters" expires_after="2026-09-27">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The length of each generated title from title generation engine, in
    characters (bytes). This is reported whenever title generation engine
    generates a new title for a group successfully (empty title is treated as
    failure and won't be reported).
  </summary>
</histogram>

<histogram name="Platform.CoralService.TitleGenerationEngine.LengthInWords"
    units="words" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The length of each generated title from title generation engine, in English
    words. This is defined by &quot;number of white spaces + 1&quot; in the
    title, which is a good enough estimation for English words. This is not
    useful for many other languages, and should be reported with some extra
    logic after we support languages other than English. Currently, this is
    reported whenever title generation engine generates a new title for a group
    successfully (empty title is treated as failure and won't be reported).
  </summary>
</histogram>

<histogram name="Platform.CoralService.TitleGenerationEngine.ModelLoaded"
    enum="BooleanLoaded" expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the title generation model is already loaded when coral service
    receives a Group request. This is recorded when title generation engine is
    processing a Group request and reaches the step that it needs to check
    whether the model is already loded.
  </summary>
</histogram>

<histogram name="Platform.CrashCollector.AddWeightResult"
    enum="CrosCrashCollectorAddWeightResult" expires_after="2025-03-09">
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    (ChromeOS only) An enum indicating the reasons why adding a weight to crash
    reports succeeded or failed. This is recorded after each crash with
    client-side weighting -- most commonly, those detected by anomaly_detector.
    Specifically, these metrics are recorded in
    CrashCollector::AddCrashMetaWeight() and
    CrashCollector::AddCrashMetaUploadData().
  </summary>
</histogram>

<histogram name="Platform.CrOS.CrashSenderRemoveReason"
    enum="CrosCrashSenderRemoveReason" expires_after="2025-01-26">
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    (Chrome OS only) An enum indicating the reasons for removal of crash reports
    on devices. Generally, we'll remove crash reports after successfully sending
    them, but there are other reasons for removal (e.g. if the metadata file was
    malformed). These should be rare, but bugs in the crash reporting system may
    cause us to start removing crashes before sending them more often. This
    metric is intended to monitor crash reporting system health.
  </summary>
</histogram>

<histogram name="Platform.CrOSEvent" enum="CrosEventEnum" expires_after="never">
<!-- expires-never: Used by the core CrOS platform with individual buckets added
     and removed as makes sense. -->

<!-- https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/metrics/OWNERS -->

  <owner>iby@chromium.org</owner>
  <owner>vapier@chromium.org</owner>
  <summary>
    Generic event of interest from Chrome OS. Intended mainly to help assess the
    frequency of rare error conditions.
  </summary>
</histogram>

<histogram name="Platform.CumulativeCpuTime" units="seconds"
    expires_after="M78">
  <owner>semenzato@chromium.org</owner>
  <owner>bsimonnet@chromium.org</owner>
  <summary>
    Total CPU time accumulated since the last version update. Reported at most
    once a day.
  </summary>
</histogram>

<histogram name="Platform.DailyUseTime" units="seconds" expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>semenzato@chromium.org</owner>
  <owner>bsimonnet@chromium.org</owner>
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <improvement direction="HIGHER_IS_BETTER"/>
  <summary>
    Total use time (device ON and not asleep) in the previous day, or the most
    recent day the device was in use. Reported at most once a day.
  </summary>
</histogram>

<histogram name="Platform.DeviceManagement.InstallAttributesRestoreResult"
    enum="InstallAttributesRestoreResult" expires_after="2025-05-04">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result of the install_attributes restoration process.
    This is logged when lockbox-cache tries to restore the missing
    install_attributes. See cryptohome::RestoreResult in
    src/platform2/cryptohome/lockbox-cache.cc for more context.
  </summary>
</histogram>

<histogram name="Platform.DeviceManagement.InstallAttributesStatus"
    enum="InstallAttributesStatus" expires_after="2027-02-07">
  <owner>sadmansakib@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result of the install_attributes initialization status.
    This is logged when DeviceManagement::Initialize() completes initialization
    of install_attributes. See InstallAttributes::Status in
    src/platform2/device_management/install_attributes/install_attributes.h for
    context.
  </summary>
</histogram>

<histogram name="Platform.DiskUsage.NumUserHomeDirectories"
    units="home directories" expires_after="2026-05-24">
  <owner>achuith@chromium.org</owner>
  <owner>tls@chromium.org</owner>
  <summary>
    Number of users home directories on the device. Logged once a day.
  </summary>
</histogram>

<histogram name="Platform.DiskUsage.UsersOnDevice" units="units"
    expires_after="M85">
  <owner>achuith@chromium.org</owner>
  <owner>omrilio@chromium.org</owner>
  <summary>
    Number of user home dirs on device. Logged once a day, if disk usage is
    high.
  </summary>
</histogram>

<histogram name="Platform.DiskUsageChronos" units="KB"
    expires_after="2027-02-07">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Chrome OS KB in use in the /home/chronos filesystem tree. Logged once a day
    during log file cleanup. Warning: this histogram was expired from 2022-04-10
    to 2023-06-01; data may be missing.
  </summary>
</histogram>

<histogram name="Platform.DiskUsageVar" units="KB" expires_after="2027-02-07">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Chrome OS KB in use in the /var filesystem tree. Logged once a day during
    log file cleanup. Warning: this histogram was expired from 2022-05-01 to
    2023-06-01; data may be missing.
  </summary>
</histogram>

<histogram name="Platform.DlcService.InstallResult"
    enum="DlcService.InstallResult" expires_after="2026-12-31">
  <owner>kimjae@chromium.org</owner>
  <owner>chromeos-core-services@google.com</owner>
  <summary>
    The result of an attempt to Install a DLC package. DLCs are ChromiumOS
    Software packages that are installed in the stateful partition.
  </summary>
</histogram>

<histogram name="Platform.DlcService.TotalUsedMBytes" units="MiB"
    expires_after="2026-12-31">
  <owner>kimjae@chromium.org</owner>
  <owner>chromeos-core-services@google.com</owner>
  <summary>
    The storage space used by DLC packages on the device. This metric is
    reported daily by the dlcservice. DLCs are ChromiumOS software packages that
    are installed in the stateful partition.
  </summary>
</histogram>

<histogram name="Platform.DlcService.UninstallResult"
    enum="DlcService.UninstallResult" expires_after="2026-12-31">
  <owner>kimjae@chromium.org</owner>
  <owner>chromeos-core-services@google.com</owner>
  <summary>
    The result of an attempt to Uninstall a DLC package. DLCs are ChromiumOS
    Software packages that are installed in the stateful partition.

    Warning: this histogram was expired from Feb 2025 to March 2026; data may be
    missing.
  </summary>
</histogram>

<histogram name="Platform.Emmc.LifeUsed.{Type}" enum="EmmcLifeUsed"
    expires_after="2027-02-07">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    eMMC [5.0] Device lifetime estimation for flash. This field provides an
    estimated indication about the device lifetime that is reflected by the
    averaged wear out of memory of {Type} relative to its maximum estimated
    lifetime.
  </summary>
  <token key="Type">
    <variant name="TypeA"/>
    <variant name="TypeB"/>
  </token>
</histogram>

<histogram name="Platform.ExternalMetrics.SamplesRead" units="count"
    expires_after="2025-01-30">
  <owner>iby@google.com</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    On ChromeOS, number of external metrics samples read in from the platform.
    Emitted once every 30 seconds. If this is too large (over 100,000), we will
    silently lose metrics. Additionally, 100,000 is the largest number we'll
    ever record here: we stop counting when we hit 100,000.
  </summary>
</histogram>

<histogram name="Platform.FbPreprocessor.Pseudonymization.DumpType"
    enum="Platform.FbPreprocessor.FirmwareType" expires_after="2026-12-31">
  <owner>jintaolin@chromium.org</owner>
  <owner>yichenyu@chromium.org</owner>
  <owner>cros-network-metrics@google.com</owner>
  <summary>
    Type of the firmware dump that is submitted for pseudonymization. Emitted
    every time a new pseudonymization is requested. Design doc:
    go/cros-fbpreprocessord-dd
  </summary>
</histogram>

<histogram name="Platform.FbPreprocessor.{FirmwareType}.Collection.Allowed"
    enum="Platform.FbPreprocessor.CollectionAllowedStatus"
    expires_after="2026-12-31">
  <owner>jintaolin@chromium.org</owner>
  <owner>yichenyu@chromium.org</owner>
  <owner>cros-network-metrics@google.com</owner>
  <summary>
    Reports whether the collection of {FirmwareType} firmware dumps is allowed
    or not. Emitted every time the bit is updated (user logs in/out, Finch
    updated, etc). Design doc: go/cros-fbpreprocessord-dd
  </summary>
  <token key="FirmwareType" variants="FirmwareTypes"/>
</histogram>

<histogram name="Platform.FbPreprocessor.{FirmwareType}.Output.Number"
    units="count" expires_after="2026-12-31">
  <owner>jintaolin@chromium.org</owner>
  <owner>yichenyu@chromium.org</owner>
  <owner>cros-network-metrics@google.com</owner>
  <summary>
    Number of firmware dumps of type {FirmwareType} that are available for
    collection. Emitted periodically, every 5 minutes. Design doc:
    go/cros-fbpreprocessord-dd
  </summary>
  <token key="FirmwareType" variants="FirmwareTypes"/>
</histogram>

<histogram
    name="Platform.FbPreprocessor.{FirmwareType}.Pseudonymization.Result"
    enum="Platform.FbPreprocessor.PseudonymizationResult"
    expires_after="2026-12-31">
  <owner>jintaolin@chromium.org</owner>
  <owner>yichenyu@chromium.org</owner>
  <owner>cros-network-metrics@google.com</owner>
  <summary>
    Result of the pseudonymization operations of firmware dumps of type
    {FirmwareType}. Emitted every time a new firmware dump completes
    pseudonymization, succesfully or not. Design doc: go/cros-fbpreprocessord-dd
  </summary>
  <token key="FirmwareType" variants="FirmwareTypes"/>
</histogram>

<histogram name="Platform.Featured.BootAttemptsSinceLastSafeSeed"
    units="number of boot attempts" expires_after="2025-10-06">
  <owner>shraash@google.com</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Records number of boot attempts on a device since receiving a variations
    safe seed from Chrome. This value is reported every time a device boots.
  </summary>
</histogram>

<histogram name="Platform.FileDescriptors.Count" units="count"
    expires_after="2027-01-03">
  <owner>keiichiw@google.com</owner>
  <owner>uekawa@google.com</owner>
  <summary>
    The total number of allocated file descriptors. This value is obtained from
    /proc/sys/fs/file-nr and reported once per day.
  </summary>
</histogram>

<histogram name="Platform.FileSystem.{Partition}.fsckResult" enum="FsckResult"
    expires_after="2026-12-01">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Reports fsck result on {Partition}. Reported once per filesystem mount.
  </summary>
  <token key="Partition" variants="PartitionTypes"/>
</histogram>

<histogram name="Platform.FileSystem.{Partition}_ErrorCount" units="errors"
    expires_after="2027-01-31">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Number of error in file system {Partition}, as reported by dumpe2fs &quot;FS
    Error count&quot; field. Reported once per boot.
  </summary>
  <token key="Partition" variants="PartitionTypes"/>
</histogram>

<histogram name="Platform.FileSystem.{Partition}_{MountResult}" enum="Boolean"
    expires_after="2027-01-31">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    {MountResult} is true when kernel reports that file system {Partition}
    is/was needed.
  </summary>
  <token key="Partition" variants="PartitionTypes"/>
  <token key="MountResult">
    <variant name="FsckNeeded"/>
    <variant name="RecoveryNeeded"/>
  </token>
</histogram>

<histogram name="Platform.Firmware.Mismatch" enum="BooleanDetected"
    expires_after="2026-12-31">
  <owner>kimjae@chromium.org</owner>
  <owner>chromeos-core-services@google.com</owner>
  <summary>
    Records if the system firmware mismatched OS bundled firmware. Reported once
    per boot by dev_debug_vboot.

    Warning: this histogram was expired from 2024-09-02 to 2025-03-27; data may
    be missing.
  </summary>
</histogram>

<histogram name="Platform.FlexBootMethod" enum="FlexBootMethod"
    expires_after="2027-01-17">
  <owner>justinoue@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    ChromeOS Flex runs on a various configurations of x86 firmware. This metric
    collects the method used to boot the device.

    This metric is only recorded on ChromeOS Flex devices. It is recorded once
    per boot.
  </summary>
</histogram>

<histogram name="Platform.FlexCpuIsaLevel" enum="FlexCpuIsaLevel"
    expires_after="2026-12-27">
  <owner>nicholasbishop@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    ChromeOS Flex runs on a wide range of x86-64 CPUs. This metric categorizes
    the CPU by its ISA level.

    This metric is only recorded on ChromeOS Flex devices. It is recorded once
    per boot.
  </summary>
</histogram>

<histogram name="Platform.FlexHwis.PermissionCheckResult"
    enum="ChromeOSRevenHwisPermission" expires_after="2027-01-15">
  <owner>tinghaolin@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    Result of checking if the device has permission to send hardware data and
    whether it is due to enabled policies or end-user opt-in.

    When a user logs in to a ChromeOS Flex device, hardware data transmission
    and related checks will be initiated. ChromeOS Flex Hardware Information
    Service (flex_hwis) checks if the device is authorized to send hardware data
    to the server. If the device is managed, management policies will be
    checked. If the device is unmanaged, the service will check if consent has
    been granted via the OOBE or settings screen before sending any data. Once
    the hardware data has been successfully transmitted to the server, no
    further transmission or related checks will be performed for the next 24
    hours.
  </summary>
</histogram>

<histogram name="Platform.FlexHwis.ServerDeleteSuccess" enum="BooleanSuccess"
    expires_after="2027-01-15">
  <owner>tinghaolin@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    Result of checking if the flex_hwis utility successfully calls DELETE API to
    delete data.

    When a user logs in to a ChromeOS Flex device, hardware data transmission
    and related checks will be initiated. In ChromeOS Flex Hardware Information
    Service (flex_hwis), if the user doesn't consent to send data, the client
    service will send a request to the server to delete the hardware data stored
    on the server.
  </summary>
</histogram>

<histogram name="Platform.FlexHwis.ServerPostSuccess" enum="BooleanSuccess"
    expires_after="2027-01-15">
  <owner>tinghaolin@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    Result of checking if the flex_hwis utility successfully calls POST API to
    create data.

    When a user logs in to a ChromeOS Flex device, hardware data transmission
    and related checks will be initiated. In ChromeOS Flex Hardware Information
    Service (flex_hwis), each device has a unique identifier. If the unique
    identifier was just generated by the service client side, the service will
    then call the POST API to create the data slot on the server side and record
    whether the API request was successful. Once the hardware data has been
    successfully transmitted to the server, no further transmission or related
    checks will be performed for the next 24 hours.
  </summary>
</histogram>

<histogram name="Platform.FlexHwis.ServerPutSuccess" enum="BooleanSuccess"
    expires_after="2027-01-15">
  <owner>tinghaolin@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    Result of checking if the flex_hwis utility successfully calls PUT API to
    update data.

    When a user logs in to a ChromeOS Flex device, hardware data transmission
    and related checks will be initiated. In ChromeOS Flex Hardware Information
    Service (flex_hwis), each device has a unique identifier. If the unique
    identifier already exists on the service client side, the service will then
    call the PUT API to update the data slot on the server side and record
    whether the API request was successful. Once the hardware data has been
    successfully transmitted to the server, no further transmission or related
    checks will be performed for the next 24 hours.
  </summary>
</histogram>

<histogram name="Platform.FlexInstallMethod" enum="FlexInstallMethod"
    expires_after="2027-07-01">
  <owner>tbrandston@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    Sent once when a ChromeOS Flex device sees what method was used for install.

    When a ChromeOS Flex device is installed via Flexor (we expect to add more
    methods in the future), a file is created on the stateful partition. If the
    file exists at boot, we delete it and emit this metric. (If we fail to
    delete the file, we don't emit the metric.)
  </summary>
</histogram>

<histogram name="Platform.FlexPageFlipFlakes2" units="flakes"
    expires_after="2026-07-26">
  <owner>andrebraga@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    Due to using legacy page flips and having little-to-no overlap promotion
    support, Flex tends to reach the 3 page flip flake threshold. This is a
    metric for finding a better threshold for Flex devices.

    This metric is only recorded on ChromeOS Flex devices. It is recorded once
    per page flip flake. There will be overcounting: a device that flakes 3
    times in a row will also emit a metric for &quot;1 flake&quot; and &quot;2
    flakes,&quot; but we are more concerned with finding the upper limit of
    flakes rather than specific counts.

    This histogram replaced `Platform.FlexPageFlipFlakes` as the metric was only
    emitted if we reached the threshold and never before.
  </summary>
</histogram>

<histogram name="Platform.FlexPartitionSize.{Partition}" units="MiB"
    expires_after="2026-11-29">
  <owner>nicholasbishop@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    A sparse histogram of the size (in MiB) of the partition labeled
    &quot;{Partition}&quot;. This is the size as defined by the partition table,
    not the size of the filesystem (if any).

    Unlike most ChromeOS boards, ChromeOS Flex occasionally migrates the disk
    layout of existing installations during the update process, so not all
    installations have the same layout.

    This metric is only recorded on ChromeOS Flex devices. It is recorded once
    per boot.
  </summary>
<!-- The list of variants must match flex_disk_metrics_main.cc's partition_labels:
     https://source.chromium.org/chromiumos/chromiumos/codesearch/+/HEAD:src/platform2/flex_hwis/flex_disk_metrics/flex_disk_metrics_main.cc -->

  <token key="Partition">
    <variant name="EFI-SYSTEM"/>
    <variant name="KERN-A"/>
    <variant name="KERN-B"/>
    <variant name="ROOT-A"/>
    <variant name="ROOT-B"/>
  </token>
</histogram>

<histogram name="Platform.FlexUefiCapsuleUpdateResult"
    enum="FlexFwupdUpdateResult" expires_after="2027-01-17">
  <owner>andrebraga@google.com</owner>
  <owner>chromeos-flex-eng@google.com</owner>
  <summary>
    The result of each `uefi_plugin` update on Flex devices.

    This metric is only recorded on ChromeOS Flex devices. Once per boot, any
    `uefi_plugin` updates in the fwupd history are recorded.
  </summary>
</histogram>

<histogram name="Platform.Fwupd.ActivateStatus" enum="FwupdReturnValue"
    expires_after="2027-01-17">
  <owner>rishbhagr@google.com</owner>
  <owner>chromeos-fwupd@google.com</owner>
  <summary>
    Indicates the return value of a firmware activation operation via fwupd.
    Reported once per activation operation.
  </summary>
</histogram>

<histogram name="Platform.Fwupd.UpdateDuration" units="seconds"
    expires_after="2027-01-17">
  <owner>rishabhagr@google.com</owner>
  <owner>chromeos-fwupd@google.com</owner>
  <summary>
    Time elapsed during the firmware update operation. Sent after every
    sucessful update firmware operation via fwupd.
  </summary>
</histogram>

<histogram name="Platform.Fwupd.UpdateStatus" enum="FwupdReturnValue"
    expires_after="2027-01-17">
  <owner>rishabhagr@google.com</owner>
  <owner>chromeos-fwupd@google.com</owner>
  <summary>
    Indicates the return value of a firmware update operation via fwupd.
    Reported once per update operation.
  </summary>
</histogram>

<histogram name="Platform.IntelMaxMicroArchitecture"
    enum="IntelMaxMicroArchitecture" expires_after="2027-02-07">
  <owner>fbarchard@chromium.org</owner>
  <owner>pwnall@chromium.org</owner>
  <summary>
    The maximum supported micro-architecture on an Intel platform. This value is
    logged at program start time.
  </summary>
</histogram>

<histogram name="Platform.KernelCrashesDaily" units="count per day"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>grundler@chromium.org</owner>
  <owner>groeck@chromium.org</owner>
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Count of kernel crashes during the previous day, or the most recent day the
    device was in use. Reported at most once a day.
  </summary>
</histogram>

<histogram name="Platform.KernelCrashesPerActiveYear" units="count per year"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>grundler@chromium.org</owner>
  <owner>groeck@chromium.org</owner>
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Count of kernel crashes since the last OS update, normalized as number of
    crashes per year of active use (active use = device is ON and not asleep).
    Reported daily.
  </summary>
</histogram>

<histogram name="Platform.KernelCrashesPerCpuYear" units="count per CPU year"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>grundler@chromium.org</owner>
  <owner>groeck@chromium.org</owner>
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Count of kernel crashes since the last OS update, normalized as number
    crashes per year of CPU time. Reported daily.
  </summary>
</histogram>

<histogram name="Platform.KernelCrashesSinceUpdate" units="count"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>grundler@chromium.org</owner>
  <owner>groeck@chromium.org</owner>
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Count of kernel crashes since the last OS update, reported daily.
  </summary>
</histogram>

<histogram name="Platform.KernelCrashesWeekly" units="count per week"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>grundler@chromium.org</owner>
  <owner>groeck@chromium.org</owner>
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Count of kernel crashes during the previous epoch-week, or the most recent
    epoch-week the device was in use. Reported at most once a week. Epoch-weeks
    divide the time in 7-day intervals starting at the UNIX epoch.
  </summary>
</histogram>

<histogram name="Platform.KernelCrashInterval" units="seconds"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>grundler@chromium.org</owner>
  <owner>groeck@chromium.org</owner>
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Time elapsed between the last two kernel crashes. Sent after every kernel
    crash.
  </summary>
</histogram>

<histogram name="Platform.KernelPanicEventsDaily" units="count per day"
    expires_after="2027-04-16">
  <owner>saboyapati@google.com</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    The number of &quot;kernel panic&quot; events recorded in the BIOS event log
    per day. This metric is updated by the metrics_daemon, which accumulates
    events in persistent storage and reports the total exactly once per 24-hour
    period. Once a report is sent to UMA, the local counter is reset to zero to
    prevent duplicate reporting. This provides an independent validation of
    fatal kernel crashes by using firmware persistent memory
  </summary>
</histogram>

<histogram name="Platform.KernelWatchdogEventsDaily" units="count per day"
    expires_after="2027-04-16">
  <owner>saboyapati@google.com</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    The number of &quot;watchdog reset&quot; events recorded in the BIOS event
    log per day. This metric is updated by the metrics_daemon, which accumulates
    events in persistent storage and reports the total exactly once per 24-hour
    period. Once a report is sent to UMA, the local counter is reset to zero to
    prevent duplicate reporting. This provides an independent validation of
    fatal kernel crashes by using firmware persistent memory
  </summary>
</histogram>

<histogram
    name="Platform.Libhwsec.PinWeaverManager.SyncHashTree.ReplayLogResult{ReplayType}"
    enum="HwsecPinWeaverLogReplayResultEnum" expires_after="2025-06-01">
  <owner>chensa@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result code of a libhwsec
    PinWeaverManagerImpl::ReplayLogEntries operation. Categorized into 2 replay
    types(Normal/Full), depending on whether all of the log entries were used
    for replay, as this will result in different error distributions. This is
    logged after the ReplayLog operation is attempted, during libhwsec's retry
    handling when the PinWeaver client loses sync with the server (GSC).
  </summary>
  <token key="ReplayType">
    <variant name=""/>
    <variant name=".Full"/>
    <variant name=".Normal"/>
  </token>
</histogram>

<histogram name="Platform.Libhwsec.PinWeaverManager.SyncHashTree.SyncOutcome"
    enum="HwsecPinWeaverSyncOutcomeEnum" expires_after="2027-02-14">
  <owner>chensa@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result code of a libhwsec PinWeaverManager::SyncHashTree
    operation. This is logged after the Sync operation is attempted, during
    libhwsec's retry handling when the PinWeaver client loses sync with the
    server (GSC).
  </summary>
</histogram>

<histogram
    name="Platform.Libhwsec.RetryAction.PinWeaverManager.{ReplayOperationType}{ReplayEntryType}"
    enum="HwsecRetryActionEnum" expires_after="2025-04-20">
  <owner>chensa@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result of the libhwsec PinWeaver {ReplayOperationType}
    operation. This is logged when a {ReplayOperationType} replay operation is
    attempted during libhwsec's retry handling, when the PinWeaver client loses
    sync with the server (GSC). The metric is categorized by the ReplayEntry
    types, where {ReplayEntryType} differentiates the status of the replay
    before attempting to replay the current log entry.
  </summary>
  <token key="ReplayOperationType">
    <variant name="ReplayCheck" summary="PinWeaverManagerImpl::ReplayCheck"/>
    <variant name="ReplayInsert" summary="PinWeaverManagerImpl::ReplayInsert"/>
    <variant name="ReplayInvalid"
        summary="PinWeaverManagerImpl::ReplayInvalid"/>
    <variant name="ReplayRemove" summary="PinWeaverManagerImpl::ReplayRemove"/>
    <variant name="ReplayReset" summary="PinWeaverManagerImpl::ReplayReset"/>
  </token>
  <token key="ReplayEntryType">
    <variant name=""/>
    <variant name=".MismatchedHash"/>
    <variant name=".Normal"/>
    <variant name=".SecondEntry"/>
  </token>
</histogram>

<histogram name="Platform.Libhwsec.RetryAction{Category}"
    enum="HwsecRetryActionEnum" expires_after="2027-01-31">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result code of a libhwsec operation issued through
    libhwsec that belongs to {Category}. Success is 0. For the other error
    codes, see src/platform2/libhwsec/error/tpm_retry_action.h. Recorded when
    the libhwsec operation finished in the middleware.
  </summary>
  <token key="Category">
    <variant name="" summary="hwsec"/>
    <variant name=".Attestation" summary="Attestation"/>
    <variant name=".Attestation.IsQuoted" summary="Attestation::IsQuoted"/>
    <variant name=".Attestation.Quote" summary="Attestation::Quote"/>
    <variant name=".Config" summary="Config"/>
    <variant name=".Config.GetCurrentBootMode"
        summary="Config::GetCurrentBootMode"/>
    <variant name=".Config.IsCurrentUserSet"
        summary="Config::IsCurrentUserSet"/>
    <variant name=".Config.SetCurrentUser" summary="Config::SetCurrentUser"/>
    <variant name=".Config.ToOperationPolicy"
        summary="Config::ToOperationPolicy"/>
    <variant name=".DAMitigation" summary="DAMitigation"/>
    <variant name=".DAMitigation.GetStatus" summary="DAMitigation::GetStatus"/>
    <variant name=".DAMitigation.IsReady" summary="DAMitigation::IsReady"/>
    <variant name=".DAMitigation.Mitigate" summary="DAMitigation::Mitigate"/>
    <variant name=".Deriving" summary="Deriving"/>
    <variant name=".Deriving.Derive" summary="Deriving::Derive"/>
    <variant name=".Deriving.SecureDerive" summary="Deriving::SecureDerive"/>
    <variant name=".Encryption" summary="Encryption"/>
    <variant name=".Encryption.Decrypt" summary="Encryption::Decrypt"/>
    <variant name=".Encryption.Encrypt" summary="Encryption::Encrypt"/>
    <variant name=".KeyManagement" summary="KeyManagement"/>
    <variant name=".KeyManagement.CreateKey"
        summary="KeyManagement::CreateKey"/>
    <variant name=".KeyManagement.Flush" summary="KeyManagement::Flush"/>
    <variant name=".KeyManagement.GetECCPublicInfo"
        summary="KeyManagement::GetECCPublicInfo"/>
    <variant name=".KeyManagement.GetKeyHandle"
        summary="KeyManagement::GetKeyHandle"/>
    <variant name=".KeyManagement.GetPersistentKey"
        summary="KeyManagement::GetPersistentKey"/>
    <variant name=".KeyManagement.GetPolicyEndorsementKey"
        summary="KeyManagement::GetPolicyEndorsementKey"/>
    <variant name=".KeyManagement.GetPubkeyHash"
        summary="KeyManagement::GetPubkeyHash"/>
    <variant name=".KeyManagement.GetRSAPublicInfo"
        summary="KeyManagement::GetRSAPublicInfo"/>
    <variant name=".KeyManagement.GetSupportedAlgo"
        summary="KeyManagement::GetSupportedAlgo"/>
    <variant name=".KeyManagement.IsSupported"
        summary="KeyManagement::IsSupported"/>
    <variant name=".KeyManagement.LoadKey" summary="KeyManagement::LoadKey"/>
    <variant name=".KeyManagement.ReloadIfPossible"
        summary="KeyManagement::ReloadIfPossible"/>
    <variant name=".KeyManagement.SideLoadKey"
        summary="KeyManagement::SideLoadKey"/>
    <variant name=".KeyManagement.WrapECCKey"
        summary="KeyManagement::WrapECCKey"/>
    <variant name=".KeyManagement.WrapRSAKey"
        summary="KeyManagement::WrapRSAKey"/>
    <variant name=".PinWeaverManager" summary="PinWeaverManager"/>
    <variant name=".PinWeaverManager.BlockGeneratePk"
        summary="PinWeaverManager::BlockGeneratePk"/>
    <variant name=".PinWeaverManager.CheckCredential"
        summary="PinWeaverManager::CheckCredential"/>
    <variant name=".PinWeaverManager.GeneratePk"
        summary="PinWeaverManager::GeneratePk"/>
    <variant name=".PinWeaverManager.GetDelayInSeconds"
        summary="PinWeaverManager::GetDelayInSeconds"/>
    <variant name=".PinWeaverManager.GetDelaySchedule"
        summary="PinWeaverManager::GetDelaySchedule"/>
    <variant name=".PinWeaverManager.GetExpirationInSeconds"
        summary="PinWeaverManager::GetExpirationInSeconds"/>
    <variant name=".PinWeaverManager.GetVersion"
        summary="PinWeaverManager::GetVersion"/>
    <variant name=".PinWeaverManager.GetWrongAuthAttempts"
        summary="PinWeaverManager::GetWrongAuthAttempts"/>
    <variant name=".PinWeaverManager.HasAnyCredential"
        summary="PinWeaverManager::HasAnyCredential"/>
    <variant name=".PinWeaverManager.Initialize"
        summary="PinWeaverManager::Initialize"/>
    <variant name=".PinWeaverManager.InsertCredential"
        summary="PinWeaverManager::InsertCredential"/>
    <variant name=".PinWeaverManager.InsertRateLimiter"
        summary="PinWeaverManager::InsertRateLimiter"/>
    <variant name=".PinWeaverManager.IsEnabled"
        summary="PinWeaverManager::IsEnabled"/>
    <variant name=".PinWeaverManager.RemoveCredential"
        summary="PinWeaverManager::RemoveCredential"/>
    <variant name=".PinWeaverManager.ResetCredential"
        summary="PinWeaverManager::ResetCredential"/>
    <variant name=".PinWeaverManager.StartBiometricsAuth"
        summary="PinWeaverManager::StartBiometricsAuth"/>
    <variant name=".PinWeaverManager.StateIsReady"
        summary="PinWeaverManager::StateIsReady"/>
    <variant name=".PinWeaverManager.SyncHashTree"
        summary="PinWeaverManager::SyncHashTree"/>
    <variant name=".Random" summary="Random"/>
    <variant name=".Random.RandomBlob" summary="Random::RandomBlob"/>
    <variant name=".Random.RandomSecureBlob"
        summary="Random::RandomSecureBlob"/>
    <variant name=".RecoveryCrypto" summary="RecoveryCrypto"/>
    <variant name=".RecoveryCrypto.EncryptEccPrivateKey"
        summary="RecoveryCrypto::EncryptEccPrivateKey"/>
    <variant name=".RecoveryCrypto.GenerateDiffieHellmanSharedSecret"
        summary="RecoveryCrypto::GenerateDiffieHellmanSharedSecret"/>
    <variant name=".RecoveryCrypto.GenerateKeyAuthValue"
        summary="RecoveryCrypto::GenerateKeyAuthValue"/>
    <variant name=".RecoveryCrypto.GenerateRsaKeyPair"
        summary="RecoveryCrypto::GenerateRsaKeyPair"/>
    <variant name=".RecoveryCrypto.SignRequestPayload"
        summary="RecoveryCrypto::SignRequestPayload"/>
    <variant name=".RoData" summary="RoData"/>
    <variant name=".RoData.Certify" summary="RoData::Certify"/>
    <variant name=".RoData.IsReady" summary="RoData::IsReady"/>
    <variant name=".RoData.Read" summary="RoData::Read"/>
    <variant name=".Sealing" summary="Sealing"/>
    <variant name=".Sealing.IsSupported" summary="Sealing::IsSupported"/>
    <variant name=".Sealing.PreloadSealedData"
        summary="Sealing::PreloadSealedData"/>
    <variant name=".Sealing.Seal" summary="Sealing::Seal"/>
    <variant name=".Sealing.Unseal" summary="Sealing::Unseal"/>
    <variant name=".SessionManagement" summary="SessionManagement"/>
    <variant name=".SessionManagement.FlushInvalidSessions"
        summary="SessionManagement::FlushInvalidSessions"/>
    <variant name=".SignatureSealing" summary="SignatureSealing"/>
    <variant name=".SignatureSealing.Challenge"
        summary="SignatureSealing::Challenge"/>
    <variant name=".SignatureSealing.Seal" summary="SignatureSealing::Seal"/>
    <variant name=".SignatureSealing.Unseal"
        summary="SignatureSealing::Unseal"/>
    <variant name=".Signing" summary="Signing"/>
    <variant name=".Signing.RawSign" summary="Signing::RawSign"/>
    <variant name=".Signing.Sign" summary="Signing::Sign"/>
    <variant name=".Signing.Verify" summary="Signing::Verify"/>
    <variant name=".State" summary="State"/>
    <variant name=".State.IsEnabled" summary="State::IsEnabled"/>
    <variant name=".State.IsReady" summary="State::IsReady"/>
    <variant name=".State.Prepare" summary="State::Prepare"/>
    <variant name=".State.WaitUntilReady" summary="State::WaitUntilReady"/>
    <variant name=".Storage" summary="Storage"/>
    <variant name=".Storage.Destroy" summary="Storage::Destroy"/>
    <variant name=".Storage.IsReady" summary="Storage::IsReady"/>
    <variant name=".Storage.IsWriteLocked" summary="Storage::IsWriteLocked"/>
    <variant name=".Storage.Load" summary="Storage::Load"/>
    <variant name=".Storage.Lock" summary="Storage::Lock"/>
    <variant name=".Storage.Prepare" summary="Storage::Prepare"/>
    <variant name=".Storage.Store" summary="Storage::Store"/>
    <variant name=".U2f" summary="U2f"/>
    <variant name=".U2f.Check" summary="U2f::Check"/>
    <variant name=".U2f.CheckUserPresenceOnly"
        summary="U2f::CheckUserPresenceOnly"/>
    <variant name=".U2f.CorpAttest" summary="U2f::CorpAttest"/>
    <variant name=".U2f.G2fAttest" summary="U2f::G2fAttest"/>
    <variant name=".U2f.Generate" summary="U2f::Generate"/>
    <variant name=".U2f.GenerateUserPresenceOnly"
        summary="U2f::GenerateUserPresenceOnly"/>
    <variant name=".U2f.GetG2fAttestData" summary="U2f::GetG2fAttestData"/>
    <variant name=".U2f.Sign" summary="U2f::Sign"/>
    <variant name=".U2f.SignUserPresenceOnly"
        summary="U2f::SignUserPresenceOnly"/>
    <variant name=".Vendor" summary="Vendor"/>
    <variant name=".Vendor.DeclareTpmFirmwareStable"
        summary="Vendor::DeclareTpmFirmwareStable"/>
    <variant name=".Vendor.GetFamily" summary="Vendor::GetFamily"/>
    <variant name=".Vendor.GetFingerprint" summary="Vendor::GetFingerprint"/>
    <variant name=".Vendor.GetFirmwareVersion"
        summary="Vendor::GetFirmwareVersion"/>
    <variant name=".Vendor.GetIFXFieldUpgradeInfo"
        summary="Vendor::GetIFXFieldUpgradeInfo"/>
    <variant name=".Vendor.GetManufacturer" summary="Vendor::GetManufacturer"/>
    <variant name=".Vendor.GetRsuDeviceId" summary="Vendor::GetRsuDeviceId"/>
    <variant name=".Vendor.GetRwVersion" summary="Vendor::GetRwVersion"/>
    <variant name=".Vendor.GetSpecLevel" summary="Vendor::GetSpecLevel"/>
    <variant name=".Vendor.GetTpmModel" summary="Vendor::GetTpmModel"/>
    <variant name=".Vendor.GetVendorSpecific"
        summary="Vendor::GetVendorSpecific"/>
    <variant name=".Vendor.IsSrkRocaVulnerable"
        summary="Vendor::IsSrkRocaVulnerable"/>
    <variant name=".Vendor.SendRawCommand" summary="Vendor::SendRawCommand"/>
    <variant name=".VersionAttestation" summary="VersionAttestation"/>
    <variant name=".VersionAttestation.AttestVersion"
        summary="VersionAttestation::AttestVersion"/>
  </token>
</histogram>

<histogram name="Platform.MantisService.ImageGenerationType"
    enum="MantisServiceImageGenerationType" expires_after="2027-05-31">
  <owner>njrafi@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The types of image generated by Mantis. This is recorded when the model
    succesfully generated an image. Even if the image failed Trust and safety
    check, it is still considered in the count.
  </summary>
</histogram>

<histogram name="Platform.MantisService.Latency.{OperationType}" units="ms"
    expires_after="2027-05-24">
  <owner>fairuzi@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Milliseconds taken by a {OperationType} request to the Mantis service. It is
    recorded when any request to Mantis service completes with successful return
    status.
  </summary>
  <token key="OperationType">
    <variant name="ClassifyImageSafety"/>
    <variant name="GenerativeFill"/>
    <variant name="Inpainting"/>
    <variant name="LoadModel"/>
    <variant name="Outpainting"/>
    <variant name="Segmentation"/>
  </token>
</histogram>

<histogram name="Platform.MantisService.ModelLoaded" enum="BooleanLoaded"
    expires_after="2027-05-24">
  <owner>fairuzi@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether the model is already loaded (i.e. processor is already initialized).
    This is recorded when mantis service is receiving a processor initialization
    request and reaches the step that it needs to check whether the processor is
    already initialized.
  </summary>
</histogram>

<histogram name="Platform.Meminfo{PlatformMeminfoSize}" units="KB"
    expires_after="2027-02-07">
  <owner>hajimehoshi@chromium.org</owner>
  <owner>kouhei@chromium.org</owner>
  <owner>sonnyrao@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Various memory usage amount on Chrome OS devices (snapshotted every 30s).
    {PlatformMeminfoSize}
  </summary>
  <token key="PlatformMeminfoSize">
    <variant name=""/>
    <variant name="FileTotal"
        summary="Size of file memory (active + inactive)."/>
    <variant name="MemFreeDerived"
        summary="Size derived from free+buffers+cached."/>
    <variant name="MemTotal" summary="Size of total installed memory."/>
    <variant name="MemUsedDerived"
        summary="Size of &quot;Total - FreeDerived&quot; memory."/>
    <variant name="ProcessDataTotal"
        summary="Size of process data (active + inactive + swap)."/>
    <variant name="Shmem" summary="Size of shared memory."/>
    <variant name="Slab" summary="Size of slab memory."/>
    <variant name="SwapUsed" summary="Size of used swap memory."/>
    <variant name="Unevictable" summary="Size of unevictable memory."/>
  </token>
</histogram>

<histogram name="Platform.Memory.ARC{ProcessMemoryType}" units="MiB"
    expires_after="2027-01-31">
  <owner>bgeffon@chromium.org</owner>
  <owner>khmel@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Memory usage of all ARC and ARCVM processes in Chrome OS, reported every 10
    minutes. {ProcessMemoryType}
  </summary>
  <token key="ProcessMemoryType" variants="ProcessMemoryType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Platform.Memory.Browser{ProcessMemoryType}" units="MiB"
    expires_after="2027-02-07">
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Memory usage of browser and helper processes (excluding GPU process and
    renderers) in Chrome OS, reported every 10 minutes. {ProcessMemoryType}
  </summary>
  <token key="ProcessMemoryType" variants="ProcessMemoryType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Platform.Memory.Daemons{ProcessMemoryType}" units="MiB"
    expires_after="2027-02-14">
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Memory usage of user-level daemons in Chrome OS, reported every 10 minutes.
    {ProcessMemoryType}
  </summary>
  <token key="ProcessMemoryType" variants="ProcessMemoryType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Platform.Memory.Gpu{ProcessMemoryType}" units="MiB"
    expires_after="2027-02-07">
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Memory usage of the GPU process in Chrome OS, reported every 10 minutes.
    {ProcessMemoryType}
  </summary>
  <token key="ProcessMemoryType" variants="ProcessMemoryType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Platform.Memory.PsiPolicyError"
    enum="Platform.Memory.PsiPolicyError" expires_after="2024-10-10">
  <owner>kawasin@google.com</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    The error types from psi memory policy feature. This is recorded each time
    the psi memory handler detects an error. PsiPolicy is not expected to fail.
    Even if it fails continuously, it reports the error at most once per 1
    second. If any error is detected, psi policy feature should be turned off by
    the finch flag.
  </summary>
</histogram>

<histogram name="Platform.Memory.ReclaimReason"
    enum="Platform.Memory.ReclaimReason" expires_after="2024-10-10">
  <owner>kawasin@google.com</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    The reason of reclaiming memory on memory pressure. This is recorded when
    resourced detects memory pressure and decides to reclaim memory by
    discarding tabs or killing processes in VMs. This is reported at most once
    per 1 second.
  </summary>
</histogram>

<histogram name="Platform.Memory.Renderers{ProcessMemoryType}" units="MiB"
    expires_after="2027-02-07">
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Memory usage of renderer processes in Chrome OS, reported every 10 minutes.
    {ProcessMemoryType}
  </summary>
  <token key="ProcessMemoryType" variants="ProcessMemoryType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Platform.Memory.VMs{ProcessMemoryType}" units="MiB"
    expires_after="2026-08-10">
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Memory usage of VMs (crostini and others, except for ARCVM) in Chrome OS,
    reported every 10 minutes. {ProcessMemoryType}
  </summary>
  <token key="ProcessMemoryType" variants="ProcessMemoryType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Platform.Mem{PlatformMeminfoPercentage}" units="%"
    expires_after="2022-07-02">
  <owner>hajimehoshi@chromium.org</owner>
  <owner>kouhei@chromium.org</owner>
  <owner>sonnyrao@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Various memory usage % of total memory on Chrome OS devices (snapshotted
    every 30s). Warning: this histogram was expired from 2021-07-02 to 2022-01;
    data may be missing. {PlatformMeminfoPercentage}
  </summary>
  <token key="PlatformMeminfoPercentage">
    <variant name=""/>
    <variant name="infoActive" summary="Active memory."/>
    <variant name="infoActiveAnon"
        summary="Active anonymous memory (data segments)."/>
    <variant name="infoActiveFile"
        summary="Active file-backed memory (executables, ...)."/>
    <variant name="infoAnonPages"
        summary="Anonymous memory (executables, ...)."/>
    <variant name="infoBuffers" summary="Buffer cache (executables, ...)."/>
    <variant name="infoCached"
        summary="size of file-backed memory minus swap and buffer cache."/>
    <variant name="infoInactive" summary="Inactive memory."/>
    <variant name="infoInactiveAnon"
        summary="Inactive anonymous memory (data segments)."/>
    <variant name="infoInactiveFile" summary="Inactive file-backed memory."/>
    <variant name="infoMapped" summary="Mapped memory."/>
    <variant name="infoMemFree"
        summary="Free memory. Logged from ChromeOS; previously logged from
                 Chromecast from M53 through M97."/>
    <variant name="infoSwapUsedPercent" summary="Used swap memory."/>
  </token>
</histogram>

<histogram name="Platform.MicrocodeVersion" enum="MicrocodeVersion"
    expires_after="2026-12-31">
  <owner>hikalium@chromium.org</owner>
  <owner>chromeos-kernel-stability@google.com</owner>
  <summary>
    The microcode version for the CPU 0 at program start time. If this
    information is not available on the system (including on errors), the value
    logged will be -1 (0xffffffff).
  </summary>
</histogram>

<histogram name="Platform.MiniDiag.Launch" units="launches"
    expires_after="2025-06-03">
  <owner>roccochen@chromium.org</owner>
  <owner>chromeos-minidiag-eng@google.com</owner>
  <summary>
    Total number of launches of the MiniDiag (pre-boot diagnostic tool) since
    the last upload. This metrics is recorded right after booting into ChromeOS.
    This metrics leverages a coreboot command, elogtool, to retrieve the event
    log and count launch events.
  </summary>
</histogram>

<histogram name="Platform.MiniDiag.OpenDuration" units="seconds"
    expires_after="2025-06-03">
  <owner>roccochen@chromium.org</owner>
  <owner>chromeos-minidiag-eng@google.com</owner>
  <summary>
    Records the duration that the MiniDiag (pre-boot diagnostic tool) is open.
    This metrics is recorded right after booting into ChromeOS. This metrics
    leverages a coreboot command, elogtool, to retrieve the event log and count
    launch events.
  </summary>
</histogram>

<histogram name="Platform.MiniDiag.{TestType}.OpenDuration" units="seconds"
    expires_after="2025-06-03">
  <owner>roccochen@chromium.org</owner>
  <owner>chromeos-minidiag-eng@google.com</owner>
  <summary>
    Test item-specific duration of the MiniDiag (pre-boot diagnostic tool) since
    the last upload. This metrics is recorded right after booting into ChromeOS.
    This metrics leverages a coreboot command, elogtool, to retrieve the event
    log and count launch events. The TestType is the same as
    cros_diagnostics_diag_types listed in coreboot/util/cbfstool/eventlog.c
    since all the data are parsed from them.
  </summary>
  <token key="TestType">
    <variant name="MemoryCheckFull"/>
    <variant name="MemoryCheckQuick"/>
    <variant name="StorageHealthInfo"/>
    <variant name="StorageSelfTestExtended"/>
    <variant name="StorageSelfTestShort"/>
  </token>
</histogram>

<histogram name="Platform.MiniDiag.{TestType}.Result" enum="MiniDiagResultType"
    expires_after="2024-11-03">
  <owner>roccochen@chromium.org</owner>
  <owner>chromeos-minidiag-eng@google.com</owner>
  <summary>
    Test item-specific results of the MiniDiag (pre-boot diagnostic tool) since
    the last upload. This metrics is recorded right after booting into ChromeOS.
    This metrics leverages a coreboot command, elogtool, to retrieve the event
    log and count launch events. The TestType and MiniDiagResultType are the
    same as cros_diagnostics_diag_types and cros_diagnostics_diag_results listed
    in coreboot/util/cbfstool/eventlog.c since all the data are parsed from
    them.
  </summary>
  <token key="TestType">
    <variant name="MemoryCheckFull"/>
    <variant name="MemoryCheckQuick"/>
    <variant name="StorageHealthInfo"/>
    <variant name="StorageSelfTestExtended"/>
    <variant name="StorageSelfTestShort"/>
  </token>
</histogram>

<histogram name="Platform.Missive.ClientEnqueueResult"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when missive clientlib calls ReportQueue::Enqueue to post an event
    to ERP. It counts occurrences of the call returning success or each possible
    error Status.
  </summary>
</histogram>

<histogram name="Platform.Missive.ConfigFileRecordBlocked"
    enum="EnterpriseCloudReportingDestination" expires_after="2025-01-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when missive blocks a record being processed and sent to the
    server. Recorded by the Missive daemon at the moment the record is received
    by `Storage::Write`. It counts occurrences of number of times it has been
    called per Destination.
  </summary>
</histogram>

<histogram name="Platform.Missive.CpuUsage" units="%"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    The percentage of CPU time that the Missive daemon has been using. The CPU
    usage is not expected to be high and any usage beyond 100% is considered to
    be in the overflow bucket. This is reported once every 10 minutes and only
    if the Missive daemon is running.
  </summary>
</histogram>

<histogram name="Platform.Missive.DataLossErrorReason"
    enum="DataLossErrorReason" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded once each time reporting::error::DATA_LOSS is returned in
    src/platform2/missive/. There is a 1:1 relationship between the UMA values
    and error messages used with reporting::error::DATA_LOSS so that we can
    understand exactly which parts of the code are failing.
  </summary>
</histogram>

<histogram name="Platform.Missive.DeleteEmptyMultigenerationQueueDirectories"
    enum="Boolean" expires_after="2026-02-22">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when the Missive daemon attempts to delete empty multigeneration
    queue directories on startup or when the periodic timer triggers. A value of
    True indicates that no errors occurred while attempting to delete
    directories and that zero or more directories were deleted. False indicates
    that at least one directory that should have been deleted was not deleted
    due to an error.
  </summary>
</histogram>

<histogram name="Platform.Missive.KeyDeliveryResult"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when missive recieves a response to its request for an encryption
    key from the server. Counts the success/failures of key requests.
  </summary>
</histogram>

<histogram name="Platform.Missive.MemoryUsage" units="0.1MiB"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    The amount of memory that the Missive daemon has been using. This is
    reported once every 10 minutes and only if the Missive daemon is running.
  </summary>
</histogram>

<histogram name="Platform.Missive.MigrationStatus"
    enum="MissiveMigrationStatus" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when Missive runs the storage directory migration function (called
    each time when Missive starts). It counts the status of the migration.
  </summary>
</histogram>

<histogram name="Platform.Missive.PermissionDeniedErrorReason"
    enum="MissivePermissionDeniedErrorReason" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded once each time reporting::error::PERMISSION_DENIED is returned in
    src/platform2/missive/. There is a 1:1 relationship between the UMA values
    and error messages used with reporting::error::PERMISSION_DENIED so that we
    can understand exactly which parts of the code are failing.
  </summary>
</histogram>

<histogram name="Platform.Missive.ResourceExhaustedCase"
    enum="ResourceExhaustedCase" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Counter of each case RESOURCE_EXHAUSTED error was returned by missive
    Storage to the caller. This is reported only when such error happens
    (rarely), and only if the Missive daemon is running.
  </summary>
</histogram>

<histogram name="Platform.Missive.StartStatus"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded status of every instance missive starts (usually once per device
    boot).
  </summary>
</histogram>

<histogram name="Platform.Missive.StorageDegradationAmount" units="KiB"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Total amount of space freed by controlled degradation performed by Storage.
  </summary>
</histogram>

<histogram name="Platform.Missive.StorageUsage" units="MiB"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    The amount of disk storage that the Missive daemon has been using for
    storing encrypted records. This is reported once every hour and only if the
    Missive daemon is running.
  </summary>
</histogram>

<histogram name="Platform.Missive.StorageUsageNonUploading" units="MiB"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    The amount of disk storage that the Missive daemon has been using for
    storing encrypted records on devices that have not uploaded any data for the
    last 24 hours (could have updated the encryption key). This is reported once
    every hour and only if the Missive daemon is running.
  </summary>
</histogram>

<histogram name="Platform.Missive.UnavailableErrorReason"
    enum="UnavailableErrorReason" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded once each time reporting::error::UNAVAILABLE is returned in
    src/platform2/missive/. There is a 1:1 relationship between the UMA values
    and error messages used with reporting::error::UNAVAILABLE so that we can
    understand exactly which parts of the code are failing.
  </summary>
</histogram>

<histogram name="Platform.Missive.UnusualEnqueueTimestamp" enum="Boolean"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Would only be true. Recorded whenever an unusual timestamp is encountered
    when enqueuing a record, which will be rejected.
  </summary>
</histogram>

<histogram name="Platform.Modemfwd.CheckForWedgedModemResult"
    enum="ModemfwdCheckForWedgedModemResult" expires_after="2027-04-05">
  <owner>andrewlassalle@google.com</owner>
  <owner>cros-device-enablement@google.com</owner>
  <summary>
    Result of the |CheckForWedgedModem| function. The function checks the modem
    state after modemfwd starts, and tries to recover the modem if the modem is
    non responsive. This function is only called once after boot, so a single
    value is emitted per boot. Warning: this histogram was expired from
    2025-07-06 to 2027-04-05; data may be missing.
  </summary>
</histogram>

<histogram name="Platform.Modemfwd.DlcInstallResult"
    enum="ModemfwdDlcInstallResult" expires_after="2027-04-05">
  <owner>andrewlassalle@google.com</owner>
  <owner>ujjwalpande@google.com</owner>
  <summary>
    Result of the DLC install action performed by modemfwd. Some device variants
    use a DLC to store their FW. When this DLC is installed, a metric is logged.
  </summary>
</histogram>

<histogram name="Platform.Modemfwd.DlcUninstallResult"
    enum="ModemfwdDlcUninstallResult" expires_after="2027-04-05">
  <owner>andrewlassalle@google.com</owner>
  <owner>ujjwalpande@google.com</owner>
  <summary>
    Result of each DLC uninstall action performed by modemfwd. Modemfwd will
    remove any modem DLCs that are not for the device's variant. Each uninstall
    will log a metric.
  </summary>
</histogram>

<histogram name="Platform.Modemfwd.FWInstallResult"
    enum="ModemfwdFWInstallResult" expires_after="2027-04-05">
  <owner>andrewlassalle@google.com</owner>
  <owner>cros-device-enablement@google.com</owner>
  <summary>The result of each modem FW install attempt.</summary>
</histogram>

<histogram name="Platform.Modemfwd.FWInstallTime" units="seconds"
    expires_after="2027-04-05">
  <owner>ujjwalpande@google.com</owner>
  <owner>cros-device-enablement@google.com</owner>
  <summary>
    Metric to track time taken by modemfwd helpers in seconds to flash the
    firmwares to modem. Values will be reported only for successful flashing
    cases as flashing times in case of failures could be misleading. Warning:
    this histogram was expired from 2023-06-17 to 2024-09-17, data may be
    missing.
  </summary>
</histogram>

<histogram name="Platform.Modemfwd.FWUpdateLocation"
    enum="ModemfwdFWUpdateLocation" expires_after="2027-04-05">
  <owner>andrewlassalle@google.com</owner>
  <owner>cros-device-enablement@google.com</owner>
  <summary>
    The location that modemfwd uses for the FW install. After modemfwd
    determines if a DLC will be used or not, a metric is logged with the
    location used.
  </summary>
</histogram>

<histogram name="Platform.Modemfwd.ModemRecoveryState"
    enum="ModemfwdModemRecoveryState" expires_after="2027-04-05">
  <owner>ujjwalpande@google.com</owner>
  <owner>cros-device-enablement@google.com</owner>
  <summary>Report state of modem recovery operation.</summary>
</histogram>

<histogram name="Platform.MountEncrypted.EncryptionKeyStatus"
    enum="MountEncryptedEncryptionKeyStatus" expires_after="2027-02-21">
  <owner>apronin@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    File system encryption key status for the encrypted stateful file system on
    Chrome OS. The encryption key is the one that is used by the kernel to
    protect actual file contents on disk.
  </summary>
</histogram>

<histogram name="Platform.MountEncrypted.SystemKeyStatus"
    enum="MountEncryptedSystemKeyStatus" expires_after="2027-02-21">
  <owner>apronin@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    Type/Origin of the system key used for the encrypted stateful file system on
    Chrome OS. This key is used to wrap the actual file system encryption key.
  </summary>
</histogram>

<histogram name="Platform.Odml.CpuUsageMilliPercent" units="1/1000ths of %"
    expires_after="2026-10-04">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Fraction of total CPU resources used by ChromeOS ODML Service, sampled every
    5 minutes.
  </summary>
</histogram>

<histogram name="Platform.Odml.PeakTotalMallocMemoryKb" units="KB"
    expires_after="2026-10-04">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Peak total malloc memory used by ChromeOS ODML Service over the last one
    hour. Sampled every 5 minutes, so may miss short-lived spikes.
  </summary>
</histogram>

<histogram name="Platform.Odml.PeakTotalRssMemoryKb" units="KB"
    expires_after="2026-10-04">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Peak total resident set size memory used by ChromeOS ODML Service over the
    last one hour. Sampled every 5 minutes, so may miss short-lived spikes.
  </summary>
</histogram>

<histogram name="Platform.Odml.PeakTotalSwapMemoryKb" units="KB"
    expires_after="2026-10-04">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Peak total swap memory used by ChromeOS ODML Service over the last one hour.
    Sampled every 5 minutes, so may miss short-lived spikes.
  </summary>
</histogram>

<histogram name="Platform.Odml.TotalMallocMemoryKb" units="KB"
    expires_after="2026-10-04">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Total malloc memory used by ChromeOS ODML Service, sampled every 5 minutes.
  </summary>
</histogram>

<histogram name="Platform.Odml.TotalRssMemoryKb" units="KB"
    expires_after="2027-02-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Total resident set size memory used by ChromeOS ODML Service, sampled every
    5 minutes.
  </summary>
</histogram>

<histogram name="Platform.Odml.TotalSwapMemoryKb" units="KB"
    expires_after="2026-10-04">
  <owner>hcyang@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Total swap memory used by ChromeOS ODML Service, sampled every 5 minutes.
  </summary>
</histogram>

<histogram name="Platform.ReadSectorsLong" units="sectors per second"
    expires_after="2026-12-01">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Number of disk sectors per second read by Chrome OS in a long interval
    (currently 30s)
  </summary>
</histogram>

<histogram name="Platform.ReadSectorsShort" units="sectors per second"
    expires_after="2026-12-01">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Number of disk sectors per second read by Chrome OS in a short interval
    (currently 1s, sampled every 30s)
  </summary>
</histogram>

<histogram name="Platform.Resourced.MemoryNotificationCountTenMinutes"
    units="count" expires_after="2025-03-02">
  <owner>vovoy@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Memory notification count in 10 minutes, reported every 10 minutes.
  </summary>
</histogram>

<histogram name="Platform.Resourced.VmmsReclaimMemoryDuration.{PressureLevel}"
    units="ms" expires_after="2025-03-23">
  <owner>vovoy@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Milliseconds taken by a request to VM Memory Management Service to reclaim
    memory from VMs. This is recorded by resourced every time it makes a reclaim
    request to the VM Memory Management Service to try to resolve memory
    pressure in the host.
  </summary>
  <token key="PressureLevel" variants="ChromePressureLevel"/>
</histogram>

<histogram name="Platform.RksAgent.CertificateFetchResult"
    enum="CertificateFetchResult" expires_after="2024-12-31">
  <owner>hcyang@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The result of fetching the recoverable key store certificate files from a
    gstatic URL. This recorded after each fetch attempt, which is scheduled
    periodically (once per day, retries every 10 minutes if fails).
  </summary>
</histogram>

<histogram name="Platform.SafetyService.ClassifySafetyLatency.{Ruleset}"
    units="ms" expires_after="2027-01-03">
  <owner>chensa@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Round-trip latency (milliseconds) for safety filtering using ruleset
    {Ruleset}. Measures the time from request initiation to final safety verdict
    from Hades. Includes platform-chrome-arcvm mojo communication,
    ArcSafetyService (mojo-proxy) to Hades, and Hades inference. This is
    recorded when SafetyServiceManager gets classify safety request, but only
    for successful round trips with explicit pass/blocked verdicts.
  </summary>
  <token key="Ruleset">
    <variant name="Coral"/>
    <variant name="Generic"/>
    <variant name="Mantis"/>
    <variant name="MantisGeneratedRegion"/>
    <variant name="MantisGeneratedRegionOutpainting"/>
    <variant name="MantisInputImage"/>
    <variant name="MantisOutputImage"/>
  </token>
</histogram>

<histogram name="Platform.SafetyService.ClassifySafetyResult.{Ruleset}"
    enum="SafetyServiceVerdict" expires_after="2027-01-03">
  <owner>chensa@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    The safety verdict for ruleset {Ruleset}. This is recorded when
    SafetyServiceManager gets classify safety request.
  </summary>
  <token key="Ruleset">
    <variant name="Coral"/>
    <variant name="Generic"/>
    <variant name="Mantis"/>
    <variant name="MantisGeneratedRegion"/>
    <variant name="MantisGeneratedRegionOutpainting"/>
    <variant name="MantisInputImage"/>
    <variant name="MantisOutputImage"/>
  </token>
</histogram>

<histogram name="Platform.SafetyService.Error.GetCloudSafetySession"
    enum="SafetyServiceGetCloudSessionResult" expires_after="2025-11-19">
  <owner>chensa@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether is succeed or failed to get an cloud session from CrosSafetyService
    (in chrome). Captured during SafetyServiceManager initialization, prior to
    safety classification requests.
  </summary>
</histogram>

<histogram name="Platform.SafetyService.Error.GetOnDeviceSafetySession"
    enum="SafetyServiceGetOnDeviceSessionResult" expires_after="2026-07-26">
  <owner>chensa@google.com</owner>
  <owner>cros-odml-foundations-eng@google.com</owner>
  <summary>
    Whether is succeed or failed to get an on-device session from
    CrosSafetyService (in chrome). Captured during SafetyServiceManager
    initialization, prior to safety classification requests.
  </summary>
</histogram>

<histogram name="Platform.SATA.AvailableReservedSpace" units="%"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    The remaining reserved space (SMART 232). The value counts down typically
    from 100 to 0, sent at boot.
  </summary>
</histogram>

<histogram name="Platform.SATA.LogicalSectorsRead" units="512-byte sectors"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    The total number of 512-byte sectors written during the lifetime of the
    device, sent at boot.
  </summary>
</histogram>

<histogram name="Platform.SATA.LogicalSectorsWritten" units="512-byte sectors"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    The total number of 512-byte sectors written during the lifetime of the
    device, sent at boot.
  </summary>
</histogram>

<histogram name="Platform.SATA.PercentageUsed" units="%"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Percentage Used Endurance Indicator. A value of 0 indicates a new device, a
    value of 100 indicates the device is at the end of its lifespan as projected
    by the manufacturer. Values greater than 100 indicate the device is beyond
    the projected lifespan. Maximum value is 255, sent at boot.
  </summary>
</histogram>

<histogram name="Platform.Segmentation.FeatureLevel" units="level number"
    expires_after="2025-10-26">
  <owner>gwendal@chromium.org</owner>
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Records the feature level of the device. Recorded in every UMA upload.

    See libsegmentation in platform2 for context.
  </summary>
</histogram>

<histogram name="Platform.Segmentation.ScopeLevel"
    enum="FeatureManagementScopeLevel" expires_after="2027-02-16">
  <owner>gwendal@chromium.org</owner>
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Records the scope level of the device (Soft vs Hard Branded). Recorded in
    every UMA upload.

    See libsegmentation in platform2 for context.
  </summary>
</histogram>

<histogram name="Platform.SmartTransferErrors" units="units"
    expires_after="2026-12-01">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>Disk communication errors (SMART 199), sent at boot.</summary>
</histogram>

<histogram name="Platform.SmartUncorrectableErrors" units="units"
    expires_after="2026-12-01">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>Uncorrectable disk errors (SMART 187), sent at boot.</summary>
</histogram>

<histogram name="Platform.StatefulFormat" enum="StatefulFormat"
    expires_after="2026-12-01">
  <owner>sarthakkukreti@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>Chrome OS stateful partition format. Sampled once per boot.</summary>
</histogram>

<histogram name="Platform.StatefulFreeSpace" units="MB"
    expires_after="2027-02-07">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Chrome OS stateful partition space free. Sampled once daily.
  </summary>
</histogram>

<histogram name="Platform.StatefulLifetimeWrites" units="GiB"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Chrome OS stateful partition lifetime writes. Sampled once daily.
  </summary>
</histogram>

<histogram name="Platform.StatefulTrim.TimeBetweenTrim" units="hours"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    The amount of time in hours since the last trim when chromeos-trim triggers
    a trim for the stateful partition. The chromeos-trim script is run daily,
    but a trim is only triggered if the previous run was interrupted, the amount
    of writes since the last trim is greater than X% of the remaining space in
    stateful or we have not trimmed in 7 days. Reported at most once a day.
    Warning: this histogram was expired from 2022-10-21 to 2023-08-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Platform.StatefulTrim.TrimmedAmount" units="MiB"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    The amount of data in the stateful partition that is erased when
    chromeos-trim triggers a trim. The chromeos-trim script is run daily, but a
    trim is only triggered if the previous run was interrupted, the amount of
    writes since the last trim is greater than X% of the remaining space in
    stateful or we have not trimmed in 7 days. Reported at most once a day.
    Warning: this histogram was expired from 2022-10-21 to 2023-08-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Platform.StatefulUsage" units="%" expires_after="2027-02-07">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Chrome OS stateful partition usage level. Warning: this histogram was
    expired from 2024-03-17 to 2024-08-01; data may be missing.
  </summary>
</histogram>

<histogram name="Platform.StatefulUsedSpace" units="GB"
    expires_after="2027-02-07">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Chrome OS stateful partition space used. Sampled once daily.
  </summary>
</histogram>

<histogram name="Platform.StatefulWritesDaily" units="KiB"
    expires_after="2027-02-07">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Chrome OS stateful partition KiB writes per day. Sampled once daily.
  </summary>
</histogram>

<histogram name="Platform.Storage.Mmc.Internal.{Error}" units="errors"
    expires_after="2026-12-01">
  <owner>korneld@chromium.org</owner>
  <owner>chromeos-devices-team@google.com</owner>
  <summary>
    MMC error counters for the MMC that controls the rootfs drive. Only reported
    on machines that use an MMC controller for rootfs. The counters represent
    the number of errors per wall-clock hour.
  </summary>
  <token key="Error">
    <variant name="CmdCRC"/>
    <variant name="CmdTimeout"/>
    <variant name="DataCRC"/>
    <variant name="DataTimeout"/>
  </token>
</histogram>

<histogram name="Platform.Storage.Nvme.PercentageUsed" units="%"
    expires_after="2027-02-07">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Vendor specific estimate of the percentage of NVM subsystem life used based
    on the actual usage and the manufacturer's prediction of NVM life. A value
    of 100 indicates the estimated endurance has been consumed, but may not
    indicate a failure. Values can exceed 100, with percentages greater than 254
    represented as 255.
  </summary>
</histogram>

<histogram name="Platform.Storage.Ufs.LifeUsed.{Type}" enum="EmmcLifeUsed"
    expires_after="2027-02-07">
  <owner>asavery@chromium.org</owner>
  <owner>gwendal@chromium.org</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    UFS Device life time estimation. This field provides an indication of the
    device life time based on the amount of performed program/erase cycles for
    memory {Type}. The calculation is vendor specific.
  </summary>
  <token key="Type">
    <variant name="TypeA"/>
    <variant name="TypeB"/>
  </token>
</histogram>

<histogram name="Platform.StorageCapabilities"
    enum="InternalStorageCapabilities" expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Sparse histogram of internal storage device capabilities. Sampled once per
    boot.
  </summary>
</histogram>

<histogram name="Platform.SwapInDaily" units="pages" expires_after="2027-02-07">
  <owner>asavery@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>Number of pages swapped IN over a day, sampled daily.</summary>
</histogram>

<histogram name="Platform.SwapOutDaily" units="pages"
    expires_after="2026-12-01">
  <owner>asavery@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Number of pages swapped OUT over a day, sampled daily. Warning: this
    histogram was expired from 2024-03-17 to 2024-08-01; data may be missing.
  </summary>
</histogram>

<histogram name="Platform.ThinpoolMigration.LvmMetadataTime" units="ms"
    expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Time taken to persist LVM metadata. Recorded once per migration attempt.
  </summary>
</histogram>

<histogram name="Platform.ThinpoolMigration.ResizeTime" units="ms"
    expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Time taken to resize the filesystem. Recorded once per migration attempt.
  </summary>
</histogram>

<histogram name="Platform.ThinpoolMigration.Result"
    enum="ThinpoolMigrationResult" expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Result of stateful migration to thinpool. Recorded once per migration
    attempt.
  </summary>
</histogram>

<histogram name="Platform.ThinpoolMigration.RevertTime" units="ms"
    expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Time taken to revert the migration. Recorded once per failed migration
    attempt.
  </summary>
</histogram>

<histogram name="Platform.ThinpoolMigration.ThinpoolMetadataTime" units="ms"
    expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Time taken to persist thinpool metadata. Recorded once per migration
    attempt.
  </summary>
</histogram>

<histogram name="Platform.ThinpoolMigration.TotalTime" units="ms"
    expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Time taken for a migration attempt. Recorded once per migration attempt.
  </summary>
</histogram>

<histogram name="Platform.ThinpoolMigration.TriesLeftAtCompletion"
    units="units" expires_after="2026-12-01">
  <owner>sarthakkukreti@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Number of migration attempts left at completion. Captures whether multiple
    attempts were required to complete migration. Recorded once after successful
    migration.
  </summary>
</histogram>

<histogram name="Platform.Ti50.ARVCount{CountType}" units="GSC resets"
    expires_after="2025-07-06">
  <owner>jettrink@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The count of potential GSC resets for AP RO Verification due to system
    event.
  </summary>
  <token key="CountType">
    <variant name="Combined"/>
    <variant name="ExternalWp"/>
    <variant name="InternalWp"/>
    <variant name="SettingsChange"/>
  </token>
</histogram>

<histogram name="Platform.TPM.ApRoVerificationTime" units="ms"
    expires_after="2027-02-07">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    Time in milliseconds AP RO verification took. Captured every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.AuthErrorCode" enum="TPMResultCodeEnum"
    expires_after="2027-02-21">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result code of a TPM authorized command issued through
    tcsd. Success is 0. For the other error codes, see
    /usr/include/tss/tpm_error.h.
  </summary>
</histogram>

<histogram name="Platform.TPM.AuthFailCommand.Auth2Fail"
    enum="TPM12CommandOrdinal" expires_after="2024-06-30">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Reporting the TPM command ordinal that results in TPM_E_AUTH2FAIL code. Note
    that this is only applicable for TPM1.2. Warning: this histogram was expired
    from Oct 8, 2022 to June 26, 2023; data may be missing.
  </summary>
</histogram>

<histogram name="Platform.TPM.AuthFailCommand.AuthFail"
    enum="TPM12CommandOrdinal" expires_after="2023-12-26">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Reporting the TPM command ordinal that results in TPM_E_AUTHFAIL code. Note
    that this is only applicable for TPM1.2. Warning: this histogram was expired
    from Oct 8, 2022 to June 26, 2023; data may be missing.
  </summary>
</histogram>

<histogram name="Platform.TPM.CryptoBusyCount" units="count"
    expires_after="2026-11-14">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@chromium.org</owner>
  <summary>
    Number of times the crypto engine returned busy. Captured every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.CryptoInitTime" units="ms"
    expires_after="2026-11-14">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@chromium.org</owner>
  <summary>
    Time in ms the crypto engine took to initialize. Captured every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.DictionaryAttackCounter" units="units"
    expires_after="2027-02-21">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the value of the TPM dictionary attack counter reported at
    boot and hourly while running. Any non-zero value is unexpected.
  </summary>
</histogram>

<histogram name="Platform.TPM.DictionaryAttackResetStatus"
    enum="CrosTPMDictionaryAttackResetStatusEnum" expires_after="2027-02-14">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the status of an hourly attempt to reset the TPM dictionary
    attack counter.
  </summary>
</histogram>

<histogram name="Platform.TPM.DispatcherBusyCount" units="count"
    expires_after="2026-11-14">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@chromium.org</owner>
  <summary>
    Number of times the dispatcher returned busy. Captured every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.ErrorCode" enum="TPMResultCodeEnum"
    expires_after="2027-02-21">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Each sample is the result code of a TPM command issued through tcsd. Success
    is 0. For the other error codes, see /usr/include/tss/tpm_error.h.
  </summary>
</histogram>

<histogram name="Platform.TPM.ExpandedApRoVerificationStatus"
    enum="ExpandedApRoVerificationStatus" expires_after="2025-07-13">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    AP RO Verification status and detailed result. Captured every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.FilesystemBusyCount" units="count"
    expires_after="2026-11-14">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@chromium.org</owner>
  <summary>
    Number of times the filesystem returned busy. Captured every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.FilesystemInitTime" units="ms"
    expires_after="2026-09-28">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    Time in milliseconds filesystem initialization and scanning took. Captured
    every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.FilesystemUtilization" units="bytes"
    expires_after="2026-09-28">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    Number of bytes used by the filesystem. Captured every cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.HardwareAlerts" enum="PlatformTPMHardwareAlerts"
    expires_after="2024-04-28">
  <owner>anatol@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    Trusted Platform Module hardware alerts that signal about the chip abnormal
    situation.
  </summary>
</histogram>

<histogram name="Platform.TPM.PowerWashResult" enum="TPMPowerWashResult"
    expires_after="2027-02-14">
  <owner>chenyian@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Report if TPM clear is success or not after a power wash. TPM should not be
    owned after the power wash.
  </summary>
</histogram>

<histogram name="Platform.TPM.TakeOwnershipResult"
    enum="TPMTakeOwnershipResult" expires_after="2025-03-30">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Report the TPM ownership can be take or not for each TPM initialization
    process. The process usually happen at the first boot of device.
  </summary>
</histogram>

<histogram name="Platform.TPM.TimeslicesExpired" units="count"
    expires_after="2026-11-14">
  <owner>granaghan@google.com</owner>
  <owner>cros-hwsec+uma@chromium.org</owner>
  <summary>
    Number of times a process on the TPM exceeded its timeslice. Captured every
    cold boot.
  </summary>
</histogram>

<histogram name="Platform.TPM.TimeToTakeOwnership" units="ms"
    expires_after="2027-01-31">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The amount of time for Chrome OS to take TPM ownership. Recorded when
    tpm_manager takes the ownership of TPM.
  </summary>
</histogram>

<histogram name="Platform.TPM.TpmManagerSecretStatus"
    enum="TpmManagerSecretStatus" expires_after="2027-01-31">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The status of the secrets that tpm manager holds.

    Warning: this histogram was expired from 2021-09-01 to 2022-06-14; data may
    be missing.
  </summary>
</histogram>

<histogram name="Platform.TPM.VersionFingerprint" enum="TPMVersionFingerprint"
    expires_after="2027-01-17">
  <owner>apronin@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    Indicates a fingerprint of hardware + firmware versions for the TPM chip
    present in a Chrome OS device.
  </summary>
</histogram>

<histogram name="Platform.TPM1.CommandAndResponse.{Client}"
    enum="TPM1CommandAndResponse" expires_after="2027-01-31">
  <owner>chingkang@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The TPM1 command and response code send from {Client} to trousers. The value
    is the encoding of 2 bytes command code and 2 bytes response code.
  </summary>
  <token key="Client">
    <variant name="Attestation"/>
    <variant name="BootLockBox"/>
    <variant name="Chaps"/>
    <variant name="Cryptohome"/>
    <variant name="DeviceManagement"/>
    <variant name="TpmManager"/>
    <variant name="TrunksSend"/>
    <variant name="U2f"/>
    <variant name="Unknown"/>
    <variant name="Vtpm"/>
  </token>
</histogram>

<histogram name="Platform.TPM2.CommandAndResponse.{Client}"
    enum="TPM2CommandAndResponse" expires_after="2027-01-31">
  <owner>chingkang@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The TPM2 command and response code send from {Client} to trunks. The value
    is the encoding of 2 bytes command code and 2 bytes response code.
  </summary>
  <token key="Client">
    <variant name="Attestation"/>
    <variant name="BootLockBox"/>
    <variant name="Chaps"/>
    <variant name="Cryptohome"/>
    <variant name="DeviceManagement"/>
    <variant name="TpmManager"/>
    <variant name="TrunksSend"/>
    <variant name="U2f"/>
    <variant name="Unknown"/>
    <variant name="Vtpm"/>
  </token>
</histogram>

<histogram name="Platform.Trunks.EventIrrelatedTime.Authenticate" units="ms"
    expires_after="2025-04-13">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The time we spend on the TPM that is not directly related to the user
    authenticate event. Recorded when user tries to authenticate the device.
  </summary>
</histogram>

<histogram name="Platform.Trunks.EventRelatedTime.Authenticate" units="ms"
    expires_after="2025-04-13">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The time we spend on the TPM that is directly related to the user
    authenticate event. Recorded when user tries to authenticate the device.
  </summary>
</histogram>

<histogram name="Platform.Trunks.EventTime.Authenticate" units="ms"
    expires_after="2025-04-13">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The total time for the user authenticate event. Recorded when user tries to
    authenticate the device.
  </summary>
</histogram>

<histogram name="Platform.Trunks.FirstTimeoutWritingCommand"
    enum="TPMCommandCode" expires_after="2027-02-14">
  <owner>chingkang@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>Command code of the first timeout writing TPM command</summary>
</histogram>

<histogram name="Platform.Trunks.FirstTimeoutWritingTime" units="seconds"
    expires_after="2024-12-24">
  <owner>chingkang@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>System uptime when first timeout writing TPM command occurs</summary>
</histogram>

<histogram name="Platform.Trunks.RecoverableWriteErrorNo" enum="PopularOSErrno"
    expires_after="2025-09-15">
  <owner>chingkang@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The write errno recovered after rebinding the TPM driver; recorded only once
    when trunks notices the write errno is gone after restart.
  </summary>
</histogram>

<histogram name="Platform.Trunks.TpmErrorCode" enum="TPMResponseCode"
    expires_after="2027-01-31">
  <owner>yich@google.com</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    Each sample is the result code of a TPM command issued through trunks. For
    the error codes, see src/platform2/trunks/tpm_generated.h.
  </summary>
</histogram>

<histogram name="Platform.Trunks.TransitionedWriteErrorNo"
    enum="PopularOSErrno" expires_after="2023-11-12">
  <owner>chingkang@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The write errno changed after rebinding the TPM driver; recorded only once
    when trunks notices the write errno has changed after restart.
  </summary>
</histogram>

<histogram name="Platform.Trunks.UnrecoverableWriteErrorNo"
    enum="PopularOSErrno" expires_after="2025-09-15">
  <owner>chingkang@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    The sticky write errno after rebinding the TPM driver; recorded only once
    when trunks notices the write errno isn't changed after restart.
  </summary>
</histogram>

<histogram name="Platform.U2F.Command" enum="Cr50U2FCommands"
    expires_after="2025-04-27">
  <owner>hcyang@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>Records occurrences of U2F commands sent to cr50.</summary>
</histogram>

<histogram name="Platform.U2F.FipsStatus" enum="U2FFipsStatus"
    expires_after="2025-05-04">
  <owner>hcyang@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Records the FIPS mode status (whether it is activated) for the Cr50 U2F
    implementation. This is recorded every time u2fd is started.
  </summary>
</histogram>

<histogram name="Platform.U2F.FipsStatus.{U2FMode}" enum="U2FFipsStatus"
    expires_after="2025-09-07">
  <owner>hcyang@google.com</owner>
  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
  <summary>
    Records the FIPS mode status (whether it is activated) for the Cr50 U2F
    implementation when the U2F mode specified by device policy is {U2FMode}.
    This is recorded every time u2fd is started.
  </summary>
  <token key="U2FMode">
    <variant name="Disabled"/>
    <variant name="U2f"/>
    <variant name="U2fExtended"/>
    <variant name="Unset"/>
  </token>
</histogram>

<histogram name="Platform.UnaggregatedUsageTime" units="seconds"
    expires_after="2027-02-07">
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Use time (device ON and not asleep) in a particular period (approximately
    every five minutes). To compute usage time in a given period (e.g. a day),
    sum up all reported values of this metric for that period (day). As with
    other UMA metrics on CrOS, this will be uploaded roughly every half-hour.
    This will eventually supercede Platform.DailyUseTime, which has significant
    limitations (e.g. it may not report on the right day).
  </summary>
</histogram>

<histogram name="Platform.UncleanShutdownsDaily" units="count per day"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>semenzato@chromium.org</owner>
  <owner>bsimonnet@chromium.org</owner>
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Count of unclean OS shutdowns during the previous day, or the most recent
    day the device was in use. Specifically, the counter is incremented during
    boot if the OS did not shut down cleanly and the previous shutdown was not
    due to a kernel crash (kernel crashes are counted elsewere) and the previous
    shutdown did not occur while the device was suspended (failures while
    suspended are assumed to be the battery running down). Reported at most once
    a day.
  </summary>
</histogram>

<histogram name="Platform.UserCrashesDaily" units="count per day"
    expires_after="never">
<!-- expires-never: Used to assess Chrome OS platform stability. -->

  <owner>semenzato@chromium.org</owner>
  <owner>bsimonnet@chromium.org</owner>
  <owner>iby@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Count of crashes (user) during the previous day, or the most recent day the
    device was in use. Reported at most once a day.
  </summary>
</histogram>

<histogram name="Platform.WiFiDeviceCount" units="wifi devices"
    expires_after="2026-12-31">
  <owner>kglund@google.com</owner>
  <owner>cros-network-metrics@google.com</owner>
  <summary>
    Sample collected 10s after boot, showing how many WiFi interfaces are
    present.
  </summary>
</histogram>

<histogram name="Platform.WiFiDisapppearedFromPCI" units="units"
    expires_after="2026-12-31">
  <owner>kglund@google.com</owner>
  <owner>cros-network-metrics@google.com</owner>
  <summary>
    Logged (with a constant value of 1) if a WiFi device experienced a PCI
    failure such that it is being removed from the system. Typically, Chrome OS
    will follow such a removal with an attempt to rescan the bus and recover
    device functionality. See also Platform.WiFiStatusAfterForcedPCIRescan for
    the result of such attempts.
  </summary>
</histogram>

<histogram name="Platform.WiFiStatusAfterForcedPCIRescan" enum="WiFiPCIStatus"
    expires_after="2026-12-31">
  <owner>kglund@google.com</owner>
  <owner>cros-network-metrics@google.com</owner>
  <summary>
    Shows the WiFi status after the PCI bus is rescanned to recover WiFi. The UI
    depends on shill noticing that wlan0 is back up, so the only happy case is
    one where shill recognizes wlan0 after the rescan completes.
  </summary>
</histogram>

<histogram name="Platform.WriteSectorsLong" units="sectors per second"
    expires_after="2026-12-01">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Number of disk sectors per second written by Chrome OS in a long interval
    (currently 30s)
  </summary>
</histogram>

<histogram name="Platform.WriteSectorsShort" units="sectors per second"
    expires_after="2026-12-01">
  <owner>gwendal@google.com</owner>
  <owner>chromeos-storage@google.com</owner>
  <summary>
    Number of disk sectors per second written by Chrome OS in a short interval
    (currently 1s, sampled every 30s)
  </summary>
</histogram>

<histogram name="Platform.ZramCompressedSize" units="MB"
    expires_after="2023-03-19">
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    Compressed swap size in megabytes. This is the actual amount of RAM used by
    the system to compress memory (i.e. after compression). Snapshot every 30s.
  </summary>
</histogram>

<histogram name="Platform.ZramCompressionRatioPercent" units="%"
    expires_after="2023-03-19">
  <owner>bgeffon@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <summary>
    The ratio of compressed memory (zram) before and after compression when the
    denominator at least 1 MB. Ratios of interest are between 1 and 6 (typically
    between 2 and 3), and we express them as a percentage (between 100% and
    600%). The size of memory before compression includes zero-filled pages.
    Values close to 100% indicate low compression effectiveness. Snapshot every
    30s.
  </summary>
</histogram>

<histogram name="Platform.{GSC}.ARVStatus" enum="GscArvStatus"
    expires_after="2025-05-11">
  <owner>vbendeb@chromium.org</owner>
  <owner>ti50-core+uma@chromium.org</owner>
  <summary>
    A histogram of values representing AP RO verification state on ChromeOS
    devices in the field. The values are collected on each ChromeOS start up and
    are clustered in two ranges: 0..7 and 20..34, both ranges could grow.

    Cr50 and Ti50 are two generations of GSC (Google Security Chip), their AP RO
    verification states are named such that it is clear which particular chip
    version they refer to.
  </summary>
  <token key="GSC">
    <variant name="Cr50"/>
    <variant name="Ti50"/>
  </token>
</histogram>

<histogram name="Platform.{GSC}.BoardIdFlags" enum="Cr50BoardIdFlags"
    expires_after="2027-01-31">
  <owner>apronin@chromium.org</owner>
  <owner>vbendeb@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    A sparse histogram of values of Board ID flags programmed in GSC devices in
    the field. Board ID flags is a 32 bit field, and while there only are a few
    expected values, conceivably any bit combination could be encountered.
  </summary>
  <token key="GSC">
    <variant name="Cr50"/>
    <variant name="Ti50"/>
  </token>
</histogram>

<histogram name="Platform.{GSC}.BoardIdOfRlzMismatch" enum="Cr50CrosRlzCodes"
    expires_after="2026-07-26">
  <owner>vbendeb@chromium.org</owner>
  <owner>apronin@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    A sparse histogram of values indexed by 4 byte Board ID code programmed in
    GSC reported by devices where there is a mismatch between the RLZ code and
    the Board ID value programmed in the GSC.
  </summary>
  <token key="GSC">
    <variant name="Cr50"/>
    <variant name="Ti50"/>
  </token>
</histogram>

<histogram name="Platform.{GSC}.FlashLog" enum="Cr50FlashLogs"
    expires_after="2027-02-14">
  <owner>apronin@chromium.org</owner>
  <owner>vbendeb@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    A histogram of flash log event types collected from the GSC device. Log
    event type is an 8 bit value. This histogram does not allow to drill into
    particular log entries' contents, but allows to collect a general statistics
    of events. A script running on the Chrome OS device polls the GSC for new
    flash log events after every start up.
  </summary>
  <token key="GSC">
    <variant name="Cr50"/>
    <variant name="Ti50"/>
  </token>
</histogram>

<histogram name="Platform.{GSC}.MatchingBoardId" enum="Cr50CrosRlzCodes"
    expires_after="2027-01-12">
  <owner>vbendeb@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    A sparse histogram of values indexed by 4 byte Board ID code programmed in
    GSC, reported by devices where there is no mismatch between the RLZ code and
    the Board ID value.
  </summary>
  <token key="GSC">
    <variant name="Cr50"/>
    <variant name="Ti50"/>
  </token>
</histogram>

<histogram name="Platform.{GSC}.RlzOfBoardIdMismatch" enum="Cr50CrosRlzCodes"
    expires_after="2027-01-31">
  <owner>vbendeb@chromium.org</owner>
  <owner>apronin@chromium.org</owner>
  <owner>cros-hwsec+uma@google.com</owner>
  <summary>
    A sparse histogram of values indexed by 4 byte RLZ code reported by devices
    where there is a mismatch between the RLZ code and the Board ID value
    programmed in the GSC. Since RLZ code could be misprogrammed, a sparse
    histogram is used to allow keeping track of outliers.
  </summary>
  <token key="GSC">
    <variant name="Cr50"/>
    <variant name="Ti50"/>
  </token>
</histogram>

</histograms>

</histogram-configuration>
