Bug 1693738 - Extend HTTP3_CONNECTION_CLOSE_CODE telemetry and add more detail codes for the internal errors r=necko-reviewers,valentin

Differential Revision: https://phabricator.services.mozilla.com/D105725
This commit is contained in:
Dragana Damjanovic 2021-02-19 20:37:24 +00:00
parent c3fd525400
commit 66692fa536
3 changed files with 64 additions and 20 deletions

View File

@ -1134,7 +1134,7 @@ void Http3Session::Close(nsresult aReason) {
mError = aReason;
// If necko closes connection, this will map to the "closing" key and the
// value HTTP3_TELEMETRY_APP_NECKO.
Telemetry::Accumulate(Telemetry::HTTP3_CONNECTION_CLOSE_CODE,
Telemetry::Accumulate(Telemetry::HTTP3_CONNECTION_CLOSE_CODE_2,
"app_closing"_ns, HTTP3_TELEMETRY_APP_NECKO);
CloseInternal(true);
}
@ -1683,6 +1683,10 @@ void Http3Session::CloseConnectionTelemetry(CloseError& aError, bool aClosing) {
key = "transport_internal"_ns;
value = aError.transport_internal_error._0;
break;
case CloseError::Tag::TransportInternalErrorOther:
key = "transport_other"_ns;
value = aError.transport_internal_error_other._0;
break;
case CloseError::Tag::TransportError:
key = "transport"_ns;
value = GetTransportErrorCodeForTelemetry(aError.transport_error._0);
@ -1711,7 +1715,7 @@ void Http3Session::CloseConnectionTelemetry(CloseError& aError, bool aClosing) {
key.Append(aClosing ? "_closing"_ns : "_closed"_ns);
Telemetry::Accumulate(Telemetry::HTTP3_CONNECTION_CLOSE_CODE, key, value);
Telemetry::Accumulate(Telemetry::HTTP3_CONNECTION_CLOSE_CODE_2, key, value);
Http3Stats stats;
mHttp3Connection->GetStats(&stats);

View File

@ -418,6 +418,7 @@ fn crypto_error_code(err: neqo_crypto::Error) -> u64 {
#[repr(C)]
pub enum CloseError {
TransportInternalError(u16),
TransportInternalErrorOther(u16),
TransportError(u64),
CryptoError(u64),
CryptoAlert(u8),
@ -426,25 +427,64 @@ pub enum CloseError {
AppError(u64),
}
impl From<TransportError> for CloseError {
fn from(error: TransportError) -> CloseError {
match error {
TransportError::InternalError(c) => CloseError::TransportInternalError(c),
TransportError::CryptoError(c) => CloseError::CryptoError(crypto_error_code(c)),
TransportError::CryptoAlert(c) => CloseError::CryptoAlert(c),
TransportError::PeerApplicationError(c) => CloseError::PeerAppError(c),
TransportError::PeerError(c) => CloseError::PeerError(c),
TransportError::NoError
| TransportError::IdleTimeout
| TransportError::ConnectionRefused
| TransportError::FlowControlError
| TransportError::StreamLimitError
| TransportError::StreamStateError
| TransportError::FinalSizeError
| TransportError::FrameEncodingError
| TransportError::TransportParameterError
| TransportError::ProtocolViolation
| TransportError::InvalidToken
| TransportError::KeysExhausted
| TransportError::ApplicationError
| TransportError::NoAvailablePath => CloseError::TransportError(error.code()),
TransportError::AckedUnsentPacket => CloseError::TransportInternalErrorOther(0),
TransportError::ConnectionIdLimitExceeded => CloseError::TransportInternalErrorOther(1),
TransportError::ConnectionIdsExhausted => CloseError::TransportInternalErrorOther(2),
TransportError::ConnectionState => CloseError::TransportInternalErrorOther(3),
TransportError::DecodingFrame => CloseError::TransportInternalErrorOther(4),
TransportError::DecryptError => CloseError::TransportInternalErrorOther(5),
TransportError::HandshakeFailed => CloseError::TransportInternalErrorOther(6),
TransportError::IntegerOverflow => CloseError::TransportInternalErrorOther(7),
TransportError::InvalidInput => CloseError::TransportInternalErrorOther(8),
TransportError::InvalidMigration => CloseError::TransportInternalErrorOther(9),
TransportError::InvalidPacket => CloseError::TransportInternalErrorOther(10),
TransportError::InvalidResumptionToken => CloseError::TransportInternalErrorOther(11),
TransportError::InvalidRetry => CloseError::TransportInternalErrorOther(12),
TransportError::InvalidStreamId => CloseError::TransportInternalErrorOther(13),
TransportError::KeysDiscarded => CloseError::TransportInternalErrorOther(14),
TransportError::KeysPending(_) => CloseError::TransportInternalErrorOther(15),
TransportError::KeyUpdateBlocked => CloseError::TransportInternalErrorOther(16),
TransportError::NoMoreData => CloseError::TransportInternalErrorOther(17),
TransportError::NotConnected => CloseError::TransportInternalErrorOther(18),
TransportError::PacketNumberOverlap => CloseError::TransportInternalErrorOther(19),
TransportError::StatelessReset => CloseError::TransportInternalErrorOther(20),
TransportError::TooMuchData => CloseError::TransportInternalErrorOther(21),
TransportError::UnexpectedMessage => CloseError::TransportInternalErrorOther(22),
TransportError::UnknownConnectionId => CloseError::TransportInternalErrorOther(23),
TransportError::UnknownFrameType => CloseError::TransportInternalErrorOther(24),
TransportError::VersionNegotiation => CloseError::TransportInternalErrorOther(25),
TransportError::WrongRole => CloseError::TransportInternalErrorOther(26),
TransportError::QlogError => CloseError::TransportInternalErrorOther(27),
}
}
}
impl From<neqo_transport::ConnectionError> for CloseError {
fn from(error: neqo_transport::ConnectionError) -> CloseError {
match error {
neqo_transport::ConnectionError::Transport(TransportError::InternalError(c)) => {
CloseError::TransportInternalError(c)
}
neqo_transport::ConnectionError::Transport(TransportError::CryptoError(c)) => {
CloseError::CryptoError(crypto_error_code(c))
}
neqo_transport::ConnectionError::Transport(TransportError::CryptoAlert(c)) => {
CloseError::CryptoAlert(c)
}
neqo_transport::ConnectionError::Transport(TransportError::PeerApplicationError(c)) => {
CloseError::PeerAppError(c)
}
neqo_transport::ConnectionError::Transport(TransportError::PeerError(c)) => {
CloseError::PeerError(c)
}
neqo_transport::ConnectionError::Transport(c) => CloseError::TransportError(c.code()),
neqo_transport::ConnectionError::Transport(c) => c.into(),
neqo_transport::ConnectionError::Application(c) => CloseError::AppError(c),
}
}

View File

@ -3395,11 +3395,11 @@
"n_values": 3,
"description": "Does a response has a h3(1), other quic(2) or non(0) alt-protocol advertisement."
},
"HTTP3_CONNECTION_CLOSE_CODE": {
"HTTP3_CONNECTION_CLOSE_CODE_2": {
"record_in_processes": ["main", "content"],
"products": ["firefox"],
"alert_emails": ["necko@mozilla.com", "ddamjanovic@mozilla.com"],
"bug_numbers": [1605099, 1688091],
"bug_numbers": [1605099, 1688091, 1693738],
"expires_in_version": "never",
"releaseChannelCollection": "opt-out",
"kind": "enumerated",