<!--
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 Net 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="CacheInstance">
  <variant name="App."
      summary="Collected from the HTML5 Application Cache instance."/>
  <variant name="Code."
      summary="Collected from the V8 Bytecode Cache instance."/>
  <variant name="Http." summary="Collected from the HTTP Cache instance."/>
</variants>

<variants name="ConnectionMigrationCause">
  <variant name=".ChangePortOnPathDegrading" summary=""/>
  <variant name=".NewNetworkConnectedPostPathDegrading" summary=""/>
  <variant name=".OnMigrateBackToDefaultNetwork" summary=""/>
  <variant name=".OnNetworkConnected" summary=""/>
  <variant name=".OnNetworkDisconnected" summary=""/>
  <variant name=".OnNetworkMadeDefault" summary=""/>
  <variant name=".OnPathDegrading" summary=""/>
  <variant name=".OnServerPreferredAddressAvailable" summary=""/>
  <variant name=".OnWriteError" summary=""/>
  <variant name=".Unknown" summary=""/>
</variants>

<variants name="DnsOverHttpsSecure">
  <variant name="Insecure" summary="DoH is not enabled"/>
  <variant name="Secure" summary="DoH is enabled"/>
</variants>

<variants name="DnsQueryType">
  <variant name="A" summary="A DNS query type"/>
  <variant name="AAAA" summary="AAAA DNS query type"/>
  <variant name="HTTPS" summary="HTTPS DNS query type"/>
</variants>

<!-- LINT.IfChange(DohProviderId) -->

<variants name="DohProviderId">
  <variant name="CleanBrowsingAdult." summary="CleanBrowsing adult filter."/>
  <variant name="CleanBrowsingFamily." summary="CleanBrowsing family filter."/>
  <variant name="CleanBrowsingSecure." summary="CleanBrowsing secure filter."/>
  <variant name="Cloudflare." summary="Cloudflare."/>
  <variant name="CloudflareFamily." summary="Cloudflare family filter."/>
  <variant name="CloudflareSecurity." summary="Cloudflare security filter."/>
  <variant name="Comcast." summary="Comcast."/>
  <variant name="Cox." summary="Cox."/>
  <variant name="Cznic." summary="CZ.NIC ODVR."/>
  <variant name="DNS4EU." summary="DNS4EU."/>
  <variant name="Dnssb." summary="DNS.SB."/>
  <variant name="Google." summary="Google."/>
  <variant name="GoogleDns64." summary="Google DNS64."/>
  <variant name="Iij." summary="Iij."/>
  <variant name="Levonet." summary="Levonet s.r.o."/>
  <variant name="NextDns." summary="NextDNS."/>
  <variant name="OpenDNS." summary="OpenDNS standard service."/>
  <variant name="OpenDNSFamily." summary="OpenDNS Family Shield service."/>
  <variant name="Other." summary="No possible upgrade to a DoH provider."/>
  <variant name="Quad9Cdn." summary="Quad9 cdn service."/>
  <variant name="Quad9Insecure." summary="Quad9 insecure service."/>
  <variant name="Quad9Secure." summary="Quad9 secure service."/>
  <variant name="Quickline." summary="Quickline AS15600"/>
  <variant name="Spectrum1."
      summary="Charter Communications/Spectrum DoH endpoint1."/>
  <variant name="Spectrum2."
      summary="Charter Communications/Spectrum DoH endpoint2."/>
</variants>

<!-- LINT.ThenChange(//net/dns/public/doh_provider_entry.cc:DohProviderId) -->

<variants name="HostType">
  <variant name="" summary="non Google Hosts"/>
  <variant name=".GoogleHost" summary="Google Host"/>
</variants>

<variants name="HttpConnectionProtocol">
  <variant name="Http1" summary="HTTP/1.1"/>
  <variant name="Http2" summary="HTTP/2"/>
  <variant name="Http3" summary="HTTP/3"/>
  <variant name="Other" summary="Other protocols"/>
</variants>

<variants name="NegotiatedProtocolCoalesced">
  <variant name="H1"/>
  <variant name="H2"/>
  <variant name="H3"/>
</variants>

<variants name="NetworkTransactionBlockedHostType">
  <variant name=""/>
  <variant name="GoogleHost"/>
</variants>

<variants name="NetworkTransactionBlockedProtocol">
  <variant name="H1"/>
  <variant name="H2"/>
  <variant name="H3"/>
  <variant name="Unknown"/>
</variants>

<variants name="NetworkTransactionProtocol">
  <variant name="" summary="all protocols"/>
  <variant name=".H1" summary="HTTP/1.1"/>
  <variant name=".H2" summary="HTTP/2"/>
  <variant name=".H3" summary="HTTP/3"/>
  <variant name=".Unknown" summary="unknown protocol"/>
</variants>

<variants name="PlatformNotifications">
  <variant name=".OnIPAddressChanged"
      summary="When IP address change is detected"/>
  <variant name=".OnMigrateBackToDefaultNetwork"
      summary="When connection attempts to migrate back to the default
               network"/>
  <variant name=".OnNetworkConnected"
      summary="When a new network is connected"/>
  <variant name=".OnNetworkDisconnected"
      summary="When an exisiting network is disconnected"/>
  <variant name=".OnNetworkMadeDefault"
      summary="When a network is made as new default"/>
  <variant name=".OnNetworkSoonToDisconnect"
      summary="When an existing network is soon to be disconnected"/>
</variants>

<variants name="ReferrerPolicySameOrigin">
  <variant name=".CrossOrigin" summary="Cross-origin requests."/>
  <variant name=".SameOrigin"
      summary="Same-origin requests (relative to the initiator, if present,
               and otherwise the initial referrer URL)."/>
</variants>

<variants name="SessionSource">
  <variant name="Existing" summary="an existing session"/>
  <variant name="New" summary="a new session"/>
</variants>

<variants name="SqlPersistentStoreCheckpointType">
  <variant name="ForceCheckpoint"
      summary="A checkpoint was executed when a commit to the DB occurred
               while the browser was not idle."/>
  <variant name="IdleCheckpoint"
      summary="A checkpoint was executed when a commit to the DB occurred
               while the browser was idle."/>
  <variant name="IdleEventCheckpoint"
      summary="A checkpoint was executed when the browser transitioned to an
               idle state."/>
</variants>

<variants name="SqlPersistentStoreMethodName">
  <variant name="CalculateSizeOfEntriesBetween2"/>
  <variant name="CreateEntry"/>
  <variant name="DeleteAllEntries"/>
  <variant name="DeleteDoomedEntries"/>
  <variant name="DeleteDoomedEntry"/>
  <variant name="DeleteLiveEntriesBetween"/>
  <variant name="DeleteLiveEntry"/>
  <variant name="DoomEntry"/>
  <variant name="EvictEntries"/>
  <variant name="EvictEntriesOnIdleTime"/>
  <variant name="GetEntryAvailableRange"/>
  <variant name="Initialize"/>
  <variant name="OpenEntry"/>
  <variant name="OpenNextEntry"/>
  <variant name="OpenOrCreateEntry"/>
  <variant name="ReadEntryData"/>
  <variant name="ResumeEviction"/>
  <variant name="ResumeEvictionOnIdleTime"/>
  <variant name="ResumePendingEviction"/>
  <variant name="ResumePendingEvictionOnIdleTime"/>
  <variant name="RunNewEviction"/>
  <variant name="RunNewEvictionOnIdleTime"/>
  <variant name="UpdateEntryLastUsedByKey"/>
  <variant name="WriteEntryData"/>
  <variant name="WriteEntryDataAndMetadata"/>
</variants>

<variants name="SqlSharedCacheIndexDatabaseMethod">
  <variant name="DeleteByDbId"/>
  <variant name="GetDbIdByNetworkIsolationKey"/>
  <variant name="GetIsolationKeyStringByDbId"/>
  <variant name="Initialize"/>
</variants>

<!-- LINT.IfChange(StreamSocketCloseReason) -->

<variants name="StreamSocketCloseReason">
  <variant name="Abort"/>
  <variant name="AttemptManagerDraining"/>
  <variant name="CannotUseTcpBasedProtocols"/>
  <variant name="CloseAllConnections"/>
  <variant name="IpAddressChanged"/>
  <variant name="QuicSessionCreated"/>
  <variant name="SpdySessionCreated"/>
  <variant name="SslConfigChanged"/>
  <variant name="Unspecified"/>
  <variant name="UsingExistingQuicSession"/>
  <variant name="UsingExistingSpdySession"/>
</variants>

<!-- LINT.ThenChange(//net/socket/stream_socket_close_reason.h:StreamSocketCloseReason) -->

<variants name="StructuredHeaderType">
  <variant name="Dictionary" summary="a Dictionary"/>
  <variant name="Item" summary="an Item"/>
  <variant name="List" summary="a List"/>
</variants>

<variants name="SuccessOrFailure">
  <variant name="Failure" summary="Operation failed"/>
  <variant name="Success" summary="Operation succeeded"/>
</variants>

<variants name="TcpSocketPoolLimitRandomizationAction">
  <variant name="Allocation" summary="New Socket Allocation"/>
  <variant name="Release" summary="Existing Socket Release"/>
</variants>

<variants name="TcpSocketPoolLimitRandomizationState">
  <variant name="Capped" summary="Capped Pool"/>
  <variant name="Uncapped" summary="Uncapped Pool"/>
</variants>

<variants name="TotalTimeToHttpsGoogle">
  <variant name=".Secure.Quic"
      summary="Recorded for Google servers (https) only when QUIC is used."/>
</variants>

<!-- LINT.IfChange(TpmCommand) -->

<variants name="TpmCommand">
  <variant name="Certify" summary="TPM2_Certify"/>
  <variant name="Create" summary="TPM2_Create"/>
  <variant name="FlushContext" summary="TPM2_FlushContext"/>
  <variant name="Hash" summary="TPM2_Hash"/>
  <variant name="HashSequenceStart" summary="TPM2_HashSequenceStart"/>
  <variant name="SequenceComplete" summary="TPM2_SequenceComplete"/>
  <variant name="SequenceUpdate" summary="TPM2_SequenceUpdate"/>
  <variant name="Sign" summary="TPM2_Sign"/>
</variants>

<!-- LINT.ThenChange(//crypto/tpm_parser.h:TpmCommand) -->

<!-- LINT.IfChange(TpmOperation) -->

<!-- Only operations that are defined for all platforms should be added here. -->

<!-- Platform-specific operations should be added to specific histograms directly. -->

<variants name="TpmOperation">
  <variant name="MessageHashing" summary="message hashing"/>
  <variant name="MessageSigning" summary="message signing"/>
  <variant name="NewAttestationKeyCreation"
      summary="new attestation key creation"/>
  <variant name="NewKeyCreation" summary="new key creation"/>
  <variant name="RestrictedMessageSigning"
      summary="restricted key message signing"/>
  <variant name="WrappedAttestationKeyCreation"
      summary="wrapped attestation key creation"/>
  <variant name="WrappedKeyCreation" summary="wrapped key creation"/>
</variants>

<!-- LINT.ThenChange(//crypto/unexportable_key_metrics.h:TPMOperation) -->

<variants name="TpmSignatureAlgorithm">
  <variant name="ECDSA"/>
  <variant name="RSA"/>
</variants>

<variants name="TrustTokenOperationType">
  <variant name="Issuance" summary="Trust token issuance"/>
  <variant name="Redemption" summary="Trust token redemption"/>
  <variant name="Signing"
      summary="SRR attachment and outgoing request signing"/>
</variants>

<!-- LINT.IfChange(UnexportableKeysBackgroundTaskOrigin) -->

<variants name="UnexportableKeysBackgroundTaskOrigin">
  <variant name="" summary="any origin"/>
  <variant name=".BoundSessionCredentials" summary="DBSC prototype"/>
  <variant name=".DeviceBoundSessions" summary="DBSC standard"/>
  <variant name=".OrphanedKeyGarbageCollection"
      summary="orphaned key garbage collection"/>
  <variant name=".RefreshTokenBinding" summary="refresh token binding"/>
</variants>

<!-- LINT.ThenChange(//components/unexportable_keys/unexportable_key_task_manager.cc:BackgroundTaskOriginSuffixForHistograms) -->

<!-- LINT.IfChange(UnexportableKeysBackgroundTaskType) -->

<variants name="UnexportableKeysBackgroundTaskType">
  <variant name=".Certify" summary="key certification operations"/>
  <variant name=".DeleteAllKeys"
      summary="operations to delete all signing keys"/>
  <variant name=".DeleteKeys"
      summary="operations to delete a collection of signing keys"/>
  <variant name=".FromWrappedAttestationKey"
      summary="operations to create an attestation key from a wrapped key"/>
  <variant name=".FromWrappedKey"
      summary="operations to create a signing key from a wrapped key"/>
  <variant name=".GenerateAttestationKey"
      summary="operations to generate a new attestation key"/>
  <variant name=".GenerateKey"
      summary="operations to generate a new signing key"/>
  <variant name=".GetAllKeys"
      summary="operations to get all keys known to the platform"/>
  <variant name=".Sign" summary="signing operations"/>
  <variant name=".SignWithAttestationKey"
      summary="attestation key signing operations"/>
</variants>

<!-- LINT.ThenChange(//components/unexportable_keys/background_task_type.h:BackgroundTaskType) -->

<!-- LINT.IfChange(UnexportableKeysSpareKeyPoolType) -->

<variants name="UnexportableKeysSpareKeyPoolType">
  <variant name="Attestation" summary="attestation"/>
  <variant name="Signing" summary="signing"/>
</variants>

<!-- LINT.ThenChange(//components/unexportable_keys/unexportable_key_service_impl.cc:GetSpareKeyPoolHistogramName) -->

<variants name="URLLoaderThrottleStages">
  <variant name="BeforeWillProcessResponse"/>
  <variant name="WillOnCompleteWithError"/>
  <variant name="WillProcessResponse"/>
  <variant name="WillRedirectRequest"/>
  <variant name="WillStartRequest"/>
</variants>

<variants name="WillProcessResponseThrottleNames">
  <variant name="MimeSniffingThrottle"/>
  <variant name="SafeBrowsingBrowserThrottle"/>
  <variant name="SafeBrowsingRendererThrottle"/>
</variants>

<variants name="WillStartRequestThrottleNames">
  <variant name="FrameRequestBlockerThrottle"/>
  <variant name="PrerenderThrottle"/>
  <variant name="SubresourceRedirectThrottle"/>
</variants>

<histogram name="CertificateType2.{BRValidity}.{ChainPosition}.{Algorithm}"
    units="units" expires_after="never">
<!-- expires-never: histograms are used to assess policy -->

<!-- https://crbug.com/732640#c5 -->

  <owner>mattm@chromium.org</owner>
  <owner>src/net/cert/OWNERS</owner>
  <summary>
    Information about the certificate algorithms and sizes in use on the web, to
    examine compliance with the CA/Browser Forum requirements and security best
    practice. This histogram considers the notBefore as the issuance date, for
    purposes of what requirements apply. {BRValidity}

    Records the size in bits of the key for certificates with chain position
    {ChainPosition} and algorithm {Algorithm}.
  </summary>
  <token key="BRValidity">
    <variant name="BR"
        summary="The *leaf* certificate of the chain expires after 2013-12-31
                 and was issued on or after 2012-07-01, as judged by the
                 notBefore, meaning that it should be in scope for the
                 Baseline Requirement's key size requirements."/>
    <variant name="NonBR"
        summary="The *leaf* certificate of the chain expires on or before
                 2013-12-31 or was issued before 2012-07-01."/>
  </token>
  <token key="ChainPosition">
    <variant name="Intermediate" summary="Intermediate"/>
    <variant name="Leaf" summary="Leaf"/>
    <variant name="Root" summary="Root"/>
  </token>
  <token key="Algorithm">
    <variant name="ECDSA" summary="ECDSA"/>
    <variant name="RSA" summary="RSA"/>
    <variant name="Unknown" summary="SPKI unrecognized by cert library"/>
  </token>
</histogram>

<histogram name="Crypto.SecureEnclaveOperation.Apple.{Operation}.Error"
    enum="MacSecurityFrameworkOSStatus" expires_after="2027-01-14">
  <owner>seblalancette@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Mac and iOS when a {Operation} operation failed for a
    SecureEnclave-protected ECDSA key. Represents the OSStatus code returned by
    the API corresponding with that operation.
  </summary>
  <token key="Operation" variants="TpmOperation">
    <variant name="KeyDeletion" summary="key deletion"/>
    <variant name="WrappedKeyExport" summary="wrapped key export"/>
  </token>
</histogram>

<histogram name="Crypto.SecureEnclaveOperation.Mac.{Operation}.Error"
    enum="MacSecurityFrameworkOSStatus" expires_after="2027-02-07">
  <owner>seblalancette@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Mac when a {Operation} operation failed for a
    SecureEnclave-protected ECDSA key. Represents the OSStatus code returned by
    the API corresponding with that operation.

    Warning: this histogram was expired from 2025-10-06 to 2025-12-08; data may
    be missing.

    Note: This histogram should be removed upon expiration and replaced by
    Crypto.SecureEnclaveOperation.Apple.{Operation}.Error
  </summary>
  <token key="Operation" variants="TpmOperation">
    <variant name="KeyDeletion" summary="key deletion"/>
    <variant name="WrappedKeyExport" summary="wrapped key export"/>
  </token>
</histogram>

<histogram name="Crypto.TPMDuration.Virtual.{Operation}{SignatureAlgorithm}"
    units="ms" expires_after="2025-08-01">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Collected on Windows at startup. Records status for various virtual TPM
    operations that Chrome artificially triggers on startup for measurement
    purposes. Note that if new key creation fails, wrapped key creation and
    message signing will not take place.
  </summary>
  <token key="Operation" variants="TpmOperation"/>
  <token key="SignatureAlgorithm" variants="TpmSignatureAlgorithm"/>
</histogram>

<histogram name="Crypto.TPMDuration.{Operation}{SignatureAlgorithm}" units="ms"
    expires_after="2027-01-03">
  <owner>kristianm@chromium.org</owner>
  <owner>wfh@chromium.org</owner>
  <summary>
    Collected on Windows at startup. Records status for various TPM operations
    that Chrome artificially triggers on startup for measurement purposes. Note
    that if new key creation fails, wrapped key creation and message signing
    will not take place.
  </summary>
  <token key="Operation" variants="TpmOperation">
    <variant name="KeyCertification" summary="key certification"/>
  </token>
  <token key="SignatureAlgorithm" variants="TpmSignatureAlgorithm"/>
</histogram>

<histogram name="Crypto.TpmError.VirtualCreateKey" units="win32 error code"
    expires_after="2025-08-01">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Error code returned by NCryptCreatePersistedKey. One of the error codes from
    https://learn.microsoft.com/en-us/windows/win32/com/com-error-codes-4.
  </summary>
</histogram>

<histogram name="Crypto.TpmError.VirtualFinalizeKey" units="win32 error code"
    expires_after="2025-08-01">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Error code returned by NCryptFinalizeKey. One of the error codes from
    https://learn.microsoft.com/en-us/windows/win32/com/com-error-codes-4.
  </summary>
</histogram>

<histogram name="Crypto.TpmError.VirtualOpenKey" units="win32 error code"
    expires_after="2025-08-01">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Error code returned by NCryptOpenKey. One of the error codes from
    https://learn.microsoft.com/en-us/windows/win32/com/com-error-codes-4.
  </summary>
</histogram>

<histogram name="Crypto.TpmError.VirtualOpenStorage" units="win32 error code"
    expires_after="2025-08-01">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Error code returned by NCryptOpenStorageProvider. One of the error codes
    from https://learn.microsoft.com/en-us/windows/win32/com/com-error-codes-4.
  </summary>
</histogram>

<histogram name="Crypto.TPMOperation.Virtual.{Operation}{SignatureAlgorithm}"
    enum="BooleanSuccess" expires_after="2027-01-03">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Collected on Windows at startup. Records status for various virtual TPM
    actions that Chrome artificially triggers on startup for measurement
    purposes. Note that if new key creation fails, wrapped key creation and
    message signing will not take place.
  </summary>
  <token key="Operation" variants="TpmOperation">
    <variant name="MessageVerify" summary="message verification"/>
  </token>
  <token key="SignatureAlgorithm" variants="TpmSignatureAlgorithm"/>
</histogram>

<histogram name="Crypto.TPMOperation.Win.LoadTBSLibrary.Result" enum="Hresult"
    expires_after="2027-01-24">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows when tbs.dll fails to load during TPM certification.
    Records the HRESULT from loading the library.
  </summary>
</histogram>

<histogram name="Crypto.TPMOperation.Win.TbsSubmitCommand.Error"
    enum="Win32TpmErrorCodes" expires_after="2027-02-07">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows when Tbsip_Submit_Command fails during TPM
    certification. Represents the TBS_RESULT returned by the API.
  </summary>
</histogram>

<histogram name="Crypto.TPMOperation.Win.TpmCertifyVerify.HashAlgorithm"
    enum="TpmAlgorithm" expires_after="2027-01-24">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows during TPM2_Certify verification. Records the
    TPM_ALG_ID of the hash algorithm unconditionally for all operations.
  </summary>
</histogram>

<histogram name="Crypto.TPMOperation.Win.TpmCertifyVerify.Result"
    enum="TpmCertifyVerifyResult" expires_after="2027-01-24">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows to record the verification result of a TPM2_Certify
    response. Records whether the signature was valid or the specific error.
  </summary>
</histogram>

<histogram name="Crypto.TPMOperation.Win.TpmCertifyVerify.SignatureAlgorithm"
    enum="TpmAlgorithm" expires_after="2027-01-24">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows during TPM2_Certify verification. Records the
    TPM_ALG_ID of the signature algorithm unconditionally for all operations.
  </summary>
</histogram>

<histogram name="Crypto.TPMOperation.Win.Tpm{Command}ExtractProperty.Result"
    enum="Win32TpmErrorCodes" expires_after="2027-08-10">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows to record the result of property extraction before
    submitting a {Command} command. Represents the SECURITY_STATUS returned by
    the API.
  </summary>
  <token key="Command" variants="TpmCommand"/>
</histogram>

<histogram name="Crypto.TPMOperation.Win.Tpm{Command}Parse.Result"
    enum="TpmParseResult" expires_after="2027-08-10">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows to record the result of parsing the response of a
    {Command} command. Represents the ParseResult, which is Ok on success or the
    specific ParseError that occurred.
  </summary>
  <token key="Command" variants="TpmCommand"/>
</histogram>

<histogram name="Crypto.TPMOperation.Win.Tpm{Command}Response.TpmResponseCode"
    enum="TPMResponseCode" expires_after="2027-08-10">
  <owner>jdoerrie@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows to record the result of a {Command} command at the TPM
    level. Represents the TPM 2.0 response code returned by the TPM.
  </summary>
  <token key="Command" variants="TpmCommand"/>
</histogram>

<histogram name="Crypto.TPMOperation.Win.{Operation}{SignatureAlgorithm}.Error"
    enum="Win32TpmErrorCodes" expires_after="2027-01-03">
  <owner>seblalancette@chromium.org</owner>
  <owner>kristianm@chromium.org</owner>
  <owner>src/crypto/OWNERS</owner>
  <summary>
    Collected on Windows when a {Operation} operation failed
    {SignatureAlgorithm}. Represents the Win32 status returned by the API
    corresponding with that operation.
  </summary>
  <token key="Operation" variants="TpmOperation">
    <variant name="KeyCertification" summary="key certification"/>
    <variant name="SelectAlgorithm" summary="select algorithm"/>
    <variant name="WrappedAttestationKeyExport"
        summary="wrapped attestation key export"/>
    <variant name="WrappedKeyExport" summary="wrapped key export"/>
  </token>
  <token key="SignatureAlgorithm">
    <variant name="" summary="while using TPM APIs without any particular key"/>
    <variant name="ECDSA" summary="while using a TPM-protected ECDSA key"/>
    <variant name="RSA" summary="while using a TPM-protected RSA key"/>
  </token>
</histogram>

<histogram name="Crypto.TPMOperation.{Operation}{SignatureAlgorithm}"
    enum="BooleanSuccess" expires_after="2027-01-03">
  <owner>kristianm@chromium.org</owner>
  <owner>wfh@chromium.org</owner>
  <summary>
    Collected on Windows at startup. Records status for various TPM actions that
    Chrome artificially triggers on startup for measurement purposes. Note that
    if new key creation fails, wrapped key creation and message signing will not
    take place.
  </summary>
  <token key="Operation" variants="TpmOperation">
    <variant name="KeyCertification" summary="key certification"/>
    <variant name="MessageVerify" summary="message verification"/>
    <variant name="RestrictedMessageVerify"
        summary="restricted key message verification"/>
  </token>
  <token key="SignatureAlgorithm" variants="TpmSignatureAlgorithm"/>
</histogram>

<histogram name="Crypto.TPMSupport2" enum="TPMSupport"
    expires_after="2027-01-03">
  <owner>agl@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>wfh@chromium.org</owner>
  <summary>
    Collected on Windows at startup. Records whether a TPM is present and, if
    so, what the best supported algorithm is.
  </summary>
</histogram>

<histogram name="Crypto.TPMSupportType" enum="TPMType"
    expires_after="2026-12-27">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Collected on Windows at startup. Records whether a virtual and/or hardware
    TPM is present.
  </summary>
</histogram>

<histogram name="Crypto.UnexportableKeys.BackgroundTaskDuration{Priority}"
    units="ms" expires_after="2027-02-07">
  <owner>alexilin@chromium.org</owner>
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the time that passed between starting a TPM operation on an
    unexportable_keys::UnexportableKeyService and completing the operation
    (either successfully or not).

    This time includes both the time spent waiting in a task queue and the
    execution time. These sub-intervals are covered by
    Crypto.UnexportableKeys.BackgroundTaskQueueWaitDuration and
    Crypto.UnexportableKeys.BackgroundTaskRunDuration histograms
    correspondingly.

    Includes operations that were scheduled with {Priority}.

    Recorded right after a TPM operation completes.
  </summary>
  <token key="Priority">
    <variant name="" summary="all priorities"/>
    <variant name=".BestEffort" summary="the BestEffort priority"/>
    <variant name=".UserBlocking" summary="the UserBlocking priority"/>
    <variant name=".UserVisible" summary="the UserVisible priority"/>
  </token>
</histogram>

<histogram
    name="Crypto.UnexportableKeys.BackgroundTaskQueueWaitDuration{Priority}"
    units="ms" expires_after="2027-02-07">
  <owner>alexilin@chromium.org</owner>
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the time spent waiting in a task queue for the subset of TPM
    operations that are asynchronously scheduled through
    unexportable_keys::UnexportableKeyService.

    This duration is a sub-interval of
    Crypto.UnexportableKeys.BackgroundTaskDuration.

    Includes operations that were scheduled with {Priority}.

    Recorded right before a TPM operation is sent to the background thread for
    execution.
  </summary>
  <token key="Priority">
    <variant name="" summary="all priorities"/>
    <variant name=".BestEffort" summary="the BestEffort priority"/>
    <variant name=".UserBlocking" summary="the UserBlocking priority"/>
    <variant name=".UserVisible" summary="the UserVisible priority"/>
  </token>
</histogram>

<histogram
    name="Crypto.UnexportableKeys.BackgroundTaskResult{TaskOrigin}{TaskType}"
    enum="UnexportableKeyServiceResult" expires_after="2027-02-14">
  <owner>alexilin@chromium.org</owner>
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the result of the subset of TPM operations that are scheduled
    asynchronously through unexportable_keys::UnexportableKeyService. In some
    error cases, the result might be returned synchronously.

    Recorded right after a TPM operation completes. Recorded only for {TaskType}
    originating from {TaskOrigin}.
  </summary>
  <token key="TaskOrigin" variants="UnexportableKeysBackgroundTaskOrigin"/>
  <token key="TaskType" variants="UnexportableKeysBackgroundTaskType"/>
</histogram>

<histogram
    name="Crypto.UnexportableKeys.BackgroundTaskRetries{TaskType}{Success}"
    units="retries" expires_after="2027-02-14">
  <owner>alexilin@chromium.org</owner>
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the number retries it took to complete a TPM operation scheduled
    through unexportable_keys::UnexportableKeyService, only for operations that
    are completed with {Success}.

    Recorded right after a TPM operation completes. Recorded only for
    {TaskType}.
  </summary>
  <token key="TaskType" variants="UnexportableKeysBackgroundTaskType"/>
  <token key="Success">
    <variant name=".Failure" summary="failure"/>
    <variant name=".Success" summary="success"/>
  </token>
</histogram>

<histogram name="Crypto.UnexportableKeys.BackgroundTaskRunDuration{TaskType}"
    units="ms" expires_after="2027-02-07">
  <owner>alexilin@chromium.org</owner>
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the time that passed between starting executing a TPM operation on a
    background thread and completing the operation (either successfully or not).
    Includes only a subset of TPM operations that are scheduled asynchronously
    through unexportable_keys::UnexportableKeyService.

    This duration is a sub-interval of
    Crypto.UnexportableKeys.BackgroundTaskDuration. Unlike
    Crypto.UnexportableKeys.BackgroundTaskDuration, this histogram is split by a
    task type instead of a task priority because the priority doesn't matter
    once a task starts executing. Only one task can be executed at the time due
    to TPM limitations.

    Includes {TaskType}.

    Recorded right after a TPM operation completes.
  </summary>
  <token key="TaskType" variants="UnexportableKeysBackgroundTaskType">
    <variant name="" summary="all operation types"/>
  </token>
</histogram>

<histogram
    name="Crypto.UnexportableKeys.GarbageCollection.{KeyDeletionClient}.{MetricName}"
    units="keys" expires_after="2027-01-03">
  <owner>alexilin@chromium.org</owner>
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records {MetricName} at the time of garbage collection triggered for
    {KeyDeletionClient}.

    Typically, the unexportable keys garbage collection runs with some delay
    after a profile startup but it also might be triggered in response to
    UnexportableKeyService deletion events. For example, a garbage collection
    will run when a profile is deleted.
  </summary>
  <token key="KeyDeletionClient">
    <variant name="DestroyedOTRProfiles" summary="destroyed OTR profiles"/>
    <variant name="DestroyedProfiles" summary="destroyed profiles"/>
    <variant name="DeviceBoundSessions"
        summary="the binding of sessions credentials with device-bound keys"/>
    <variant name="ObsoleteOTRProfiles" summary="obsolete OTR profiles"/>
    <variant name="ObsoleteProfiles" summary="obsolete profiles"/>
    <variant name="RefreshTokenBinding"
        summary="the binding of refresh tokens with device-bound keys"/>
  </token>
  <token key="MetricName">
    <variant name="ObsoleteKeyCount" summary="the number of obsolete keys"/>
    <variant name="ObsoleteKeyDeletionCount"
        summary="the number of obsolete keys deleted"/>
    <variant name="TotalKeyCount"
        summary="the total number of unexportable keys"/>
    <variant name="UsedKeyCount"
        summary="the number of unexportable keys still in use"/>
  </token>
</histogram>

<histogram name="Crypto.UnexportableKeys.SparePool.{KeyType}.GenerateError"
    enum="UnexportableKeyServiceResult" expires_after="2027-01-01">
  <owner>amraboelkher@chromium.org</owner>
  <owner>jdoerrie@chromium.org</owner>
  <summary>
    Recorded when a background task finishes generating a spare {KeyType} key to
    replenish the pool, regardless of success or failure. Records 'Success' (0,
    corresponding to kNoServiceErrorForMetrics in C++) or the specific
    ServiceError code on failure.
  </summary>
  <token key="KeyType" variants="UnexportableKeysSpareKeyPoolType"/>
</histogram>

<histogram name="Crypto.UnexportableKeys.SparePool.{KeyType}.PoolSize"
    units="keys" expires_after="2027-01-01">
  <owner>amraboelkher@chromium.org</owner>
  <owner>jdoerrie@chromium.org</owner>
  <summary>
    Recorded when an asynchronous {KeyType} key generation request is received,
    immediately before checking the pool for a hit or triggering replenishment.
    Records the total {KeyType} key pool size.
  </summary>
  <token key="KeyType" variants="UnexportableKeysSpareKeyPoolType"/>
</histogram>

<histogram
    name="Crypto.UnexportableKeys.SparePool.{KeyType}.ReplenishmentLatency"
    units="ms" expires_after="2027-01-01">
  <owner>amraboelkher@chromium.org</owner>
  <owner>jdoerrie@chromium.org</owner>
  <summary>
    Recorded when a background task successfully generates a spare {KeyType} key
    to replenish the pool. Records the duration (in milliseconds) of the
    background task from its launch until completion.
  </summary>
  <token key="KeyType" variants="UnexportableKeysSpareKeyPoolType"/>
</histogram>

<histogram name="Crypto.UnexportableKeys.SparePool.{KeyType}.RequestLatency"
    units="ms" expires_after="2027-01-01">
  <owner>amraboelkher@chromium.org</owner>
  <owner>jdoerrie@chromium.org</owner>
  <summary>
    Recorded when an asynchronous {KeyType} key generation request completes
    (its callback is executed), regardless of whether the spare pool feature is
    enabled or disabled. Records the duration (in milliseconds) from the initial
    request until callback execution, covering both instantaneous pool hits and
    slow fallback background generations.
  </summary>
  <token key="KeyType" variants="UnexportableKeysSpareKeyPoolType"/>
</histogram>

<histogram name="Crypto.UnexportableKeys.SparePool.{KeyType}.RetrievalResult"
    enum="SpareKeyPoolRetrievalResult" expires_after="2027-01-01">
  <owner>amraboelkher@chromium.org</owner>
  <owner>jdoerrie@chromium.org</owner>
  <summary>
    Recorded when a consumer requests a {KeyType} key asynchronously. Records
    the outcome (hit, various miss reasons, or hardware support failure) of
    attempting to retrieve a pre-generated spare {KeyType} key from the
    background pool.
  </summary>
  <token key="KeyType" variants="UnexportableKeysSpareKeyPoolType"/>
</histogram>

<histogram name="Crypto.VirtualKeySupport" enum="TPMSupport"
    expires_after="2025-08-01">
  <owner>kristianm@chromium.org</owner>
  <owner>agl@chromium.org</owner>
  <summary>
    Collected on Windows at startup. Records whether a virtual TPM is present
    and, if so, what the best supported algorithm is.
  </summary>
</histogram>

<histogram name="HttpCache.AccessToDone2{HttpCacheAccessToDoneCases}"
    units="ms" expires_after="2027-01-31">
  <owner>morlovich@chromium.org</owner>
  <owner>olivierli@chromium.org</owner>
  <summary>
    For every http cache transaction with a pattern (see HttpCache.Pattern), the
    time from the first access to the disk cache until the transaction was done.
    {HttpCacheAccessToDoneCases}
  </summary>
  <token key="HttpCacheAccessToDoneCases">
    <variant name=""/>
    <variant name=".SentRequest"
        summary="The request was sent over the network."/>
    <variant name=".Used"
        summary="A cache entry was used without using the network."/>
  </token>
</histogram>

<histogram name="HttpCache.AddTransactionToEntry" units="ms"
    expires_after="2026-09-06">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time taken an HttpCache::Transaction to be added to ActiveEntry. It
    roughly captures time to acquire a write lock for an disk cache. Recorded
    every time a transaction (re)starts. Not recorded if the cache is
    memory-backed.
  </summary>
</histogram>

<histogram name="HttpCache.BeforeSend{HttpCacheBeforeSendCases}" units="ms"
    expires_after="2027-01-31">
  <owner>morlovich@chromium.org</owner>
  <owner>yhirano@chromium.org</owner>
  <summary>
    For http cache transactions in which a network request was sent, the time
    elapsed between beginning the request and sending it over the network; this
    is the time spent accessing the disk cache. {HttpCacheBeforeSendCases}
  </summary>
  <token key="HttpCacheBeforeSendCases">
    <variant name=""/>
    <variant name=".CantConditionalize"
        summary="A cached resource existed but no conditional request could
                 be written."/>
    <variant name=".NotCached"
        summary="There was no pre-existing disk cache entry."/>
    <variant name=".Updated"
        summary="A cached resource existed and was updated over the network."/>
    <variant name=".Validated"
        summary="A cached resource existed and was validated over the
                 network."/>
  </token>
</histogram>

<histogram name="HttpCache.CreateBackendEarly" enum="Boolean"
    expires_after="2027-02-07">
  <owner>yoichio@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Logged wether or not CreateBackend is called when HttpCache is created. This
    is valid when HttpCacheInitializeDiskCacheBackendEarly is enabled.
  </summary>
</histogram>

<histogram name="HttpCache.CreateDiskEntry" units="ms"
    expires_after="2027-02-07">
  <owner>yhirano@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time taken to create a disk cache entry. Recorded when the entry is
    created for the first time in the HttpCacheTransaction. Not recorded if the
    cache is memory-backed.
  </summary>
</histogram>

<histogram name="HttpCache.EntryRejectionStatus{Type}"
    enum="HttpCacheEntryRejectionStatus" expires_after="2027-01-03">
  <owner>leimy@chromium.org</owner>
  <owner>chrome-owp-storage@google.com</owner>
  <summary>
    Records the outcome of considering whether to reject a cache entry based on
    in-memory hints. This is used to avoid accessing disk for entries that are
    likely to be unusable. Recorded every time we try to open a cache entry, but
    there is no active one{Type}
  </summary>
  <token key="Type">
    <variant name="" summary="."/>
    <variant name=".MainFrameOriginNotRecentlyAccessed"
        summary=", only if `UpdateIsMainFrameOriginRecentlyAccessed` is
                 enabled and the request is for a resource whose main frame's
                 origin is not recently accessed."/>
    <variant name=".MainFrameOriginRecentlyAccessed"
        summary=", only if `UpdateIsMainFrameOriginRecentlyAccessed` is
                 enabled and the request is for a resource whose main frame's
                 origin is recently accessed."/>
  </token>
</histogram>

<histogram name="HttpCache.Experimental.Read.EntryContentSize" units="bytes"
    expires_after="2027-01-03">
  <owner>anthonyvd@chromium.org</owner>
  <owner>chrome-catan@google.com</owner>
  <summary>
    Records the size of an HTTP cache entry's content section, every time the
    content of the entry is read from the cache.
  </summary>
</histogram>

<histogram name="HttpCache.Experimental.Read.EntryResponseInfoSize"
    units="bytes" expires_after="2026-10-11">
  <owner>anthonyvd@chromium.org</owner>
  <owner>chrome-catan@google.com</owner>
  <summary>
    Records the size of an HTTP cache entry's response info section, every time
    the content of the entry is read from the cache.
  </summary>
</histogram>

<histogram name="HttpCache.Experimental.Read.EntryTotalSize" units="bytes"
    expires_after="2027-02-14">
  <owner>anthonyvd@chromium.org</owner>
  <owner>chrome-catan@google.com</owner>
  <summary>
    Records the total size (header + content) of an HTTP cache entry, every time
    the content of the entry is read from the cache.
  </summary>
</histogram>

<histogram name="HttpCache.HardReset" enum="Boolean" expires_after="2027-01-03">
  <owner>horo@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Whether the HttpCache was forced to reset upon creation, effectively
    clearing out its previous content. This is recorded when the cache is
    created for the browsing session. Warning: this histogram was expired from
    June 2021 to June 2026; data may be missing.
  </summary>
</histogram>

<histogram name="HttpCache.IsNoStore{Type}" enum="Boolean"
    expires_after="2026-11-29">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Whether or not a response has `Cache-Control: no-store`. Recorded when a
    HTTP transaction is finished. This histogram is for {Type}.
  </summary>
  <token key="Type">
    <variant name="" summary="all request types"/>
    <variant name=".MainFrameHTML" summary="main frame requests"/>
  </token>
</histogram>

<histogram name="HttpCache.MaxFileSizeOnInit" units="KB"
    expires_after="2027-04-07">
  <owner>shivanisha@chromium.org</owner>
  <owner>jkarlin@chromium.org</owner>
  <owner>yoichio@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Max file size allowed to be cached in the http cache. This is logged at the
    time the backend is created. Warning: this histogram was expired from
    2022-02-20 to 2026-04-07; data may be missing.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.CacheStorage.CreateAndLoadTime"
    units="ms" expires_after="2027-02-07">
  <owner>yoichio@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The time it takes to instantiate and synchronously execute the Load method
    of NoVarySearchCacheStorage::Loader on a worker pool thread. This is logged
    at the time the NVS backend is created.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.DeleteIfExistsError.{Directory}"
    enum="PlatformFileError" expires_after="2026-01-11">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to delete the
    &quot;snapshot.baj-new&quot; temporary file from the {Directory} directory
    by net::NoVarySearchCacheStorage. This is only logged if the file exists and
    deleting it fails. The check is only done when creating an on-the-record
    NetworkContext.

    These errors should be rare and harmless.
  </summary>
  <token key="Directory">
    <variant name="Dedicated" summary="dedicated"/>
    <variant name="NoVarySearch" summary="no-vary-search"/>
    <variant name="Parent" summary="parent"/>
  </token>
</histogram>

<histogram name="HttpCache.NoVarySearch.DirectoryCreateError.Dedicated"
    enum="PlatformFileError" expires_after="2026-11-22">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to create the
    Cache/No_Vary_Search directory by net::NoVarySearchCacheStorage. This is
    logged any time creating the directory fails. The directory is only created
    when opening a profile when the directory doesn't already exist.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.DirectoryCreateResult.Dedicated"
    enum="NoVarySearchDirectoryCreateResult" expires_after="2026-12-27">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The result from trying to ensure the existence of the Cache/No_Vary_Search
    directory by net::NoVarySearchCacheStorage. This is logged when an
    on-the-record NetworkContext is created.

    Anything other than &quot;Create failed&quot; is good.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.EntriesAddedDuringLoading"
    units="entries" expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Number of entries that were added to the NoVarySearchCache while the
    previously persisted cache was being loaded from disk. This is logged once
    per successful call to NoVarySearchCacheStorage::Load(), which is once per
    on-the-record NetworkContext.

    This can be considered an approximation of how many requests missed the
    benefit of the NoVarySearchCache due to the load being slow.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.EntriesLoaded" units="entries"
    expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Number of entries that were loaded from a previously persisted
    NoVarySearchCache by a successful call to NoVarySearchCacheStorage::Start().
    Logged once per successful call, which is once per on-the-record
    NetworkContext.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.HeaderParseResult"
    enum="NoVarySearchHeaderParseResult" expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The result of parsing the No-Vary-Search value in the HTTP response header.
    This metric is emitted every time an HTTP response is written to the HTTP
    disk cache.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.InitDeleteError.{Directory}.{File}"
    enum="PlatformFileError" expires_after="2026-05-24">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to delete the {File} file from
    the {Directory} directory by net::NoVarySearchCacheStorage. This is logged
    when the {File} file is found to exist in both the old and new locations,
    and deleting it from the old location fails. This can only happen when
    opening the cache directory on creation of an on-the-record NetworkContext.

    Unless the quantity is very large these errors are harmless.
  </summary>
  <token key="Directory">
    <variant name="NoVarySearch" summary="no-vary-search"/>
    <variant name="Parent" summary="parent"/>
  </token>
  <token key="File">
    <variant name="Journal" summary="journal.baj"/>
    <variant name="Snapshot" summary="snapshot.baf"/>
  </token>
</histogram>

<histogram name="HttpCache.NoVarySearch.InitRenameError.{Directory}.{File}"
    enum="PlatformFileError" expires_after="2026-12-06">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to rename the {File} file from
    the {Directory} directory to the new location by
    net::NoVarySearchCacheStorage. This is logged when the {File} file is only
    found in the old location, and moving it from the old location fails. This
    can only happen when opening the cache directory on creation of an
    on-the-record NetworkContext.

    Unless the quantity is very large these errors are harmless.
  </summary>
  <token key="Directory">
    <variant name="NoVarySearch" summary="no-vary-search"/>
    <variant name="Parent" summary="parent"/>
  </token>
  <token key="File">
    <variant name="Journal" summary="journal.baj"/>
    <variant name="Snapshot" summary="snapshot.baf"/>
  </token>
</histogram>

<histogram name="HttpCache.NoVarySearch.JournalAppendError" enum="Boolean"
    expires_after="2026-11-01">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    A true value is logged whenever appending to the &quot;journal.baj&quot;
    file fails. Appending is done for every entry inserted into or erased from
    the cache.

    After an error, persistence is abandoned, and so this will be logged at most
    once per NetworkContext created.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.JournalCreateError"
    enum="PlatformFileError" expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to create the
    &quot;journal.baj&quot; file by net::NoVarySearchCacheStorage. This is
    logged any time creating &quot;journal.baj&quot; fails.
    &quot;journal.baj&quot; is created when a new on-the-record profile is
    created, and recreated when it gets too full or when a bulk erase is done on
    the cache.

    After an error, persistence is abandoned, and so this will be logged at most
    once per NetworkContext created.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.JournalLoadError"
    enum="PlatformFileError" expires_after="2025-12-16">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to open the
    &quot;journal.baj&quot; file for reading by net::NoVarySearchCacheStorage.
    This is logged when loading &quot;journal.baj&quot; fails.
    &quot;journal.baj&quot; is loaded when an on-the-record profile is
    initialized, typically during browser startup.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.JournalStartError" enum="Boolean"
    expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    A true value is logged whenever writing the magic number to a new
    &quot;journal.baj&quot; file fails. This is done whenever the file is
    created.

    After an error, persistence is abandoned, and so this will be logged at most
    once per NetworkContext created.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.LegacySubdirectoryDeleteError"
    enum="PlatformFileError" expires_after="2025-12-16">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to delete the legacy
    &quot;no-vary-search&quot; directory within &quot;Cache/Cache_Data&quot;.
    This is logged when the deletion fails, which can only happen during
    initialization of an on-the-record NetworkContext.

    Unless the volume is very large these errors are harmless.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.LoadResult"
    enum="NoVarySearchCacheStorageLoadResult" expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The result of attempting to load a previously persisted NoVarySearchCache
    from disk and start a new one. This is logged asynchronously after
    net::NoVarySearchCacheStorage::Start() is called, once per on-the-record
    NetworkContext creation.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.LoadTime.Failure" units="ms"
    expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time between calling net::NoVarySearchCacheStorage::Start() and
    discovering that persistence has failed to be initialized, including
    cross-thread task posting overhead. See HttpCache.NoVarySearch.LoadResult
    for the cause of failure.

    Logged once per unsuccessful call to net::NoVarySearchCacheStorage::Start().
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.LoadTime.Success" units="ms"
    expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time between calling net::NoVarySearchCacheStorage::Start() and starting
    to use the previously-persisted data, including cross-thread task posting
    overhead. This is logged in any case where persistence is able to continue,
    even when data may have been lost. See HttpCache.NoVarySearch.LoadResult for
    the actual success rate in loading persisted data.

    Logged once per successful call to net::NoVarySearchCacheStorage::Start().
  </summary>
</histogram>

<histogram
    name="HttpCache.NoVarySearch.LookupTime{HitOrMiss}{MainFrameOrNot}{BaseUrlMatchedOrNot}"
    units="microseconds" expires_after="2027-02-14">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time spent executing net::NoVarySearchCache::Lookup(). This is recorded
    once for every call to the function {HitOrMiss}. {MainFrameOrNot}
    {BaseUrlMatchedOrNot}

    This will be used to evaluate the need for optimization.

    The histogram is not reported on Windows machines without high resolution
    clocks.
  </summary>
  <token key="HitOrMiss">
    <variant name="" summary="so approximately once for every HTTP(S) request"/>
    <variant name=".Hit" summary="that finds a match"/>
    <variant name=".Miss" summary="that doesn't find a match"/>
  </token>
  <token key="MainFrameOrNot">
    <variant name="" summary=""/>
    <variant name=".MainFrame"
        summary="Only logged for main frame navigations."/>
  </token>
  <token key="BaseUrlMatchedOrNot">
    <variant name="" summary=""/>
    <variant name=".BaseUrlMatched"
        summary="Only logged when the base URL is matched."/>
  </token>
</histogram>

<histogram name="HttpCache.NoVarySearch.NotUsableLostTime2.NotSuitable"
    units="microseconds" expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time lost due to a successful lookup in the NoVarySearchCache that was
    later found to not be usable by Simple Cache in-memory hints. This happens
    when an entry is stale and cannot be revalidated, and the load flags do not
    permit the use of stale entries.

    In these cases the transaction is restarted with the original URL without
    using the NoVarySearchCache, and so time has been lost compared to if we'd
    never used the NoVarySearchCache at all. This histogram measures that lost
    time.

    This doesn't include the actual lookup time, but that is recorded in
    HttpCache.NoVarySearch.LookupTime.Hit and is usually an order of magnitude
    smaller.

    Recorded once for every cache transaction which is restarted due to getting
    a hit in the NoVarySearchCache that was then found to be unusable due to
    Simple Cache in-memory hints. This corresponds to the NoVarySearchUseResult
    case &quot;Not suitable&quot;.

    This is a subset of the HttpCache.NoVarySearch.NotUsableLostTime2 histogram
    that is expected to be fast due to not including any asynchronous
    operations.

    The histogram is not reported on Windows machines without high resolution
    clocks.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.NotUsableLostTime2{HostAndFrameType}"
    units="ms" expires_after="2027-02-07">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time lost due to a successful lookup in the NoVarySearchCache that was
    later found to not be usable, usually due to the disk entry either being
    missing or not conditionalizable.

    In these cases the transaction is restarted with the original URL without
    using the NoVarySearchCache, and so time has been lost compared to if we'd
    never used the NoVarySearchCache at all. This histogram measures that lost
    time.

    This doesn't include the actual lookup time, but that is recorded in
    HttpCache.NoVarySearch.LookupTime.Hit and is usually an order of magnitude
    smaller.

    Recorded once for {HostAndFrameType} cache transaction which is restarted
    due to getting a hit in the NoVarySearchCache that was later found to be
    unusable. This corresponds to the NoVarySearchUseResult cases &quot;Not
    openable&quot;, &quot;Incomplete body&quot; and &quot;Couldn't
    conditionalize&quot;.

    This histogram replaced HttpCache.NoVarySearch.NotUsableLostTime, which was
    logged too eagerly in some edge cases.
  </summary>
  <token key="HostAndFrameType">
    <variant name="" summary="any"/>
    <variant name=".GoogleHost.MainFrame"
        summary="any Google host, main frame resource"/>
  </token>
</histogram>

<histogram
    name="HttpCache.NoVarySearch.RenameOrDeleteResult.{Directory}.{File}"
    enum="NoVarySearchRenameOrDeleteResult" expires_after="2026-09-20">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The result from checking for and possibly moving {File} from the {Directory}
    directory to a new location.

    This is logged when an on-the-record NetworkContext is created.

    &quot;Source did not exist&quot; and &quot;Renamed&quot; are good outcomes.
    &quot;Rename failed&quot; means the user had to start again from an empty
    NoVarySearchCache, but is otherwise harmless. See
    HttpCache.NoVarySearch.InitRenameError.* for the actual filesystem error.
    &quot;Source deleted&quot; probably means rename failed on a previous run
    but is harmless. &quot;Deletion failed&quot; means we left junk on the
    user's disk but is otherwise harmless. See
    HttpCache.NoVarySearch.InitDeleteError.* for the actual filesystem error.
  </summary>
  <token key="Directory">
    <variant name="NoVarySearch" summary="no-vary-search"/>
    <variant name="Parent" summary="parent"/>
  </token>
  <token key="File">
    <variant name="Journal" summary="journal.baj"/>
    <variant name="Snapshot" summary="snapshot.baf"/>
  </token>
</histogram>

<histogram name="HttpCache.NoVarySearch.ReplaceFileError"
    enum="PlatformFileError" expires_after="2026-11-01">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The error code returned by base::ReplaceFile() inside the concrete
    implementation of NoVarySearchCacheStorageFileOperations::AtomicSave().

    On Windows base::ReplaceFile() may be retried on failure, and if it is
    subsequently successful then this histogram will not be logged. See
    &quot;HttpCache.NoVarySearch.ReplaceFileTryCount&quot;.

    Logged once per failure to replace the file in AtomicSave(). Not logged on
    success.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.ReplaceFileTryCount" units="tries"
    expires_after="2026-08-30">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The number of calls to ReplaceFile() in ReplaceFileWithRetries() needed
    until one is successful. This should usually be 1, but may be more if there
    was interference from an anti-virus or other third-party program.

    Only logged on Windows because retries are only necessary on Windows.

    Not logged when ReplaceFile fails more than the maximum numer of retries. In
    that case &quot;HttpCache.NoVarySearch.ReplaceFileError&quot; will be logged
    with a value of IN_USE instead.

    Logged once for each successful call to AtomicSave() in the concrete
    implementation of NoVarySearchCacheStorageFileOperations on Windows.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.ReplayedJournalEntries" units="entries"
    expires_after="2027-02-07">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Number of entries successfully read from the &quot;journal.baj&quot; file.
    This is logged once for every journal file that is successfully opened for
    reading and found to have a correct magic number. Journal load is triggered
    asynchronously by a call to net::NoVarySearchCacheStorage::Start() and
    happens once per on-the-record NetworkContext.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.SnapshotLoadError"
    enum="PlatformFileError" expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to open the
    &quot;snapshot.baf&quot; file for reading by net::NoVarySearchCacheStorage.
    This is logged when loading &quot;snapshot.baf&quot; fails.
    &quot;snapshot.baf&quot; is loaded when an on-the-record profile is
    initialized, typically during browser startup.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.SnapshotSaveError"
    enum="PlatformFileError" expires_after="2027-01-17">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The filesystem error from a failed attempt to write the
    &quot;snapshot.baf&quot; file by net::NoVarySearchCacheStorage. This is
    logged any time writing &quot;snapshot.baf&quot; fails.
    &quot;snapshot.baf&quot; is written when a new on-the-record profile is
    created, and rewritten when &quot;journal.baj&quot; gets too full or when a
    bulk erase is done on the cache.

    After an error, persistence is abandoned, and so this will be logged at most
    once per NetworkContext created.
  </summary>
</histogram>

<histogram name="HttpCache.NoVarySearch.UseResult2{HostAndFrame}"
    enum="NoVarySearchUseResult" expires_after="2027-02-07">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The results of applying the No-Very-Search algorithm in the HTTP disk
    cache{HostAndFrame}. This metric is emitted once for every cache transaction
    when the transaction is complete.

    &quot;Used&quot; and &quot;Validated&quot; are the happy cases where
    applying No-Vary-Search reduced network traffic. &quot;Not applied&quot;,
    &quot;No match&quot; and &quot;URL Unchanged&quot; it didn't help, but at
    minimal cost. In the case of &quot;Updated&quot;, a different entry was
    written than would have been otherwise but nothing user-visible changed.
    &quot;Not suitable&quot; means it didn't help at a slightly higher cost. The
    other values mean it didn't help, and there was a cost of additional disk
    reads.

    This histogram replaced &quot;HttpCache.NoVarySearch.UseResult&quot;, which
    was accidentally missing cache transactions that ended with a &quot;Not
    Covered&quot; reason.
  </summary>
  <token key="HostAndFrame">
    <variant name="" summary=""/>
    <variant name=".GoogleHost.MainFrameHTML"
        summary="to Google hosts for main frame resources"/>
  </token>
</histogram>

<histogram name="HttpCache.OpenDiskEntry" units="ms" expires_after="2027-02-07">
  <owner>yhirano@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time taken to open a disk cache entry. Recorded when the entry is
    created for the first time in the HttpCacheTransaction. Not recorded if the
    cache is memory-backed.
  </summary>
</histogram>

<histogram name="HttpCache.Pattern.NotCoveredReason{CachedResourceType}"
    enum="HttpCacheNotCoveredReason" expires_after="2026-11-29">
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For each http cache transaction that reported &quot;Not covered&quot; to the
    HttpCache.Pattern histogram, the reason why it was not covered. Logged once
    for every cache transaction that records a &quot;Not covered&quot; reason,
    in the destructor. {CachedResourceType}
  </summary>
  <token key="CachedResourceType">
    <variant name=""/>
    <variant name=".MainFrameHTML"
        summary="Showing reasons only for main-frame HTML resources."/>
  </token>
</histogram>

<histogram name="HttpCache.Pattern{CachedResourceType}" enum="HttpCachePattern"
    expires_after="2027-01-10">
  <owner>morlovich@chromium.org</owner>
  <owner>jkarlin@chromium.org</owner>
  <summary>
    For each http cache transaction, the recorded pattern. {CachedResourceType}
  </summary>
  <token key="CachedResourceType">
    <variant name=""/>
    <variant name=".Audio"
        summary="Showing cache patterns only for audio resources."/>
    <variant name=".CSS"
        summary="Showing cache patterns only for CSS resources."/>
    <variant name=".CSSThirdParty"
        summary="Showing cache patterns only for CSS resources with a
                 different origin from the top level origin."/>
    <variant name=".Font"
        summary="Showing cache patterns only for font resources."/>
    <variant name=".FontThirdParty"
        summary="Showing cache patterns only for font resources with a
                 different origin from the top level origin."/>
    <variant name=".Image"
        summary="Showing cache patterns only for image resources."/>
    <variant name=".JavaScript"
        summary="Showing cache patterns only for JavaScript resources."/>
    <variant name=".JavaScriptThirdParty"
        summary="Showing cache patterns only for JavaScript resources with a
                 different origin from the top level origin."/>
    <variant name=".MainFrameHTML"
        summary="Showing cache patterns only for main-frame HTML resources."/>
    <variant name=".NonMainFrameHTML"
        summary="Showing cache patterns only for non-main-frame HTML
                 resources."/>
    <variant name=".NonTinyImage"
        summary="Showing cache patterns only for image resources with
                 content-length &gt;= 100 bytes."/>
    <variant name=".TinyImage"
        summary="Showing cache patterns only for image resources with
                 content-length less than 100 bytes."/>
    <variant name=".Video"
        summary="Showing cache patterns only for video resources."/>
  </token>
</histogram>

<histogram name="HttpCache.ResponseFreshnessIsZero" enum="Boolean"
    expires_after="2027-06-01">
  <owner>hayato@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Whether the freshness of a response is zero or not. Recorded for each http
    cache transaction. Emitted when a response is written into the HTTP cache.
  </summary>
</histogram>

<histogram name="HttpCache.SetMaxBytes.BackendStartedOrStarting" enum="Boolean"
    expires_after="2026-12-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    For each call to HttpCache::SetMaxBytes, records whether the disk cache
    backend was already created or is at least being created. This is emitted
    regardless of whether force_initialization is true or false for the
    SetMaxBytes call.

    HttpCache::SetMaxBytes is usually called as a result of using a setter in
    the Android WebView HTTP Cache Quota API.
  </summary>
</histogram>

<histogram name="HttpCache.TimeToInitDiskCache" units="ms"
    expires_after="2026-12-18">
  <owner>haihan@google.com</owner>
  <owner>valadkevich@google.com</owner>
  <summary>
    The time taken to initialize the disk cache at
    disk_cache::CreateCacheBackend level.
  </summary>
</histogram>

<histogram name="HttpCache.TotalDiskCacheTimePerTransaction.{AccessType}"
    units="ms" expires_after="2027-01-31">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Deprecated. Replaced by
    HttpCache.TotalDiskCacheTimePerTransaction.{AccessType}2.
  </summary>
  <token key="AccessType">
    <variant name="Read"/>
    <variant name="Write"/>
  </token>
</histogram>

<histogram name="HttpCache.TotalDiskCacheTimePerTransaction.{AccessType}2"
    units="ms" expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    For each HTTP cache transaction, record total time spent {AccessType} the
    disk cache. Recorded when a transaction finished. This histogram does not
    record partial requests.
  </summary>
  <token key="AccessType">
    <variant name="Read" summary="reading from"/>
    <variant name="Write" summary="writing to"/>
  </token>
</histogram>

<histogram name="Net.AcceptCHFrameInterceptor.MismatchClientHint2"
    enum="WebClientHintsType" expires_after="2026-10-11">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    To optimize performance, the network service can handle `Accept-CH` frames
    directly without consulting the browser process (an optimization called
    'offloading'). This histogram is recorded when that optimization fails. It
    identifies the specific client hint from the `Accept-CH` frame that was not
    in the network service's cache of hints the browser had previously
    identified as either allowed or disallowed for the origin. A value is
    recorded each time this mismatch occurs, forcing a fallback to the browser
    process.
  </summary>
</histogram>

<histogram name="Net.AcceptCHFrameInterceptor.NeedsObserverCheckReason"
    enum="NeedsObserverCheckReason" expires_after="2027-02-14">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The reason why AcceptCHFrameInterceptor::NeedsObserverCheck returns true.
    Recorded every time NeedsObserverCheck is called. It is recorded just before
    returning from the function.
  </summary>
</histogram>

<histogram name="Net.AcceptCHFrameInterceptor.OffloadSuccessForNotAllowedHint"
    enum="WebClientHintsType" expires_after="2026-08-01">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    When handling an `Accept-CH` frame, the network service can sometimes avoid
    a costly round-trip to the browser process by checking for required client
    hints itself (an optimization called 'offloading'). This histogram is
    recorded for each client hint that was successfully offloaded specifically
    because of a mechanism enabled by the AcceptCHFrameOffloadNotAllowedHints
    feature parameter. This mechanism allows offloading for hints that are
    persisted for an origin but currently disabled by Permissions Policy. This
    metric helps measure the effectiveness of this opt-in optimization.
  </summary>
</histogram>

<histogram name="Net.AlternateProtocolBrokenLocation"
    enum="BrokenAlternateProtocolLocation" expires_after="2024-02-25">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Breakdown of the locations when SetBrokenAlternateProtocol is called.
  </summary>
</histogram>

<histogram name="Net.AlternateProtocolUsage" enum="AlternateProtocolUsage"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Breakdown of how requests which could potentially make use of an alternate
    protocol use or don't use the protocol.
  </summary>
</histogram>

<histogram name="Net.AlternateProtocolUsageGoogle"
    enum="AlternateProtocolUsage" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Breakdown of how requests which could potentially make use of an alternate
    protocol use or don't use the protocol, for connections to Google servers.
  </summary>
</histogram>

<histogram name="Net.AlternateServiceFailed" enum="NetErrorCodes"
    expires_after="2025-04-13">
  <owner>tbansal@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Positive net error codes that failed alternative protocol requests end with.
    Recorded only when an alternative job fails, and the main job succeeds.
  </summary>
</histogram>

<histogram name="Net.AlternateServiceForDnsAlpnH3Failed" enum="NetErrorCodes"
    expires_after="2024-07-28">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Positive net error codes that failed alternative protocol requests end with.
    Recorded only when an DNS alpn H3 job fails, and the main job succeeds.
  </summary>
</histogram>

<histogram name="Net.AlternativeServiceTypeForRequest"
    enum="AlternativeServiceType" expires_after="2027-01-17">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Information about the AlternativeService used for each request.

    Warning: this histogram was expired from 2024-04-03 to 2024-05-31; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Net.Android.NetworkChangeNotifier.RegisterDefaultNetworkCallbackResult"
    enum="NetworkCallbackRegisterResult" expires_after="2027-08-18">
  <owner>lukedeng@google.com</owner>
  <owner>dmurph@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The outcome of attempting to register the Android default network callback
    in NetworkChangeNotifierAutoDetect.

    Recorded on Android 28+ (Pie+) on every registration attempt: - On
    application startup or when returning to the foreground (visible activity
    created/resumed). - When an activity regains window focus and triggers a
    self-healing retry because previous callback registration had failed.

    If an initial registration throws a SecurityException (e.g. transient UID
    permission delay on waking from Doze mode), a single immediate retry is
    attempted. This histogram records the final result (initial success with or
    without immediate retry, focus self-heal success with or without immediate
    retry, or failure categorized by exception type).
  </summary>
</histogram>

<histogram
    name="Net.Android.NetworkChangeNotifier.RegisterNetworkCallbackResult"
    enum="NetworkCallbackRegisterResult" expires_after="2027-08-18">
  <owner>lukedeng@google.com</owner>
  <owner>dmurph@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The outcome of attempting to register the Android network request callback
    in NetworkChangeNotifierAutoDetect.

    Recorded on Android 21+ (Lollipop+) on every registration attempt: - On
    application startup or when returning to the foreground (visible activity
    created/resumed). - When an activity regains window focus and triggers a
    self-healing retry because previous callback registration had failed.

    If an initial registration throws a SecurityException (e.g. transient UID
    permission delay on waking from Doze mode), a single immediate retry is
    attempted. This histogram records the final result (initial success with or
    without immediate retry, focus self-heal success with or without immediate
    retry, or failure categorized by exception type).
  </summary>
</histogram>

<histogram name="Net.Android.NetworkChangeNotifier.RegistrationException"
    enum="NetworkCallbackRegistrationException" expires_after="2027-08-18">
  <owner>lukedeng@google.com</owner>
  <owner>dmurph@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Categorization of exceptions caught during Android ConnectivityManager
    callback registration in NetworkChangeNotifierAutoDetect.

    Recorded once on each failed registration attempt when all retries have been
    exhausted. Categorizes the final exception into SecurityException,
    TooManyRequestsException, IllegalArgumentException, IllegalStateException,
    or other RuntimeException.
  </summary>
</histogram>

<histogram
    name="Net.Android.NetworkChangeNotifier.SelfHealDefaultNetworkResult"
    enum="NetworkCallbackSelfHealResult" expires_after="2027-08-18">
  <owner>lukedeng@google.com</owner>
  <owner>dmurph@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The result of attempting to self-heal default network callback registration
    in NetworkChangeNotifierAutoDetect.

    Recorded when an Android activity regains window focus (onWindowFocusChanged
    with hasFocus=true) and the default network callback was previously in a
    failed state (e.g. due to Doze mode restrictions). Records whether the
    recovery attempt succeeded (RECOVERED) or failed (FAILED).
  </summary>
</histogram>

<histogram name="Net.Android.NetworkChangeNotifier.SelfHealNetworkResult"
    enum="NetworkCallbackSelfHealResult" expires_after="2027-08-18">
  <owner>lukedeng@google.com</owner>
  <owner>dmurph@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The result of attempting to self-heal network request callback registration
    in NetworkChangeNotifierAutoDetect.

    Recorded when an Android activity regains window focus (onWindowFocusChanged
    with hasFocus=true) and the network request callback was previously in a
    failed state (e.g. due to Doze mode restrictions). Records whether the
    recovery attempt succeeded (RECOVERED) or failed (FAILED).
  </summary>
</histogram>

<histogram name="Net.BlobFetch.ResponseNetErrorCode" enum="NetErrorCodes"
    expires_after="2026-06-28">
  <owner>leimy@chromium.org</owner>
  <owner>chrome-owp-storage@google.com</owner>
  <summary>
    Net error code from a blob fetch request. It's recorded as the abolute value
    of the raw error code when a blob fetch request fails, or as 0 when the
    request receives response.
  </summary>
</histogram>

<histogram name="Net.CachingCertVerifier.CacheHit{HostType}" enum="Boolean"
    expires_after="2027-02-07">
  <owner>nidhijaju@chromium.org</owner>
  <owner>chrome-network-stack@google.com</owner>
  <summary>
    Records if a certificate verification result was provided from the cache or
    not for connections to {HostType}. Recorded after checking the certificate
    verification cache when CachingCertVerifier::Verify() is called.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".Google" summary="Google hosted servers"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
</histogram>

<histogram
    name="Net.CachingCertVerifier.{VerificationCompletionType}.UncachedVerifyTime{HostType}"
    units="ms" expires_after="2027-02-07">
  <owner>nidhijaju@chromium.org</owner>
  <owner>chrome-network-stack@google.com</owner>
  <summary>
    Records the time taken to {VerificationCompletionType} verify a certificate
    if not found in the certificate verification cache for connections to
    {HostType}. Recorded after a certificate is verified in the
    CachingCertVerifier.

    Note: This is similar to Net.CertVerifier_Job_Latency which is recorded in
    CoalescingCertVerifier. CachingCertVerifier wraps the
    CoalescingCertVerifier, so the main difference is if there are multiple
    verifications for the same params in a short time span,
    CoalescingCertVerifier records a single histogram event from the start of
    the first verification request, whereas this histogram includes the effect
    of averaging out the times if multiple requests are coalesced together.
  </summary>
  <token key="VerificationCompletionType">
    <variant name="Async" summary="asynchronously"/>
    <variant name="Sync" summary="synchronously"/>
  </token>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".Google" summary="Google hosted servers"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
</histogram>

<histogram name="Net.CanPool.CTRequirementStatus" enum="CTRequirementStatus"
    expires_after="2027-01-17">
  <owner>mattm@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    Records the result of CheckCTRequirements when evaluating whether a SPDY or
    QUIC connection can pool with an existing session.
  </summary>
</histogram>

<histogram name="Net.Certificate.ChangeNotification"
    enum="CertificateChangeNotificationType" expires_after="never">
<!-- expires-never: core cert verifier metric; monitored by Chirps -->

  <owner>mattm@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <summary>
    Recorded each time a platform certificate change notification occurs. (Note
    that on Linux and ChromeOS these events are generated by the Chrome
    Certificate Manager but there are no notifications for changes that occurred
    outside of Chrome, and on Windows there are no notifications at all.)

    This does not count internal changes like Chrome Root Store and CRLSet
    updates.
  </summary>
</histogram>

<histogram name="Net.Certificate.TrustAnchor.Request" enum="NetTrustAnchors"
    expires_after="2027-01-10">
  <owner>mattm@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    The SHA-256 hash of the subjectPublicKeyInfo of the most-specific trust
    anchor encountered in a successfully-verified certificate chain, during an
    HTTP URL request. The associated root certificate can be looked up using
    https://crt.sh/?spkisha256= .

    This histogram is being replaced by Net.Certificate.TrustAnchor2.Request and
    will be removed once the new histogram has built up enough history.
  </summary>
</histogram>

<histogram name="Net.Certificate.TrustAnchor.Verify" enum="NetTrustAnchors"
    expires_after="2027-01-10">
  <owner>mattm@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    The SHA-256 hash of the subjectPublicKeyInfo of the most-specific trust
    anchor encountered in a successfully-verified certificate chain, during
    verification time. The associated root certificate can be looked up using
    https://crt.sh/?spkisha256= .

    This histogram is being replaced by Net.Certificate.TrustAnchor2.Verify and
    will be removed once the new histogram has built up enough history.
  </summary>
</histogram>

<histogram name="Net.Certificate.TrustAnchor.VerifyOutOfDate"
    enum="BooleanOutOfDate" expires_after="2027-01-10">
  <owner>mattm@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    This histogram is recorded every time Chrome successfully validates a
    certificate, but cannot determine a public trust anchor from the verified
    chain. A value of true indicates that the trust anchor list is out of date,
    as the OS believes a public trust anchor is being used, but the built-in
    list does not know about this trust anchor, while a value of false indicates
    that a public trust anchor was not used, thus there is no evidence that the
    list is out of date. This histogram is temporary until the transition to a
    unified root store (in source), at which point, the OS store will no longer
    be consulted for known roots.
  </summary>
</histogram>

<histogram name="Net.Certificate.TrustAnchor2.Request" enum="CrsRootIds"
    expires_after="never">
<!-- expires-never: Used for CA risk assessment ( https://goto.google.com/chrome-root-ca-stats ) -->

  <owner>mattm@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    For each HTTP URL request satisfied by an active connection (non-cached
    requests), where the server certificate verified successfully and the Chrome
    Root Store is being used, records the Chrome Root Store stable ID of the
    root of trust of the successfully verified certificate chain. In the case
    where the Chrome Root Store includes trusted intermediate CA certificates
    and the verified path terminated at a trusted intermediate, the ID will be
    that of the root certificate, as if the path had been built all the way to
    the root.
  </summary>
</histogram>

<histogram name="Net.Certificate.TrustAnchor2.Verify" enum="CrsRootIds"
    expires_after="never">
<!-- expires-never: Used for CA risk assessment ( https://goto.google.com/chrome-root-ca-stats ) -->

  <owner>mattm@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    For each certificate verification, where the certificate verified
    successfully and the Chrome Root Store is being used, records the Chrome
    Root Store stable ID of the root of trust of the successfully verified
    certificate chain. Does not include cached verifications, and is only
    recorded once when multiple identical verification inputs are coalesced into
    a single verification attempt. In the case where the Chrome Root Store
    includes trusted intermediate CA certificates and the verified path
    terminated at a trusted intermediate, the ID will be that of the root
    certificate, as if the path had been built all the way to the root.
  </summary>
</histogram>

<histogram name="Net.CertificateTransparency.SCTOrigin" enum="SCTOrigin"
    expires_after="2027-02-07">
  <owner>estark@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    The origin breakdown of Signed Certificate Timestamps (SCTs). Emitted once
    for every SCT when first validated, which means 0 or more times during every
    SSL connection establishment.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.AndroidTrustStoreInit" units="ms"
    expires_after="2024-04-28">
  <owner>hchao@chromium.org</owner>
  <owner>mattm@chromium.org</owner>
  <summary>
    Time needed to initialize the Android platform Trust store when using the
    builtin certificate verifier on Android.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.CTRequirementStatus"
    enum="CTRequirementStatus" expires_after="2027-01-17">
  <owner>mattm@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    Records the result of CheckCTRequirements after a certificate verification.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.DoVerifyOnWorkerThreadTime{HostType}"
    units="ms" expires_after="2027-01-31">
  <owner>nidhijaju@chromium.org</owner>
  <owner>chrome-network-stack@google.com</owner>
  <summary>
    Records the time taken to verify the certificate on a worker thread for
    connections to {HostType}. This is recorded after a certificate is verified
    in the MultithreadedCertVerifier, and does not include the thread hop from
    the network service.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".Google" summary="Google hosted servers"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
</histogram>

<histogram name="Net.CertVerifier.MacKeychainCerts.IntermediateCacheInitTime"
    units="ms" expires_after="2024-02-01">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    When initializing the builtin certificate verifier on Mac using the
    DomainCacheFullCerts implementation of the system trust store integration,
    this records how long it took to query the Mac keychain and initialize the
    cache of intermediate certificates.

    Warning: this histogram was expired from 2023-04-09 to 2023-06-07(M116);
    data may be missing.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.MacKeychainCerts.IntermediateCount"
    units="certificates" expires_after="2024-04-28">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    When initializing the builtin certificate verifier on Mac using the
    DomainCacheFullCerts or KeychainCacheFullCerts implementation of the system
    trust store integration, this records the number of certificates that were
    included in the cache of intermediate certificates.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.MacKeychainCerts.TotalCount"
    units="certificates" expires_after="2024-04-28">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    When initializing the builtin certificate verifier on Mac using the
    DomainCacheFullCerts or KeychainCacheFullCerts implementation of the system
    trust store integration, this records the number of certificates found in
    the Mac keychain.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.MacKeychainCerts.TrustCount"
    units="certificates" expires_after="2024-02-01">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    When initializing the builtin certificate verifier on Mac using the
    KeychainCacheFullCerts implementation of the system trust store integration,
    this records the number of certificates found in the Mac keychain which had
    trust records marking them as either trusted or distrusted.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.MacTrustDomainCacheInitTime" units="ms"
    expires_after="2024-04-28">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    When the builtin certificate verifier is used on Mac and the platform
    trusted certificates cache is initialized (or re-initialized if keychain
    trust settings changed), records how long it took to initialize all the
    trust domain caches. Only recorded by the DomainCacheFullCerts
    implementation, which may or may not be used depending on Finch trial
    parameters.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.MacTrustDomainCertCount.{Domain}"
    units="certificates" expires_after="2024-02-01">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    When the builtin certificate verifier is used on Mac and the platform
    trusted certificates cache is initialized (or re-initialized if keychain
    trust settings changed), records the number of certificates read from the
    {Domain} trust domain. Only counts certificates that were successfully
    parsed. Only recorded by the DomainCacheFullCerts implementation, which may
    or may not be used depending on Finch trial parameters.

    Warning: this histogram was expired from 2023-04-09 to 2023-06-07(M116);
    data may be missing.
  </summary>
  <token key="Domain">
    <variant name="Admin"/>
    <variant name="System"/>
    <variant name="User"/>
  </token>
</histogram>

<histogram name="Net.CertVerifier.MacTrustImplCacheInitTime" units="ms"
    expires_after="2024-04-28">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    When the builtin certificate verifier is used on Mac and the platform
    trusted certificates cache is initialized (or re-initialized if keychain
    trust settings changed), records how long it took to initialize both the
    trust cache and the intermediates cache. Only recorded by the
    DomainCacheFullCerts and KeychainCacheFullCerts implementations, which may
    or may not be used depending on Finch trial parameters.
  </summary>
</histogram>

<histogram
    name="Net.CertVerifier.NameNormalizationPrivateRoots{CertVerifyProcImpl}"
    enum="NetCertificateNameNormalization" expires_after="2023-01-15">
  <owner>mattm@chromium.org</owner>
  <owner>rsleevi@chromium.org</owner>
  <summary>
    Whether Name normalization was used in successfully validated certificate
    chains, only recorded for chains ending in privately trusted roots. Suffixed
    by the CertVerifyProc implementation. {CertVerifyProcImpl}
  </summary>
  <token key="CertVerifyProcImpl">
    <variant name=".Android" summary="CertVerifyProcAndroid"/>
    <variant name=".Builtin" summary="CertVerifyProcBuiltin"/>
    <variant name=".IOS" summary="CertVerifyProcIOS"/>
    <variant name=".Mac" summary="CertVerifyProcMac"/>
    <variant name=".NSS" summary="CertVerifyProcNSS"/>
    <variant name=".Win" summary="CertVerifyProcWin"/>
  </token>
</histogram>

<histogram name="Net.CertVerifier.NSSCertMigrationResult"
    enum="NetCertVerifierNSSCertMigrationResult" expires_after="2026-10-11">
  <owner>mattm@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <summary>
    Records the result of migrating certificates from the user's NSS database
    into the ServerCertificateDatabase.

    This only applies on ChromeOS when then kEnableCertManagementUIV2Write flag
    is enabled, and is only recorded when migration is required (once per
    profile, on the first time the profile is loaded after the feature flag is
    flipped to true).
  </summary>
</histogram>

<histogram name="Net.CertVerifier.Qwac.1Qwac" enum="NetCertVerifier1QwacResult"
    expires_after="2026-11-16">
  <owner>mattm@chromium.org</owner>
  <owner>src/net/cert/OWNERS</owner>
  <summary>
    Result of attempting to verify if a certificate is a valid 1-QWAC (EU
    qualified website authentication certificate).

    This will be emitted only when the VerifyQWACs feature flag is enabled,
    Chrome Root Store is being used and CertVerifyProcBuiltin::VerifyInternal
    returns OK.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.Qwac.2QwacBinding"
    enum="NetCertVerifier2QwacBindingResult" expires_after="2026-11-16">
  <owner>mattm@chromium.org</owner>
  <owner>src/net/cert/OWNERS</owner>
  <summary>
    Result of attempting to verify if a 2-QWAC (EU qualified website
    authentication certificate) binding is valid and binds the specified TLS
    certificate.

    This will be emitted only when the VerifyQWACs feature flag is enabled,
    Chrome Root Store is being used, the site's TLS certificate validates
    successfully, the request includes a 2-QWAC link header, and fetching and
    processing the 2-QWAC binding is successful.
  </summary>
</histogram>

<histogram name="Net.CertVerifier.Qwac.2QwacLinkProcessing"
    enum="NetCertVerifier2QwacLinkProcessingResult" expires_after="2026-11-16">
  <owner>mattm@chromium.org</owner>
  <owner>src/net/cert/OWNERS</owner>
  <summary>
    Result of processing 2-QWAC link headers.

    This will be emitted only for committed TLS main frame navigations when the
    VerifyQWACs feature flag is enabled and Chrome Root Store is being used.
    (Notably, it is not recorded for same-page navigations, nor are Link headers
    on main-frame redirects processed or histogrammed.)
  </summary>
</histogram>

<histogram name="Net.CertVerifier_First_Job_Latency" units="ms"
    expires_after="never">
<!-- expires-never: core cert verifier metric; monitored by Chirps -->

  <owner>mattm@chromium.org</owner>
  <owner>rsleevi@chromium.org</owner>
  <summary>
    The actual amount of time spent verifying a certificate using the underlying
    cryptographic APIs. Because parallel verifications for the same certificate
    may be coalesced, histograms such as Net.SSLCertVerificationTime may be
    skewed, due to later verifications taking less overall time. This records
    the overall time spent verifying the first job to capture initialization
    costs.
  </summary>
</histogram>

<histogram name="Net.CertVerifier_Job_Latency" units="ms" expires_after="never">
<!-- expires-never: core cert verifier metric; monitored by Chirps -->

  <owner>rsleevi@chromium.org</owner>
  <owner>mattm@chromium.org</owner>
  <summary>
    The actual amount of time spent verifying a certificate using the underlying
    cryptographic APIs. Because parallel verifications for the same certificate
    may be coalesced, histograms such as Net.SSLCertVerificationTime may be
    skewed, due to later verifications taking less overall time. This records
    the overall time spent verifying a single request, regardless of how many
    parallel requests are being served by the verification.
  </summary>
</histogram>

<histogram name="Net.ConnectionInfo.MainFrame" enum="ConnectionInfo"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Application protocol used for main frame resources. Logged by the renderer
    only for request that accessed the network and have received response
    headers.
  </summary>
</histogram>

<histogram name="Net.ConnectionInfo.SubResource" enum="ConnectionInfo"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Application protocol used for subresources (resources other than main
    frame). Logged by the renderer only for request that accessed the network
    and have received response headers.
  </summary>
</histogram>

<histogram name="Net.ContentEncodingType2" enum="ContentEncodingType"
    expires_after="2026-12-27">
  <owner>nidhijaju@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    For each response stream, record the Content-Encoding type. If multiple
    encoding types are specified, this histogram only records the last one.
    Note: Compression Dictionary Transport headers (i.e. &quot;sbr&quot; for
    Shared Brotli) will be recorded as &quot;Unknown&quot; in this histogram.
  </summary>
</histogram>

<histogram name="Net.CountOfBrokenAlternativeServices" units="services"
    expires_after="2027-02-14">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The number of broken alternative services loaded from the prefs file on
    startup. Alternative services allow an origin server to specify additional
    means of interacting with it on the network. A broken alternative service is
    one whose most recent connection attempt failed and whose retry timeout
    period has not yet expired. Recorded when broken alternative services are
    loaded from the prefs file on startup.
  </summary>
</histogram>

<histogram name="Net.CountOfQuicServerInfos" units="configs"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    This counts the number of server configs persisted in prefs file.
  </summary>
</histogram>

<histogram name="Net.CountOfRecentlyBrokenAlternativeServices" units="services"
    expires_after="2024-08-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The number of recently broken alternative services loaded from the prefs
    file on startup. Alternative services allow an origin server to specify
    additional means of interacting with it on the network. A recently broken
    alternative service is one whose most recent connection attempt failed.
    Recorded when broken alternative services are loaded from the prefs file on
    startup.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.AttestationKeySaveOutcome"
    enum="DeviceBoundSessionAttestationKeySaveOutcome"
    expires_after="2026-12-25">
  <owner>jdoerrie@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the outcome of attempting to save the hardware attestation key
    during a Device Bound Session store operation (saving a new session or
    updating an existing one).
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.DeferralResultByOutcome.{Outcome}"
    enum="DeviceBoundSessionRefreshResult" expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the outcome of deferring a request due to a Device Bound
    Session (https://github.com/w3c/webappsec-dbsc/blob/main/README.md). This is
    logged every time a {Outcome} request is unblocked after being deferred,
    which is usually due to a refresh completing.
  </summary>
  <token key="Outcome">
    <variant name="Failure" summary="failed"/>
    <variant name="Success" summary="successful"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.DeferralResult{Duration}"
    enum="DeviceBoundSessionRefreshResult" expires_after="2027-01-03">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the outcome of deferring a request due to a Device Bound
    Session (https://github.com/w3c/webappsec-dbsc/blob/main/README.md). This is
    logged every time a request is unblocked after being deferred {Duration},
    which is usually due to a refresh completing.
  </summary>
  <token key="Duration">
    <variant name="" summary="for any duration of deferral"/>
    <variant name=".Instant" summary="if the deferral takes less than 1ms"/>
    <variant name=".Slow" summary="if the deferral takes more than 1ms"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.DeletionReason"
    enum="DeviceBoundSessionDeletionReason" expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the reason a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) was deleted.
    This is logged every time we terminate a session.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.GoogleRegistrationIsFromStandard"
    enum="Boolean" expires_after="2027-01-24">
  <owner>thefrog@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records whether a Google Device Bound Session registration was
    performed by the Device Bound Session Standard in Net code. The alternative
    is that it was done by BoundSessionCredentials SignIn code. Standard Device
    Bound Session registration is described in
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md). This histogram
    is logged every time the Standard or the BoundSessionCredentials SignIn code
    has just completed trying to register a new Google session, whether or not
    that registration succeeded.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.MinimumBoundCookieLifetime" units="ms"
    expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    On each refresh request due to a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md), this histogram
    logs the minimum bound cookie lifetime in the refresh response.
  </summary>
</histogram>

<histogram
    name="Net.DeviceBoundSessions.MinimumProactiveRefreshThreshold{Outcome}"
    units="ms" expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    On each refresh request due to a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md), this histogram
    logs the minimum threshold to make the previous request trigger a proactive
    refresh. This is logged {Outcome}.
  </summary>
  <token key="Outcome">
    <variant name="" summary="on every refresh"/>
    <variant name=".Failure"
        summary="when a proactive refresh would fail to prevent the current
                 refresh request"/>
    <variant name=".Success"
        summary="when a proactive refresh would successfully prevent the
                 current refresh request"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.PrewarmInvalidUrlConsecutiveFailures"
    units="failures" expires_after="2027-04-12">
  <owner>santosls@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the number of consecutive failures when the target_url provided to
    DeviceBoundSessionPrewarmer is invalid, empty, or not HTTPS, forcing it to
    fall back to a long prewarm interval. Recorded when DoPrewarm runs.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.PrewarmResult.{PrewarmType}"
    enum="DeviceBoundSessionRefreshResult" expires_after="2027-04-12">
  <owner>santosls@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the outcome of a prewarm operation per DBSC session. This is logged
    to {PrewarmType} track. Startup represents the first prewarm when started,
    and Scheduled represents the prewarms that are scheduled based on the Mojo
    response.
  </summary>
  <token key="PrewarmType">
    <variant name="Scheduled" summary="a scheduled prewarm"/>
    <variant name="Startup" summary="the startup prewarm"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.ProactiveRefreshAttempt"
    enum="DeviceBoundSessionProactiveRefreshAttempt" expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the outcome of attempting to proactively refresh a Device Bound
    Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md#refresh-procedure).
    It records the reasons we may not have attempted to refresh despite a bound
    cookie expiring soon. This is logged every time a request is made with a
    bound cookie expiring soon. For the final result of proactive refresh, see
    Net.DeviceBoundSessions.RefreshResult.Proactive.
  </summary>
</histogram>

<histogram
    name="Net.DeviceBoundSessions.ProactiveRefreshCandidateDeferredCount.{Threshold}"
    units="requests" expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    On each refresh request due to a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) that Chrome
    believes may have been preventable with proactive refresh, this histogram
    logs the number of deferrals that proactive refresh would have prevented.
    This is logged when the minimum threshold is {Threshold}.
  </summary>
  <token key="Threshold">
    <variant name="OneMinute" summary="less than 1 minute"/>
    <variant name="ThirtySeconds" summary="less than 30 seconds"/>
    <variant name="TwoMinutes" summary="less than 2 minutes"/>
  </token>
</histogram>

<histogram
    name="Net.DeviceBoundSessions.ProactiveRefreshCandidateRequestDeferredDuration.{Threshold}"
    units="requests" expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    On each refresh request due to a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) that Chrome
    believes may have been preventable with proactive refresh, this histogram
    logs the duration of each deferral that proactive refresh would have
    prevented. This is logged when the minimum threshold is {Threshold}.
  </summary>
  <token key="Threshold">
    <variant name="OneMinute" summary="less than 1 minute"/>
    <variant name="ThirtySeconds" summary="less than 30 seconds"/>
    <variant name="TwoMinutes" summary="less than 2 minutes"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.ProactiveRefreshDuration" units="ms"
    expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the duration of a proactive refresh of a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md#refresh-procedure).
    This is logged every time a proactive refresh is done, which is triggered by
    a request with a bound cookie expiring soon.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.Refresh.Network.Result{Attempt}"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2027-07-06">
  <owner>alexilin@chromium.org</owner>
  <owner>ahijazi@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the network result of a refresh request for a Device Bound
    Session (https://github.com/w3c/webappsec-dbsc/blob/main/README.md). This is
    logged when refresh network response processing finishes for {Attempt}. If a
    network error occurs at any point while reading the response body, that is
    logged instead of the HTTP status code.
  </summary>
  <token key="Attempt">
    <variant name=".FirstAttempt" summary="the first attempt"/>
    <variant name=".SecondAttempt" summary="the second attempt (retry)"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.RefreshChallengeCount"
    units="challenges" expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the number of challenge signings done during one Device Bound
    Session refresh (https://github.com/w3c/webappsec-dbsc/blob/main/README.md).
    This is logged at the end of each session refresh.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.RefreshQuotaExceededLastResult"
    enum="DeviceBoundSessionError" expires_after="2027-04-19">
  <owner>alexilin@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the last outcome of refreshing a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md#refresh-procedure)
    when we reject a refresh due to exceeding the refresh quota.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.RefreshResult{RefreshType}"
    enum="DeviceBoundSessionError" expires_after="2027-01-03">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the outcome of refreshing a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md#refresh-procedure).
    This is logged every time we attempt to refresh the cookies bound by a
    session due to {RefreshType}.
  </summary>
  <token key="RefreshType">
    <variant name="" summary="any refresh trigger"/>
    <variant name=".MissingCookie" summary="a missing cookie"/>
    <variant name=".Proactive" summary="the proactive refresh heuristics"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.RegistrationResult{RegistrationType}"
    enum="DeviceBoundSessionError" expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the outcome of {RegistrationType} Device Bound Session
    registration (https://github.com/w3c/webappsec-dbsc/blob/main/README.md).
    This is logged every time we attempt to register a new session.
  </summary>
  <token key="RegistrationType">
    <variant name="" summary="any"/>
    <variant name=".Federated" summary="a federated"/>
    <variant name=".Standalone" summary="a standalone"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.RequestDeferralCount"
    units="deferrals" expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records how many times a request was deferred due to a Device Bound
    Session (https://github.com/w3c/webappsec-dbsc/blob/main/README.md). This is
    logged once for each round trip of a network requests that can add a cookie
    header; requests that attempt to refresh but fail are omitted.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.RequestDeferralDecision3"
    enum="DeviceBoundSessionUsage2" expires_after="2027-01-24">
  <owner>thefrog@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records whether a request was deferred due to a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) and the reason
    for that decision. This is logged once for each round trip of most network
    requests that can add a cookie header; requests that attempt to refresh but
    fail are omitted.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.RequestDeferredCount" units="requests"
    expires_after="2027-02-07">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records how many requests were deferred by a single Device Bound
    Session (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) refresh.
    This is logged every time requests are unblocked, which is usually due to a
    refresh completing.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.RequestDeferredDuration" units="ms"
    expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the duration of each time a request is deferred due to a Device
    Bound Session (https://github.com/w3c/webappsec-dbsc/blob/main/README.md).
    This is logged every time one round trip of a network request is deferred.
    Under normal operations, a small fraction of network requests are deferred
    at most once. See also Net.DeviceBoundSessions.TotalRequestDeferredDuration.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.RequestsDeferredForInitialization"
    units="requests" expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the number of network requests deferred while we waited to load
    Device Bound Sessions
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) persisted to
    disk. It is logged once at startup, when sessions are loaded.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.SessionStoreLoadDuration" units="ms"
    expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records how long it took to load Device Bound Sessions
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) persisted to
    disk. It is logged once at startup, when sessions are loaded.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.SessionStoreLoadSuccess"
    enum="BooleanLoaded" expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records whether loading existing Device Bound Sessions
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) that were
    persisted to disk succeeded. It is logged once at startup, when sessions are
    loaded.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.SigningQuotaExceededLastResult"
    enum="DeviceBoundSessionError" expires_after="2027-01-03">
  <owner>thefrog@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the last outcome of refreshing a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md#refresh-procedure)
    when we reject a signing due to exceeding the signing quota.
  </summary>
</histogram>

<histogram name="Net.DeviceBoundSessions.TotalRequestDeferredDuration"
    units="ms" expires_after="2026-12-27">
  <owner>drubery@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the total amount of time a request spent deferred due to a
    Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md). This is logged
    once for every network request that is deferred, totalling the delay due to
    all deferrals. Under normal operations, this is a small fraction of network
    requests.
  </summary>
</histogram>

<histogram
    name="Net.DeviceBoundSessions.{RefreshType}RefreshAlreadyInProgressOnDeferAttempt"
    enum="Boolean" expires_after="2027-02-07">
  <owner>thefrog@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Logs whether there is already a Device Bound Session
    (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) {RefreshType}
    refresh attempt in progress, so there is no need to trigger a new refresh
    for this request. This histogram is logged when the Standard is attempting
    to defer a request for a valid session's refresh.
  </summary>
  <token key="RefreshType">
    <variant name="DeferredRequest" summary="deferred request"/>
    <variant name="Proactive" summary="proactive"/>
  </token>
</histogram>

<histogram name="Net.DeviceBoundSessions.{RequestType}.Network.Result"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2027-02-07">
  <owner>thefrog@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    This records the network result of a {RequestType} request for a Device
    Bound Session (https://github.com/w3c/webappsec-dbsc/blob/main/README.md).
    This is logged when {RequestType} network response processing finishes. If a
    network error occurs at any point while reading the response body, that is
    logged instead of the HTTP status code.
  </summary>
  <token key="RequestType">
    <variant name="ProviderWellKnown" summary="session provider .well-known"/>
    <variant name="Refresh" summary="refresh"/>
    <variant name="Registration" summary="registration"/>
    <variant name="RelyingPartyWellKnown" summary="relying party .well-known"/>
    <variant name="SubdomainWellKnown" summary="subdomain .well-known"/>
  </token>
</histogram>

<histogram name="Net.DNS.AddressSorterPosix.ConnectCalls" units="calls"
    expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the number of socket connect calls made during a single call to
    net::AddressSorterPosix::Sort(). Recorded once for every call to Sort().
    Only recorded on platforms that use the Posix implementation.
  </summary>
</histogram>

<histogram name="Net.DNS.AddressSorterPosix.SortDuration" units="microseconds"
    expires_after="2027-01-03">
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the time it takes to execute a single call to
    net::AddressSorterPosix::Sort(). Measured for every call to Sort(). Only
    recorded on platforms that use the Posix implementation.

    The histogram is not reported on systems without high resolution clocks.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.AdditionalDnsQueryTypesEnabled"
    enum="BooleanEnabled" expires_after="2025-02-10">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether or not `prefs::kAdditionalDnsQueryTypesEnabled` is enabled. Recorded
    at startup if disabled or whenever Chrome is believed to be
    enterprise-managed (per the same detection as the default disabling of DoH).
    Measures whether or not enterprise admins are setting the disable,
    potentially due to issues encoutered with HTTPS/INTEGRITY query experiments.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.DnsClientCapability"
    enum="DNS.DnsClientCapability" expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether DNS clients can and are allowed to perform secure and insecure DNS
    transactions. Logged when HostResolverManager receives a host resolution
    request using HostResolverSource::ANY.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.Nsswitch.Compatible" enum="BooleanValid"
    expires_after="2025-04-13">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether or not the DNS configuration read from a nsswitch.conf file is
    considered compatible with Chrome, that is that the configuration did not
    contain any options that Chrome is unable to support using the built-in
    resolver. Reported whenever a nsswitch.conf file is read by Chrome.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.Nsswitch.IncompatibleService"
    enum="NsswitchService" expires_after="2024-12-08">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Enumeration of the nsswitch.conf service that caused a compatibility issue,
    leading to the nsswitch.conf DNS configuration being considered incompatible
    with Chrome. Only emitted when a specific token is present in the
    nsswitch.conf file, causing the incompatibility, e.g. because the service is
    always incompatible with Chrome or because the service is configured with
    incompatible actions.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.Nsswitch.Read" enum="BooleanReceived"
    expires_after="2024-12-08">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether or not an attempt to read nsswitch.conf succeeded. May fail due to
    missing file or filesystem issues, but does not consider it a failure if the
    file is larger than the size limit (see Net.DNS.DnsConfig.Nsswitch.TooLarge
    for that case). Reported for all attempts to read nsswitch.conf.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.Nsswitch.TooLarge" enum="BooleanExceeded"
    expires_after="2025-03-02">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether or not an attempt to read nsswitch.conf failed due to the file size
    being unreasonably large. Reported for all attempts to read nsswitch.conf.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.Resolv.Compatible" enum="BooleanValid"
    expires_after="2025-05-04">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether or not the DNS configuration read from a resolv.conf file is
    considered compatible with Chrome, that is that the configuration did not
    contain any options that Chrome is unable to support using the built-in
    resolver. Reported whenever a resolv.conf file is successfully read by
    Chrome.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.SecureDnsMode" enum="SecureDnsModeDetails"
    expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Records details of the secure DNS mode used to configure the host resolver
    at construction of the network service.

    Warning: this histogram was expired from M140 to M142; data may be missing.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.Windows.Compatibility"
    enum="DNS.WindowsCompatibility" expires_after="2024-08-01">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Enumeration of whether or not the DNS configuration setting of Windows is
    considered compatible with Chrome and the reason why it is considered
    incompatible. Reported whenever the DNS configuration setting of Windows is
    read by Chrome.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsConfig.Windows.ReadSystemSettings{RetryCount}"
    enum="DNS.WindowsReadSystemSettingsResult" expires_after="2025-03-02">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The result of reading system DNS settings. Reported whenever Chrome tries to
    read the DNS configuration setting of Windows.
  </summary>
  <token key="RetryCount">
    <variant name="0"/>
    <variant name="1"/>
    <variant name="2"/>
    <variant name="3"/>
  </token>
</histogram>

<histogram name="Net.DNS.DnsHosts.Count" units="count"
    expires_after="2024-09-01">
  <owner>horo@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The number of hosts parsed from a Hosts file. Reported whenever a Hosts file
    is read and parsed.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsHosts.EstimateMemoryUsage" units="bytes"
    expires_after="2024-09-01">
  <owner>horo@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Estimated memory usage to keep the parsed result of a Hosts file. Reported
    whenever a Hosts file is read and parsed.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsHosts.FileSize" units="bytes"
    expires_after="2024-09-01">
  <owner>horo@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The file size of a Hosts file. Reported whenever a Hosts file is read.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsPlatformAndroidAttempt.FdAlreadyReadable"
    enum="Boolean" expires_after="2027-05-22">
  <owner>stefanoduo@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Whether the file descriptor returned by android_res_nquery was already
    readable as soon as it was returned. Reported when starting a platform DNS
    attempt on Android.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsPlatformAndroidAttempt.ResponseSize.{QueryType}"
    units="bytes" expires_after="2027-05-22">
  <owner>stefanoduo@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    The size of the DNS response in bytes returned by android_res_nresult for
    {QueryType} resource records. Reported when successfully reading a platform
    DNS attempt response on Android.
  </summary>
  <token key="QueryType" variants="DnsQueryType"/>
</histogram>

<histogram name="Net.DNS.DnsTask.AdditionalHttps.Requested"
    enum="AdditionalHttpsRecordStatus" expires_after="2027-01-03">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Status of HTTPS DNS records received as additional records in a DnsTask
    querying for HTTPS. This would represent a recurssive resolver that is
    HTTPS-aware and performing followup queries on behalf of the client.
    Recorded as DNS responses are parsed.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsTask.SvcbHttpsTransactionError"
    enum="DNS.SvcbHttpsTransactionError" expires_after="2025-08-10">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Enumeration of whether or not an HTTPS (SVCB) record transaction succeeded
    and whether or not any failure is fatal to the DnsTask. Recorded for all
    completed HTTPS record transactions.
  </summary>
</histogram>

<histogram name="Net.DNS.DnsTask.{Secure}.FailureTime" units="ms"
    expires_after="2027-02-14">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Duration of time taken by a {Secure}DnsTask (the grouping of all individual
    DNS queries for a single instance of resolving a name) in resolutions that
    failed. Recorded when a {Secure}DnsTask failed.
  </summary>
  <token key="Secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram name="Net.DNS.DnsTask.{Secure}.SuccessTime" units="ms"
    expires_after="2027-02-14">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Duration of time taken by a {Secure}DnsTask (the grouping of all individual
    DNS queries for a single instance of resolving a name) in resolutions that
    succeeded. Recorded when a {Secure}DnsTask succeeded.
  </summary>
  <token key="Secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram name="Net.DNS.DnsTransaction.AttemptType" enum="DNS.AttemptType"
    expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Enumeration of the logic path used (e.g. different protocols) for each
    started DnsAttempt (the representation of an individual network request to a
    DNS server).
  </summary>
</histogram>

<histogram name="Net.DNS.DnsTransaction.Insecure.{DohProviderId}FailureTime"
    units="ms" expires_after="2027-02-14">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by an insecure DnsTransaction to fail.
    {DohProviderId}
  </summary>
</histogram>

<histogram name="Net.DNS.DnsTransaction.Insecure.{DohProviderId}SuccessTime"
    units="ms" expires_after="2027-02-14">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by an insecure DnsTransaction to succeed.
    {DohProviderId}
  </summary>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.SecureNotValidated.{DohProviderId}FailureError"
    enum="NetErrorCodes" expires_after="2027-02-14">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Counts of specific error codes returned by secure DnsTransactions to a DoH
    server that is unavailable or has unknown availability. These transactions
    may be probe queries or queries issued in the secure DNS mode.
    {DohProviderId}
  </summary>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.SecureValidated.{DohProviderId}FailureError"
    enum="NetErrorCodes" expires_after="2027-01-31">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Counts of specific error codes returned by secure DnsTransactions to an
    available DoH server. A DoH server is available if a probe has been
    successfully completed and fewer than a threshold amount of failures have
    occurred. {DohProviderId}
  </summary>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.SecureValidated.{DohProviderId}FailureTime"
    units="ms" expires_after="2027-01-03">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by a secure DnsTransaction to an available DoH server
    to fail. A DoH server is available if a probe has been successfully
    completed and fewer than a threshold amount of failures have occurred.
    {DohProviderId}
  </summary>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.SecureValidated.{DohProviderId}SuccessTime"
    units="ms" expires_after="2027-02-14">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by a secure DnsTransaction to an available DoH server
    to succeed. A DoH server is available if a probe has been successfully
    completed and fewer than a threshold amount of failures have occurred.
    {DohProviderId}
  </summary>
</histogram>

<histogram name="Net.DNS.DnsTransaction.UDP.LowEntropyReason"
    enum="DNS.UdpLowEntropyReason" expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Enumerated status of the reason why the built-in DNS resolver has detected a
    &quot;low entropy&quot; situation for DNS over UDP and has switched to DNS
    over TCP.
  </summary>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.{DohProviderId}{Protocol}.SessionSource"
    enum="NetworkSessionSource" expires_after="2027-01-31">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Measures whether a DoH request used a new or an existing session. Recorded
    when a non-probe, auto-upgrade mode DoH transaction completes.
  </summary>
  <token key="DohProviderId" variants="DohProviderId"/>
  <token key="Protocol" variants="HttpConnectionProtocol"/>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.{DohProviderId}{Protocol}.{SessionSource}.EarlyDataAccepted"
    enum="Boolean" expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Measures whether early data was accepted for a DoH request. Recorded when a
    non-probe, auto-upgrade mode DoH transaction succeeds.
  </summary>
  <token key="DohProviderId" variants="DohProviderId"/>
  <token key="Protocol" variants="HttpConnectionProtocol"/>
  <token key="SessionSource" variants="SessionSource"/>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.{DohProviderId}{Protocol}.{SessionSource}.MaxStreamLimitPendingDelay"
    units="ms" expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The time taken for a SPDY/QUIC session to create an active stream for a DoH
    request. Measures pending time due to max stream limits. Recorded when a
    non-probe, auto-upgrade mode DoH transaction succeeds.
  </summary>
  <token key="DohProviderId" variants="DohProviderId"/>
  <token key="Protocol" variants="HttpConnectionProtocol"/>
  <token key="SessionSource" variants="SessionSource"/>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.{DohProviderId}{Protocol}.{SessionSource}.{EarlyDataStatus}.Time"
    units="ms" expires_after="2027-01-31">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Duration of time taken by a DoH transaction which {EarlyDataStatus}.
    Recorded when a non-probe, auto-upgrade mode DoH transaction succeeds. Valid
    only for requests that access the network.
  </summary>
  <token key="DohProviderId" variants="DohProviderId"/>
  <token key="Protocol" variants="HttpConnectionProtocol"/>
  <token key="SessionSource" variants="SessionSource"/>
  <token key="EarlyDataStatus">
    <variant name="0RTT" summary="accepted early data"/>
    <variant name="1RTT" summary="did not accept early data"/>
  </token>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.{DohProviderId}{Protocol}.{SessionSource}.{Outcome}Time"
    units="ms" expires_after="2027-01-31">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Duration of time taken by a DoH transaction to {Outcome}. Recorded when a
    non-probe, auto-upgrade mode DoH transaction completes.
  </summary>
  <token key="DohProviderId" variants="DohProviderId"/>
  <token key="Protocol" variants="HttpConnectionProtocol"/>
  <token key="SessionSource" variants="SessionSource"/>
  <token key="Outcome">
    <variant name="Failure"/>
    <variant name="Success"/>
  </token>
</histogram>

<histogram name="Net.DNS.DnsTransaction.{QueryType}.LookupResult"
    enum="NetErrorCodes" expires_after="2027-01-03">
  <owner>stefanoduo@google.com</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Net error codes resulting from completed or aborted DnsTransactions querying
    for {QueryType} resource records. Recorded across all resolution modes when
    a transaction completes or is aborted before completion.
  </summary>
  <token key="QueryType" variants="DnsQueryType"/>
</histogram>

<histogram
    name="Net.DNS.DnsTransaction.{QueryType}.LookupResult.ClassicTruncatedAndTcpRetried"
    enum="NetErrorCodes" expires_after="2027-01-03">
  <owner>stefanoduo@google.com</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Net error codes resulting from completed or aborted classic (Do53)
    DnsTransactions querying for {QueryType} resource records that experienced
    UDP truncation (TC bit set) and retried over TCP. Recorded when a classic
    DNS transaction completes or is aborted after retrying over TCP.
  </summary>
  <token key="QueryType" variants="DnsQueryType"/>
</histogram>

<histogram name="Net.DNS.DnsTransaction.{QueryType}.LookupResult.{AttemptMode}"
    enum="NetErrorCodes" expires_after="2027-01-03">
  <owner>stefanoduo@google.com</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Net error codes resulting from completed or aborted DnsTransactions querying
    for {QueryType} resource records using {AttemptMode}. Recorded when a
    transaction completes or is aborted before completion.
  </summary>
  <token key="QueryType" variants="DnsQueryType"/>
  <token key="AttemptMode">
    <variant name="Classic" summary="classic DNS (Do53)"/>
    <variant name="DoH" summary="DNS over HTTPS"/>
    <variant name="Platform" summary="platform resolver"/>
  </token>
</histogram>

<histogram name="Net.DNS.FallbackFromSecureTransactionPreferred"
    enum="FallbackFromSecureTransactionPreferredReason"
    expires_after="2027-01-31">
  <owner>bcb@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Records the reason for falling back from a secure DNS transaction to an
    insecure one. This is recorded every time HostResolverManager::PushDnsTasks
    is called while in AUTOMATIC secure DNS mode. A preferred reason indicates
    that the SECURE_DNS task was prevented from being included to resolve a host
    request.
  </summary>
</histogram>

<histogram name="Net.DNS.HostCache.EraseStale.ExpiredBy{HostType}" units="ms"
    expires_after="2027-10-25">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    When erasing a stale (expired or old-network) DNS entry for {HostType} from
    the host cache, how long past the expiration time it is. This is recorded
    each time an erase happens, when clearing the host cache or evicting the
    entry.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HostCache.EraseStale.NetworkChanges{HostType}"
    units="changes" expires_after="2027-10-26">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    When erasing a stale (expired or old-network) DNS entry for {HostType} from
    the host cache how many network changes happened between setting and erasing
    it. This is recorded each time an erase happens, when clearing the host
    cache or evicting the entry.

    WARNING: This metric was expired on 2025-10-26, but was re-enabled on
    2026-01-20. Some data may be missing.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HostCache.EraseStale.StaleHits{HostType}" units="hits"
    expires_after="2027-11-29">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    When erasing a stale (expired or old-network) DNS entry for {HostType} from
    the host cache how many hits it received while stale. This is recorded each
    time an erase happens, when clearing the host cache or evicting the entry.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HostCache.EraseValid.ValidFor{HostType}" units="ms"
    expires_after="2027-10-26">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    When erasing a valid DNS entry for {HostType} from the host cache, for how
    much longer it would have remained valid. This is recorded each time an
    erase happens, when clearing the host cache or evicting the entry.

    WARNING: This metric was expired on 2025-10-26, but was re-enabled on
    2026-01-20. Some data may be missing.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HostCache.Erase{HostType}" enum="EraseReason"
    expires_after="2027-12-14">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The reason for erasing a DNS entry for {HostType} from the host cache. This
    is recorded each time an erase happens, when clearing the host cache or
    evicting the entry.

    WARNING: This metric was expired on 2025-12-14, but was re-enabled on
    2026-01-20. Some data may be missing.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HostCache.LookupStale.ExpiredBy{HostType}" units="ms"
    expires_after="2027-07-01">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    When looking up a stale DNS entry for {HostType} in the host cache, how long
    past the expiration time it is. This is recorded at the end of each DNS
    entry lookup.

    WARNING: This metric was expired on 2025-06-10, but was re-enabled on
    2026-01-20. Some data may be missing.

    This histogram has been expired between 2026-06-10 and 2026-07-01, thus does
    not contain data for this period.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HostCache.LookupStale.NetworkChanges{HostType}"
    units="changes" expires_after="2027-08-10">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    When looking up a stale DNS entry for {HostType} in the host cache, how many
    network changes happened between setting it and looking it up. This is
    recorded at the end of each DNS entry lookup.

    WARNING: This metric was expired on 2025-08-10, but was re-enabled on
    2026-01-20. Some data may be missing.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HostCache.Lookup{HostType}" enum="LookupOutcome"
    expires_after="2027-02-07">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The outcome of looking up a DNS entry for {HostType} in the host cache. This
    is recorded at the end of each DNS entry lookup.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.DNS.HTTPSSVC.RecordHttps.{secure}.ExpectNoerror.DnsRcode"
    enum="HttpssvcDnsRcode" expires_after="2027-08-13">
  <owner>bashi@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records which RCODE the DNS server specified when it responded to our HTTPS
    query. If the query timed out before getting a response,
    &quot;TimedOut&quot; is recorded instead of an RCODE value. Histograms are
    emitted at the completion of a DnsTask's final transaction.
  </summary>
  <token key="secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram name="Net.DNS.HTTPSSVC.RecordHttps.{secure}.ExpectNoerror.Parsable"
    enum="BooleanValid" expires_after="2027-03-02">
  <owner>bashi@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Indicates whether the result of an HTTPS query was validly parsable or
    mangled. Only recorded when DnsRcode indicates NoError. Histograms are
    emitted at the completion of a DnsTask's final transaction.
  </summary>
  <token key="secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram
    name="Net.DNS.HTTPSSVC.RecordHttps.{secure}.ExpectNoerror.RecordWithError"
    enum="Boolean" expires_after="2024-06-01">
  <owner>horo@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records true when we receive an HTTPS record and an error RCODE at the same
    time. Only recorded for true. Histograms are emitted at the completion of a
    DnsTask's final transaction.
  </summary>
  <token key="secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram
    name="Net.DNS.HTTPSSVC.RecordHttps.{secure}.ExpectNoerror.ResolveTimeAddressRecord"
    units="ms" expires_after="2024-06-01">
  <owner>horo@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records how many ms the DNS server took to respond to address queries.
    Histograms are emitted at the completion of a DnsTask's final transaction.
  </summary>
  <token key="secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram
    name="Net.DNS.HTTPSSVC.RecordHttps.{secure}.ExpectNoerror.ResolveTimeExperimental"
    units="ms" expires_after="2024-08-04">
  <owner>horo@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records how many ms the DNS server took to respond to an HTTPS query.
    Histograms are emitted at the completion of a DnsTask's final transaction.
  </summary>
  <token key="secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram
    name="Net.DNS.HTTPSSVC.RecordHttps.{secure}.ExpectNoerror.ResolveTimeRatio"
    units="scaled ratio (% / 10)" expires_after="2024-08-04">
  <owner>horo@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records a ratio indicating the relative HTTPS query resolve time compared to
    the slower A or AAAA resolve time, where A/AAAA/HTTPS belong to the same
    DnsTask. Multiply this value by 10 to obtain a percentage P. The HTTPS query
    completed in roughly P% of the slower A/AAAA resolve time. Values smaller
    than 10 indicate that HTTPS query was faster than A/AAAA. Values larger than
    10 indicate that the HTTPS query was slower than A/AAAA. Histograms are
    emitted at the completion of a DnsTask's final transaction.
  </summary>
  <token key="secure" variants="DnsOverHttpsSecure"/>
</histogram>

<histogram name="Net.DNS.JobAttemptedHttps" enum="Boolean"
    expires_after="2026-10-09">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Record whether a HostResolverManager::Job attempted HTTPS query. Recorded
    when the Job succeeded, had non speculative requests, and source type is ANY
    (which means that the Job could have queried more than one query).
  </summary>
</histogram>

<histogram name="Net.DNS.JobHttpsNotAttemptedReason"
    enum="HttpsNotAttemptedReason" expires_after="2027-02-14">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Record why a HostResolverManager::Job didn't attempt HTTPS query. Recorded
    when the Job succeeded, had non speculative requests, source type is ANY
    (which means that the Job could have queried more than one query), and
    didn't attempt HTTPS query.
  </summary>
</histogram>

<histogram name="Net.DNS.JobQueueTime.Failure" units="ms"
    expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The duration of time DnsTransactions spend waiting to be started by a
    DnsTask, aggregated by HostResolverManager::Job. This metric is only
    recorded when the Job failed.
  </summary>
</histogram>

<histogram name="Net.DNS.JobQueueTime.PerTransaction" units="ms"
    expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The duration of time a DnsTransaction spends waiting to be started by a
    DnsTask. The dominant factor is likely the time spent waiting for other
    DnsTransactions to complete, i.e. waiting for DnsTask::StartNextTransaction
    to be invoked by the dispatcher. If there were no limit on the number of
    concurrent DNS queries, we would expect this metric to be near zero.
  </summary>
</histogram>

<histogram name="Net.DNS.JobQueueTime.Success" units="ms"
    expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The duration of time DnsTransactions spend waiting to be started by a
    DnsTask, aggregated by HostResolverManager::Job. This metric is only
    recorded when the Job succeeded.
  </summary>
</histogram>

<histogram name="Net.DNS.ProbeSequence.ConfigChange.Failure.AttemptTime"
    units="ms" expires_after="2024-07-22">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by a probe attempt to fail. The time is measured
    since the probe sequence was initiated due to a DNS config change.
  </summary>
</histogram>

<histogram name="Net.DNS.ProbeSequence.ConfigChange.Success.AttemptTime"
    units="ms" expires_after="2024-09-22">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by a probe attempt to succeed. The time is measured
    since the probe sequence was initiated due to a DNS config change.
  </summary>
</histogram>

<histogram name="Net.DNS.ProbeSequence.NetworkChange.Failure.AttemptTime"
    units="ms" expires_after="2024-07-22">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by a probe attempt to fail. The time is measured
    since the probe sequence was initiated due to a network change.
  </summary>
</histogram>

<histogram name="Net.DNS.ProbeSequence.NetworkChange.Success.AttemptTime"
    units="ms" expires_after="2024-12-08">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Duration of time taken by a probe attempt to succeed. The time is measured
    since the probe sequence was initiated due to a network change.
  </summary>
</histogram>

<histogram name="Net.DNS.Request.TotalTime" units="ms" expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Duration of HostResolver requests from Start() until completion. Includes
    requests resolved synchronously using fast local sources, e.g. from cache,
    recorded as 0. Excludes speculative requests.
  </summary>
</histogram>

<histogram name="Net.DNS.Request.TotalTimeAsync" units="ms"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Duration of HostResolver requests from Start() until completion. Excludes
    speculative requests and requests resolved using fast local sources, e.g.
    from cache.
  </summary>
</histogram>

<histogram name="Net.DNS.ResolveCategory" enum="ResolutionCategory"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether a HostResolverManager::Job (the basic internal unit of work for
    non-local host resolutions, potentially merging redundant requests from
    Chrome) succeeded or failed, and whether it was speculative.
  </summary>
</histogram>

<histogram name="Net.DNS.ResolveContext.DohAutoupgrade.{DohProviderId}Status"
    enum="DohServerAutoupgradeStatus" expires_after="2027-02-14">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The state of the Secure DNS (DoH) auto-upgrade functionality. This histogram
    is only emitted by clients with secure DNS set to automatic mode, and the
    emission occurs one minute after the insecure DNS to secure DNS auto-upgrade
    network probing begins. There will be one histogram emission per DoH
    provider in the system DNS configuration per NetworkContext that allows
    using secure DNS queries, and re-emissions can occur each time the DNS
    configuration changes. {DohProviderId}
  </summary>
</histogram>

<histogram name="Net.DNS.ResolveError.Fast" enum="NetErrorCodes"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For DNS resolutions that failed after less than 10 ms, which are probably
    local failures, what error code the jobs failed with.
  </summary>
</histogram>

<histogram name="Net.DNS.ResolveError.Slow" enum="NetErrorCodes"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For DNS resolutions that failed after at least 10 ms, which are probably
    remote failures or connectivity problems, what error code the jobs failed
    with.
  </summary>
</histogram>

<histogram name="Net.DNS.ResolveFailureTime" units="ms" expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Duration of time taken by HostResolverManager::Job (the basic internal unit
    of work for non-local host resolutions, potentially merging redundant
    requests from Chrome) in resolutions that failed. This is the time to
    resolve a hostname from start to finish. Excludes jobs where all requests
    are speculative.
  </summary>
</histogram>

<histogram name="Net.DNS.ResolveFallbackPath" enum="ResolveFallbackPath"
    expires_after="2027-01-10">
  <owner>bashi@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The complete fallback path taken to achieve a successful host resolution.
    Emitted when a non-speculative HostResolverManager::Job successfully
    resolves a host.
  </summary>
</histogram>

<histogram name="Net.DNS.ResolveSuccessTime" units="ms" expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Duration of time taken by HostResolverManager::Job (the basic internal unit
    of work for non-local host resolutions, potentially merging redundant
    requests from Chrome) in resolutions that succeeded. This is the time to
    resolve a hostname from start to finish. Excludes jobs where all requests
    are speculative.
  </summary>
</histogram>

<histogram name="Net.Dns.ResolveTimeDiff2.{Variant}" units="ms"
    expires_after="2027-07-20">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-network-stack@google.com</owner>
  <summary>
    Time difference between when DNS records were resolved. Recorded when
    {Variant}.
  </summary>
  <token key="Variant">
    <variant name="AAAABeforeA" summary="AAAA resolved before A"/>
    <variant name="ABeforeAAAA" summary="A resolved before AAAA"/>
    <variant name="AddressRecordBeforeHTTPS"
        summary="the first address record (A or AAAA) resolved before HTTPS"/>
    <variant name="HTTPSBeforeFirstAddress"
        summary="HTTPS resolved before the first address record (A or AAAA)"/>
    <variant name="HTTPSBeforeLastAddress"
        summary="HTTPS resolved before the last address record (A or AAAA)"/>
  </token>
</histogram>

<histogram name="Net.DNS.SystemTask.FailureTime" units="ms"
    expires_after="2027-01-03">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Duration of time taken by HostResolverSystemTask (the grouping of all
    individual DNS queries for a single instance of resolving a name using the
    system resolver) in resolutions that failed.
  </summary>
</histogram>

<histogram name="Net.DNS.SystemTask.SuccessTime" units="ms"
    expires_after="2027-01-03">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Duration of time taken by HostResolverSystemTask (the grouping of all
    individual DNS queries for a single instance of resolving a name using the
    system resolver) in resolutions that succeeded.
  </summary>
</histogram>

<histogram name="Net.DNS.UI.ProbeAttemptSuccess" enum="Boolean"
    expires_after="2023-12-17">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Records the outcome of a DoH probe attempt on the first valid entry in the
    custom text field.
  </summary>
</histogram>

<histogram name="Net.DNS.UI.ValidationAttemptSuccess" enum="Boolean"
    expires_after="2024-10-28">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Records the outcome of a formatting validation attempt on the custom text
    field.
  </summary>
</histogram>

<histogram name="Net.DNS.UpgradeConfig.DotUpgradeSucceeded" enum="Boolean"
    expires_after="2027-02-07">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    True if upgrade to DoH from a DoT hostname was attempted and succeeded.
    False if it was attempted and failed.
  </summary>
</histogram>

<histogram name="Net.DNS.UpgradeConfig.HasPublicInsecureNameserver"
    enum="Boolean" expires_after="2026-09-20">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    True if there was at least one public nameserver during an attempt to
    upgrade to DoH from insecure DNS. False if there were no public nameservers
    during an attempt to upgrade to DoH from insecure DNS.

    Warning: this histogram was expired from 2023-04-23 to 2023-06-12; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.DNS.UpgradeConfig.Ineligible.DohSpecified" enum="Boolean"
    expires_after="2026-05-14">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    True if upgrade to DoH was not attempted because the DoH config was already
    specified. False if upgrade to DoH was not attempted for some other reason.
  </summary>
</histogram>

<histogram name="Net.DNS.UpgradeConfig.Ineligible.UnhandledOptions"
    enum="Boolean" expires_after="2026-05-14">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    True if upgrade to DoH was not attempted because of unhandled options in the
    system config. False if upgrade to DoH was not attempted for some other
    reason. Emitted each time the DnsConfig is updated.
  </summary>
</histogram>

<histogram name="Net.DNS.UpgradeConfig.InsecureUpgradeSucceeded" enum="Boolean"
    expires_after="2027-01-24">
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    True if upgrade to DoH from insecure DNS was attempted and succeeded. False
    if it was attempted and failed.
  </summary>
</histogram>

<histogram name="Net.DNS.UpgradeConfig.InsecureUpgradeWithFallbackSucceeded"
    enum="Boolean" expires_after="2026-12-06">
  <owner>kaklilu@chromium.org</owner>
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Recorded if upgrading to DoH from insecure DNS was attempted, failed, then
    succeeded using the fallback DoH server config. This is only emitted when
    Secure DNS is used in automatic-with-doh-fallback mode. We also only try
    using the fallback if and the system DNS provider was not in Chrome's
    supported DoH provider list.
  </summary>
</histogram>

<histogram name="Net.DNS.UpgradeConfigFailed.LocalNameserverState"
    enum="DnsConfigLocalNameserverState" expires_after="2026-12-27">
  <owner>kaklilu@chromium.org</owner>
  <owner>awillia@chromium.org</owner>
  <owner>src/net/dns/OWNERS</owner>
  <summary>
    Breaks down what kinds of local nameservers (if any) are on the DNS config
    when Chrome has tried and failed to upgrade it to DoH from insecure DNS.
  </summary>
</histogram>

<histogram name="Net.DNS_Resolution_And_TCP_Connection_Latency2" units="ms"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <summary>
    The time measured before starting DNS lookup until after the connection is
    complete.
  </summary>
</histogram>

<histogram name="Net.DomainReliability.BeaconOutcome"
    enum="DomainReliabilityBeaconOutcome" expires_after="2024-07-26">
  <owner>ricea@chromium.org</owner>
  <owner>src/net/network_error_logging/OWNERS</owner>
  <summary>
    The outcome of a Domain Reliability beacon, logged upon destruction of the
    beacon.
  </summary>
</histogram>

<histogram name="Net.EphemeralPortRandomizer.ConnectResult"
    enum="NetErrorCodes" expires_after="2027-01-28">
  <owner>arichiv@chromium.org</owner>
  <owner>awillia@chromium.org</owner>
  <owner>katabolism-finch@google.com</owner>
  <summary>
    Logged on connection completion when EphemeralPortRandomizer was used to
    pick the port. Records the associated net error (or OK). MacOS only.
  </summary>
</histogram>

<histogram name="Net.EphemeralPortRandomizer.PickPortExhausted" enum="Boolean"
    expires_after="2027-01-28">
  <owner>arichiv@chromium.org</owner>
  <owner>awillia@chromium.org</owner>
  <owner>katabolism-finch@google.com</owner>
  <summary>
    Logged as true when EphemeralPortRandomizer::PickPort fails to find a port
    to allocate for a pending TCP connection. Never logged as false. MacOS only.
  </summary>
</histogram>

<histogram name="Net.ErrorCodesForHTTPSGoogleMainFrame3" enum="NetErrorCodes"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <summary>
    Positive net error codes that requests for pages end with, including net::OK
    and net::ERR_ABORTED. This only counts loads in &quot;main frames&quot; for
    https://www.google.com (it does not for example count the error codes for
    subresoures on a page). It excludes main frame navigations that are
    converted to downloads (unless they fail / are aborted before it's known
    that they would be a download), and requests handled externally (like mailto
    links).
  </summary>
</histogram>

<histogram name="Net.ErrorCodesForIsolatedAppScheme" enum="NetErrorCodes"
    expires_after="2027-01-10">
  <owner>giovax@chromium.org</owner>
  <owner>pwa-commercial@google.com</owner>
  <owner>src/chrome/browser/web_applications/isolated_web_apps/OWNERS</owner>
  <summary>
    Positive net error codes that HTTP requests using the isolated-app: URL
    scheme end with, including net::OK and net::ERR_ABORTED.
  </summary>
</histogram>

<histogram name="Net.ErrorCodesForMainFrame4" enum="NetErrorCodes"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <summary>
    Positive net error codes that requests for pages end with, including net::OK
    and net::ERR_ABORTED. This only counts loads in &quot;main frames&quot; (it
    does not for example count the error codes for subresoures on a page). It
    excludes main frame navigations that are converted to downloads (unless they
    fail / are aborted before it's known that they would be a download), and
    requests handled externally (like mailto links).
  </summary>
</histogram>

<histogram name="Net.ErrorCodesForSubresources3" enum="NetErrorCodes"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <summary>
    Net error codes that requests for &quot;subresources&quot; end with,
    including net::OK and net::ERR_ABORTED.
  </summary>
</histogram>

<histogram name="Net.ErrorPageCounts" enum="NetErrorPageEvents"
    expires_after="2026-09-06">
  <owner>edwardjung@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Counts of various events that can occur on the network error page. Note that
    this histogram enum buckets are not mutually exclusive and so a single error
    page load might report samples into multiple ones. Each bucket has
    descriptions that further explain the context of their samples.
  </summary>
</histogram>

<histogram name="Net.ErrorPageCounts.WebAppAlternativeErrorPage"
    enum="NetErrorCodes" expires_after="2025-03-09">
  <owner>finnur@chromium.org</owner>
  <owner>alexbn@chromium.org</owner>
  <summary>
    Counts the number of times web apps receive `ERR_INTERNET_DISCONNECTED` and
    the alternative error page (rather than the dino) is shown. Reported when
    the error page html is being prepared. See
    `NetErrorHelper::GenerateLocalizedErrorPage` (crbug.com/1280518).
  </summary>
</histogram>

<histogram name="Net.HttpAuthCount" enum="HttpAuthCount"
    expires_after="2025-12-28">
  <owner>mpdenton@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Per-authentication-scheme counts of HTTP authentication attempts and
    rejections.
  </summary>
</histogram>

<histogram name="Net.HttpAuthTarget" enum="HttpAuthTarget"
    expires_after="2026-01-11">
  <owner>mpdenton@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Per-authentication-scheme counts of HTTP authentication targets, such as
    secure servers or proxies.

    Emitted at the same time as Net.HttpAuthCount, on every HTTP authentication
    attempt or rejection.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.ActiveFilterCountOnAddition"
    units="filters" expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The number of active logical HTTP cache invalidation filters present in
    memory at the moment a new invalidation filter is added. Recorded in
    HttpCache::AddInvalidationFilter upon each filter addition.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.ClearContext"
    enum="NetHttpCacheLogicalInvalidationClearContext"
    expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The context under which a logical HTTP cache invalidation filter is cleared
    (i.e., whether it was cleared during the same session it was added, or if it
    was successfully recovered from disk after a crash/restart and then
    subsequently cleared). Recorded when a filter is removed.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.FilterCapEvicted"
    enum="Boolean" expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Recorded as true when adding a new logical HTTP cache invalidation filter
    causes the oldest active filter to be evicted due to reaching the maximum
    filter capacity cap (configured via FeatureParam
    kLogicalClearHttpCacheMaxFilters, defaulting to 500). Recorded in
    HttpCache::AddInvalidationFilter.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.LoadedFilterCount"
    units="filters" expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The number of logical HTTP cache invalidation filters successfully loaded
    from persistent disk storage at startup. Recorded once at NetworkContext
    startup when initializing the LogicalInvalidationStore.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.LoadResult"
    enum="LogicalInvalidationStoreLoadResult" expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Records the result of loading the disk persistence file for logical HTTP
    cache invalidation filters (e.g. success, file not found, or corrupt).
    Recorded once at NetworkContext startup when initializing the
    LogicalInvalidationStore.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.MatchResult"
    enum="NetHttpCacheLogicalInvalidationMatchResult"
    expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The lookup match outcome when querying active HTTP cache invalidation
    filters (e.g. filter matched resulting in a cache miss, or filter did not
    match). Recorded on the hot path in HttpCache::IsInvalidated only when
    active invalidation filters are present in memory.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.PersistenceLoadDuration"
    units="ms" expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time taken to asynchronously load and deserialize logical HTTP cache
    invalidation filters from persistent disk storage via background thread.
    Recorded once at NetworkContext startup when initializing the
    LogicalInvalidationStore.
  </summary>
</histogram>

<histogram name="Net.HttpCache.LogicalInvalidation.PersistenceWriteDuration"
    units="ms" expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time taken to serialize and atomically write the active logical HTTP
    cache invalidation filters to persistent disk storage. Recorded every time
    LogicalInvalidationStore saves filters to disk.
  </summary>
</histogram>

<histogram
    name="Net.HttpCache.LogicalInvalidation.StaleDataProtectedAfterCrash"
    enum="Boolean" expires_after="2027-05-26">
  <owner>deepakr@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Recorded as true when a cache entry is matched and invalidated by a logical
    filter that was recovered from persistent storage after a crash or restart.
    This tracks how often recovered logical filters actively protect against
    serving stale data before a physical purge occurs.
  </summary>
</histogram>

<histogram name="Net.HttpJob.BytesReceived2" units="bytes"
    expires_after="2027-01-03">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Total bytes received over the network for an HttpJob request. This is
    measured when the HttpJob is completed.

    Bytes after switching protocols (such as WebSockets) are not counted.

    There is no previous version of this metric. It is numbered to be in sync
    with similar metrics. Unlike PrefilterBytesRead, this metric accounts for
    all HTTP stream bytes (not just the content body), counts bytes for aborted
    jobs, and network bytes in 304 Not Modified exchanges (rather than cached
    content bodies).
  </summary>
</histogram>

<histogram name="Net.HttpJob.BytesSent2" units="bytes"
    expires_after="2027-01-03">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Total bytes sent over the network for an HttpJob request. This is measured
    when the HttpJob is completed.

    Bytes after switching protocols (such as WebSockets) are not counted.

    There is no previous version of this metric. It is numbered to be in sync
    with similar metrics.
  </summary>
</histogram>

<histogram name="Net.HttpJob.MainJobWaitTimeWithAvailableSpdySession"
    units="ms" expires_after="2026-11-01">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Wait time of main job while there is an available SPDY session but no QUIC
    session.
  </summary>
</histogram>

<histogram name="Net.HttpJob.MainJobWaitTimeWithoutAvailableSpdySession"
    units="ms" expires_after="2027-01-03">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Wait time of main job while there is no available SPDY session and no QUIC
    session.
  </summary>
</histogram>

<histogram name="Net.HttpJob.PrefilterBytesRead.Ads.Net" units="bytes"
    expires_after="2025-01-12">
  <owner>jkarlin@chromium.org</owner>
  <owner>chrome-ads-histograms@google.com</owner>
  <summary>
    Total prefilter (e.g., before decompression) bytes read for an HttpJob
    request that is run on behalf of a request tagged as advertising related.
  </summary>
</histogram>

<histogram name="Net.HttpJob.PrefilterBytesRead{Source}" units="bytes"
    expires_after="2026-11-29">
  <owner>jkarlin@chromium.org</owner>
  <owner>shivanisha@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Total prefilter (e.g., before decompression) bytes read for an HttpJob
    request.
  </summary>
  <token key="Source">
    <variant name=""/>
    <variant name=".Cache" summary="For requests served from the cache."/>
    <variant name=".Net" summary="For requests served from the network."/>
  </token>
</histogram>

<histogram name="Net.HttpJob.ProxyTypeFailed" enum="ProxyScheme"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>rch@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Scheme of the proxy server used by an HTTP job that failed, or
    SCHEME_INVALID if no proxy was used. A value is emitted for each failed HTTP
    stream. Note: Although SCHEME_DIRECT is deprecated, value 1 corresponds to a
    direct proxy. Warning: this histogram was expired from 2022-11-13 to
    2023-12-01; data may be missing.
  </summary>
</histogram>

<histogram name="Net.HttpJob.ProxyTypeSuccess" enum="ProxyScheme"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>rch@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Scheme of the proxy server used by an HTTP job that succeeded, or
    SCHEME_INVALID if no proxy was used. A value is emitted for each successful
    HTTP stream. Note: Although SCHEME_DIRECT is deprecated, value 1 corresponds
    to a direct proxy. Warning: this histogram was expired from 2023-03-19 to
    2023-12-01; data may be missing.
  </summary>
</histogram>

<histogram name="Net.HttpJob.TotalTime.TLS13.Google" units="ms"
    expires_after="2026-12-20">
  <owner>bashi@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time it takes to complete an HttpJob to a Google host, from starting the
    transaction until we are done reading, if the response was received over TLS
    1.3 and TCP. This is recorded to measure the impact of 0-RTT.
  </summary>
</histogram>

<histogram name="Net.HttpJob.TotalTimeCached" units="ms" expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time it takes to complete an HttpJob, from starting the transaction until we
    are done reading, for jobs served from the cache.
  </summary>
</histogram>

<histogram name="Net.HttpJob.TotalTimeCancel" units="ms" expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time it takes to complete an HttpJob, from starting the transaction until
    the job is killed. Note that we didn't detect the end of the data for this
    job.
  </summary>
</histogram>

<histogram name="Net.HttpJob.TotalTimeNotCached{TotalTimeToHttpsGoogle}"
    units="ms" expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time it takes to complete an HttpJob, from starting the transaction until we
    are done reading, for jobs not served from the cache.
    {TotalTimeToHttpsGoogle}
  </summary>
  <token key="TotalTimeToHttpsGoogle" variants="TotalTimeToHttpsGoogle">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Net.HttpJob.TotalTimeSuccess{Priority}" units="ms"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time it takes to complete an HttpJob, from starting the transaction until we
    are done reading, for jobs when we read until no more data is available.
    {Priority}
  </summary>
  <token key="Priority">
    <variant name="" summary=""/>
    <variant name="Priority0" summary="THROTTLED or MINIMUM_PRIORITY"/>
    <variant name="Priority1" summary="IDLE"/>
    <variant name="Priority2" summary="LOWEST or DEFAULT_PRIORITY"/>
    <variant name="Priority3" summary="LOW"/>
    <variant name="Priority4" summary="MEDIUM"/>
    <variant name="Priority5" summary="HIGHEST or MAXIMUM_PRIORITY"/>
  </token>
</histogram>

<histogram name="Net.HttpJob.TotalTime{TotalTimeToHttpsGoogle}" units="ms"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time it takes to complete an HttpJob, from starting the transaction until we
    are done reading. {TotalTimeToHttpsGoogle}
  </summary>
  <token key="TotalTimeToHttpsGoogle" variants="TotalTimeToHttpsGoogle">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Net.HttpNoVarySearch.HasUnrecognizedKeys" enum="Boolean"
    expires_after="2026-09-13">
  <owner>jbroman@chromium.org</owner>
  <owner>liviutinta@chromium.org</owner>
  <summary>
    Whether any unrecognized keys were seen at the root dictionary of a
    No-Vary-Search response header. Recorded each time one is parsed as a
    dictionary, whether or not it affects caching in any way.
  </summary>
</histogram>

<histogram
    name="Net.HttpProxy.ConnectLatency.{HttpVersion}.{ProxySchema}.{Result}"
    units="ms" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Time taken to establish the connection to an HTTP proxy. This is only
    measured for connections to the first proxy in a proxy chain. In the Error
    and TimedOut variations, HTTP/1 and HTTP/2 cannot be distinguished, so these
    are reported as HTTP/1. This histogram expired 2024-09-17 and was
    re-established in M131 with the addition of the HTTP version and proxy
    scheme.
  </summary>
  <token key="HttpVersion">
    <variant name="Http1"/>
    <variant name="Http2"/>
    <variant name="Http3"/>
  </token>
  <token key="ProxySchema">
    <variant name="Http"/>
    <variant name="Https"/>
    <variant name="Quic"/>
  </token>
  <token key="Result">
    <variant name="Error"/>
    <variant name="Success"/>
    <variant name="TimedOut"/>
  </token>
</histogram>

<histogram name="Net.HttpProxy.MacSystemResolver.OsError"
    units="macOS error code" expires_after="2027-03-24">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Records macOS error codes returned by the macOS System Proxy Resolver when
    proxy resolution fails. This histogram is only recorded when a non-zero OS
    error code is returned, indicating a macOS API failure during proxy
    resolution.
  </summary>
</histogram>

<histogram name="Net.HttpProxy.MacSystemResolver.Status"
    enum="MacProxyResolutionStatus" expires_after="2027-03-24">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Records the status of macOS system proxy resolution requests. This histogram
    is recorded for every proxy resolution request made through the macOS system
    proxy resolver, indicating whether the resolution succeeded or failed.
    Aborted requests (e.g., during browser shutdown) are not recorded.
  </summary>
</histogram>

<histogram name="Net.HttpProxy.ProxyResolverWin.HttpSessionInitializationState"
    enum="WinHttpStatus" expires_after="2026-07-04">
  <owner>ricea@chromium.org</owner>
  <owner>src/services/proxy_resolver_win/OWNERS</owner>
  <summary>
    Logs the status of WinHTTP session initialization for proxy resolution on
    Windows. This entry is recorded when the WinHTTP session is initialized,
    which involves opening the session, configuring timeouts, and registering
    the status callback.
  </summary>
</histogram>

<histogram name="Net.HttpProxy.WindowsSystemResolver.WinError"
    units="win32 error code" expires_after="2026-07-15">
  <owner>ricea@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Records Windows error codes returned by the Windows System Proxy Resolver
    when proxy resolution fails. This histogram is only recorded when a non-zero
    Windows error code is returned, indicating a Windows API failure during
    proxy resolution. One of the error codes from
    https://learn.microsoft.com/en-us/windows/win32/com/com-error-codes-4.
  </summary>
</histogram>

<histogram name="Net.HttpRequestSSLUpgradeDecision"
    enum="HttpRequestSSLUpgradeDecision" expires_after="2027-02-07">
  <owner>cthomp@chromium.org</owner>
  <owner>etienneb@chromium.org</owner>
  <owner>joenotcharles@google.com</owner>
  <summary>
    Recorded for all top-frame HTTP/HTTPS/WS/WSS requests made by
    UrlRequestHttpJob. Records whether the request was upgraded from HTTP (or
    WS) to HTTPS (or WSS), and whether the decision to upgrade required dynamic
    STS data.
  </summary>
</histogram>

<histogram name="Net.HttpResponseCode" enum="HttpResponseCode"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <summary>The count of HTTP Response codes encountered.</summary>
</histogram>

<histogram name="Net.HttpResponseCode2" enum="HttpResponseCode"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>nidhijaju@chromium.org</owner>
  <owner>ricea@chromium.org</owner>
  <summary>
    The count of HTTP Response codes encountered, for codes registered in the
    IANA HTTP Status Code Registry. Ignores unknown response codes. Recorded
    when HttpResponseHeaders are constructed, after parsing.
  </summary>
</histogram>

<histogram name="Net.HttpStreamFactory.OnStreamReadyCallbackDelay" units="ms"
    expires_after="2026-11-15">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Record a delay between an HttpStreamFactory::Job gets a successful stream
    and the job calls the delegate's OnStreamReady(). Recorded when the job gets
    a successful stream.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.AttemptManagerAliveTime2" units="ms"
    expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when an HttpStreamPool::AttemptManager is created to when the
    AttemptManager is destroyed. Recorded when an AttemptManager is destroyed.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.Existing{Protocol}SessionFoundTime"
    units="ms" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a service endpoint request is started to when an existing
    {Protocol} session is found by IP-based matching. Recorded when an existing
    {Protocol} session is found after the service endpoint request is updated or
    finished.
  </summary>
  <token key="Protocol">
    <variant name="Quic" summary="QUIC"/>
    <variant name="Spdy" summary="SPDY"/>
  </token>
</histogram>

<histogram name="Net.HttpStreamPool.InitialAttemptStartTime" units="ms"
    expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The time taken from an HttpStreamPool::AttemptManager creation to the time
    the AttemptManager attempting the initial TCP based attempt. Recorded when
    an AttemptManager attempts TCP for the first time.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.InitialAttemptState2"
    enum="HttpStreamPoolInitialAttemptState" expires_after="2026-04-05">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Record the initial attempt state (whether known to support QUIC/SPDY,
    attempt QUIC first, etc). Recorded the first time a
    HttpStreamPool::AttemptManager attempts a TCP connection.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.JobCompleteTime4.{Result}" units="ms"
    expires_after="2026-10-11">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when an HttpStreamPool::Job is created to when the job is
    completed. Recorded for each job that has a result upon destruction of the
    job.
  </summary>
  <token key="Result">
    <variant name="Failure" summary="Job failed"/>
    <variant name="H1" summary="Job succeeded with HTTP/1.1"/>
    <variant name="H2" summary="Job succeeded with HTTP/2"/>
    <variant name="H3" summary="Job succeeded with HTTP/3"/>
  </token>
</histogram>

<histogram name="Net.HttpStreamPool.JobControllerCallRequestCompleteDelay"
    units="ms" expires_after="2026-10-25">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Record a delay between an HttpStreamPool::JobController gets a successful
    stream and the job controller complets the corresponding request. Recorded
    when the job controller completes the corresponding request.
  </summary>
</histogram>

<histogram
    name="Net.HttpStreamPool.JobControllerRequestCompleteTime2.{Protocol}"
    units="ms" expires_after="2027-03-02">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when an HttpStreamPool::JobController is created to when the job
    controller completes the corresponding request. Recorded when the job
    controller completes the corresponding request.
  </summary>
  <token key="Protocol" variants="NegotiatedProtocolCoalesced"/>
</histogram>

<histogram name="Net.HttpStreamPool.JobErrorCode" enum="NetErrorCodes"
    expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The net error for an HttpStreamPool::Job. Recorded for each job that has a
    result upon destruction of the job.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.NewSpdySessionEstablishTime" units="ms"
    expires_after="2027-01-03">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a stream attempt is created to when a new SPDY session is
    created from the attempt. Recorded when a new SPDY session is created as a
    result of a stream attempt.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.QuicAttemptTime.{Result}" units="ms"
    expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a QuicAttempt attempted a QUIC session to when the task is
    completed. Recorded for each QuicAttempt if the task actually attempted a
    session.
  </summary>
  <token key="Result">
    <variant name="Failure" summary="Attempt failed"/>
    <variant name="Success" summary="Attempt succeeded"/>
  </token>
</histogram>

<histogram
    name="Net.HttpStreamPool.TcpBasedAttemptCanceledInitialAttemptState.{Reason}"
    enum="HttpStreamPoolInitialAttemptState" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Record the initial attempt state (whether known to support QUIC/SPDY,
    attempt QUIC first, etc) when a TcpBasedAttempt is canceled. Recorded for
    each stream attempt upon destruction of the canceled attempt.
  </summary>
  <token key="Reason">
    <variant name="ExistingQuicSession"/>
    <variant name="ExistingSpdySession"/>
    <variant name="NewQuicSession"/>
    <variant name="NewSpdySession"/>
    <variant name="Other"/>
  </token>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptCanceledTime2.{Reason}"
    units="ms" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a stream attempt is created to when the attempt is canceled.
    Recorded for each stream attempt upon destruction of the canceled attempt.
  </summary>
  <token key="Reason">
    <variant name="AttemptManagerDraining"/>
    <variant name="ExistingQuicSession"/>
    <variant name="ExistingSpdySession"/>
    <variant name="NewQuicSession"/>
    <variant name="NewSpdySession"/>
    <variant name="Other"/>
  </token>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptCancelReason"
    enum="StreamSocketCloseReason" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The reason why a stream attempt is canceled. Recorded when a stream attempt
    is destroyed after being canceled.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptDelay" units="ms"
    expires_after="2026-10-11">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time to block TCP-based stream attempts. Recorded when an
    HttpStreamPool::AttemptManager is created.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptServiceEndpointWaitTime"
    units="ms" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a TCP based attempt started waiting for service endpoint
    resolution to when the attempt gets the resolution. Recorded for each TCP
    based attempt upon destruction of the attempt if the attempt completed
    successfully.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptSlotCancelCount.{Reason}"
    units="attempts" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The number of TcpBasedAttemptSlots when an HttpStreamPool::AttemptManager
    cancels them. Recorded when an HttpStreamPool::AttemptManager cancels
    TcpBasedAttemptSlots.
  </summary>
  <token key="Reason" variants="StreamSocketCloseReason"/>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptStartDelay" units="ms"
    expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when an HttpStreamPool::AttemptManager is started to when a TCP
    based attempt is started, measuring the delay of the TCP based attempt.
    Recorded for each TCP based attempt upon destruction of the attempt if the
    attempt completed successfully.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptSuccessTime.{Protocol}"
    units="ms" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a {Protocol} attempt is created to when the attempt is
    completed successfully. Recorded for each TCP based attempt upon destruction
    of the attempt if the attempt completed successfully.
  </summary>
  <token key="Protocol">
    <variant name="TCP"/>
    <variant name="TLS"/>
  </token>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptTime2.{Result}" units="ms"
    expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a TCP based attempt is created to when the attempt is
    completed. Recorded for each TCP based attempt upon destruction of the
    attempt.
  </summary>
  <token key="Result">
    <variant name="Canceled" summary="Attempt canceled"/>
    <variant name="ConnectionTimedOut" summary="Attempt connection timed out"/>
    <variant name="OtherFailure" summary="Attempt failed other than time out"/>
    <variant name="Success" summary="Attempt succeeded"/>
    <variant name="TimedOut" summary="Attempt timed out"/>
  </token>
</histogram>

<histogram name="Net.HttpStreamPool.TcpBasedAttemptTotalCancelCount.{Reason}"
    units="attempts" expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The number of all TcpBasedAttempts when an HttpStreamPool::AttemptManager
    cancels them. Recorded when an HttpStreamPool::AttemptManager cancels all
    TcpBasedAttempts in TcpBasedAttemptSlots.
  </summary>
  <token key="Reason" variants="StreamSocketCloseReason"/>
</histogram>

<histogram name="Net.HttpStreamPool.TcpHandshakeTime.{Protocol}" units="ms"
    expires_after="2027-04-23">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a {Protocol} attempt starts a TCP handshake to when the TCP
    handshake completes. Recorded for each {Protocol} attempt upon destruction
    of the attempt if the attempt completed successfully.
  </summary>
  <token key="Protocol">
    <variant name="TCP"/>
    <variant name="TLS"/>
  </token>
</histogram>

<histogram name="Net.HttpStreamPool.TlsHandshakeTime" units="ms"
    expires_after="2026-12-16">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time from when a TLS attempt starts a TLS handshake to when the TLS
    handshake completes. Recorded for each TLS attempt upon destruction of the
    attempt if the attempt completed successfully.
  </summary>
</histogram>

<histogram name="Net.HttpStreamPool.{JobType}JobCancelCount.{Reason}"
    units="jobs" expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The number of HttpStreamPool::Jobs when an HttpStreamPool::AttemptManager
    cancels them. Recorded when an HttpStreamPool::AttemptManager cancels
    HttpStreamPool::Jobs.
  </summary>
  <token key="Reason" variants="StreamSocketCloseReason"/>
  <token key="JobType">
    <variant name="Preconnect"/>
    <variant name="Request"/>
  </token>
</histogram>

<histogram name="Net.HttpTimeToFirstByte.ServerPadding" units="ms"
    expires_after="2027-01-17">
  <owner>davidben@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    Time from when an HTTP request is issued to when the first byte is
    processed, if the response was not cached and the connection used the Server
    Padding extension.
  </summary>
</histogram>

<histogram name="Net.HttpTimeToFirstByte.ServerPaddingFirstConnectionOnly"
    units="ms" expires_after="2027-02-07">
  <owner>davidben@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    Time from when an HTTP request is issued to when the first byte is
    processed, if the response was not cached, the connection used the Server
    Padding extension, and the request did not reuse a connection. Recorded on
    URLRequestHttpJob::OnStartCompleted.
  </summary>
</histogram>

<histogram name="Net.HttpTimeToFirstByte.TLS13.Google" units="ms"
    expires_after="2027-01-17">
  <owner>davidben@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time from when an HTTP request to a Google host is issued to when the first
    byte is processed, if the response was not cached and received over TLS 1.3
    and TCP. This is recorded to measure the impact of 0-RTT.
  </summary>
</histogram>

<histogram name="Net.HttpTimeToFirstByte{Prefetch}" units="ms"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time from when an HTTP request is issued to when the first byte is
    processed. {Prefetch}
  </summary>
  <token key="Prefetch">
    <variant name=""/>
    <variant name="_ContentPrefetchPrefetchOff"
        summary="Prefetch is completely disabled."/>
    <variant name="_ContentPrefetchPrefetchOn"
        summary="prefetch is enabled but prerender is disabled."/>
  </token>
</histogram>

<histogram name="Net.MultiThreadedCertVerifier.RequestDuration{HostType}"
    units="ms" expires_after="2027-02-07">
  <owner>nidhijaju@chromium.org</owner>
  <owner>chrome-network-stack@google.com</owner>
  <summary>
    Records the time taken to post a task to the worker thread pool, verify a
    certificate for connections to {HostType}, and post a task back to the
    browser main thread in the MultiThreadedCertVerifier. Recorded after
    verifying the certificate and returning back to the browser main thread in
    the MultiThreadedCertVerifier.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".Google" summary="Google hosted servers"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
</histogram>

<histogram name="Net.NeedsHWCAP2Workaround" enum="BooleanBroken"
    expires_after="2027-01-03">
  <owner>davidben@chromium.org</owner>
  <owner>src/third_party/boringssl/OWNERS</owner>
  <summary>
    Records, on startup, for ARM devices running Android, whether the kernel is
    missing AT_HWCAP2 from the ELF auxv and /proc/cpuinfo reports support for
    ARMv8 features. Those features should also be reported in AT_HWCAP2. This is
    to measure the workaround in https://crbug.com/boringssl/46.

    Warning: this histogram was expired from 2024-06-30 to 2026-01-20; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Net.NetworkChangeNotifier.ConnectionTypePollsWin.{NotificationType}"
    units="polls" expires_after="2027-02-14">
  <owner>mmenke@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The number of times that network state is polled before invoking
    ConnectionTypeObserver::OnConnectionTypeChanged on Windows. Each
    IPAddressChange event results repeatedly polling the network, with polls 1
    second apart, and a subset of those result in sending notifications,
    depending on network state. This is because the change OS change
    notification often happens before the modified network connections can
    actually be observed.

    This records how many times the network state is polled before a particular
    connection type change notification is sent. Note that the
    NetworkChangeNotifier may continue to poll after sending a connection type
    change notification.

    The logic to report changes is fairly complicated. See logging code to
    better understand the values.
  </summary>
  <token key="NotificationType">
    <variant name="Offline" summary="Offline notification sent"/>
    <variant name="Online" summary="Online notification sent"/>
  </token>
</histogram>

<histogram name="Net.NetworkChangeNotifier.NewConnectionCost"
    enum="NetworkConnectionCost" expires_after="2023-11-12">
  <owner>fbeaufort@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The new network connection cost any time a change to the device's active
    default network is observed.
  </summary>
</histogram>

<histogram name="Net.NetworkChangeNotifier.NewConnectionType"
    enum="NetworkConnectionType" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The new network connection type any time a change to the device's active
    default network is observed.
  </summary>
</histogram>

<histogram name="Net.NetworkErrorLogging.SignedExchangeRequestOutcome"
    enum="NetNetworkErrorLoggingRequestOutcome" expires_after="2023-03-29">
  <owner>ksakamoto@chromium.org</owner>
  <owner>webpackage-dev@chromium.org</owner>
  <summary>
    When Network Error Logging observes a completed request of signed exchange
    that might generate a report, what happens to it. NEL observes all requests,
    both successful and unsuccessful. It sends reports for successful and
    unsuccessful requests at specified sampling rates so that error rates can be
    calculated. Insecure requests are discarded for having an insecure origin
    regardless of existence of a policy for the origin.
  </summary>
</histogram>

<histogram name="Net.NetworkErrorLoggingService.TaskBacklogSize" units="count"
    expires_after="2027-01-03">
  <owner>hayato@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Records the size of the Network Error Logging (NEL) Service's task backlog
    queue. This is recorded when commands are issued to the NEL service while it
    is not yet initialized, causing the task to be queued in the backlog. This
    metric is sampled with a probability of 0.001 to reduce overhead.
  </summary>
</histogram>

<histogram
    name="Net.NetworkTransaction.AsyncRetryOnTooManyConnectionErrors.{Occurrence}{Protocol}"
    enum="Boolean" expires_after="2027-01-03">
  <owner>horo@chromium.org</owner>
  <owner>hayato@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Recorded when the mitigation for priority starvation (switching to async
    retry after a threshold of connection errors) is triggered. {Occurrence}
    This is for {Protocol}.
  </summary>
  <token key="Occurrence">
    <variant name="Every" summary="Recorded every time it is triggered."/>
    <variant name="First"
        summary="Recorded only the first time it is triggered for a
                 transaction."/>
  </token>
  <token key="Protocol" variants="NetworkTransactionProtocol"/>
</histogram>

<histogram name="Net.NetworkTransaction.ConnectedCallbackDelay" units="ms"
    expires_after="2027-08-09">
  <owner>hayato@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Measures the time taken to call http network transaction connected callback.
    Recorded every time the connected callback is called and completed. Emitted
    when the callback is completed.
  </summary>
</histogram>

<histogram
    name="Net.NetworkTransaction.Create{StreamType}Time3{HostType}.{Protocol}{AddressFamily}"
    units="ms" expires_after="2027-01-31">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>Deprecated. Replaced by Create{StreamType}Time4.</summary>
  <token key="StreamType">
    <variant name="HttpStream"/>
    <variant name="WebSocketStream"/>
  </token>
  <token key="HostType">
    <variant name=""/>
    <variant name=".GoogleHost"/>
  </token>
  <token key="Protocol" variants="NegotiatedProtocolCoalesced"/>
  <token key="AddressFamily">
    <variant name=""/>
    <variant name=".IPv4"/>
    <variant name=".IPv6"/>
    <variant name=".Unspecified"/>
  </token>
</histogram>

<histogram
    name="Net.NetworkTransaction.Create{StreamType}Time4{HostType}.{Protocol}{AddressFamily}"
    units="ms" expires_after="2027-01-31">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The time taken for creating a(n) {StreamType}. Recorded in
    HttpNetworkTransaction::DoCreateStreamComplete when the stream creation
    completes successfully for the first time (i.e. not for retries).
  </summary>
  <token key="StreamType">
    <variant name="HttpStream"/>
    <variant name="WebSocketStream"/>
  </token>
  <token key="HostType">
    <variant name=""/>
    <variant name=".GoogleHost"/>
  </token>
  <token key="Protocol" variants="NegotiatedProtocolCoalesced"/>
  <token key="AddressFamily">
    <variant name=""/>
    <variant name=".IPv4"/>
    <variant name=".IPv6"/>
    <variant name=".Unspecified"/>
  </token>
</histogram>

<histogram
    name="Net.NetworkTransaction.DuplicateRequestInterval{HostType}{MainFrame}"
    units="ms" expires_after="2026-02-01">
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    When an HTTP(S) request with a GET method is sent to the network within 10
    seconds of another GET request with an identical URL, records the time
    interval between the first request and the second.

    Recorded once per duplicate request, but only when the
    &quot;LogDuplicateRequests&quot; feature is enabled.
  </summary>
  <token key="HostType">
    <variant name=""/>
    <variant name=".GoogleHost"/>
  </token>
  <token key="MainFrame">
    <variant name=""/>
    <variant name=".MainFrame"/>
  </token>
</histogram>

<histogram name="Net.NetworkTransaction.InitialErrorOnAsyncRetry{Protocol}"
    enum="NetErrorCodes" expires_after="2027-06-19">
  <owner>hayato@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Recorded when the mitigation for priority starvation (switching to async
    retry after a threshold of connection errors) is triggered. Records the
    initial network error code that started the connection error retry loop.
    This is for {Protocol}.
  </summary>
  <token key="Protocol" variants="NetworkTransactionProtocol"/>
</histogram>

<histogram
    name="Net.NetworkTransaction.InitializeStreamBlocked{HostType}.{Protocol}"
    enum="Boolean" expires_after="2026-09-20">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records whether HTTP stream initialization is blocked or not. Recorded every
    time HttpStream::InitializeStream() is called.
  </summary>
  <token key="HostType" variants="NetworkTransactionBlockedHostType"/>
  <token key="Protocol" variants="NetworkTransactionBlockedProtocol"/>
</histogram>

<histogram
    name="Net.NetworkTransaction.InitializeStreamBlockTime{HostType}.{Protocol}"
    units="ms" expires_after="2026-11-29">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The time taken for HTTP stream initialization to finish if the
    initialization was blocked. Recorded in
    HttpNetworkTransaction::DoInitStreamComplete when the stream initialization
    is complete.
  </summary>
  <token key="HostType" variants="NetworkTransactionBlockedHostType"/>
  <token key="Protocol" variants="NetworkTransactionBlockedProtocol"/>
</histogram>

<histogram name="Net.NetworkTransaction.NegotiatedProtocol2{HostType}"
    enum="SSLNegotiatedAlpnProtocol" expires_after="2026-12-06">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Deprecated. Replaced by NegotiatedProtocol3.</summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.NetworkTransaction.NegotiatedProtocol3{HostType}"
    enum="SSLNegotiatedAlpnProtocol" expires_after="2027-01-03">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Negotiated protocol of an HttpStream. Recorded in HttpNetworkTransaction
    when an HttpStreamRequest succeeded for the first time (i.e. not for
    retries).
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.NetworkTransaction.RequestStreamCpuTime" units="ms"
    expires_after="2027-01-17">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Measures the CPU time taken by creating a HttpStreamRequest. Recoreded every
    time the HttpNetworkTransaction::DoCreateStream() is called for HTTP stream
    request.
  </summary>
</histogram>

<histogram
    name="Net.NetworkTransaction.RetryAttemptsOnConnectionErrors{Protocol}"
    units="count" expires_after="2027-01-03">
  <owner>horo@chromium.org</owner>
  <owner>hayato@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The number of retry attempts made for connection errors during the lifetime
    of a single HttpNetworkTransaction. Recorded when the transaction is
    destroyed, if there was at least one retry attempt. The maximum value is
    kMaxRetryAttemptsOnConnectionErrors (50). This is for {Protocol}.
  </summary>
  <token key="Protocol" variants="NetworkTransactionProtocol"/>
</histogram>

<histogram name="Net.NetworkTransaction.RetryOnConnectionErrors{Protocol}"
    enum="NetErrorCodes" expires_after="2027-06-19">
  <owner>hayato@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Recorded when a retry attempt is made for a connection error during an HTTP
    network transaction. Records the specific network error code that triggered
    the retry. This is for {Protocol}.
  </summary>
  <token key="Protocol" variants="NetworkTransactionProtocol"/>
</histogram>

<histogram name="Net.NetworkTransaction.SessionSource3.{Protocol}"
    enum="NetworkSessionSource" expires_after="2027-03-02">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>Deprecated. Replaced by SessionSource4.</summary>
  <token key="Protocol" variants="NegotiatedProtocolCoalesced"/>
</histogram>

<histogram name="Net.NetworkTransaction.SessionSource4.{Protocol}"
    enum="NetworkSessionSource" expires_after="2027-03-02">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Measures whether a request used a new or an existing {Protocol} session.
    Recorded in HttpNetworkTransaction::DoCreateStreamComplete when the stream
    creation completes successfully for the first time (i.e. not for retries).
    Note that this is only recorded for HTTP/2 and HTTP/3. There are similar
    histograms called PageLoad.Clients.GoogleSearch.SessionSource.{Protocol}
    that are recorded only for search navigation. These histograms are recorded
    per navigation, whereas this histograms measures per request.
  </summary>
  <token key="Protocol" variants="NegotiatedProtocolCoalesced"/>
</histogram>

<histogram name="Net.NetworkTransaction.StreamAddressFamily2"
    enum="AddressFamily" expires_after="2027-06-30">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Deprecated. Replaced by StreamAddressFamily3.</summary>
</histogram>

<histogram name="Net.NetworkTransaction.StreamAddressFamily3"
    enum="AddressFamily" expires_after="2027-06-30">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Address family of a remote endpoint of an HttpStream. Recorded in
    HttpNetworkTransaction when an HttpStreamRequest succeeded and getting the
    remote endpoint IP address succeeded for the first time (i.e. not for
    retries).
  </summary>
</histogram>

<histogram
    name="Net.NetworkTransaction.StreamRequestCompleteTime3{HostType}.{SuccessOrFailure}"
    units="ms" expires_after="2026-11-29">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Deprecated. Replaced by StreamRequestCompleteTime4.</summary>
  <token key="HostType" variants="HostType"/>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram
    name="Net.NetworkTransaction.StreamRequestCompleteTime4{HostType}.{SuccessOrFailure}"
    units="ms" expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The time taken by an HttpStreamRequest to complete. Recorded only when an
    HttpStreamRequest succeeded without retries in HttpNetworkTransaction for
    the first time (i.e. not for retries).
  </summary>
  <token key="HostType" variants="HostType"/>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram name="Net.NetworkTransaction.StreamRequestErrorCode3"
    enum="NetErrorCodes" expires_after="2027-01-06">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Deprecated. Replaced by StreamRequestErrorCode4.</summary>
</histogram>

<histogram name="Net.NetworkTransaction.StreamRequestErrorCode4"
    enum="NetErrorCodes" expires_after="2027-01-06">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The net error for an HttpStreamRequest. Recorded in HttpNetworkTransaction
    when an HttpStreamRequest failed for the first time (i.e. not for retries).
  </summary>
</histogram>

<histogram
    name="Net.NetworkTransaction.TooManyRetriesOnConnectionErrors{Protocol}"
    enum="Boolean" expires_after="2027-01-03">
  <owner>hayato@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Recorded when an HTTP network transaction has reached the maximum number of
    retries for connection errors. Recorded every time when the retry reached
    kMaxRetryAttemptsOnConnectionErrors (50). This is for {Protocol}.
  </summary>
  <token key="Protocol" variants="NetworkTransactionProtocol"/>
</histogram>

<histogram
    name="Net.NetworkTransaction.{Protocol}StreamCreationTime2.{NewOrExisting}"
    units="ms" expires_after="2026-12-16">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>Deprecated. Replaced by {Protocol}StreamCreationTime3.</summary>
  <token key="Protocol" variants="NegotiatedProtocolCoalesced"/>
  <token key="NewOrExisting">
    <variant name="Existing"/>
    <variant name="New"/>
  </token>
</histogram>

<histogram
    name="Net.NetworkTransaction.{Protocol}StreamCreationTime3.{NewOrExisting}"
    units="ms" expires_after="2026-10-11">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The time taken by an HttpNetworkTransaction to create a successful
    HttpStream, recorded separately by protocol and whether the stream is
    created on top of new or existing socket/session. Recorded in
    HttpNetworkTransaction::DoCreateStreamComplete when the stream creation
    completes successfully for the first time (i.e. not for retries).
  </summary>
  <token key="Protocol" variants="NegotiatedProtocolCoalesced"/>
  <token key="NewOrExisting">
    <variant name="Existing"/>
    <variant name="New"/>
  </token>
</histogram>

<histogram name="Net.NetworkTransaction{HostType}.RetryReason"
    enum="HttpNetworkTransactionRetryReason" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Log the reason when HttpNetworkTransaction retries.</summary>
  <token key="HostType">
    <variant name=""/>
    <variant name="H3SupportedGoogleHost"/>
  </token>
</histogram>

<histogram name="Net.NumQuicSessionsAtShutdown" units="units"
    expires_after="2024-11-03">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of QUIC sessions when the QuicSessionPool is destroyed.
  </summary>
</histogram>

<histogram name="Net.OnTransferSizeUpdated.Experimental.OverridenBy"
    enum="OnTransferSizeUpdatedFrom" expires_after="2025-04-08">
  <expired_intentionally>
    Kept as a diagnostic metric.
  </expired_intentionally>
  <owner>amanvr@chromium.org</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    Records the number of times OnTransferSizeUpdated is called from different
    overriding methods. This UMA is useful to understand the distribution of
    calls being made to this method and will help see the reductions in IPC when
    we implement a prototype (b/257057692) where we remove unnecessary
    URLLoaderClient::OnTransferSizeUpdated IPCs.

    Disabled starting M137.
  </summary>
</histogram>

<histogram name="Net.PreconnectHSTSUpgradesUrl"
    enum="HSTSRedirectUpgradeReason" expires_after="2026-02-22">
  <owner>ladan@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Records whether or not a url was upgraded by HSTS during an attempt to
    preconnect to the url and, if it was not upgraded, why. Recorded whenever
    GetHSTSRedirectForPreconnect() is called and kHstsTopLevelNavigationsOnly is
    disabled.
  </summary>
</histogram>

<histogram name="Net.ProxyChangeListener.ReflectedCall" enum="Boolean"
    expires_after="2026-01-17">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logged everytime an app uses reflection to invoke the
    ProxyChangeListener.ProxyReceiver BroadcastReceiver's onReceive method. This
    method exists for backwards compatibility with WebView apps that have not
    migrated to using newer proxy configuration APIs. This histogram is used to
    identify if it is still used in the app ecosystem or if it can be removed.

    Apps may trigger the method zero, one, or multiple times per session.

    Only logs to the false bucket. Only logged for Android WebView.
  </summary>
</histogram>

<histogram name="Net.ProxyChangeListener.RegistrationTime" units="microseconds"
    expires_after="2027-02-07">
  <owner>barkinunal@google.com</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    Records the time taken to complete the registration of the
    ProxyChangeListener on Android. This measures the duration from when
    registration is initiated until it is complete. Note that there are two
    binder calls involved, as there are two receivers being registered. The
    metric covers the combined timing of these two calls. The combined timing
    won't tell whether one was slow or both were slow, but they are likely
    correlated. This metric is intended to help with judging priorities.

    This metric is only recorded on Android, for which a high-resolution clock
    is always available.
  </summary>
</histogram>

<histogram name="Net.ProxyScriptFetcher.FirstByteDuration" units="ms"
    expires_after="2024-04-03">
  <owner>dschinazi@chromium.org</owner>
  <summary>
    The time taken from requesting a PAC script to receiving the first byte of
    the response body on successful fetches. This does not include time spent
    doing proxy auto-discovery, or failed attempts at retrieving PAC scripts. If
    the response body was empty, this measures the total time to fetch the
    (empty) response body.
  </summary>
</histogram>

<histogram name="Net.QuicActiveSessionCount.{GoingAwayReason}" units="sesions"
    expires_after="2027-02-07">
  <owner>nidhijaju@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records the number of active sessions that are marked as going away because
    {GoingAwayReason}.
  </summary>
  <token key="GoingAwayReason">
    <variant name="CertDBChanged" summary="the certificate database changed"/>
    <variant name="CertVerifierChanged"
        summary="the certificate veriier changed"/>
    <variant name="ClockSkewDetected" summary="a clock skew was detected"/>
    <variant name="IPAddressChanged" summary="an IP address changed"/>
  </token>
</histogram>

<histogram name="Net.QuicActiveSessions" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of active QUIC sessions before we activate a new QUIC session.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicAltSvcFormat" enum="QuicAltSvcFormat"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Tracks the number of QUIC alt-svc advertisements parsed by Chrome in Google
    format vs in IETF format.
  </summary>
</histogram>

<histogram name="Net.QuicChromiumClientStream.HandleOnCloseConnectionError"
    enum="QuicErrorCodes" expires_after="2026-07-26">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Log the connection error code when QUIC stream handle closes.
  </summary>
</histogram>

<histogram name="Net.QuicChromiumClientStream.HandleOnCloseNetError"
    enum="NetErrorCodes" expires_after="2025-06-22">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Log the net error code when QUIC stream handle closes.</summary>
</histogram>

<histogram name="Net.QuicChromiumClientStream.HandleOnCloseStreamError"
    enum="QuicRstStreamErrorCodes" expires_after="2025-06-22">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Log the stream error code when QUIC stream handle closes.</summary>
</histogram>

<histogram name="Net.QuicChromiumClientStream.HeaderDecodingDelay{ServerType}"
    units="ms" expires_after="2025-06-07">
  <owner>bnc@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The delay in decoding received headers due to having to wait for dynamic
    table entries to arrive on the QPACK encoder stream. Zero if header block
    could be decoded as soon as it was received. This is recorded for
    connections made to {ServerType}.
  </summary>
  <token key="ServerType">
    <variant name="" summary="all QUIC servers"/>
    <variant name="Google" summary="Google servers"/>
  </token>
</histogram>

<histogram
    name="Net.QuicChromiumClientStream.Http3DatagramDroppedOnWriteConnectUdpPayload"
    enum="BooleanSuccess" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records whether an HTTP Datagram was dropped when trying to send a UDP
    payload over the QUIC stream. Datagram is dropped if the QUIC session has
    not yet received SETTINGS_H3_DATAGRAM frame and therefore does not support
    sending or receiving datagrams.
  </summary>
</histogram>

<histogram name="Net.QuicChromiumClientStream.TrailingHeadersProcessSuccess"
    enum="BooleanSuccess" expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Log success rate of processing trailing headers.</summary>
</histogram>

<histogram name="Net.QuicConnection.MultiPortPathCreationCancelled"
    enum="PathValidationReason" expires_after="2025-04-13">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The reason for the existing path validation when a new multi-port path
    creation is attempted but failed because of existing validation.
  </summary>
</histogram>

<histogram name="Net.QuicConnection.MultiPortPathStatusWhenMigrating"
    enum="MultiPortStatusOnMigration" expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The status of the multi-port path when the client initiates the migration.
  </summary>
</histogram>

<histogram name="Net.QuicConnection.ServerAllowsActiveMigrationForMultiPort"
    enum="BooleanEnabled" expires_after="2026-05-31">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    When multi-port is enabled, log whether the server allows active migration
    that's required for multi-port
  </summary>
</histogram>

<histogram name="Net.QuicConnection.WritePacketStatus" enum="QuicWriteStatus"
    expires_after="2024-12-08">
  <owner>wub@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The write result returned by the packet writer when the connection attempts
    to write a packet.
  </summary>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.NumActiveDegradingSessions{PlatformNotifications}"
    units="sessions" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of active sessions that are degrading on network changes. The
    suffix specifies the network change. Emitted when there are more than one
    active sessions.

    The histogram is emitted when a network change happens which could affect
    the current default network, which includes the default network being
    changed, alternate networks being connected. It, however, doesn't emit when
    disconnecting an alternate network because that does not affect the current
    default network. {PlatformNotifications}
  </summary>
  <token key="PlatformNotifications" variants="PlatformNotifications">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.NumActiveQuicSessionsAtNetworkChange"
    units="sessions" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of active QUIC sessions when a network change is detected. The
    suffix specifies the network change.

    The histogram is emitted when a network change happens which could affect
    the current default network, which includes the default network being
    changed, alternate networks being connected. It, however, doesn't emit when
    disconnecting an alternate network because that does not affect the current
    default network.
  </summary>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.NumAllDegradedSessions{PlatformNotifications}"
    units="sessions" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of all sessions that detectes path degradation until a network
    change happens, including both active sessions and closed sessions. The
    suffix specifies the network change.

    The histogram is emitted when a network change happens which could affect
    the current default network, which includes the default network being
    changed, alternate networks being connected. It, however, doesn't emit when
    disconnecting an alternate network because that does not affect the current
    default network. {PlatformNotifications}
  </summary>
  <token key="PlatformNotifications" variants="PlatformNotifications">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.NumAllSessionsDegradedAtNetworkChange"
    units="sessions" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The total number of sessions that reports path degradation before a network
    change happens, including both still active sessions and closed sessions.

    The histogram is emitted when a network change happens which could affect
    the current default network, which includes the default network being
    changed, alternate networks being connected. It, however, doesn't emit when
    disconnecting an alternate network because that does not affect the current
    default network.
  </summary>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.NumSessionsTrackedSinceSpeculativeError"
    units="sessions" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of total sessions that has been tracked since the first
    speculative error, including both active and closed sessions. Only recorded
    if non-zero.

    The histogram is emitted when a network change happens which could affect
    the current default network, which includes the default network being
    changed, alternate networks being connected. It, however, doesn't emit when
    disconnecting an alternate network because that does not affect the current
    default network.
  </summary>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.NumWriteErrorsSeenBeforeDegradation"
    units="errors" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of total sessions that has been closed due to
    QUIC_PACKET_WRITE_ERROR before first path degradation detection.

    The histogram is emitted when session path degrading is detected for the
    first time on the current network and there was a session closed with a
    speculative signal (QUIC_PACKET_WRITE_ERROR).
  </summary>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.PercentageActiveDegradingSessions{PlatformNotifications}"
    units="%" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The percentage of active sessions that are degrading on network changes. The
    suffix specifies the network change. Emitted when there are at least two
    active sessions.

    The histogram is emitted when a network change happens which could affect
    the current default network, which includes the default network being
    changed, alternate networks being connected. It, however, doesn't emit when
    disconnecting an alternate network because that does not affect the current
    default network. {PlatformNotifications}
  </summary>
  <token key="PlatformNotifications" variants="PlatformNotifications">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="Net.QuicConnectivityMonitor.PercentageAllDegradedSessions{PlatformNotifications}"
    units="%" expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The percentage of all sessions that detectes path degradation until a
    network change happens, including both active sessions and closed sessions.
    Always emit 0 when there is no session reporting path degrading to speculate
    a connectivity failure on the current network. The suffix specifies the
    network change.

    The histogram is emitted when a network change happens which could affect
    the current default network, which includes the default network being
    changed, alternate networks being connected. It, however, doesn't emit when
    disconnecting an alternate network because that does not affect the current
    default network. {PlatformNotifications}
  </summary>
  <token key="PlatformNotifications" variants="PlatformNotifications">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Net.QuicConnectivityMonitor.SessionDegradedBeforeWriteError"
    enum="BooleanDetected" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    When a packet write error is detected by the session, if path degradation
    has been detected already on the same session.

    The histogram is emitted when a session encounters a QUIC_PACKET_WRITE_ERROR
    and is soon to be closed.
  </summary>
</histogram>

<histogram name="Net.QuicDiskCache.FailureReason{NetQuicDiskCacheBackend}"
    enum="QuicDiskCacheFailureReason" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Tracks failure reasons to read/load/write of QuicServerInfo to and from disk
    cache. {NetQuicDiskCacheBackend}
  </summary>
  <token key="NetQuicDiskCacheBackend">
    <variant name=""/>
    <variant name=".DiskCache" summary="DiskCache backend is using disk cache.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name=".MemoryCache"
        summary="DiskCache backend is using memory cache.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name=".NoBackend" summary="DiskCache didn't have a backend">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name=".PropertiesBasedCache"
        summary="Preferences based cache is used.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name=".WaitForDataReady"
        summary="Tracks the last failure reason until WaitForDataReady or its
                 callback is executed. This is recorded when data is ready in
                 WaitForDataReady or when the callback is executed">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
  </token>
</histogram>

<histogram name="Net.QuicDroppedPacketReason" enum="QuicDroppedPacketReason"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The reason a QUIC packet could not be processed, logged for each dropped
    packet.

    WARNING: this histogram was expired from 2025-01-05 to 2026-06-24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicHandshakeNotConfirmedNumPacketsReceived" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of QUIC packets received by a QUIC connection whose handshake was
    not confirmed when that connection is closed.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicHandshakeState" enum="QuicHandshakeState"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The state of a QUIC connection's crypto hanshake as it progresses from
    starting to confirmation or failure.
  </summary>
</histogram>

<histogram name="Net.QuicHttpStream.ProcessResponseHeaderSuccess"
    enum="BooleanSuccess" expires_after="2024-01-21">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Log the success rate of HTTP layer reading QUIC response headers, for
    investigating b/177893733.
  </summary>
</histogram>

<histogram name="Net.QuicHttpStream.ResponseStatus"
    enum="QuicRstStreamErrorCodes" expires_after="2024-11-27">
  <owner>bnc@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Stream error of QuicSpdyStream when QuicHttpStream::ComputeResponseStatus()
    returns ERR_QUIC_PROTOCOL_ERROR, for investigating b/177893733.
  </summary>
</histogram>

<histogram name="Net.QuicMultiPort.AltPortFailureWhenPathDegradingVsGeneral"
    units="%" expires_after="2024-11-17">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The percentage comparison between alternative port probe failure when
    default path is degrading and in general.
  </summary>
</histogram>

<histogram name="Net.QuicMultiPort.AltPortRttWhenPathDegradingVsGeneral"
    units="%" expires_after="2024-07-07">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The percentage comparison between alternative port response time when
    default path is degrading and response time in general.
  </summary>
</histogram>

<histogram name="Net.QuicMultiPort.NumMultiPortFailureWhenPathDegrading"
    units="times" expires_after="2026-07-19">
  <owner>dmcardle@chromium.org</owner>
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of alternative port probing failure when the default path is
    degrading.
  </summary>
</histogram>

<histogram name="Net.QuicMultiPort.NumMultiPortFailureWhenPathNotDegrading"
    units="times" expires_after="2026-07-19">
  <owner>dmcardle@chromium.org</owner>
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of alternative port probing failure when the default path is
    healthy.
  </summary>
</histogram>

<histogram name="Net.QuicMultiPort.NumProbeAttempts" units="times"
    expires_after="2026-07-19">
  <owner>dmcardle@chromium.org</owner>
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The number of alternative port probing attempts.</summary>
</histogram>

<histogram name="Net.QuicMultiPort.NumSuccessfulProbes" units="times"
    expires_after="2026-07-19">
  <owner>dmcardle@chromium.org</owner>
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The number of successful alternative port probes.</summary>
</histogram>

<histogram name="Net.QuicNetworkDegradingDurationTillConnected" units="ms"
    expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Time from when QUIC detects performance degradation on the current network
    to when QUIC notices a new network is connected.
  </summary>
</histogram>

<histogram name="Net.QuicNetworkDegradingDurationTillDisconnected" units="ms"
    expires_after="2024-05-05">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Time from when QUIC detects performance degradation on the current network
    to when QUIC notices the current network is disconnected.
  </summary>
</histogram>

<histogram name="Net.QuicNetworkDegradingDurationTillNewNetworkMadeDefault"
    units="ms" expires_after="2024-05-26">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The time from QUIC detecting network performance degradation to an
    alternative network becoming default.
  </summary>
</histogram>

<histogram name="Net.QuicNetworkDisconnectionDuration" units="ms"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The time from network disconnection to an alternative network becoming
    default.
  </summary>
</histogram>

<histogram name="Net.QuicNumServerConfig.UpdateMessagesIgnored"
    enum="BooleanIgnored" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The number of times ServerConfigUpdateMessages ignored.</summary>
</histogram>

<histogram name="Net.QuicProxyDatagramClientSocket.MaxQueueSizeReached"
    enum="BooleanSuccess" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Records whether queue is at maximum capacity when an HTTP/3 datagram arrives
    on the QUIC stream in client socket. A QUIC connection parses the Datagram
    frame and passes it to the QUIC SPDY session, which then extracts the
    quarter stream ID to determine which stream to invoke `OnHttp3Datagram`
    method on. The incoming datagram is dropped if full and added to queue
    otherwise.
  </summary>
</histogram>

<histogram name="Net.QuicServerInfo.DiskCacheState"
    enum="QuicServerConfigState" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The state of the QUIC server information when it's loaded from the disk
    cache.
  </summary>
</histogram>

<histogram name="Net.QuicSession.AbortedPendingStreamRequests"
    units="stream requests" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of pending stream requests aborted when the session is closed.
    Pending streams are those which could not be created immediately because
    there were too many active streams.
  </summary>
</histogram>

<histogram name="Net.QuicSession.AcceptChForOrigin" enum="Boolean"
    expires_after="2026-12-27">
  <owner>bnc@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records whether the QUIC session received an Accept-CH entry for the given
    origin, which GetAcceptChViaAlps() returns. Logged every time
    QuicHttpStream::GetAcceptChViaAlps() is called, typically once for each
    request that is served over HTTP/3.
  </summary>
</histogram>

<histogram name="Net.QuicSession.AcceptChFrameReceivedViaAlps"
    enum="AcceptChEntries" expires_after="2027-02-21">
  <owner>bnc@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records both whether there are any valid origin fields and whether there are
    any invalid ones in the ACCEPT_CH frame. Logged during the TLS handshake of
    a QUIC connection if ALPS is negotiated, once for every ACCEPT_CH HTTP/3
    frame received (possibly zero, typically not more than one).
  </summary>
</histogram>

<histogram name="Net.QuicSession.ActiveStreamsOnGoAwayAfterPathDegrading"
    units="Streams" expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of active streams when the quic session decides to go away on
    path degrading.
  </summary>
</histogram>

<histogram name="Net.QuicSession.AsyncDnsJob.AttemptsPerJob.{JobOutcome}"
    units="attempts" expires_after="2026-11-02">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The number of connection attempts a QuicSessionPool::AsyncDnsJob started
    before it settled. Recorded once per job, when {JobOutcome}. A job recorded
    with zero attempts failed before it could start a connection attempt or
    succeeded by using an existing session. Only recorded when the
    AsyncDnsQuicJob feature is enabled.
  </summary>
  <token key="JobOutcome">
    <variant name="JobFailed" summary="the job failed"/>
    <variant name="JobSucceeded" summary="the job succeeded"/>
  </token>
</histogram>

<histogram
    name="Net.QuicSession.AsyncDnsJob.SuccessfulAttemptElapsedTime.{MeasurementPoint}"
    units="ms" expires_after="2026-11-02">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Time since the successful connection attempt started, measured at
    {MeasurementPoint}. The FinalDnsResult variant records zero if the attempt
    started after DNS finished. The JobSuccessWithDnsInFlight variant is a lower
    bound on the time until the final DNS result because job success cancels
    DNS. Recorded once per successful job that used a connection attempt. Only
    recorded when the AsyncDnsQuicJob feature is enabled.
  </summary>
  <token key="MeasurementPoint">
    <variant name="FinalDnsResult"
        summary="the resolver returned its final result"/>
    <variant name="JobSuccessWithDnsInFlight"
        summary="the job succeeded while DNS was still running"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.AsyncDnsJob.SuccessSource"
    enum="QuicSessionPoolAsyncDnsJobSuccessSource" expires_after="2026-11-02">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    How a successful QuicSessionPool::AsyncDnsJob obtained its session. The
    source is an active session for the same key, IP pooling, the first attempt
    by the initial connector, a later attempt by the initial connector, or any
    attempt by the connector created when the slow timer fired. Recorded once
    per successful job. Only recorded when the AsyncDnsQuicJob feature is
    enabled.
  </summary>
</histogram>

<histogram name="Net.QuicSession.AsyncDnsJob.TimeToFailure" units="ms"
    expires_after="2026-11-02">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The time from the start of a QuicSessionPool::AsyncDnsJob's first connection
    attempt to the job's failure. Recorded once per failed job that started at
    least one attempt. Jobs that fail before starting an attempt are not
    recorded. Only recorded when the AsyncDnsQuicJob feature is enabled.
  </summary>
</histogram>

<histogram name="Net.QuicSession.AsyncRead" enum="Boolean"
    expires_after="2024-11-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if the result of reading a packet from the network was ERR_IO_PENDING.
    Recorded for each packet when Read() returns.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.BlockedFrames.Received" units="units"
    expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of BLOCKED frames recevied by a QuicSession when the session is
    closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.BlockedFrames.Sent" units="units"
    expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of BLOCKED frames sent by a QuicSession when the session is
    closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.CertVerificationResult" enum="NetErrorCodes"
    expires_after="2026-12-27">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code returned to a QUIC session from the CertVerifier when
    a certification verification is attempted.
  </summary>
</histogram>

<histogram name="Net.QuicSession.CertVerifierJob.CompleteTime"
    units="Milliseconds" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Time spent verifying a certificate when racing cert veriifcation with host
    resolution.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ClientSideMtu" units="bytes"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The final maximum packet size of the connection used by the client before
    the session is closed.

    WARNING: this histogram was expired from 2025-04-10 to 2026-06-24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.CloseAllSessionsError" enum="NetErrorCodes"
    expires_after="2024-12-08">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code which resulted in all sessions being closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ClosedByPublicReset{HandshakeType}"
    enum="Boolean" expires_after="2027-02-07">
  <owner>wub@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    For a QUIC session that is closed by a public reset, where the handshake was
    {HandshakeType}, this boolean shows whether it is a public reset sent from a
    Google server or not.

    Warning: this histogram was expired between 2024-06-02 and 2026-08-07 so
    some data is missing.
  </summary>
  <token key="HandshakeType">
    <variant name="" summary="not confirmed"/>
    <variant name=".HandshakeConfirmed" summary="confirmed"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.ClosedByRtoAtClient.ReceivedPacketCount"
    units="packets" expires_after="2023-11-19">
  <owner>wub@chromium.org</owner>
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    For a QUIC session that is closed by QUIC_TOO_MANY_RTOS at client, this is
    the number of packets it received before it is closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ClosedByRtoAtClient.SentPacketCount"
    units="packets" expires_after="2023-11-19">
  <owner>wub@chromium.org</owner>
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    For a QUIC session that is closed by QUIC_TOO_MANY_RTOS at client, this is
    the number of packets it sent before it is closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ClosedDuringInitializeSession" enum="Boolean"
    expires_after="2024-05-26">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if the QUIC session is closed during the call to InitializeSession,
    logged for each session just after InitializeSession is called.
  </summary>
</histogram>

<histogram name="Net.QuicSession.CloseSessionOnError" enum="NetErrorCodes"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code which resulted in the session being closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.CoalesceStreamFrameStatus"
    enum="BooleanCoalesced" expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    When a new stream frame is added to a QUIC packet, record whether it's
    coalesced with the existing stream frames.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ConnectAfterBroken" enum="BooleanSuccess"
    expires_after="2024-06-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if a QUIC connection connected successfully after having been broken.
    Only emitted after a QUIC connection attempt to a server that was previous
    marked as broken.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.ConnectionClose.HandshakeFailureBlackHole.QuicError"
    enum="QuicErrorCodes" expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error which caused a QUIC connection to be closed before the
    hanshake was confirmed, in the case where no packets were received. This
    provides a breakdown of the entires in
    Net.QuicSession.ConnectionClose.HandshakeNotConfirmed.Reason where the value
    is BLACK_HOLE.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.ConnectionClose.HandshakeFailureUnknown.QuicError"
    enum="QuicErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error which caused a QUIC connection to be closed before the
    hanshake was confirmed, in the case where at least 1 packet was received.
    This provides a breakdown of the entires in
    Net.QuicSession.ConnectionClose.HandshakeNotConfirmed.Reason where the value
    is UNKNOWN.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ConnectionClose.HandshakeNotConfirmed.Reason"
    enum="QuicHandshakeFailureReason" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The reason a QUIC handshake failed.</summary>
</histogram>

<histogram
    name="Net.QuicSession.ConnectionClose.NumOpenStreams.HandshakeTimedOut"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of streams open when a QUIC session crypto handshake timed out.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ConnectionClose.NumOpenStreams.TimedOut"
    units="units" expires_after="2024-02-11">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The number of streams open when a QUIC session timed out.</summary>
</histogram>

<histogram
    name="Net.QuicSession.ConnectionClose.NumTotalStreams.HandshakeTimedOut"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of total streams created when a QUIC session crypto handshake
    timed out.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.ConnectionCloseErrorCodeServerIetfApplication{GQuicMissing}{ServerType}{HandshakeType}"
    enum="QuicHttp3ErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC application transport error code in a CONNECTION_CLOSE frame
    received from the server{GQuicMissing}. This is recorded for connections
    made to {ServerType}{HandshakeType}.
  </summary>
  <token key="GQuicMissing">
    <variant name="" summary=""/>
    <variant name="GQuicErrorMissing"
        summary=", when the GQUIC error was missing"/>
  </token>
  <token key="ServerType">
    <variant name="" summary="all QUIC servers"/>
    <variant name="ECH" summary="ECH-capable servers">
      <owner>davidben@chromium.org</owner>
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="Google" summary="Google servers"/>
  </token>
  <token key="HandshakeType">
    <variant name="" summary=""/>
    <variant name=".HandshakeConfirmed"
        summary=", where the handshake was confirmed"/>
    <variant name=".HandshakeNotConfirmed"
        summary=", where the handshake was not confirmed"/>
  </token>
</histogram>

<histogram
    name="Net.QuicSession.ConnectionCloseErrorCodeServerIetfTransport{GQuicMissing}{ServerType}{HandshakeType}"
    enum="QuicTransportErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC transport error code in a CONNECTION_CLOSE frame received from the
    server{GQuicMissing}. This is recorded for connections made to
    {ServerType}{HandshakeType}.

    Warning: the ConnectionCloseErrorCodeServerIetfTransportGoogle variant was
    expired from 09/12/2022 to 03/22/2023; data may be missing.
  </summary>
  <token key="GQuicMissing">
    <variant name="" summary=""/>
    <variant name="GQuicErrorMissing"
        summary=", when the GQUIC error was missing"/>
  </token>
  <token key="ServerType">
    <variant name="" summary="all QUIC servers"/>
    <variant name="ECH" summary="ECH-capable servers">
      <owner>davidben@chromium.org</owner>
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="Google" summary="Google servers"/>
  </token>
  <token key="HandshakeType">
    <variant name="" summary=""/>
    <variant name=".HandshakeConfirmed"
        summary=", where the handshake was confirmed"/>
    <variant name=".HandshakeNotConfirmed"
        summary=", where the handshake was not confirmed"/>
  </token>
</histogram>

<histogram
    name="Net.QuicSession.ConnectionCloseErrorCode{Closer}{ServerType}{HandshakeType}"
    enum="QuicErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error code which resulted in the QUIC connection being closed by
    the {Closer}. This is recorded for connections made to
    {ServerType}{HandshakeType}.
  </summary>
  <token key="Closer">
    <variant name="Client" summary="client"/>
    <variant name="Server" summary="server"/>
  </token>
  <token key="ServerType">
    <variant name="" summary="all QUIC servers"/>
    <variant name="ECH" summary="ECH-capable servers">
      <owner>davidben@chromium.org</owner>
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="Google" summary="Google servers"/>
  </token>
  <token key="HandshakeType">
    <variant name="" summary=""/>
    <variant name=".HandshakeConfirmed"
        summary=", where the handshake was confirmed"/>
    <variant name=".HandshakeNotConfirmed"
        summary=", where the handshake was not confirmed"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.ConnectionDurationWithPublicReset" units="ms"
    expires_after="2024-06-30">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>Duration of connections received PUBLIC_RESET.</summary>
</histogram>

<histogram name="Net.QuicSession.ConnectionDuration{HostType}{Initiator}"
    units="ms" expires_after="2027-02-07">
  <owner>renjietang@chromium.org</owner>
  <owner>suzukikeita@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The duration of a QUIC connection starting from 1-RTT key available to
    connection close for {HostType} with {Initiator}. This is recorded when the
    QUIC connection is closed.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
  <token key="Initiator">
    <variant name="" summary="any connection initiator"/>
    <variant name=".Preconnect"
        summary="the connection was established via preconnect"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.ConnectionFlowControlBlocked"
    enum="BooleanBlocked" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Whether QUIC session's connection is flow control blocked when a PING
    message is sent to server.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ConnectionIpPooled" enum="Boolean"
    expires_after="2025-10-26">
  <owner>nidhijaju@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if an active session already exists for a given Ip during connection.
    Recorded when attempting to create a new session. Warning: this histogram
    was expired from 2024-02-04 to 2024-03-28; data may be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ConnectionMigration{ConnectionMigrationCause}"
    enum="QuicConnectionMigrationStatus" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The result of a QUIC connection migration attempt. The suffix specifies the
    cause of connection migration. {ConnectionMigrationCause}
  </summary>
  <token key="ConnectionMigrationCause" variants="ConnectionMigrationCause">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Net.QuicSession.ConnectionTypeFromPeer" enum="AddressFamily"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The IP Address family of this connection, as reported by the server.
  </summary>
</histogram>

<histogram name="Net.QuicSession.Connect{QuicPortSelection}" units="RTTs"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Samples of the number of round-trips needed by a QUIC connection before a
    request could be sent by the client. {QuicPortSelection}
  </summary>
  <token key="QuicPortSelection">
    <variant name=""/>
    <variant name="RandomPort"
        summary="The operating system randomly selected a source port for the
                 connection.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="SelectPort"
        summary="An effort was mode to (try to) consistently connect using the
                 same source port for the given server IP/port.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
  </token>
</histogram>

<histogram name="Net.QuicSession.CreationError" enum="QuicSessionErrorCodes"
    expires_after="2024-06-30">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Count of errors during attempts to create a QUIC session (before even using
    the session).
  </summary>
</histogram>

<histogram name="Net.QuicSession.CryptoRetransmitCount.HandshakeConfirmed"
    units="count" expires_after="2025-08-31">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Times of retransmission time out of connections with successful handshake.
  </summary>
</histogram>

<histogram name="Net.QuicSession.CryptoRetransmitCount.HandshakeNotConfirmed"
    units="count" expires_after="2025-08-31">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Times of crypto retransmission timeout of connections with failed handshake.
  </summary>
</histogram>

<histogram name="Net.QuicSession.DrainingStreamsOnGoAwayAfterPathDegrading"
    units="Streams" expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of draining streams when the quic session decides to go away on
    path degrading.
  </summary>
</histogram>

<histogram name="Net.QuicSession.DuplicatePacketsReceived" units="units"
    expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of duplicate packets recevied by a QuicSession when the session
    is closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.EcnMarksSent" enum="EcnPermutations"
    expires_after="2025-09-05">
  <owner>martinduke@google.com</owner>
  <owner>rch@chromium.org</owner>
  <summary>
    The combination of ECN marks sent on a single QuicSession. Recorded when the
    session is closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.EncryptionEstablishedTime"
    units="Milliseconds" expires_after="2026-11-29">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The elapsed time between starting the crypto handshake and installing the
    first encryption key that can carry application data (either 0-RTT or
    1-RTT).
  </summary>
</histogram>

<histogram name="Net.QuicSession.FinalTcpCwnd" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The value of the TCP cubic sender's CWND when the session is closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.FinchConfigIsValid" enum="Boolean"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Logged every time we parse a QUIC Finch config, and logs whether the config
    was valid. Invalid configs are most likely to be obsolete configs. Note that
    this is still logged (as true) when no variations config is present.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.FinchObsoleteVersion" enum="Boolean"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Triggered any time Finch configures an obsolete QUIC version. Only recorded
    when obsolete versions are not allowed (which is the default).
  </summary>
</histogram>

<histogram name="Net.QuicSession.FindMatchingIpSessionResult{ServerType}"
    enum="QuicFindMatchingIpSessionResult" expires_after="2027-02-07">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Result of finding matching IP session when DNS resolution finishes.
  </summary>
  <token key="ServerType">
    <variant name="" summary="all QUIC servers"/>
    <variant name="Google" summary="Google servers"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.GapBetweenWriteErrorAndNetworkDisconnection"
    units="ms" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    This measures the time gap between the most recent write error and the
    network disconnection.
  </summary>
</histogram>

<histogram name="Net.QuicSession.GoAwayReceivedForConnectionMigration"
    enum="BooleanReceived" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Whether QuicGoAwayFrame is received from server for connection migration due
    to client's port change. Logged when a QuicGoAwayFrame with error code
    QUIC_ERROR_MIGRATING_PORT is received.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.GoogleSearch.EstablishmentReason{Initiator}{Used}"
    enum="QuicSessionEstablishmentReason" expires_after="2027-07-01">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The session establishment reason for a QUIC session to GoogleSearch. This is
    recorded when closing a session to GoogleSearch, indicating if it was
    {Used}{Initiator}.
  </summary>
  <token key="Initiator">
    <variant name="" summary=""/>
    <variant name=".NonPreconnect"
        summary=", and that the connection was not established via preconnect"/>
    <variant name=".Preconnect"
        summary=", and that the connection was established via preconnect"/>
  </token>
  <token key="Used">
    <variant name=".Unused" summary="unused"/>
    <variant name=".Used" summary="used"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.GoogleSearch.NonReuseReason{Initiator}{Used}"
    enum="QuicSessionNonReuseReason" expires_after="2027-07-01">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The session non-reuse reason for a QUIC session to GoogleSearch. This is
    recorded when closing the session to GoogleSearch, and when {Used} with
    {Initiator}.
  </summary>
  <token key="Initiator">
    <variant name="" summary="any connection initiator"/>
    <variant name=".NonPreconnect"
        summary="the connection was not established via preconnect"/>
    <variant name=".Preconnect"
        summary="the connection was established via preconnect"/>
  </token>
  <token key="Used">
    <variant name=".Unused" summary="session was unused"/>
    <variant name=".Used" summary="session was used"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.HandshakeConfirmedTime" units="Milliseconds"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The elapsed time between starting the crypto handshake, and receiving
    confirmation from the server.

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

<histogram name="Net.QuicSession.HandshakeConfirmedTime.ECH"
    units="Milliseconds" expires_after="2024-08-04">
  <owner>davidben@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The elapsed time between starting the crypto handshake, and receiving
    confirmation from the server, measured only for ECH-capable servers.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HandshakeConfirmedTime.ServerPadding"
    units="Milliseconds" expires_after="2027-01-17">
  <owner>davidben@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The elapsed time between starting the crypto handshake, and receiving
    confirmation from the server, measured only for servers responding with the
    Server Padding extension.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.HandshakeConfirmedTime.TrustAnchorIDs{IsResumption}"
    units="Milliseconds" expires_after="2026-08-02">
  <owner>estark@chromium.org</owner>
  <owner>davidben@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The elapsed time between starting the crypto handshake, and receiving
    confirmation from the server, measured only for servers that advertise TLS
    Trust Anchor IDs in DNS, {IsResumption}.

    Warning: this histogram was expired from 2025-10-26 to 2026-02-12; data may
    be missing.
  </summary>
  <token key="IsResumption">
    <variant name=""
        summary="aggregated across new connections and resumption"/>
    <variant name=".NewConnection" summary="on a new connection"/>
    <variant name=".Resumption"
        summary="on a connection that Chrome is attempting to resume"/>
  </token>
</histogram>

<histogram
    name="Net.QuicSession.HandshakeStatusOnConnectionMigration{ConnectionMigrationCause}"
    enum="BooleanConfirmed" expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The handshake status when the session attempts to migrate the connection
    according to different migration causes. {ConnectionMigrationCause}
  </summary>
  <token key="ConnectionMigrationCause" variants="ConnectionMigrationCause">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="Net.QuicSession.HandshakeStatusOnMigratingToServerPreferredAddress"
    enum="BooleanConfirmed" expires_after="2024-05-11">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The handshake status when the session attempts to validate received server
    preferred address.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HandshakeStatusOnPortMigration"
    enum="BooleanConfirmed" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The handshake status when the session attempts to port migration on path
    degrading.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HandshakeTimeout.PathDegradingDetected"
    enum="BooleanDetected" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Whether path degrading has been detected by the time a QUIC connection is
    closed due to handshake timeout.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HeaderCompressionRatioHpackReceived" units="%"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Header compression ratio as percentage for received headers using HPACK.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HeaderCompressionRatioHpackSent" units="%"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Header compression ratio as percentage for sent headers using HPACK.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HeaderCompressionRatioQpackReceived" units="%"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Header compression ratio as percentage for received headers using QPACK.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HeaderCompressionRatioQpackSent" units="%"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Header compression ratio as percentage for sent headers using QPACK.
  </summary>
</histogram>

<histogram name="Net.QuicSession.HostResolution.HandshakeConfirmedTime"
    units="Milliseconds" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The elapsed time between the end of resolving the DNS name of the server for
    a QUIC connection, and receiving crypto handshake confirmation from the
    server. Logged after crypto handshake is confirmed.

    WARNING: this histogram was expired from 2025-03-09 to 2026-06-24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.IncorrectConnectionIDsReceived" units="units"
    expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number packets recevied by a QuicSession with an incorrect connection id
    when the sesesion is closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.InitialRttEsitmateSource"
    enum="InitialRttEstimateSource" expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The source for the initial RTT estimate recorded when a QUIC session is
    created.
  </summary>
</histogram>

<histogram name="Net.QuicSession.KeyUpdate.PerConnection2" units="count"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of key updates processed per connection, recorded on connection
    close. Only logged for connections which reached the 1-RTT level and
    supported key update.
  </summary>
</histogram>

<histogram name="Net.QuicSession.KeyUpdate.PotentialPeerKeyUpdateAttemptCount"
    units="count" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Count of packets received that appeared to attempt a key update but failed
    decryption which have been received since the last successfully decrypted
    packet, recorded on connection close. Only logged for connections which
    reached the 1-RTT level and supported key update.
  </summary>
</histogram>

<histogram name="Net.QuicSession.KeyUpdate.Reason" enum="QuicKeyUpdateReason"
    expires_after="2025-07-01">
  <owner>mattm@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The reason why each key update occured.</summary>
</histogram>

<histogram name="Net.QuicSession.KeyUpdate.Success.{Group}"
    enum="QuicKeyUpdateSuccess" expires_after="2025-07-01">
  <owner>mattm@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Records the success or failure of the last key update for connections where
    the key update was initiated by the {Group} side. Failure is defined as
    having sent at least one packet in the new key phase but never receiving an
    ack for any packet sent in the new key phase before the connection was
    closed.
  </summary>
  <token key="Group">
    <variant name="Local"/>
    <variant name="Remote"/>
  </token>
</histogram>

<histogram
    name="Net.QuicSession.LastInFlightPacketSentTimeFromHandshakeCompletionWithPublicReset"
    units="ms" expires_after="2024-02-11">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Time from handshake completion to last packet was sent for connections
    received PUBLIC_RESET.
  </summary>
</histogram>

<histogram name="Net.QuicSession.LastSentPacketContentBeforePublicReset"
    units="bitfield value" expires_after="2024-05-26">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    A bitfield representing the last sent packet content before connection
    receives PUBLIC_RESET.
  </summary>
</histogram>

<histogram name="Net.QuicSession.MaxConsecutiveRtoWithForwardProgress"
    units="count" expires_after="2025-07-01">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Max consecutive retransmission timeout before making forward progress.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.MaxConsecutiveRtoWithForwardProgressAndBlackholeDetected"
    units="count" expires_after="2023-11-19">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Max consecutive retransmission timeout before making forward progress when
    blackhole has been detected.
  </summary>
</histogram>

<histogram name="Net.QuicSession.MaxReordering" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The maximum packet sequence number reordering observed by a QUIC connection.
  </summary>
</histogram>

<histogram name="Net.QuicSession.MaxReorderingTime" units="%"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The ratio of the maximum reordering time of a QUIC packet to the min rtt.
  </summary>
</histogram>

<histogram name="Net.QuicSession.MaxReorderingTimeLongRtt" units="%"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The ratio of the maximum reordering time of a QUIC packet to the min rtt,
    only for those sessions with a min rtt larger than 100 ms.
  </summary>
</histogram>

<histogram name="Net.QuicSession.MigrateToSocketSuccess" enum="Boolean"
    expires_after="2025-04-13">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Records whether the migration of the QuicSession to a new socket is
    successful.
  </summary>
</histogram>

<histogram name="Net.QuicSession.MinRTT" units="ms" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The minimum RTT observed during the life of a QUIC connection.
  </summary>
</histogram>

<histogram name="Net.QuicSession.MtuProbesSent" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of MTU probes sent by the client during the session. Logged when
    the connection is destroyed.

    WARNING: this histogram was expired from 2025-04-10 to 2026-06-24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.NumActiveStreamsOnIdleTimeout{HostType}"
    units="streams" expires_after="2027-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>suzukikeita@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of active streams when idle timeout is detected and connection is
    being closed for {HostType}. This is recorded when the QUIC connection is
    closed because of idle timeout. This metric has been re-enabled on M138, and
    any data prior to this is missing.

    This histogram has been expired between 2025-08-24 and 2026-07-01, thus does
    not contain data for this period.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.NumDefaultPathDegrading" units="times"
    expires_after="2024-11-17">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of times that a session enters path-degrading state on the
    default path.
  </summary>
</histogram>

<histogram name="Net.QuicSession.NumForwardProgressMadeAfterPathDegrading"
    units="times" expires_after="2025-05-11">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of times that a session makes forward progress after the original
    default path is degrading.
  </summary>
</histogram>

<histogram name="Net.QuicSession.NumMigrations" units="units"
    expires_after="2026-11-29">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The number of successful migrations for a QUIC session.</summary>
</histogram>

<histogram name="Net.QuicSession.NumMigrationsExercisedBeforePublicReset"
    units="migrations" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Number of connection migrations exercised before the connection receives a
    public reset.
  </summary>
</histogram>

<histogram name="Net.QuicSession.NumOpenStreams" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of QUIC streams opened when a new QUIC stream is created.
  </summary>
</histogram>

<histogram name="Net.QuicSession.NumPendingStreamRequests"
    units="stream requests" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of pending stream requests when a new stream request is added to
    the pending list. Pending streams are those which could not be created
    immediately because there were too many active streams.
  </summary>
</histogram>

<histogram name="Net.QuicSession.NumPingsSent{HostType}" units="pings"
    expires_after="2027-02-07">
  <owner>renjietang@chromium.org</owner>
  <owner>suzukikeita@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of pings a QUIC connection sends during its lifetime. This is
    recorded when the QUIC connection is closed for {HostType}. This metric has
    been re-enabled on M138, and any data prior to this is missing.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.NumReceivedOrigins" units="origins"
    expires_after="2026-12-16">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of origins in received ORIGIN frames. This is recorded for each
    received ORIGIN frame. If multiple ORIGIN frames are received over the
    duration of a connection, this count is recorded for each frame.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.NumStreamsWaitingToWriteOnIdleTimeout{HostType}"
    units="streams" expires_after="2027-02-14">
  <owner>renjietang@chromium.org</owner>
  <owner>suzukikeita@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of streams waiting to write when idle timeout is detected and
    connection is being closed for {HostType}. This is recorded when the QUIC
    connection is closed because of idle timeout. This metric has been
    re-enabled on M138, and any data prior to this is missing.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.NumTotalStreams" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The total number of streams created by the client when the session is
    closed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.OnServerPreferredAddressAvailable"
    enum="QuicConnectionMigrationStatus" expires_after="2024-08-25">
  <owner>fayang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The result of a QUIC server preferred address migration attempt.
  </summary>
</histogram>

<histogram name="Net.QuicSession.OutOfOrderGapReceived" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of missing packets between the current received packet and the
    previously largest received packet sequence number, when the current
    received packet had a lower sequence number than the previously received
    packet sequence number.
  </summary>
</histogram>

<histogram name="Net.QuicSession.OutOfOrderLargePacketsReceived" units="units"
    expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of times the current received packet had a lower sequence number
    than the previously received packet sequence number, and the size of the
    current packet is larger than the size of the previous packet.
  </summary>
</histogram>

<histogram name="Net.QuicSession.OutOfOrderPacketsReceived" units="units"
    expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of times the current received packet had a lower sequence number
    than the previously received packet sequence number.
  </summary>
</histogram>

<histogram name="Net.QuicSession.PacketGapReceived" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of missing packets between the current received packet and the
    previously largest received packet sequence number.
  </summary>
</histogram>

<histogram name="Net.QuicSession.PacketGapReceivedNearPing" units="count"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of missing packets between the last received packet before a PING
    frame sent and the first packet received after PING sent.
  </summary>
</histogram>

<histogram name="Net.QuicSession.PacketGapSent" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of missing packets between the current received packet and the
    previously largest received packet sequence number, as reported by the
    remote end of the connection.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.PacketLossRate{Net_QuicSession_PacketReceived_CONNECTION_TYPE}"
    units="1/10th Percent" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The ratio of the number of missing packets, to the maximum packet sequence
    number received, for QUIC connections longer than 21 packets received via

    Warning: this histogram was expired from 2023-10-01 to 2024-03-06; data may
    be missing. {Net_QuicSession_PacketReceived_CONNECTION_TYPE}
  </summary>
  <token key="Net_QuicSession_PacketReceived_CONNECTION_TYPE">
    <variant name=""/>
    <variant name="_CONNECTION_2G" summary="mobile 2G are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_3G" summary="mobile 3G are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_4G" summary="mobile 4G are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_BLUETOOTH"
        summary="Bluetooth are tallied, but this may include connections to a
                 mobile hotspot.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_ETHERNET"
        summary="ethernet are tallied, but this may include connections to a
                 WiFi bridge.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_NONE"
        summary="NO(?) network are tallied (should be empty).">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_UNKNOWN" summary="WiFi are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_WIFI"
        summary="WiFi are tallied, but this may include connections to a
                 mobile hotspot. Also check similar histograms that end in
                 WIFI_802.11* for more details on some platforms.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_WIFI_802.11a" summary="802.11a are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_WIFI_802.11b" summary="802.11b are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_WIFI_802.11g" summary="802.11g are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_WIFI_802.11n" summary="802.11n are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
    <variant name="_CONNECTION_WIFI_ANCIENT"
        summary="802.11 that are no longer standard are tallied.">
      <owner>dschinazi@chromium.org</owner>
      <owner>src/net/quic/OWNERS</owner>
    </variant>
  </token>
</histogram>

<histogram name="Net.QuicSession.PacketRetransmitsPerMille" units="permille"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of packets retransmitted per 1000. Only sessions with
    packets_sent &gt;= 100 are included. Recorded in session destructor.
  </summary>
</histogram>

<histogram name="Net.QuicSession.PacketWriteTime{IOMode}" units="ms"
    expires_after="2027-02-07">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The time taken to Write() a QUIC packet to the socket. Recorded for each
    packet when it is sent. The suffix specifies if the write completed
    synchonously or asynchronously.

    Warning: this histogram was expired from 2023-11-19 to 2024-03-06 and from
    2024-09-06 to 2026-03-26; data may be missing. {IOMode}
  </summary>
  <token key="IOMode">
    <variant name=""/>
    <variant name=".Asynchronous" summary=""/>
    <variant name=".Synchronous" summary=""/>
  </token>
</histogram>

<histogram
    name="Net.QuicSession.PathValidationSuccess{ConnectionMigrationCause}"
    enum="BooleanSuccess" expires_after="2027-08-09">
  <owner>martinduke@google.com</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The result of path validation according to different migration causes.
    {ConnectionMigrationCause}
  </summary>
  <token key="ConnectionMigrationCause" variants="ConnectionMigrationCause">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Net.QuicSession.PendingStreamsWaitTime" units="ms"
    expires_after="2027-01-17">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The wait time of the pending stream when it is finally serviced. Pending
    streams are those which could not be created immediately because there were
    too many active streams. Recorded when a QUIC session is ready open a new
    stream on top of the session.

    Warning: this histogram was expired from 2023-02-12 to 2026-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.PlatformNotification"
    enum="QuicPlatformNotification" expires_after="2024-01-21">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The platform notification received by QUIC when network change happens.
  </summary>
</histogram>

<histogram name="Net.QuicSession.PortMigration"
    enum="QuicConnectionMigrationStatus" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The result of a QUIC port migration attempt.</summary>
</histogram>

<histogram name="Net.QuicSession.PreferAesGcm" enum="BooleanPreferred"
    expires_after="never">
<!-- expires-never: Core metric used to monitor hardware capabilities -->

  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if the QUIC session prefers to use AES GCM because of hardware support.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ProbingRetryCountUntilSuccess" units="retries"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Number of retries to send connectivity probing packet on new path until
    success.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ProbingTimeInMillisecondsUntilSuccess"
    units="ms" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The wait time to receive a matched probing response to mark connectivity
    probing as successful.
  </summary>
</histogram>

<histogram name="Net.QuicSession.Qpack.HeaderListCountWhenBlockedStreamLimited"
    units="count" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The ordinality of a header list within a connection during the encoding of
    which unacknowledged dynamic table entries could not be referenced due to
    the limit on the number of blocked streams.
  </summary>
</histogram>

<histogram name="Net.QuicSession.Qpack.HeaderListCountWhenInsertionBlocked"
    units="count" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The ordinality of a header list within a connection during the encoding of
    which at least one dynamic table insertion was blocked.
  </summary>
</histogram>

<histogram name="Net.QuicSession.Qpack.HeaderListCountWhenInsertionNotBlocked"
    units="count" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The ordinality of a header list within a connection during the encoding of
    which no dynamic table insertion was blocked.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.Qpack.HeaderListCountWhenNotBlockedStreamLimited"
    units="count" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The ordinality of a header list within a connection during the encoding of
    which the limit on the number of blocked streams did not prevent referencing
    unacknowledged dynamic table entries.
  </summary>
</histogram>

<histogram name="Net.QuicSession.QuicVersion" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>Version of the QUIC protocol used for this connection.</summary>
</histogram>

<histogram name="Net.QuicSession.ReadError.CurrentNetwork.HandshakeConfirmed"
    enum="NetErrorCodes" expires_after="2023-10-08">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code returned when attempting to read on the current
    network from a QUIC connection after handshake has been confirmed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ReadError{ReadErrorSourceNetwork}"
    enum="NetErrorCodes" expires_after="2023-10-08">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code returned when attempting to read from a QUIC
    connection. The suffix specifies the condition/source of the read error.
    {ReadErrorSourceNetwork}
  </summary>
  <token key="ReadErrorSourceNetwork">
    <variant name=""/>
    <variant name=".AnyNetwork" summary=""/>
    <variant name=".CurrentNetwork"
        summary="This metric is for current network only."/>
    <variant name=".OtherNetworks"
        summary="This metric is for old networks or networks to be migrated
                 to only."/>
  </token>
</histogram>

<histogram name="Net.QuicSession.ReadMultipleNumPackets" units="packets"
    expires_after="2027-07-14">
  <owner>aymanm@google.com</owner>
  <owner>ricea@chromium.org</owner>
  <summary>
    The number of UDP packets successfully read in a single batch read
    (`ReadMultiple` / `recvmmsg`) operation on a QUIC UDP socket. Recorded each
    time `QuicChromiumPacketReader` processes a successful multi-packet read
    result when the `QuicUseReadMultiple` feature is enabled.

    Note: Because packet reading occurs at high frequency, this metric is
    subsampled and recorded for 10% of successful read operations.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ReceivedSettings.BlockedStreams" units="units"
    expires_after="2023-09-24">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The value of the SETTINGS_QPACK_BLOCKED_STREAMS parameter received on an
    HTTP/3 connection, if any.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ReceivedSettings.CountPlusOne" units="units"
    expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of SETTINGS parameters received on an HTTP/3 connection,
    incremented by one (the SETTINGS frame can be empty).
  </summary>
</histogram>

<histogram name="Net.QuicSession.ReceivedSettings.MaxHeaderListSize2"
    units="bytes" expires_after="2023-09-24">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The value of the SETTINGS_MAX_HEADER_LIST_SIZE parameter received on an
    HTTP/3 connection, if any.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ReceivedSettings.MaxTableCapacity2"
    units="bytes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The value of the SETTINGS_QPACK_MAX_TABLE_CAPACITY parameter received on an
    HTTP/3 connection, if any.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ReceivedSettings.ReservedCountPlusOne"
    units="units" expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of reserved SETTINGS parameters (that is, with identifier in the
    form 0x1f * N + 0x21 for a non-negative integer value of N) received on an
    HTTP/3 connection, incremented by one (there might be zero reserved
    identifiers). Defined at
    https://quicwg.org/base-drafts/draft-ietf-quic-http.html#name-defined-settings-parameters.
    These should not be treated specially on the receive side, because they are
    sent to exercise the requirement that unknown identifiers are ignored. Here
    an exception is made for logging only, to understand what kind of
    identifiers are received.
  </summary>
</histogram>

<histogram name="Net.QuicSession.RejectHasProof" enum="Boolean"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if the QUIC REJ message received from the server contains a proof.
  </summary>
</histogram>

<histogram name="Net.QuicSession.RejectLength" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The length in bytes of a QUIC REJ message received from the server.
  </summary>
</histogram>

<histogram name="Net.QuicSession.RequestBlockedByPreFreeze"
    enum="BooleanBlocked" expires_after="2027-05-19">
  <owner>yfriedman@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Records whether a request to RequestSession was blocked because the app was
    pre-frozen. Logged for every RequestSession call on Android.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ResumeAttemptTicketAge.{Status}"
    units="seconds" expires_after="2027-07-01">
  <owner>thesalsa@google.com</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The age of the session ticket when the client attempted 0-RTT and the
    handshake completed. Recorded for 0-RTT attempts that were {Status}. The
    maximum valid age of session tickets is capped at 7 days by the TLS 1.3
    spec, though in practice this may be set lower by the client. Capped to 14
    days in this histogram.

    https://datatracker.ietf.org/doc/html/rfc8446#section-4.6.1
  </summary>
  <token key="Status">
    <variant name="Accepted" summary="accepted by the server"/>
    <variant name="All" summary="either accepted or rejected"/>
    <variant name="Rejected" summary="rejected by the server"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.RetryAfterWriteErrorCount2" units="retries"
    expires_after="2024-06-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of consecutive times a packet was retried after a write error,
    using exponential backoff.
  </summary>
</histogram>

<histogram name="Net.QuicSession.RstStreamErrorCodeClient"
    enum="QuicRstStreamErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error code which resulted in a stream being reset by the client.
  </summary>
</histogram>

<histogram name="Net.QuicSession.RstStreamErrorCodeServer"
    enum="QuicRstStreamErrorCodes" expires_after="2023-03-19">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error code which resulted in a stream being reset by the server.
  </summary>
</histogram>

<histogram name="Net.QuicSession.SecureResourceSecureSession" units="units"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of request for secure resources over QUIC sessions. True if the
    session is secure, false if it is not.
  </summary>
</histogram>

<histogram name="Net.QuicSession.SelfShloAddressMismatch"
    enum="QuicAddressMismatch" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    When a SHLO handshake message is received, whether the client IP address and
    port number in it differ from the local client IP address and port number.
    In the comparison, the first address is the one in SHLO and the second
    address is the client IP address.
  </summary>
</histogram>

<histogram name="Net.QuicSession.SendPacketSize{EncryptionLevel}" units="bytes"
    expires_after="2024-12-08">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The size in bytes of an encrypted QUIC packet sent to the peer at the
    specified encryption level. {EncryptionLevel}
  </summary>
  <token key="EncryptionLevel">
    <variant name=""/>
    <variant name=".0RTT" summary="Packets sent at 0-RTT encryption only."/>
    <variant name=".ForwardSecure"
        summary="Packets sent at Forward Secure encryption only."/>
    <variant name=".Handshake"
        summary="Packets sent at Handshake encryption only."/>
    <variant name=".Initial"
        summary="Packets sent at Initial encryption only."/>
  </token>
</histogram>

<histogram name="Net.QuicSession.ServerSideMtu" units="bytes"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The largest packet which the client received from the server during the
    session. Warning: this histogram was expired from 2023-11-19 to 2024-04-11;
    data may be missing.

    WARNING: this histogram was expired from 2025-04-10 to 2026-06-24; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Net.QuicSession.SessionKeyMismatch.MismatchedFieldCombination{HostType}"
    enum="QuicSessionKeyMismatchedFieldCombination" expires_after="2027-09-20">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records which combination of fields in `QuicSessionKey` mismatched with the
    key of existing session or an in-flight session attempt to {HostType} with
    the same `ServerId`. We only look at the combinations of frequent fields
    which cause mismatches, retrieved by `MismatchedField` histograms. Recorded
    every time when we attempt to create a QUIC session.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.QuicSession.SessionKeyMismatch.MismatchedField{HostType}"
    enum="QuicSessionKeyMismatchedField" expires_after="2027-09-20">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records which fields in `QuicSessionKey` mismatched with the key of existing
    session or an in-flight session attempt to {HostType} with the same
    `ServerId`. Recorded every time when we attempt to create a QUIC session.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram
    name="Net.QuicSession.SessionKeyMismatch.TotalMismatchedField{HostType}"
    units="count" expires_after="2027-09-20">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records the total number fields in `QuicSessionKey` which mismatched with
    the key of existing session or an in-flight session attempt to {HostType}
    with the same `ServerId`. Recorded every time when we attempt to create a
    QUIC session.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.QuicSession.SessionKeyMismatch{HostType}"
    enum="QuicSessionKeyPartialMatchResult" expires_after="2027-09-20">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records whether `QuicSessionKey` had an existing session or an in-flight
    session attempt to {HostType}. Recorded every time when we attempt to create
    a QUIC session.
  </summary>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.QuicSession.SmoothedRTT" units="ms"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The final smoothed RTT observed during the life of a QUIC connection.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StaleAndFreshHostMatched" enum="Boolean"
    expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if fresh host lists contains stale host used in racing connection.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StaleConnectionTime" units="ms"
    expires_after="2024-06-16">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The time a QUIC connection from invalid stale dns result takes to do Crypto
    handshake. This starts on DoConnect and ends when the connection finishes.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StatelessResetAfterProbingCancelled"
    enum="BooleanReceived" expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Records when a STATELESS_RESET is received after a connectivity probing is
    cancelled.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StatelessResetDuringProbing"
    enum="BooleanReceived" expires_after="2025-07-01">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    When probing is cancelled, records whether a STATELESS_RESET is received.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StopSendingErrorCodeClient"
    enum="QuicRstStreamErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>The QUIC error code that we sent in a STOP_SENDING frame.</summary>
</histogram>

<histogram name="Net.QuicSession.StopSendingErrorCodeServer"
    enum="QuicRstStreamErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error code that we received in a STOP_SENDING frame.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StreamCloseErrorCodeClient.HandshakeConfirmed"
    enum="QuicErrorCodes" expires_after="2023-09-10">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error code which resulted in the stream (and connection) being
    closed by the client after the handshake was confirmed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StreamCloseErrorCodeServer.HandshakeConfirmed"
    enum="QuicErrorCodes" expires_after="2024-02-11">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The QUIC error code which resulted in the stream (and connection) being
    closed by the client after the handshake was confirmed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StreamFlowControlBlocked"
    enum="BooleanBlocked" expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Whether any of QUIC session's streams are flow control blocked when a PING
    message is sent to server.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StreamFrameDuplicatedLongConnection"
    units="1/10th Percent" expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of stream frames received which were duplicates, out of every
    1000 stream frames received. Only for QUIC sessions which received at least
    100 packets.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StreamFrameDuplicatedPercentLongConnection"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The percentage of stream frames received which were duplicates. Only for
    QUIC sessions which received at least 100 packets.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StreamFrameDuplicatedPercentShortConnection"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The percentage of stream frames received which were duplicates. Only for
    QUIC sessions which received fewer than 100 packets.
  </summary>
</histogram>

<histogram name="Net.QuicSession.StreamFrameDuplicatedShortConnection"
    units="1/10th Percent" expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of stream frames received which were duplicates, out of every
    1000 stream frames received. Only for QUIC sessions which received fewer
    than 100 packets.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TimedOutWithOpenStreams.ConsecutivePTOCount"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    If a QUIC connection timed out with open streams, this contains a count of
    consecutive PTOs.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TimedOutWithOpenStreams.ConsecutiveRTOCount"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    If a QUIC connection timed out with open streams, this contains a count of
    consecutive RTOs.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TimedOutWithOpenStreams.ConsecutiveTLPCount"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    If a QUIC connection timed out with open streams, this contains a count of
    consecutive TLPs.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TimedOutWithOpenStreams.HasUnackedPackets"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    If a QUIC connection timed out with open streams, this will be true when the
    connection has unacked packets.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TimedOutWithOpenStreams.LocalPort"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    If a QUIC connection timed out locally with open streams, this contains the
    local port number for the connection.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TimeFromResolveHostToConfirmConnection"
    units="Milliseconds" expires_after="2025-03-09">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The time a QuicSessionPool Job takes from host rersolution to connection
    confirmation.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TooManyOpenStreams" enum="BooleanTooMany"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    True if more than 100 streams are open when a new stream is activated.
  </summary>
</histogram>

<histogram name="Net.QuicSession.TooSmallInitialSentPacket" units="bytes"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    When a QUIC packet is sent at initial encryption that is smaller than the
    minimum size, this records the size difference (minimum_size -
    observed_size).
  </summary>
</histogram>

<histogram name="Net.QuicSession.UndecryptablePacketsReceived" units="units"
    expires_after="2024-02-04">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of undecryptable packets recevied by a QuicSession when the
    session is closed. Includes packets where a decryption key was not present.
  </summary>
</histogram>

<histogram name="Net.QuicSession.UndecryptablePacketsReceivedWithDecrypter"
    units="units" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The number of undecryptable packets recevied by a QuicSession when the
    session is closed. Only includes packets where a decryption key was present
    for the packet's encryption level.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ValidConnectionTime" units="ms"
    expires_after="2024-11-03">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The time a QUIC connection that will be confirmed takes for Crypto
    handshake. The event starts on DoConnect, and ends when the connection
    finishes.
  </summary>
</histogram>

<histogram name="Net.QuicSession.VerifyProofTime{Type}" units="ms"
    expires_after="2024-05-26">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Time spent verifying the signature and certificate chain. This is logged
    whenever QUIC verifies the certificate chain and signature during crypto
    handshake.

    Warning: this histogram was expired from 09/12/2022 to 03/22/2023; data may
    be missing.
  </summary>
  <token key="Type">
    <variant name="" summary="Verification time for a server."/>
    <variant name=".CachedServerConfig"
        summary="Verification time for a server when server config from cache
                 is used."/>
    <variant name=".google"
        summary="Verification time for www.google.com server."/>
  </token>
</histogram>

<histogram name="Net.QuicSession.WriteError" enum="NetErrorCodes"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code returned when attempting to write to a QUIC
    connection.

    WARNING: this histogram was expired from 2025-04-10 to 2026-06-24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.QuicSession.WriteError.HandshakeConfirmed"
    enum="NetErrorCodes" expires_after="2024-07-16">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code returned when attempting to write to a QUIC
    connection after the handshake has been confirmed.
  </summary>
</histogram>

<histogram name="Net.QuicSession.WriteError.NetworkDisconnected"
    enum="NetErrorCodes" expires_after="2023-09-17">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The most recent network error code when attempting to write to a QUIC
    connection when the network gets disconnected.
  </summary>
</histogram>

<histogram name="Net.QuicSession.WritePacketNotReusableReason"
    enum="QuicNotReusableReason" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The reason QUIC packet writer needed to allocate a new buffer, rather than
    the expected case of reusing its existing one.
  </summary>
</histogram>

<histogram name="Net.QuicSession.ZeroRttReason{HostType}"
    enum="SSLHandshakeEarlyDataReason" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Indicates whether a QUIC handshake attempted or used 0-RTT on the
    connection, and if 0-RTT was not used, it provides reasons why. Records
    connections to {HostType} when a QUIC handshake is completed.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".Google" summary="Google hosted servers"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
    <variant name=".NonGoogle" summary="non-Google servers"/>
  </token>
</histogram>

<histogram name="Net.QuicSession.ZeroRttState{HostType}" enum="ZeroRttState"
    expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Whether 0-RTT was successfully used in the connection. Records connections
    to {HostType} when a QUIC handshake is completed.

    Warning: this histogram was expired from 2024-05-19 to 2024-10-25; data may
    be missing.
  </summary>
  <token key="HostType">
    <variant name="" summary="any server"/>
    <variant name=".Google" summary="Google hosted servers"/>
    <variant name=".GoogleWithAlpnH3"
        summary="Google hosted servers with ALPN h3"/>
    <variant name=".NonGoogle" summary="non-Google servers"/>
  </token>
</histogram>

<histogram name="Net.QuicSessionAttempt.CompleteTime.{SuccessOrFailure}"
    units="ms" expires_after="2026-09-20">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Record the time that a QuicSessionAttempt takes to invoke the completion
    callback. Recorded when a QuicSessionAttempt called the completion callback.
  </summary>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram name="Net.QuicSessionAttempt.CreateSessionTime.{SuccessOrFailure}"
    units="ms" expires_after="2027-08-11">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Record the time that a QuicSessionAttempt takes to create a session.
    Recorded when a QuicSessionAttempt created a session asynchronously.
  </summary>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram name="Net.QuicSessionAttempt.CryptoConnectTime.{SuccessOrFailure}"
    units="ms" expires_after="2026-10-25">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Record the time that a QuicSessionAttempt takes to perform a crypto
    handshake. Recorded when a QuicSessionAttempt performed a crypto handshake
    asynchronously.
  </summary>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram name="Net.QuicStreamFactory.AttemptMigrationBeforeHandshake"
    enum="BooleanAttempted" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Records if a new connection on the alternate network is attempted when a
    connection fails before handshake is confirmed.
  </summary>
</histogram>

<histogram
    name="Net.QuicStreamFactory.AttemptMigrationBeforeHandshake.FailedConnectionType"
    enum="NetworkConnectionType" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Connection type of the default network when the connection fails with
    handshake not confirmed.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.BadPacketLossEvents5"
    enum="QuicBadPacketLossEvents" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    A count of how often a user hits 1, 2, 3, 4 and 5 bad packet loss events for
    port 443. Recorded whenever QUIC has bad packet loss (high packet loss on
    multiple consecutive connections).
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.ConnectionOnNonDefaultNetwork"
    enum="BooleanSuccess" expires_after="2024-12-08">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Status of the connection on the non-default network when it finishes. A
    connection may stay on the non-default network during the initial setup when
    the platform's default network changes.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.DefaultNetworkMatch"
    enum="BooleanMatched" expires_after="2023-10-01">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Records, for initial socket created for each new QUIC connection, whether
    the bound network matched the default network tracked by QuicSessionPool.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.DisabledReasons"
    enum="QuicDisabledReason" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Rrecords reasons QUIC is disabled (for all ports), if sufficent recent
    connections experience: public reset post crypto handshake, or timeouts with
    streams open. QUIC is disabled until the next reboot of Chrome. Logged
    during session close.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.DoConnectFailureLocation"
    enum="JobProtocolErrorLocation" expires_after="2025-01-05">
  <owner>renjietang@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Log the location in QuicSessionPool where QUIC_PROTOCOL_ERROR is reported.
  </summary>
</histogram>

<histogram
    name="Net.QuicStreamFactory.MigrationBeforeHandshake.NewConnectionType"
    enum="NetworkConnectionType" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Connection type of the alternate network when a connection is about to be
    attempted when the original connection fails on the default network with
    handshake not confirmed.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.MigrationBeforeHandshake2"
    enum="BooleanSuccess" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Status of the connection which is created for migration before handshake is
    confirmed.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.MigrationBeforeHandshakeFailedReason"
    enum="NetErrorCodes" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    The network error code returned when the retried connection on the alternate
    network before handshake fails.
  </summary>
</histogram>

<histogram
    name="Net.QuicStreamFactory.NetworkChangeDuringMigrationBeforeHandshake"
    enum="BooleanChanged" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Captures whether the default network has been changed when the new
    connection succeeds on the &quot;alternate&quot; network.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.PublicResetsPostHandshake"
    units="resets" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Captures the maximum number of public resets post handshake that occurred
    within a window of recent connections (default 20). Will help inform the
    choice of threshold to disable QUIC for clients that experience pathalogical
    errors. Logged during session close.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.QuicIsDisabled" enum="Ports"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Recorded whenever QUIC is disabled for a port due to repeated lossy
    connections (high packet loss on multiple consecutive connections). QUIC is
    disabled until next reboot of Chrome.
  </summary>
</histogram>

<histogram name="Net.QuicStreamFactory.TimeoutsWithOpenStreams"
    units="timeouts" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/quic/OWNERS</owner>
  <summary>
    Captures the maximum number of connection timeouts with streams open that
    occurred within a window of recent connections (default 20). Will help
    inform the choice of threshold to disable QUIC for clients that experience
    pathalogical errors. Logged during session close.
  </summary>
</histogram>

<histogram
    name="Net.RegistryControlledDomains.GetDomainAndRegistry.CacheHit.Sampled"
    enum="BooleanCacheHit" expires_after="2026-08-09">
  <owner>jkarlin@chromium.org</owner>
  <owner>src/net/base/registry_controlled_domains/OWNERS</owner>
  <summary>
    Whether a call to GetDomainAndRegistry was served from the cache or not.
    Recorded on a sampled (0.00001) subset of calls to GetDomainAndRegistry.
  </summary>
</histogram>

<histogram name="Net.Reporting.FilteredReportsCount" units="reports"
    expires_after="2026-02-21">
  <owner>ricea@chromium.org</owner>
  <owner>patilmayur@microsoft.com</owner>
  <owner>src/net/reporting/OWNERS</owner>
  <summary>
    This metric is recorded each time a report upload attempt is made, when the
    reports are serialized to JSON. It reflects the size of the report list
    after filtering based on the report body size. Reports with bodies exceeding
    kMaxReportBodySizeKB are excluded when the kExcludeLargeBodyReports feature
    is enabled.
  </summary>
</histogram>

<histogram name="Net.Reporting.HeaderType" enum="NetReportingHeaderType"
    expires_after="2025-06-22">
  <owner>rodneyding@google.com</owner>
  <owner>src/net/reporting/OWNERS</owner>
  <summary>
    The type of header received for configuring reporting API endpoints,
    recorded when reporting API headers are successfully parsed.

    Warning: this histogram was expired from 2023-02-18 to 2024-04-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.Reporting.ReportBodySize" units="KB"
    expires_after="2026-02-21">
  <owner>ricea@chromium.org</owner>
  <owner>patilmayur@microsoft.com</owner>
  <owner>src/net/reporting/OWNERS</owner>
  <summary>
    Records the estimated memory usage, in kb, of the report body for each
    report being considered for upload to the Reporting API. This metric is
    recorded for all reports, before any filtering based on body size.
  </summary>
</histogram>

<histogram name="Net.Reporting.ReportsCount" units="reports"
    expires_after="2026-02-21">
  <owner>ricea@chromium.org</owner>
  <owner>patilmayur@microsoft.com</owner>
  <owner>src/net/reporting/OWNERS</owner>
  <summary>
    Counts the total number of reports initially considered for serialization
    and upload to the Reporting API. This metric reflects the size of the report
    list before any filtering based on size of report body.
  </summary>
</histogram>

<histogram name="Net.Reporting.ReportTotalSize" units="KB"
    expires_after="2026-02-21">
  <owner>ricea@chromium.org</owner>
  <owner>patilmayur@microsoft.com</owner>
  <owner>src/net/reporting/OWNERS</owner>
  <summary>
    Records the estimated memory usage, in kb, of the complete serialized JSON
    payload containing the reports being prepared for upload to the Reporting
    API. This metric reflects the size of the JSON after filtering based on
    report body size.
  </summary>
</histogram>

<histogram name="Net.Reporting.UploadHeaderType"
    enum="NetReportingUploadHeaderType" expires_after="2025-11-30">
  <owner>rodneyding@google.com</owner>
  <owner>src/net/reporting/OWNERS</owner>
  <summary>
    The type of header that produced the endpoint used for uploading reports for
    the Reporting API, recorded when reports have been succesfully uploaded,
    counted once for each report.
  </summary>
</histogram>

<histogram name="Net.RequestedUrlLength" units="characters"
    expires_after="2027-05-01">
  <owner>tov@google.com</owner>
  <owner>chrome-privacy-core@google.com</owner>
  <summary>
    The length of the requested URL, excluding the fragment. Only logged for
    requests where the URL length exceeds 8192 characters. Recorded when the
    network loader (URLLoader) request is initiated in the Network Service.
  </summary>
</histogram>

<histogram name="Net.RestrictedCookieManager.GetCookiesString.Count30Seconds"
    units="IPCs" expires_after="2026-04-26">
  <owner>olivierli@chromium.org</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    Counts the number of RestrictedCookieManager::GetCookiesString IPCs received
    over 30 second periods at the Network Service.

    We start recording the metric when the Network Service is created and keep
    updating it for the entire lifetime of the Network Service process.
  </summary>
</histogram>

<histogram
    name="Net.RestrictedCookieManager.GetCookiesString.Duration.Subsampled"
    units="microseconds" expires_after="2027-07-07">
  <owner>victorvianna@google.com</owner>
  <owner>woa-performance-team+alerts@google.com</owner>
  <summary>
    Records the time spent executing RestrictedCookieManager::GetCookiesString,
    plus its callback if the callback is invoked synchronously.

    Subsampled to 1/1000. See kHistogramSampleProbability in
    net/cookies/cookie_constants.h for details.

    Not reported for clients with low-resolution clocks.
  </summary>
</histogram>

<histogram
    name="Net.RestrictedCookieManager.PartitionedCookiesInScript.Subsampled"
    units="cookies" expires_after="2026-10-26">
  <owner>dylancutler@google.com</owner>
  <owner>src/net/cookies/OWNERS</owner>
  <summary>
    Logs the number of partitioned cookies accessed by a script. Logged only
    when partitioned cookies are enabled.

    Subsampled to 1/1000. See kHistogramSampleProbability in
    net/cookies/cookie_constants.h for details.

    Warning: this histogram was expired from 2026-07-22 to 2026-08-25; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Net.RestrictedCookieManager.SetCookieFromString.Duration.Subsampled"
    units="microseconds" expires_after="2027-02-14">
  <owner>acondor@chromium.org</owner>
  <owner>clank-performance-team@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the time spent executing
    RestrictedCookieManager::SetCookieFromString, plus its callback.

    Subsampled to 1/1000. See kHistogramSampleProbability in
    net/cookies/cookie_constants.h for details.

    Not reported for clients with low-resolution clocks.
  </summary>
</histogram>

<histogram name="Net.RestrictedCookieManager.SetPartitionedCookie.Subsampled"
    enum="Boolean" expires_after="2026-06-01">
  <owner>dylancutler@google.com</owner>
  <owner>src/net/cookies/OWNERS</owner>
  <summary>
    True iff the cookie set by RestrictedCookieManager is a partitioned cookie.
    Only logged when partitioned cookies are enabled and the cookie set by RCM
    will be accepted.

    Subsampled to 1/1000. See kHistogramSampleProbability in
    net/cookies/cookie_constants.h for details.
  </summary>
</histogram>

<histogram name="Net.RestrictedCookieManager.SiteForCookiesOK.Subsampled"
    enum="BooleanMatched" expires_after="2027-01-17">
  <owner>morlovich@chromium.org</owner>
  <owner>src/net/cookies/OWNERS</owner>
  <summary>
    Logged on any document.cookie or CookieStore API operation. True if the
    browser-side site_for_cookies and the render-provided value match.

    Subsampled to 1/1000. See kHistogramSampleProbability in
    net/cookies/cookie_constants.h for details.

    Warning: Histogram was expired from 2025-03-09 to 2026-05-14. Data may be
    missing.
  </summary>
</histogram>

<histogram name="Net.RestrictedCookieManager.TopFrameOriginOK.Subsampled"
    enum="BooleanMatched" expires_after="2026-11-14">
  <owner>morlovich@chromium.org</owner>
  <owner>src/net/cookies/OWNERS</owner>
  <summary>
    Logged on any document.cookie or CookieStore API operation. True if the
    browser-side top_frame_origin and the render-provided value match.

    Subsampled to 1/1000. See kHistogramSampleProbability in
    net/cookies/cookie_constants.h for details.

    Warning: Histogram was expired from 2025-01-26 to 2026-05-14. Data may be
    missing.
  </summary>
</histogram>

<histogram name="Net.RestrictedLocalhostPorts" units="connections"
    expires_after="2026-01-18">
  <owner>tov@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Captures to which port a connection to localhost was blocked. This only
    applies to the ports controlled by the RestrictAbusePortsOnLocalhost
    feature. Logged for every request that is initiated.
  </summary>
</histogram>

<histogram name="Net.RestrictedPorts" units="connections"
    expires_after="2026-05-24">
  <owner>tov@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Captures to which restricted port a connection is initiated, regardless of
    whether this needs to be enforced. This only applies to the ports controlled
    by the RestrictAbusePorts feature. Logged for every request that is
    initiated.
  </summary>
</histogram>

<histogram name="Net.SafeSearch.CacheHit" enum="CacheAccessStatus"
    expires_after="2026-06-21">
  <owner>tju@google.com</owner>
  <owner>chrome-kids-eng@google.com</owner>
  <summary>
    Records if a URL classification in safe_search_api::URLChecker was provided
    from the cache or not. In the latter case, it distinguishes between true
    cache misses and cache hits which were unfit for classification.

    Missing data between 2024-04-28 and 2024-07-30.
  </summary>
</histogram>

<histogram
    name="Net.SessionCreate.GoogleSearch.Preconnect2.Quic.CompletionResult{JobType}"
    enum="NetErrorCodes" expires_after="2027-09-20">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The network error code of the session creation for preconnect to
    GoogleSearch using Quic for {JobType} job type. This is recorded everytime a
    preconnect is attempted to GoogleSearch, after preconnect attempt is
    finished.
  </summary>
  <token key="JobType">
    <variant name="" summary="any"/>
    <variant name=".PreconnectDnsAlpnH3Job" summary="PRECONNECT_DNS_ALPN_H3"/>
    <variant name=".PreconnectJob" summary="PRECONNECT"/>
  </token>
</histogram>

<histogram
    name="Net.SessionCreate.GoogleSearch.Preconnect2.{ProtocolType}.IsSessionReused"
    enum="Boolean" expires_after="2027-01-03">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records whether the session is already established for a preconnect request
    to GoogleSearch using {ProtocolType}. This is recorded everytime a
    preconnect is attempted to GoogleSearch, after preconnect attempt is
    finished.
  </summary>
  <token key="ProtocolType">
    <variant name="Quic"/>
    <variant name="Spdy"/>
  </token>
</histogram>

<histogram
    name="Net.SessionCreate.{ProtocolType}.HasTrafficAnnotation{HostType}"
    enum="Boolean" expires_after="2027-09-13">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Whether the session create to {HostType} using {ProtocolType} had any
    traffic annotation tag associated. {ProtocolType}. This is recorded
    everytime a session create is attempted to GoogleSearch, after the attempt
    is finished.
  </summary>
  <token key="ProtocolType">
    <variant name="Quic"/>
    <variant name="Spdy"/>
  </token>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.SessionCreate.{ProtocolType}.TrafficAnnotation{HostType}"
    enum="TrafficAnnotationUniqueIdHash" expires_after="2027-09-13">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The traffic annotation tag for the session create to {HostType} using
    {ProtocolType}. This is recorded everytime a session create is attempted to
    GoogleSearch, after the attempt is finished.
  </summary>
  <token key="ProtocolType">
    <variant name="Quic"/>
    <variant name="Spdy"/>
  </token>
  <token key="HostType" variants="HostType"/>
</histogram>

<histogram name="Net.SharedDictionary.Transaction.Outcome"
    enum="SharedDictionaryTransactionOutcome" expires_after="2027-01-10">
  <owner>wbjacksonjr@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Tracks the outcome of a network transaction only when a matching shared
    dictionary was found and advertised to the server in the request headers. It
    is emitted after the server's response headers have been received. The
    metric records whether the server actually used the dictionary for
    compression, which type of compression was used, or whether it chose not to
    use the dictionary.
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryManagerOnDisk.CacheMaxSize2" units="MB"
    expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The maximum total size of dictionaries that can be stored in the Shared
    Dictionary cache, calculated based on available disk space in the browser
    process and notified to the network service. This is recorded once per a
    netwrok context only if the DiskCacheSize enterprise policy is not set. The
    original histogram &quot;CacheMaxSize&quot; didn't correctly recorded the
    actual maximum total size.
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryManagerOnDisk.DictionarySize"
    units="bytes" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The size of shared dictionary written on disk. Emitted when
    SharedDictionaryManagerOnDisk succeeded to store the dictionary in disk
    cache and database.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryManagerOnDisk.DiskCacheEntryMissingDictionaryCount"
    units="count" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The number of dictionaries evicted as there is no matching disk cache entry.
    Emitted when MismatchingEntryDeletionTask finishes.
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryManagerOnDisk.InvalidDiskCacheEntryCount"
    units="count" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The number of disk cache entries evicted as the key is invalid for token.
    Emitted when MismatchingEntryDeletionTask finishes.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryManagerOnDisk.MetadataMissingDictionaryCount"
    units="count" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The number of disk cache entries evicted as there is no matching metadata.
    Emitted when MismatchingEntryDeletionTask finishes.

    Warning: this histogram was expired from 2024-06-29 to 2024-08-27; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryManagerOnDisk.PolicySpecifiedCacheMaxSize"
    units="MB" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The maximum total size of dictionaries that can be stored in the Shared
    Dictionary cache, as specified by an enterprise policy. This is recorded
    only once at a network context startup, and only if the DiskCacheSize
    enterprise policy is set to non zero value.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryManagerOnDisk.TotalDictionaryCountWhenAdded"
    units="count" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The total count of shared dictionary on disk. Emitted when
    SharedDictionaryManagerOnDisk succeeded to store a dictionary in disk cache
    and database.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryManagerOnDisk.TotalDictionarySizeWhenAdded"
    units="MB" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The total size of shared dictionary on disk. Emitted when
    SharedDictionaryManagerOnDisk succeeded to store a dictionary in disk cache
    and database.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryOnDisk.OpenEntryLatency.{SuccessOrFailure}"
    units="ms" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The time taken to open a disk cache entry of a shared dictionary. Recorded
    when the entry is opened in the SharedDictionaryOnDisk.
  </summary>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram name="Net.SharedDictionaryOnDisk.ReadDataLatency.{SuccessOrFailure}"
    units="ms" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The time taken to read the data of a shared dictionary's disk cache entry.
    Recorded when the whole data is read in the SharedDictionaryOnDisk.
  </summary>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram name="Net.SharedDictionaryOnDisk.StorageResult"
    enum="SharedDictionaryStorageResult" expires_after="2027-01-10">
  <owner>wbjacksonjr@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    After a dictionary is fetched, this metric tracks the outcome of the storage
    process. It records whether the dictionary was successfully written to the
    disk cache and its metadata was registered in the database, along with a
    variety of specific failure modes (e.g., disk write errors, database errors,
    size limit exceeded).
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryStorageOnDisk.IsMetadataReadyOnFirstUse"
    enum="Boolean" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Records whether the shared dictionary metadata has been read when
    GetDictionary() is called for the first time.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryStorageOnDisk.IsMetadataReadyOnFirstUse.PreviouslyEvicted"
    enum="Boolean" expires_after="2027-02-07">
  <owner>wbjacksonjr@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Records whether the shared dictionary metadata has been read when
    GetDictionary() is called for the first time, specifically for storages that
    were previously evicted.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryStorageOnDisk.IsMetadataReadyOnFirstUse.PreviouslyEvictedByMemoryPressure"
    enum="Boolean" expires_after="2027-02-07">
  <owner>wbjacksonjr@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Records whether the shared dictionary metadata has been read when
    GetDictionary() is called for the first time, specifically for storages that
    were previously evicted due to memory pressure.
  </summary>
</histogram>

<histogram
    name="Net.SharedDictionaryStorageOnDisk.MemoryCache.PreviousEvictionReason"
    enum="SharedDictionaryStorageEvictionReason" expires_after="2026-11-28">
  <owner>wbjacksonjr@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Records the specific reason a Shared Dictionary Storage instance was
    previously evicted from the in-memory cache. This metric is emitted when
    `GetDictionarySync()` is called for the first time on a re-created storage
    instance for the same site isolation key. It provides insight into the
    causes of dictionary unavailability when a storage needs to be reloaded,
    helping to understand the real-world effectiveness of the feature,
    especially on memory-constrained devices.
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryStorageOnDisk.MetadataReadTime.{Result}"
    units="ms" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The time taken to read shared dictionary metadata from the database.
    Recorded when SharedDictionaryStorageOnDisk receives the result.
  </summary>
  <token key="Result">
    <variant name="Empty"/>
    <variant name="Failure"/>
    <variant name="NonEmpty"/>
  </token>
</histogram>

<histogram name="Net.SharedDictionaryStore.DictionaryCountPerSiteWhenAdded"
    units="count" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The count of shared dictionary per top frame site on metadata. Emitted when
    SQLitePersistentSharedDictionaryStore is writing a dictionary in the
    database.

    Warning: this histogram was expired from 2024-12-20 to 2024-08-27; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryStore.DictionarySizeKBPerSiteWhenAdded"
    units="KB" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The size of shared dictionary per top frame site on metadata. Emitted when
    SQLitePersistentSharedDictionaryStore is writing a dictionary in the
    database.
  </summary>
</histogram>

<histogram name="Net.SharedDictionaryStore.{MethodName}.Error"
    enum="SharedDictionaryStoreError" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Records the status (OK or error code) returned by
    SQLitePersistentSharedDictionaryStore. Recorded when the database operation
    finishes.
  </summary>
  <token key="MethodName">
    <variant name="ClearAllDictionaries"/>
    <variant name="ClearDictionaries"/>
    <variant name="ClearDictionariesForIsolationKey"/>
    <variant name="DeleteDictionariesByDiskCacheKeyTokens"/>
    <variant name="DeleteExpiredDictionaries"/>
    <variant name="GetAllDictionaries"/>
    <variant name="GetAllDiskCacheKeyTokens"/>
    <variant name="GetDictionaries"/>
    <variant name="GetTotalDictionarySize"/>
    <variant name="GetUsageInfo"/>
    <variant name="ProcessEviction"/>
    <variant name="RegisterDictionary"/>
  </token>
</histogram>

<histogram
    name="Net.SharedDictionaryTransaction.AbortedWhileReadingDictionary.{SuccessOrFailure}"
    units="ms" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The delay to read a shared dictionary from a SharedDictionaryTransaction
    which is already aborted. Recorded when the dictionary is read, but the
    SharedDictionaryTransaction was aborted before the read operation was
    completed.
  </summary>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram
    name="Net.SharedDictionaryTransaction.DictionaryReadLatency.{RequestType}.{SuccessOrFailure}"
    units="ms" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The delay of SharedDictionaryTransaction caused by reading a shared
    dictionary for a {RequestType}. Recorded when the dictionary is read in the
    SharedDictionaryTransaction.
  </summary>
  <token key="RequestType">
    <variant name="Document" summary="document load (main frame or subframe)"/>
    <variant name="Subresource" summary="subresource load"/>
  </token>
  <token key="SuccessOrFailure" variants="SuccessOrFailure"/>
</histogram>

<histogram name="Net.SharedDictionaryTransaction.NetResultWithDict.{CertState}"
    enum="NetErrorCodes" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Positive net error codes returned from the network layer for requests with
    Sec-Available-Dictionary header. Recorded when a
    SharedDictionaryNetworkTransaction received the result from the network
    layer.
  </summary>
  <token key="CertState">
    <variant name="KnownRootCert"/>
    <variant name="UnknownRootCertOrNoCert"/>
  </token>
</histogram>

<histogram
    name="Net.SharedDictionaryUsedByResponseWhenAvailable2.MainFrame.{ConnectionType}.{CertState}"
    enum="Boolean" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Records whether the response used a shared dictionary when it was available.
    This is recorded only for main frame requests. Recorded when the URLLoader
    request is completed.
  </summary>
  <token key="ConnectionType">
    <variant name="Http1"/>
    <variant name="Http2"/>
    <variant name="Http3"/>
    <variant name="Other"/>
  </token>
  <token key="CertState">
    <variant name="KnownRootCert"/>
    <variant name="NoCert"/>
    <variant name="UnknownRootCert"/>
  </token>
</histogram>

<histogram
    name="Net.SharedDictionaryUsedResponseErrorCodes2.{DestinationType}.{CertState}"
    enum="NetErrorCodes" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    Positive net error codes of responses which used shared dictionaries.
    Recorded when the URLLoader request is completed.
  </summary>
  <token key="DestinationType">
    <variant name="MainFrame"/>
    <variant name="SubFrame"/>
    <variant name="Subresource"/>
  </token>
  <token key="CertState">
    <variant name="KnownRootCert"/>
    <variant name="NoCert"/>
    <variant name="UnknownRootCert"/>
  </token>
</histogram>

<histogram name="Net.SharedDictionaryWriterInMemory.DictionarySize"
    units="bytes" expires_after="2027-01-01">
  <owner>pmeenan@chromium.org</owner>
  <owner>src/net/extras/shared_dictionary/OWNERS</owner>
  <summary>
    The size of shared dictionary written in memory. Emitted when
    SharedDictionaryWriterInMemory succeeded to store the dictionary in memory.

    Warning: this histogram was expired from 2024-12-20 to 2024-08-27; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.Socket.SkipCompletionPortOnSuccessOutcome"
    enum="SkipCompletionPortOnSuccessOutcome" expires_after="2025-09-14">
  <owner>fdoray@chromium.org</owner>
  <owner>ricea@chromium.org</owner>
  <summary>
    The outcome of enabling the FILE_SKIP_COMPLETION_PORT_ON_SUCCESS option on a
    TcpSocketIoCompletionPortWin. Recorded for 1/1000 attempts to set the
    option.
  </summary>
</histogram>

<histogram name="Net.SocketPosix.DoReadDuration" units="microseconds"
    expires_after="2027-02-14">
  <owner>pasko@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The time it takes to execute SocketPosix::DoRead. Emitted at the end of
    DoRead. Subsampled to 1/1000.

    A few words on Rationale. This histogram can be used as an exemplary task
    duration on the network thread. Sometimes it will take several milliseconds
    to do a socket read due to OS state, like thrashing, or just randomly
    descheduling the task from the CPU. This DoReadDuration will show how often
    these events happen across the fleet. Regardless of its slowness in the
    field, the assumption is that the read duration cannot be realistically
    improved in the app. In other words, this duration is 'good enough' for any
    task on this thread. This will be a useful baseline when compared to
    duration of other tasks on the network thread, such as
    OnHandshakeIOCompleteDuration.
  </summary>
</histogram>

<histogram name="Net.SocketUnchangeableReceiveBuffer" units="Bytes"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The size of a socket's receive buffer when the attempt to change it via
    setsockopt failed.
  </summary>
</histogram>

<histogram name="Net.SocketUnchangeableSendBuffer" units="Bytes"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The size of a socket's send buffer when the attempt to change it via
    setsockopt failed.
  </summary>
</histogram>

<histogram name="Net.SpdyFrameStreamAndSessionFlowControlState"
    enum="SpdyFrameFlowControlState" expires_after="2027-02-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The counts of the flow control state of each frame (with stream and session
    flow control on).
  </summary>
</histogram>

<histogram name="Net.SpdyHeadersCompressionPercentage" units="%"
    expires_after="2027-02-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The percent compression achieved when compressing HEADERS frames.

    Warning: this histogram was expired from 2024-03-17 to 2024-04-24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.SpdyIPPoolDomainMatch" enum="SpdyIPPoolDomainMatch"
    expires_after="2027-02-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Status of checking if a SPDY domain can handle a IP match. If a match is
    found, we successfully used the IP Pooling. If a match is not found, we
    could have used IP Pooling, except the TLS Cert didn't match the IP-pooled
    domain.
  </summary>
</histogram>

<histogram name="Net.SpdyResponseCode" enum="HttpResponseCode"
    expires_after="2022-09-11">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    HTTP status codes received in HTTP/2 HEADERS frames. If a stream contains
    one or more informational (1xx) response preceeding the main response, each
    status code is logged separately.
  </summary>
</histogram>

<histogram name="Net.SpdySession.AcceptChForOrigin" enum="Boolean"
    expires_after="2027-01-03">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records whether the HTTP/2 session received an Accept-CH entry for the given
    origin, which GetAcceptChViaAlps() returns. Logged every time
    SpdyHttpStream::GetAcceptChViaAlps() is called, typically once for each
    request that is served over HTTP/2.
  </summary>
</histogram>

<histogram name="Net.SpdySession.AlpsAcceptChEntries" enum="AcceptChEntries"
    expires_after="2027-01-03">
  <owner>bnc@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records both whether there are any valid origin fields and whether there are
    any invalid ones in ACCEPT_CH frames. Logged once for each TLS handshake of
    a HTTP/2 connection if ALPS is negotiated, regardless of the number of
    ACCEPT_CH frames received in ALPS.
  </summary>
</histogram>

<histogram name="Net.SpdySession.AlpsDecoderStatus" enum="AlpsDecoderError"
    expires_after="2027-01-03">
  <owner>bnc@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the status (OK or error code) returned by AlpsDecoder when parsing
    ALPS data. Logged once for each TLS handshake of a HTTP/2 connection if ALPS
    is negotiated.
  </summary>
</histogram>

<histogram name="Net.SpdySession.AlpsDecoderStatus.Bypassed"
    enum="AlpsDecoderError" expires_after="2027-01-03">
  <owner>arichiv@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Net.SpdySession.AlpsDecoderStatus records errors returned by the AlpsDecoder
    class in HTTP/2 responses. Errors logged to that histogram cause a session
    termination, which isn't always desired. This histogram records errors that
    we want to note, but that shouldn't stop the connection.
  </summary>
</histogram>

<histogram name="Net.SpdySession.AlpsSettingParameterCount" units="parameters"
    expires_after="2027-01-03">
  <owner>bnc@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the total number of setting parameters received in SETTINGS frames
    in ALPS. Logged once for each TLS handshake of a HTTP/2 connection if ALPS
    is negotiated, regardless of the number of SETTINGS frames received in ALPS.
  </summary>
</histogram>

<histogram name="Net.SpdySession.ClosedOnError" enum="NetErrorCodes"
    expires_after="2027-02-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Net error codes when SpdySession was closed.</summary>
</histogram>

<histogram name="Net.SpdySession.CreateStreamWithSocketConnected"
    enum="BooleanSuccess" expires_after="2027-02-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>Socket connected status in SpdySession::CreateStream.</summary>
</histogram>

<histogram name="Net.SpdySession.GetRemoteEndpointResult" enum="NetErrorCodes"
    expires_after="2027-06-20">
  <owner>hayato@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the net error code returned by GetPeerAddress inside
    SpdySession::GetRemoteEndpoint. This is recorded every time
    GetRemoteEndpoint is called.
  </summary>
</histogram>

<histogram name="Net.SpdySession.GoAwayReceived" enum="Http2WireErrorCodes"
    expires_after="2026-09-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the error code value received in each HTTP/2 GOAWAY frame.
  </summary>
</histogram>

<histogram name="Net.SpdySession.OnSettings.{StreamState}StreamCount2"
    units="count" expires_after="2027-01-12">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-network-stack@google.com</owner>
  <summary>
    Records the number of {StreamState} streams when a SpdySession receives an
    HTTP/2 SETTINGS frame for the first time.
  </summary>
  <token key="StreamState">
    <variant name="Active" summary="active"/>
    <variant name="Created" summary="created"/>
    <variant name="CreatedAndActive" summary="created and active"/>
    <variant name="Pending" summary="pending"/>
  </token>
</histogram>

<histogram name="Net.SpdySession.RstStreamReceived" enum="Http2WireErrorCodes"
    expires_after="2027-06-30">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the error code value received in each HTTP/2 RST_STREAM frame.
  </summary>
</histogram>

<histogram name="Net.SpdySession.ServerSupportsWebSocket" enum="Boolean"
    expires_after="2027-06-30">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether the server has advertised support for WebSockets over HTTP/2.
  </summary>
</histogram>

<histogram name="Net.SpdySessionErrorDetails2" enum="SpdyProtocolErrorDetails2"
    expires_after="2027-02-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>The type of SPDY Protocol error encountered.</summary>
</histogram>

<histogram name="Net.SpdySessionErrorDetails_Google2"
    enum="SpdyProtocolErrorDetails2" expires_after="2027-02-02">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    WARNING: r181910 added an enum value in the middle, so don't trust the
    counts for values 9 and above for Chrome builds after that revision.

    The type of SPDY Protocol error encountered when talking to a google.com
    server.
  </summary>
</histogram>

<histogram name="Net.SpdySessionGet" enum="SpdySessionGet"
    expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>The type of SPDY Session used when looking up a session.</summary>
</histogram>

<histogram name="Net.SpdySessionGetPeerAddressNotConnected"
    enum="BooleanSuccess" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Whether SpdySession::Get{Peer,Local}Address was called when the connection
    had no socket.
  </summary>
</histogram>

<histogram name="Net.SpdyStreamsAbandonedPerSession" units="units"
    expires_after="2027-06-30">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    The number of pushed, but abandoned streams over a single session.
  </summary>
</histogram>

<histogram name="Net.SpdyStreamsPerSession" units="units"
    expires_after="2027-06-30">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>The number of streams issued over a single session.</summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.DatabaseSize" units="MB"
    expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the size of the database file of the SQL-based disk cache. This is
    recorded when the backend is initialized.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.EntryCount" units="entries"
    expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the number of entries in the SQL-based disk cache. This is recorded
    when the backend is initialized.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.IdleEventIncrementalVacuum.Result"
    enum="SqlDiskCacheStoreError" expires_after="2027-02-14">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the result of the incremental vacuum attempt of the SQL-based disk
    cache backend. This helps track the frequency of different failures and
    aborts. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram
    name="Net.SqlDiskCache.Backend.IdleEventIncrementalVacuum.{ResultType}Pages"
    units="pages" expires_after="2027-02-14">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the number of pages vacuumed during an incremental vacuum attempt
    of the SQL-based disk cache backend. This metric is recorded immediately
    after the incremental vacuum attempt {ResultType}. It helps diagnose
    performance regressions. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="ResultType">
    <variant name="Abort" summary="aborted"/>
    <variant name="Failure" summary="failed"/>
    <variant name="Success" summary="succeeded"/>
  </token>
</histogram>

<histogram
    name="Net.SqlDiskCache.Backend.IdleEventIncrementalVacuum.{ResultType}Time"
    units="microseconds" expires_after="2027-02-14">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the time taken to run the incremental vacuum of the SQL-based disk
    cache backend. This metric is recorded immediately after the incremental
    vacuum attempt {ResultType}. It helps diagnose performance regressions. The
    histogram is not reported on Windows machines without high resolution
    clocks. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="ResultType">
    <variant name="Abort" summary="aborted"/>
    <variant name="Failure" summary="failed"/>
    <variant name="Success" summary="succeeded"/>
  </token>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.IndexMismatch"
    enum="SqlDiskCacheIndexMismatchLocation" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the location where an in-memory index mismatch is detected in the
    SQL-based disk cache. This helps identify the operations that are most prone
    to causing inconsistencies between the in-memory index and the on-disk
    database.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.LoadInMemoryIndexTime"
    units="microseconds" expires_after="2026-12-27">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the time taken to load the in memory index of the SQL-based disk
    cache backend. This metric is recorded immediately after the in-memory index
    is loaded from the database. The histogram is not reported on Windows
    machines without high resolution clocks. Not recorded when
    kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.MaxSize" units="MB"
    expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the configured maximum size of the SQL-based disk cache. This is
    recorded when the backend is initialized.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.SqliteError"
    enum="SqliteLoggedResultCode" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Errors reported by SQLite while initializing or using the SQL-based disk
    cache backend database. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.TotalSize" units="MB"
    expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the total size of entries in the SQL-based disk cache. This is
    recorded when the backend is initialized.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{CheckpointType}.{ResultType}"
    units="pages" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the number of pages in the WAL file when the SQL-based disk cache
    checkpoint is performed. This metric is recorded immediately after the
    checkpoint succeeded or failed. It helps diagnose performance regressions.
    Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="CheckpointType" variants="SqlPersistentStoreCheckpointType"/>
  <token key="ResultType">
    <variant name="FailurePages"/>
    <variant name="SuccessPages"/>
  </token>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{CheckpointType}.{TimeType}"
    units="microseconds" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the time taken to run the checkpoint of the SQL-based disk cache
    backend. This metric is recorded immediately after the checkpoint succeeded
    or failed. It helps diagnose performance regressions. The histogram is not
    reported on Windows machines without high resolution clocks. Not recorded
    when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="CheckpointType" variants="SqlPersistentStoreCheckpointType"/>
  <token key="TimeType">
    <variant name="FailureTime"/>
    <variant name="SuccessTime"/>
  </token>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{EvictionType}.EntryCount"
    units="entries" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the number of entries deleted during a single eviction run in the
    SQL-based disk cache. This is recorded after the eviction is finished. Not
    recorded when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="EvictionType">
    <variant name="ResumeEviction"/>
    <variant name="ResumeEvictionOnIdleTime"/>
    <variant name="RunNewEviction"/>
    <variant name="RunNewEvictionOnIdleTime"/>
  </token>
</histogram>

<histogram
    name="Net.SqlDiskCache.Backend.{EvictionType}.ScannedEntriesCount.{LookupType}.{ResultType}"
    units="entries" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the number of entries scanned in the database or in-memory index
    during a single eviction candidate selection run in the SQL-based disk
    cache. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="EvictionType">
    <variant name="RunEviction"/>
    <variant name="RunEvictionOnIdleTime"/>
  </token>
  <token key="LookupType">
    <variant name="Database"/>
    <variant name="InMemory"/>
  </token>
  <token key="ResultType">
    <variant name="Abort"/>
    <variant name="Failure"/>
    <variant name="Success"/>
  </token>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{EvictionType}.SelectEntriesSqlError"
    enum="SqliteLoggedResultCode" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the SQLite error code when SelectEvictionCandidates fails during a
    single eviction run in the SQL-based disk cache. Not recorded when
    kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="EvictionType">
    <variant name="RunEviction"/>
    <variant name="RunEvictionOnIdleTime"/>
  </token>
</histogram>

<histogram
    name="Net.SqlDiskCache.Backend.{EvictionType}.TimeToSelectEntries.{LookupType}.{ResultType}"
    units="microseconds" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the time taken to select entries for deletion during a single
    eviction run in the SQL-based disk cache. This is recorded after the
    selection of the candidates is finished. The histogram is not reported on
    Windows machines without high resolution clocks. Not recorded when
    kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="EvictionType">
    <variant name="RunEviction"/>
    <variant name="RunEvictionOnIdleTime"/>
  </token>
  <token key="LookupType">
    <variant name="Database"/>
    <variant name="InMemory"/>
  </token>
  <token key="ResultType">
    <variant name="Abort"/>
    <variant name="Failure"/>
    <variant name="Success"/>
  </token>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{MethodName}.PostingDelay"
    units="microseconds" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the time delay from posting a task to its execution for the method
    of the SQL-based disk cache backend. This metric is recorded immediately
    before the logic for the method is executed. It helps diagnose potential
    delays caused by task queueing. The histogram is not reported on Windows
    machines without high resolution clocks. Not recorded when
    kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="MethodName" variants="SqlPersistentStoreMethodName"/>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{MethodName}.Result"
    enum="SqlDiskCacheStoreError" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the result of the method of the SQL-based disk cache backend. This
    helps track the frequency of different failures. This histogram is not
    reported if any data corruption was detected during the operation. Not
    recorded when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="MethodName" variants="SqlPersistentStoreMethodName"/>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{MethodName}.ResultWithCorruption"
    enum="SqlDiskCacheStoreError" expires_after="2027-01-03">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the error result of a method of the SQL-based disk cache backend
    when a data corruption is detected. This helps track the frequency of
    different failures in corrupted scenarios. Not recorded when
    kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="MethodName" variants="SqlPersistentStoreMethodName"/>
</histogram>

<histogram name="Net.SqlDiskCache.Backend.{MethodName}.{TimeType}"
    units="microseconds" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the time taken to run the method of the SQL-based disk cache
    backend. This metric is recorded immediately after the logic for the method
    succeeded or failed. It helps diagnose performance regressions. This
    histogram is not reported if any data corruption was detected during the
    operation. The histogram is not reported on Windows machines without high
    resolution clocks. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
  <token key="MethodName" variants="SqlPersistentStoreMethodName"/>
  <token key="TimeType">
    <variant name="FailureTime"/>
    <variant name="FailureTimeWithCorruption"/>
    <variant name="SuccessTime"/>
    <variant name="SuccessTimeWithCorruption"/>
  </token>
</histogram>

<histogram name="Net.SqlDiskCache.DeleteDoomedEntriesCount" units="entries"
    expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the number of doomed entries deleted during a single call to
    DeleteDoomedEntries. This operation is used for garbage collection of
    orphaned cache entries, which can be left behind after events like a network
    service crash. It deletes all entries marked as doomed, except for a
    specified set of entries that are still actively in use. Recorded each time
    the cleanup operation is run. Not recorded when kSqlDiskCacheReduceUma is
    true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.EntriesWithHintsPercentage" units="%"
    expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the percentage of live cache entries that have associated hints set.
    This is recorded once each time the in-memory index is loaded from the
    database. This data is used to evaluate the efficiency of the in-memory data
    structures. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.ExclusiveOperationDelay" units="microseconds"
    expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the time an exclusive operation spends in the queue before it is
    run in the SQL-based disk cache. This helps monitor potential delays and
    starvation issues for exclusive operations. Recorded when an exclusive
    operation is run. The histogram is not reported on Windows machines without
    high resolution clocks. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.FakeIndexFileError"
    enum="SqlDiskCacheFakeIndexFileError" expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the error status that can occur during the fake index file check of
    the SQL-based disk cache. This check is performed during the cache
    initialization.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Init.{SuccessOrFailure}Time"
    units="microseconds" expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the total duration of the SQL disk cache initialization. Recorded
    when the initialization completes {SuccessOrFailure}. The histogram is not
    reported on Windows machines without high resolution clocks.
  </summary>
  <token key="SuccessOrFailure">
    <variant name="Failure" summary="with an error"/>
    <variant name="Success" summary="successfully"/>
  </token>
</histogram>

<histogram name="Net.SqlDiskCache.MemoryEntryDataHintsValid" enum="Boolean"
    expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records whether all memory entry data hints loaded from the SQL-based disk
    cache database are valid (fit within the expected 2-bit range). This is
    recorded once when the in-memory index is loaded from the database. Not
    recorded when kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.NormalOperationDelay" units="microseconds"
    expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Measures the time a normal operation spends in the queue before it is run in
    the SQL-based disk cache. This helps monitor potential delays and starvation
    issues, especially when exclusive operations are frequent. Recorded when a
    normal operation is run. The histogram is not reported on Windows machines
    without high resolution clocks. Not recorded when kSqlDiskCacheReduceUma is
    true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.OptimisticWrite.Result"
    enum="SqlDiskCacheStoreError" expires_after="2027-01-17">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the result of an optimistic write operation to the SQL disk cache.
    This is recorded when the optimistic write completes on the background
    thread, indicating whether the underlying persistent store operation
    succeeded or failed. Not recorded when kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram name="Net.SqlDiskCache.Write.IsOptimistic" enum="Boolean"
    expires_after="2027-02-07">
  <owner>horo@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records whether a disk cache write operation was performed optimistically
    (synchronously) or not. True indicates the write was optimistic, false
    indicates it was queued for asynchronous processing. This metric will be
    emitted every time a cache entry write happens. Not recorded when
    kSqlDiskCacheReduceUma is true.
  </summary>
</histogram>

<histogram name="Net.SqlSharedCacheIndexDatabase.{Method}.Result"
    enum="SqlSharedCacheIndexDatabaseResult" expires_after="2026-10-20">
  <owner>horo@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>The result of {Method} in SqlSharedCacheIndexDatabase.</summary>
  <token key="Method" variants="SqlSharedCacheIndexDatabaseMethod"/>
</histogram>

<histogram name="Net.SqlSharedCacheIndexDatabase.{Method}.{TimeType}"
    units="microseconds" expires_after="2026-10-20">
  <owner>horo@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The processing time of {Method} in SqlSharedCacheIndexDatabase. Recorded on
    {TimeType}.

    The histogram is not reported on Windows machines without high resolution
    clocks.
  </summary>
  <token key="Method" variants="SqlSharedCacheIndexDatabaseMethod"/>
  <token key="TimeType">
    <variant name="FailureTime" summary="failure"/>
    <variant name="SuccessTime" summary="success"/>
  </token>
</histogram>

<histogram name="Net.SSL.ECHResult" enum="SSLECHResult"
    expires_after="2026-05-03">
  <owner>davidben@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    For each TLS connection that offered Encrypted ClientHello (ECH), what was
    the result of that connection. In particular, this measures if the recovery
    flow was needed and, if so, whether it fixed the connection.
  </summary>
</histogram>

<histogram name="Net.SSL.TrustAnchorIDsResult" enum="SSLTrustAnchorIDsResult"
    expires_after="2027-02-07">
  <owner>davidben@chromium.org</owner>
  <owner>estark@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    For each TLS connection, recorded when the connection attempt completes,
    whether the trust anchor IDs retry flow was triggered and, if so, whether it
    fixed the connection.
  </summary>
</histogram>

<histogram name="Net.SSL_CipherSuite" enum="SSLCipherSuite"
    expires_after="never">
<!-- expires-never: Used to keep track of the TLS ecosystem. -->

  <owner>agl@chromium.org</owner>
  <owner>rsleevi@chromium.org</owner>
  <summary>
    The SSL/TLS cipher suite that was negotiated. Recorded for each SSL/TLS
    connection in the socket pool where Connect() succeeds.
  </summary>
</histogram>

<histogram name="Net.SSL_Connection_Error" enum="NetErrorCodes"
    expires_after="never">
<!-- expires-never: Used to keep track of the TLS ecosystem. -->

  <owner>agl@chromium.org</owner>
  <summary>
    Counts of specific error codes returned when opening an SSL connection.
  </summary>
</histogram>

<histogram name="Net.SSL_Connection_Error_TrustAnchorIDs" enum="NetErrorCodes"
    expires_after="2026-12-06">
  <owner>davidben@chromium.org</owner>
  <owner>estark@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    Counts of specific error codes returned when opening an SSL connection.
    Recorded for connections to servers that advertise support for Trust Anchor
    IDs in DNS.
  </summary>
</histogram>

<histogram name="Net.SSL_Connection_Latency_2" units="ms" expires_after="never">
<!-- expires-never: Used to keep track of the TLS ecosystem. -->

  <owner>agl@chromium.org</owner>
  <summary>Time from when the Connect() starts until it completes.</summary>
</histogram>

<histogram name="Net.SSL_Connection_Latency_ServerPadding" units="ms"
    expires_after="2027-01-17">
  <owner>davidben@chromium.org</owner>
  <owner>hchao@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    Time from when the Connect() starts until it completes. Recorded for
    successful connections to servers that used the Server Padding extension.
  </summary>
</histogram>

<histogram name="Net.SSL_Connection_Latency_TrustAnchorIDs" units="ms"
    expires_after="2026-12-06">
  <owner>davidben@chromium.org</owner>
  <owner>estark@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    Time from when the Connect() starts until it completes. Recorded for
    successful connections to servers that advertise support for Trust Anchor
    IDs in DNS.
  </summary>
</histogram>

<histogram name="Net.SSL_KeyExchange.ECDHE" enum="ECDHECurves"
    expires_after="never">
<!-- expires-never: Used to keep track of the TLS ecosystem. -->

  <owner>agl@chromium.org</owner>
  <owner>rsleevi@chromium.org</owner>
  <owner>sigbjorn@opera.com</owner>
  <summary>
    The curve used for key exchange for ECDHE. Recorded for each SSL/TLS
    connection in the socket pool where Connect() succeeds.
  </summary>
</histogram>

<histogram name="Net.SSLClientCertSignatureAlgorithm"
    enum="SSLSignatureAlgorithm" expires_after="2027-06-30">
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For each non-resumption TLS handshake that sends a client certificate, the
    signature algorithm used by the client.

    Warning: this histogram was expired from 2025-02-10 to 2025-06-25; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.SSLClientSocketImpl.OnHandshakeIOCompleteDuration"
    units="ms" expires_after="2027-02-14">
  <owner>pasko@chromium.org</owner>
  <owner>src/net/ssl/OWNERS</owner>
  <summary>
    The time it takes to execute SSLClientSocketImpl::OnHandshakeIOComplete.
    Measured at the end of OnHandshakeIOComplete. Subsampled to 1/1000.
  </summary>
</histogram>

<histogram name="Net.SSLExtendedMainSecretSupported" enum="BooleanSupported"
    expires_after="2027-06-30">
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For each TLS handshake, whether the server supports the Extended Main Secret
    extension (RFC 7627). If the server negotiated TLS 1.3, which is always
    patched against this bug, it is considered to support the extension. Servers
    that do not implement this extension may be vulnerable to attacks when using
    channel binding or key exporters.

    Note this extension was originally defined with a different name in RFC
    7276. It is being renamed in draft-ietf-tls-rfc8446bis to Extended Main
    Secret. With both names, it is often referred to by the acronym EMS.
  </summary>
</histogram>

<histogram name="Net.SSLHandshakeDetails" enum="SSLHandshakeDetails"
    expires_after="2027-01-17">
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For each successful TLS handshake, what kind of handshake was used. This
    metric distinguishes TLS 1.2 (or earlier) and TLS 1.3 as they have very
    different resumption and round-trip behaviors. It also distinguishes full
    handshakes, resumption, 0-RTT, and False Start.
  </summary>
</histogram>

<histogram name="Net.SSLHandshakeEarlyDataReason"
    enum="SSLHandshakeEarlyDataReason" expires_after="2026-12-20">
  <owner>bashi@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    Indicates whether a TLS 1.3 connection ended up using 0-RTT or not, and why;
    this includes reasons such as the server declining to resume the connection
    and the client not having enough tickets available. This metric is only
    recorded if 0-RTT supported is enabled in the client.

    Warning: this histogram was expired from 2022-05-11 to 2024-11-05; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.SSLHandshakeEarlyDataReason.Google"
    enum="SSLHandshakeEarlyDataReason" expires_after="2027-02-07">
  <owner>bashi@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    Indicates whether a TLS 1.3 connection to a Google host ended up using 0-RTT
    or not, and why; this includes reasons such as the server declining to
    resume the connection and the client not having enough tickets available.
    This metric is only recorded if 0-RTT supported is enabled in the client.

    Warning: this histogram was expired from 2022-05-11 to 2024-11-05; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.SSLKeyLogFileUse" enum="SSLKeyLogFileAction"
    expires_after="2023-11-12">
  <owner>cthomp@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    Counts when the SSLKEYLOGFILE environment variable or --ssl-key-log-file
    command-line flag are set, and when they enable the SSLKeyLogger feature.

    This histogram was temporarily expired from M92 until M104.
  </summary>
</histogram>

<histogram name="Net.SSLNegotiatedAlpnProtocol"
    enum="SSLNegotiatedAlpnProtocol" expires_after="2027-02-02">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For each TLS handshake, whether ALPN was negotiated; and if so, the
    negotiated protocol.
  </summary>
</histogram>

<histogram name="Net.SSLRenegotiationInfoSupported" enum="BooleanSupported"
    expires_after="2027-06-30">
  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For each TLS handshake, whether the server supports the renegotiation_info
    extension (RFC 5746). If the server negotiated TLS 1.3, which removed
    renegotiation, it is considered to support the extension. Servers that do
    not support it are potentially vulnerable to an attack involving TLS
    renegotiation.
  </summary>
</histogram>

<histogram name="Net.SSLSignatureAlgorithm" enum="SSLSignatureAlgorithm"
    expires_after="never">
<!-- expires-never: Used to keep track of the TLS ecosystem. -->

  <owner>davidben@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    For each SSL connection with a full handshake using a DHE- or ECDHE-based
    key exchange, the signature algorithm used to authenticate the peer. In TLS
    1.2, this is the signature on the ServerKeyExchange message. (Note: Although
    the ECDSA values specify a curve, the curve is only enforced in TLS 1.3.)
  </summary>
</histogram>

<histogram name="Net.SSLVersion" enum="SSLOrQUICVersion" expires_after="never">
<!-- expires-never: Used to keep track of the TLS ecosystem. -->

  <owner>davidben@chromium.org</owner>
  <summary>
    The SSL/TLS version that was negotiated. Recorded for each SSL/TLS
    connection in the socket pool where Connect() succeeds.
  </summary>
</histogram>

<histogram name="Net.StructuredHeaders.Base64DecodingIsStrictCompliant"
    enum="Boolean" expires_after="2027-01-17">
  <owner>apaseltiner@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    True when strict base64 decoding of a Structured Header succeeds, false when
    it fails but non-compliant lenient decoding succeeds. Emitted whenever a
    byte-sequence-typed bare item
    (https://www.rfc-editor.org/rfc/rfc8941.html#name-byte-sequences) is
    successfully parsed, regardless of whether subsequent parsing of the
    remainder of the top-level Structured Header is successful. See
    crbug.com/393153699 and crbug.com/393408763 for details.
  </summary>
</histogram>

<histogram name="Net.StructuredHeaders.DecimalWithZeroFractionalDigits"
    enum="Boolean" expires_after="2027-01-24">
  <owner>apaseltiner@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    Whether a decimal point in a Structured Header is erroneously accepted
    without any digits following it. Emitted whenever a decimal-typed bare item
    (https://www.rfc-editor.org/rfc/rfc8941.html#name-decimals) is successfully
    parsed, regardless of whether subsequent parsing of the remainder of the
    top-level Structured Header is successful. See crbug.com/517189418 for
    details.
  </summary>
</histogram>

<histogram name="Net.StructuredHeaders.Parse{Type}.Success"
    enum="BooleanSuccess" expires_after="2027-05-28">
  <owner>apaseltiner@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The result (success or failure) of parsing a structured-header {Type}. See
    crbug.com/377941140 for more details.
  </summary>
  <token key="Type" variants="StructuredHeaderType"/>
</histogram>

<histogram name="Net.StructuredHeaders.Parse{Type}.Time" units="microseconds"
    expires_after="2027-05-28">
  <owner>apaseltiner@chromium.org</owner>
  <owner>net-dev@chromium.org</owner>
  <summary>
    The time taken to parse a structured-header {Type} via the
    net::structured_headers::Parse{Type} function. Recorded for all clients, not
    just ones with high-resolution time, and recorded regardless of whether
    parsing succeeds or fails. See crbug.com/377941140 for more details.
  </summary>
  <token key="Type" variants="StructuredHeaderType"/>
</histogram>

<histogram name="Net.TaskRunner.RequestPriority" enum="RequestPriority"
    expires_after="2027-01-03">
  <owner>hayato@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The request priority passed to net::GetTaskRunner. Recorded with 0.001
    probability when net::GetTaskRunner is called.
  </summary>
</histogram>

<histogram name="Net.TCP_Connection_Latency{DnsImpact2}" units="ms"
    expires_after="never">
<!-- expires-never: Core network stack health metric -->

  <owner>mmenke@chromium.org</owner>
  <summary>
    Time from when the Connect() starts until it completes. Only times under 10
    minutes are logged. {DnsImpact2}
  </summary>
  <token key="DnsImpact2">
    <variant name=""/>
    <variant name="_disabled_prefetch"
        summary="DNS pre-resolving is disabled in these clients"/>
    <variant name="_disabled_prefetch_4_connections"
        summary="DNS pre-resolving is disabled in these clients, and a
                 maximum of 4 connections per host was allowed"/>
    <variant name="_enabled_prefetch_4_connections"
        summary="a maximum of 4 connections per host was allowed in these
                 clients"/>
    <variant name="_parallel_4_prefetch"
        summary="DNS pre-resolving was only doing 4 concurrent speculative
                 resolutions in this test"/>
  </token>
</histogram>

<histogram name="Net.TcpConnectAttempt.Latency.Error" units="ms"
    expires_after="2027-01-17">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Time taken when failed to establish a TCP connection to an individual
    endpoint. This includes the case when the attempt was aborted by a higher
    layer (likely because it took too long).
  </summary>
</histogram>

<histogram name="Net.TcpConnectAttempt.Latency.Success" units="ms"
    expires_after="2027-01-31">
  <owner>bashi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Time taken to successfully establish a TCP connection to an individual
    endpoint.
  </summary>
</histogram>

<histogram name="Net.TCPSocket.PortReuseTimeWindows2.{IPType}.{Result}"
    units="ms" expires_after="2027-01-03">
  <owner>arichiv@chromium.org</owner>
  <owner>awillia@chromium.org</owner>
  <owner>katabolism-finch@google.com</owner>
  <summary>
    The time between the release of a socket on a particular local address/port
    and its future re-use in another connection. The time for the last release
    is cleared if the open is successful, and reused without overwriting if not.

    Recorded once for each attempted re-use of an address/port for TCP on
    Windows via TCPSocketWin::DoConnectComplete.

    This second version of the histogram uses UmaHistogramLongTimes100 where the
    original used UmaHistogramTimes, which was insufficient.

    {IPType}

    {Result}
  </summary>
  <token key="IPType">
    <variant name="LinkLocal"
        summary="Link-local IP addresses are used for communication on
                 sub-network."/>
    <variant name="Loopback"
        summary="Loopback IP addresses are used for on-device network
                 testing."/>
    <variant name="Other" summary="All other IP addresses."/>
  </token>
  <token key="Result">
    <variant name="Failure" summary="Socket failed to connect."/>
    <variant name="Success" summary="Socket did connect."/>
  </token>
</histogram>

<histogram name="Net.TcpSocketPoolLimitRandomization.Error"
    enum="SocketPoolAdditionalCapacityError" expires_after="2026-11-03">
  <owner>arichiv@chromium.org</owner>
  <owner>katabolism-finch@google.com</owner>
  <summary>
    Records when SocketPoolAdditionalCapacity is constructed with invalid
    constants, or when transitions are calculated with invalid parameters. Most
    errors cannot cause exits as the code path is critical, so we just log and
    take a low-risk route.

    This data is used to validate proper behavior of the probability function.

    See crbug.com/415691664 for more details.
  </summary>
</histogram>

<histogram name="Net.TcpSocketPoolLimitRandomization.Probability.{Action}"
    units="%" expires_after="2027-01-03">
  <owner>arichiv@chromium.org</owner>
  <owner>katabolism-finch@google.com</owner>
  <summary>
    Records the probability of a state transition returned when a socket is
    having action, {Action}, performed.

    This data is used to validate proper behavior of the probability function.

    See crbug.com/415691664 for more details.
  </summary>
  <token key="Action" variants="TcpSocketPoolLimitRandomizationAction"/>
</histogram>

<histogram
    name="Net.TcpSocketPoolLimitRandomization.Transition.{Action}.{PastState}To{NextState}"
    units="sockets" expires_after="2027-01-03">
  <owner>arichiv@chromium.org</owner>
  <owner>katabolism-finch@google.com</owner>
  <summary>
    Records the number of active sockets at the time the new state for the
    socket pool is calculated. The state {PastState} was the behavior before the
    action, {Action}, and the state {NextState} defines the behavior after.

    This data is used to validate proper behavior of the probability function.

    See crbug.com/415691664 for more details.
  </summary>
  <token key="Action" variants="TcpSocketPoolLimitRandomizationAction"/>
  <token key="PastState" variants="TcpSocketPoolLimitRandomizationState"/>
  <token key="NextState" variants="TcpSocketPoolLimitRandomizationState"/>
</histogram>

<histogram
    name="Net.TrustTokens.NetErrorForFetchFailure.{TrustTokenOperationType}"
    enum="NetErrorCodes" expires_after="2023-06-06">
  <owner>svaldez@chromium.org</owner>
  <owner>timhuber@google.com</owner>
  <owner>yhirano@chromium.org</owner>
  <summary>
    The net error for a failed Fetch API call with an associated Trust Tokens
    operation. This was originally added to help debug a surfeit of 'TypeError:
    failed to fetch' observed in live testing, and it is now retained since it's
    useful for ongoing health monitoring. {TrustTokenOperationType}
  </summary>
</histogram>

<histogram
    name="Net.TrustTokens.NetErrorForTrustTokenOperation.{OperationResult}.{TrustTokenOperationType}"
    enum="NetErrorCodes" expires_after="2023-06-06">
  <owner>svaldez@chromium.org</owner>
  <owner>timhuber@google.com</owner>
  <summary>
    The //net status codes for resource requests that had started Trust Tokens
    operations. This captures the reasons why requests with Trust Tokens
    operations fail and might help debug a surfeit of &quot;TypeError: failed to
    fetch&quot; observed in live testing. {OperationResult}
    {TrustTokenOperationType}
  </summary>
  <token key="OperationResult">
    <variant name="Failure"
        summary="The operation or partial operation failed: for ServerTime,
                 this means that the subsequent Finalize part failed; for
                 TotalTime, it means that the operation failed during
                 Finalize."/>
    <variant name="Success"
        summary="The operation or partial operation succeeded."/>
  </token>
</histogram>

<histogram name="Net.TrustTokens.OperationOutcome.{TrustTokenOperationType}"
    enum="TrustTokenOperationStatus" expires_after="2027-01-31">
  <owner>svaldez@chromium.org</owner>
  <owner>timhuber@google.com</owner>
  <summary>
    For Private State Token (PST) operations, the result of the operation. This
    is recorded everytime a PST operation completed in URLLoader. See
    network::URLLoader::OnDoneBeginningTrustTokenOperation for details. This can
    help debug the use of the API observed in the ecosystem.
    {TrustTokenOperationType}
  </summary>
</histogram>

<histogram name="Net.TrustTokens.Operation{TimeSpan}Time.{Outcome}.{Type}"
    units="ms" expires_after="2023-06-06">
  <owner>svaldez@chromium.org</owner>
  <owner>timhuber@google.com</owner>
  <summary>
    Time taken to execute various parts of a Trust Tokens operation: 1. Begin =
    time taken to execute the operation's outbound Begin half 2. Server = time
    from the end of the outbound Begin half to the beginning of the inbound
    Finalize half 3. Finalize = time taken to execute the inbound Finalize half
    4. Total = Begin + Server + Finalize (only recorded for operations that see
    server responses)

    The other variants (see TrustTokenOperationType variants): 1. Outcome
    (Success or Failure) 2. The type of Trust Tokens operation 3. Whether the
    operation was platform-provided (i.e. executed by a method other than a
    direct HTTP request to the issuer's server)
  </summary>
  <token key="TimeSpan">
    <variant name="Begin"/>
    <variant name="Finalize"/>
    <variant name="Server"/>
    <variant name="Total"/>
  </token>
  <token key="Outcome">
    <variant name="Failure"/>
    <variant name="Success"/>
  </token>
  <token key="Type">
    <variant name="Issuance"/>
    <variant name="Redemption"/>
    <variant name="Signing"/>
  </token>
</histogram>

<histogram name="Net.TrustTokens.ProtocolVersion"
    enum="TrustTokenProtocolVersion" expires_after="2026-12-27">
  <owner>aykutb@chromium.org</owner>
  <owner>trust-token@google.com</owner>
  <summary>
    The crypto version used for Private State Token (PST) operations. This is
    recorded every time a PST issuance operation started. This will be used to
    remove the unused crypto versions.
  </summary>
</histogram>

<histogram name="Net.TrustTokens.RedemptionRequestEmpty" enum="BooleanEmpty"
    expires_after="2023-06-06">
  <owner>svaldez@chromium.org</owner>
  <owner>timhuber@google.com</owner>
  <summary>
    Whether the Trust Tokens redemption logic received an empty redemption
    request string from its underlying cryptographic library. If this is always
    true, but servers occasionally see empty redemption request headers, it
    might suggest middleware (namely extensions) is removing the headers'
    values.
  </summary>
</histogram>

<histogram
    name="Net.TrustTokens.RequestHelperFactoryOutcome.{TrustTokenOperationType}"
    enum="TrustTokenRequestHelperFactoryOutcome" expires_after="2026-09-27">
  <owner>svaldez@chromium.org</owner>
  <owner>timhuber@google.com</owner>
  <summary>
    For resource requests that bear Trust Tokens parameters, the results of
    running TrustTokenRequestHelperFactory to initialize Trust Tokens handling
    logic. This might help debug a surfeit of failed Trust Tokens issuance
    operations observed in live testing. {TrustTokenOperationType}
  </summary>
</histogram>

<histogram name="Net.UDPSocketPosix.GroPacketsRead" units="packets"
    expires_after="2027-07-17">
  <owner>aymanm@google.com</owner>
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the number of UDP datagrams read and sliced from a UDP_GRO
    superpacket (or un-coalesced datagram) per read operation when UDP Generic
    Receive Offload (UDP_GRO) is enabled on a UDPSocketPosix. This metric is
    sampled at 1% of successful GRO read operations. This metric is only emitted
    if `ReadMultiple()` is called.
  </summary>
</histogram>

<histogram name="Net.UDPSocketPosix.RecvMmsgPacketsRead" units="packets"
    expires_after="2027-07-17">
  <owner>aymanm@google.com</owner>
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the number of UDP datagrams read in a single batch read (recvmmsg)
    operation on a UDPSocketPosix. This metric is sampled at 1% of successful
    recvmmsg read operations. This metric is only emitted if `ReadMultiple()` is
    called and recvmmsg is used.
  </summary>
</histogram>

<histogram name="Net.UDPSocketPosix.SetSocketOptionGroResult"
    enum="SetSocketOptionGroResult" expires_after="2027-07-17">
  <owner>aymanm@google.com</owner>
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Records the result of enabling UDP Generic Receive Offload (UDP_GRO) via
    setsockopt on a UDPSocketPosix. This metric is sampled at 1% of socket
    creations.
  </summary>
</histogram>

<histogram name="Net.UDPSocketWinClose" units="ms" expires_after="2024-03-24">
  <owner>dschinazi@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>The time spent in closesocket call in UDPSocketWin::Close.</summary>
</histogram>

<histogram name="Net.URLLoader.AcceptCH.NeedsObserverCheck" enum="Boolean"
    expires_after="2026-08-09">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    We aim to offload the critical client hint check in the network layer. This
    metric records true if we still need to call the AcceptCHFrameObserver for
    checking the hint. It is recorded only if the received header has the
    ACCEPT_CH frame on the QUIC connection set up timing. Refer
    AcceptCHFrameInterceptor::OnConnected() for details.
  </summary>
</histogram>

<histogram name="Net.URLLoader.AcceptCH.RoundTripTime" units="microseconds"
    expires_after="2027-02-14">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the IPC round trip time to handle the AcceptCH frame in the browser
    process. It is recorded if there are hints in the ACCEPT_CH frame that were
    not included in the original request during URLLoader to handle a
    connection. It is time just before the OnAcceptCHFrameReceived() IPC call
    until the IPC callback is called. Refer
    AcceptCHFrameInterceptor::OnConnected() for details.

    Note: The metrics is reported from all clients. Some of clients may not have
    high resolution timer that can send metrics with microseconds precision.
  </summary>
</histogram>

<histogram name="Net.URLLoader.AcceptCH.RunObserverCall" enum="Boolean"
    expires_after="2027-01-24">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records if the received the ACCEPT_CH frame should be checked by the
    observer. It is recorded only if the received header has the ACCEPT_CH
    frame. Refer AcceptCHFrameInterceptor::OnConnected() for details.
  </summary>
</histogram>

<histogram name="Net.URLLoader.AcceptCH.Status" enum="NetErrorCodes"
    expires_after="2027-02-14">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the response status of the the AcceptCH frame handling in the
    browser process. It is recorded if there are hints in the ACCEPT_CH frame
    that were not included in the original request during URLLoader to handle a
    connection. It is time just before the OnAcceptCHFrameReceived() IPC call
    until the IPC callback is called. Refer
    AcceptCHFrameInterceptor::OnConnected() for details.
  </summary>
</histogram>

<histogram name="Net.URLLoader.AcceptCHFrameReceivedOnHttp2" enum="Boolean"
    expires_after="2026-07-05">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether an ACCEPT_CH frame was received on an HTTP/2 connection.
    This is recorded when the URLLoader is connected.
  </summary>
</histogram>

<histogram name="Net.URLLoader.AcceptCHFrameReceivedOnHttp3" enum="Boolean"
    expires_after="2026-09-06">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether an ACCEPT_CH frame was received on an HTTP/3 connection.
    This is recorded when the URLLoader is connected.
  </summary>
</histogram>

<histogram name="Net.URLLoader.HasHeaderClient" enum="Boolean"
    expires_after="2027-01-24">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records whether a URLLoader has a TrustedHeaderClient when starting a
    transaction. Logged before the URLLoader starts a transaction.
  </summary>
</histogram>

<histogram name="Net.URLLoader.OnBeforeSendHeadersDuration" units="ms"
    expires_after="2027-01-24">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Records the duration of the TrustedHeaderClient::OnBeforeSendHeaders IPC
    call. Logged when the callback for OnBeforeSendHeaders is received in
    URLLoader::OnBeforeSendHeadersComplete.
  </summary>
</histogram>

<histogram name="Net.URLLoader.ProportionOfWritesBlockedByMojo" units="%"
    expires_after="2026-12-20">
  <owner>yoichio@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the proportion of writes when URLLoader was blocked by
    MOJO_RESULT_SHOULD_WAIT where the renderer process seems to be busy. Logged
    every time a URLLoader completes a load.
  </summary>
</histogram>

<histogram
    name="Net.URLLoader.SlopBucket.ProportionOfWritesBlockedByMojo.{CacheEntryStatus}"
    units="%" expires_after="2026-09-06">
  <owner>yoichio@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the proportion of writes when URLLoader was blocked by
    MOJO_RESULT_SHOULD_WAIT where the renderer process seems to be busy. Logged
    every time a URLLoader completes a load and only when SlopBucket is actually
    used and response cache type is {CacheEntryStatus}.
  </summary>
  <token key="CacheEntryStatus">
    <variant name="All"/>
    <variant name="NoCache"/>
  </token>
</histogram>

<histogram name="Net.URLLoaderThrottle.OnReceiveResponseTime" units="ms"
    expires_after="2027-01-17">
  <owner>nidhijaju@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Time spent on the callback called when the response head is received. Logged
    every time a throttle receives a response.
  </summary>
</histogram>

<histogram name="Net.URLLoaderThrottleDeferTime.WillProcessResponse.{Throttle}"
    units="ms" expires_after="2023-02-13">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures time {Throttle} deferred a request on WillProcessResponse. Logged
    every time {Throttle} defers a request.
  </summary>
  <token key="Throttle" variants="WillProcessResponseThrottleNames"/>
</histogram>

<histogram name="Net.URLLoaderThrottleDeferTime.WillStartRequest.{Throttle}"
    units="ms" expires_after="2023-02-13">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures time {Throttle} deferred a request on WillStartRequest. Logged
    every time {Throttle} defers a request.
  </summary>
  <token key="Throttle" variants="WillStartRequestThrottleNames"/>
</histogram>

<histogram name="Net.URLLoaderThrottleDeferTime.{Stage}" units="ms"
    expires_after="2023-02-14">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures time a URLLoaderThrottle was deferred when on {Stage}. Logged every
    time a throttle defers a request.
  </summary>
  <token key="Stage" variants="URLLoaderThrottleStages"/>
</histogram>

<histogram name="Net.URLLoaderThrottleExecutionTime.{Stage}" units="ms"
    expires_after="2023-02-14">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures time a URLLoaderThrottle took to execute {Stage}. Logged every time
    a throttle runs.
  </summary>
  <token key="Stage" variants="URLLoaderThrottleStages"/>
</histogram>

<histogram
    name="Net.URLRequest.ReferrerHasInformativePath{ReferrerPolicySameOrigin}"
    enum="BooleanPathIsInformative" expires_after="2023-04-16">
  <owner>davidvc@chromium.org</owner>
  <owner>kaustubhag@chromium.org</owner>
  <summary>
    Records for each URLRequest whether its referrer contains more information
    than just its origin (this is the case exactly when it has at least one
    character apart from a leading slash in its path, e.g. http://example.com/a
    but not http://example.com/ nor http://example.com).
    {ReferrerPolicySameOrigin}
  </summary>
  <token key="ReferrerPolicySameOrigin" variants="ReferrerPolicySameOrigin">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="Net.URLRequest.ReferrerPolicyForRequest{ReferrerPolicySameOrigin}"
    enum="URLRequestReferrerPolicy" expires_after="2023-04-16">
  <owner>davidvc@chromium.org</owner>
  <owner>kaustubhag@chromium.org</owner>
  <summary>
    Records the distribution of referrer policies provided with outgoing
    URLRequests, and whether or not the requests were cross-origin.
    {ReferrerPolicySameOrigin}
  </summary>
  <token key="ReferrerPolicySameOrigin" variants="ReferrerPolicySameOrigin">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Net.WebSocket.ErrorCodes{ProtocolOrType}" enum="NetErrorCodes"
    expires_after="never">
<!-- expires-never: needed for long-term tracking of ecosystem -->

  <owner>ricea@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Positive net error codes that WebSockets end with, including OK and ABORTED.
  </summary>
  <token key="ProtocolOrType">
    <variant name="" summary="All protocols"/>
    <variant name=".Http2" summary="HTTP/2"/>
    <variant name=".Http3" summary="HTTP/3"/>
    <variant name="_Localhost"/>
    <variant name="_NotLocalhost"/>
  </token>
</histogram>

<histogram name="Net.WebSocket.FallbackResult" enum="WebSocketFallbackResult"
    expires_after="2027-06-30">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Fallback result of WebSocket handshakes. Recorded when a WebSocket handshake
    completed.
  </summary>
</histogram>

<histogram name="Net.WebSocket.HandshakeResult2"
    enum="WebSocketHandshakeResult2" expires_after="never">
<!-- expires-never: needed for long-term tracking of ecosystem -->

  <owner>yhirano@chromium.org</owner>
  <owner>ricea@chromium.org</owner>
  <owner>src/net/OWNERS</owner>
  <summary>
    Results of WebSocket handshakes, including information whether the handshake
    happened over HTTP/1, HTTP/2 or HTTP/3. Use this histogram as a baseline for
    investigating feature usage counters.
  </summary>
</histogram>

<histogram name="Net.WebSocket.Http3SessionReuseAvailable" enum="Boolean"
    expires_after="2027-05-13">
  <owner>ricea@chromium.org</owner>
  <owner>patilmayur@microsoft.com</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Whether a WebSocket-over-HTTP/3 handshake can reuse an existing QUIC session
    that supports Extended CONNECT. Recorded for WebSocket handshakes when QUIC
    and WebSocket-over-HTTP/3 are enabled and the proxy is direct.
  </summary>
</histogram>

<histogram name="Net.WebSocket.ProtocolHeaderSize" units="bytes"
    expires_after="2027-01-17">
  <owner>ricea@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The size of the value of the Sec-WebSocket-Protocol header in the WebSocket
    handshake request, in bytes. Recorded once for every WebSocket handshake
    request sent, regardless of HTTP version.
  </summary>
</histogram>

<histogram name="Net.WebSocket.ResponseCode" enum="HttpResponseCode"
    expires_after="never">
<!-- expires-never: needed for long-term tracking of ecosystem -->

  <owner>yhirano@chromium.org</owner>
  <owner>ricea@chromium.org</owner>
  <summary>All HTTP status codes seen during WebSocket handshakes.</summary>
</histogram>

<histogram name="Net.WebTransport.NegotiatedHttpDatagramVersion"
    enum="NegotiatedHttpDatagramVersion" expires_after="2027-05-24">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Negotiated HTTP Datagram version. Recorded when a WebTransport session
    becomes ready.
  </summary>
</histogram>

<histogram name="Net.WebTransport.NegotiatedWebTransportVersion"
    enum="NegotiatedWebTransportVersion" expires_after="2026-10-04">
  <owner>bashi@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Negotiated WebTransport version. Recorded when a WebTransport session
    becomes ready.
  </summary>
</histogram>

<histogram name="Net.ZstdFilter.CompressionRatio" units="%"
    expires_after="2026-06-25">
  <owner>nidhijaju@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Compressed/Decompressed size ratio as a percentage when using zstd.
  </summary>
</histogram>

<histogram name="Net.ZstdFilter.ErrorCode" enum="ZstdFilterErrorCode"
    expires_after="2026-06-25">
  <owner>nidhijaju@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    Error code observed after failing to decode a Zstd-compressed response
    stream from the network. Recorded once per layer of Zstd compression that
    encountered a decoding error. See Net.ZstdFilter.Status to get the overall
    error rate.

    Warning: this histogram was expired from 2024-12-31 to 2025-06-25; data may
    be missing.
  </summary>
</histogram>

<histogram name="Net.ZstdFilter.MaxMemoryUsage" units="KB"
    expires_after="2026-06-25">
  <owner>nidhijaju@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The maximum memory allocation by the zstd library to decode a
    Zstd-compressed response stream from the network. Recorded once per layer of
    Zstd compression (usually once per zstd-compressed response), at the end of
    decoding.
  </summary>
</histogram>

<histogram name="Net.ZstdFilter.Status" enum="ZstdFilterDecodingStatus"
    expires_after="2026-06-25">
  <owner>nidhijaju@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The final state of the ZstdFilter. Recorded once per layer of Zstd
    compression (usually once per zstd-compressed response), at the end of
    decoding.

    Warning: this histogram was expired from 2025-05-05 to 2025-06-25; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Net.{ProtocolType}.GoogleSearch.SessionCreationInitiator{Used}"
    enum="MultiplexedSessionCreationInitiator" expires_after="2027-08-30">
  <owner>suzukikeita@chromium.org</owner>
  <owner>blink-network-stack@google.com</owner>
  <summary>
    The session creation initiator for a {ProtocolType} to GoogleSearch. This is
    recorded for each session with at least one stream created, when closing the
    session to GoogleSearch, and when {Used}.
  </summary>
  <token key="ProtocolType">
    <variant name="QuicSession"/>
    <variant name="SpdySession"/>
  </token>
  <token key="Used">
    <variant name=".Unused" summary="session was unused"/>
    <variant name=".Used" summary="session was used"/>
  </token>
</histogram>

<histogram name="SimpleCache.FileDescriptorLimiterAction"
    enum="SimpleCache.FileDescriptorLimiterOp" expires_after="2026-01-13">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    This even is emitted when SimpleCache is forced to either close some files
    due to being over FD limit, or reopen files it had to close due to such
    limit earlier.

    Warning: this histogram was expired from 2022-11-13 to 2025-10-17; data may
    be missing.
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}CacheSizeOnInit2" units="MB"
    expires_after="2027-02-14">
  <owner>jkarlin@chromium.org</owner>
  <owner>shivanisha@chromium.org</owner>
  <summary>
    The size of the cache at the time that the index has finished initializing.
    This is the disk space actually used. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}ConsistencyResult2"
    enum="SimpleCacheConsistencyResult" expires_after="2027-02-14">
  <owner>wanderview@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <owner>yoichio@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Record the outcome of the simple DiskCache consistency check. The
    consistency check is executed every time a simple DiskCache is initialized.
    This check includes both inspecting the schema on disk and upgrading the
    schema to the latest version if necessary. {CacheInstance}
  </summary>
</histogram>

<histogram
    name="SimpleCache.{CacheInstance}ConsistencyResultAfterIndexFilesDeleted"
    enum="SimpleCacheConsistencyResult" expires_after="2027-02-07">
  <owner>wanderview@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <summary>
    Record the final consistency check value after index files have been deleted
    from an empty simple DiskCache. This histogram will tell us how often the
    index deletion code results in a functioning cache. It will also tell us
    what kind of consistency failures cannot be recovered due to index file
    deletion. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}CreationToIndex" units="ms"
    expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time from the creation of the simple cache backend until the index has
    been loaded from disk. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}CreationToIndexFail" units="ms"
    expires_after="2026-03-08">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time from the creation of the simple cache backend until the index fails
    to load. {CacheInstance}
  </summary>
</histogram>

<histogram
    name="SimpleCache.{CacheInstance}DidDeleteIndexFilesAfterFailedConsistency"
    enum="Boolean" expires_after="2026-01-13">
  <owner>wanderview@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <summary>
    Record if any simple DiskCache index files were deleted from an otherwise
    empty cache after the cache failed the initialization consistency check.
    This histogram will tell us how often the deletion code is triggering and
    modifying the disk. {CacheInstance}

    Warning: this histogram was expired from 2023-12-08 to 2025-10-17; data may
    be missing.
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}DiskCloseLatency" units="ms"
    expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time to close (write out footers and close the file) the cache entry on
    disk. Includes only successful operations. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}DiskCreateLatency" units="ms"
    expires_after="2026-03-08">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time to access (open for creation and write initial headers) the cache
    entry on disk. Includes only successful operations. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}DiskDoomLatency" units="ms"
    expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time to remove the cache entry on disk. Includes only individually
    doomed entries, not entries bulk-erased during eviction. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}DiskOpenLatency" units="ms"
    expires_after="2027-02-14">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time to access (open and read headers from all files) the cache entry on
    disk. Includes only successful operations. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}DiskWriteLatency" units="ms"
    expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time to write a chunk to the cache entry on disk. Includes only
    successful operations. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}EntryCreationTime" units="ms"
    expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The time, in ms, spent creating a new entry on disk. This measures time from
    when the method got removed from SimpleEntryImpl's operation queue till when
    the callback is about to be invoked, and includes all Open and Create
    operations, despite what the name may suggest. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}Eviction.EntryCount" units="units"
    expires_after="2027-02-14">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The number of entries to be erased in an eviction. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}Eviction.TimeToDone" units="ms"
    expires_after="2027-02-14">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>Time spent completing an eviction. {CacheInstance}</summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}Eviction.TimeToSelectEntries"
    units="ms" expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>Time spent selecting entries for eviction. {CacheInstance}</summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}HeaderSize" units="bytes"
    expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The size of the header stream of a Simple Cache entry, emitted every time
    the headers are written or rewritten. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}IndexCreatedEntryCount"
    units="units" expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The number of entries in a newly created index file. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}IndexFileStateOnLoad"
    enum="SimpleIndexState" expires_after="2027-02-14">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The state the index file is at when an attempt is made to load from it.
    {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}IndexInitializeMethod"
    enum="SimpleCacheIndexInitializeMethod" expires_after="2027-01-31">
  <owner>wanderview@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <summary>
    The method used to initialize the simple cache index. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}IndexNumEntriesOnInit2"
    units="entries" expires_after="2027-02-14">
  <owner>jkarlin@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <summary>
    The number of entries in the index at the time that the index has finished
    initializing. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}IndexRestoreTime" units="ms"
    expires_after="2027-01-03">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    Time (as measured on the worker pool) spent restoring the index file by
    iterating directory entries. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}IndexWriteResult"
    enum="SimpleCacheIndexWriteResult" expires_after="2027-02-14">
  <owner>yoichio@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The result of writing the index file to disk. Recorded each time the index
    is written to disk. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}MaxCacheSizeOnInit2" units="MB"
    expires_after="2027-02-14">
  <owner>morlovich@chromium.org</owner>
  <owner>jkarlin@chromium.org</owner>
  <summary>The size limit computed for the cache. {CacheInstance}</summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}OpenEntryIndexState"
    enum="SimpleCacheOpenEntryIndexState" expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    At the time that an entry is opened, the state of that entry in the index.
    {CacheInstance}
  </summary>
</histogram>

<histogram
    name="SimpleCache.{CacheInstance}OriginalConsistencyResultBeforeSuccessfulRetry"
    enum="SimpleCacheConsistencyResult" expires_after="2027-02-07">
  <owner>wanderview@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <summary>
    Record the original consistency error produced by a simple DiskCache before
    a retry was attempted and succeeded. This histogram will tell us what kind
    consistency errors can be recovered from in practice. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}RetryConsistencyResult"
    enum="SimpleCacheConsistencyResult" expires_after="2027-02-07">
  <owner>wanderview@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <summary>
    Record the outcome of the simple DiskCache consistency check after retrying
    initialization on an empty cache directory. The retry may occur after
    corrupt index files were deleted from an empty cache. The retry may also
    occur if the original failed initialization left an empty directory without
    any index files. This histogram will tell us how often the retry succeeds in
    recovering caches and also which consistency checks cannot be recovered.
    {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}StaleIndexExtraEntryCount"
    units="entries" expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    Count of the number of entries recorded in the index, but not actually
    present in the cache. Recorded each time a stale index is found and a
    directory rescan is required. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}StaleIndexMissedEntryCount"
    units="entries" expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    Count of the number of entries present in a cache, but not recorded in the
    index. Recorded each time a stale index is found and a directory rescan is
    required. {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}StaleIndexQuality"
    enum="SimpleCacheStaleIndexQuality" expires_after="2027-02-07">
  <owner>morlovich@chromium.org</owner>
  <owner>wanderview@chromium.org</owner>
  <summary>
    The quality of a &quot;stale&quot; index compared to a full directory
    rescan. Recorded immediately after every directory scan for stale indexes.
    {CacheInstance}
  </summary>
</histogram>

<histogram name="SimpleCache.{CacheInstance}SyncOpenPrefetchMode"
    enum="SimpleCachePrefetchMode" expires_after="2027-02-07">
  <owner>ashleynewson@chromium.org</owner>
  <owner>morlovich@chromium.org</owner>
  <summary>
    The kind of prefetching performed, if any, when executing
    SimpleSynchronousEntry::ReadAndValidateStream0AndMaybe1(). {CacheInstance}

    Warning: this histogram was expired from 2023-12-10 to 2025-10-17 and
    2026-01-13 to 2026-07-07; data may be missing.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
