Add stats on QuicConnection path degrading and recovering.

To merge: please use num_path_degrading stats from the connection instead of from multi_port_stats.

PiperOrigin-RevId: 526808051
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc
index 10f830d..4a60d9a 100644
--- a/quiche/quic/core/quic_connection.cc
+++ b/quiche/quic/core/quic_connection.cc
@@ -6147,6 +6147,7 @@
   }
   if (is_path_degrading_) {
     visitor_->OnForwardProgressMadeAfterPathDegrading();
+    stats_.num_forward_progress_after_path_degrading++;
     is_path_degrading_ = false;
   }
   if (sent_packet_manager_.HasInFlightPackets()) {
@@ -6290,8 +6291,8 @@
 void QuicConnection::OnPathDegradingDetected() {
   is_path_degrading_ = true;
   visitor_->OnPathDegrading();
+  stats_.num_path_degrading++;
   if (multi_port_stats_) {
-    multi_port_stats_->num_path_degrading++;
     MaybeMigrateToMultiPortPath();
   }
 }
diff --git a/quiche/quic/core/quic_connection.h b/quiche/quic/core/quic_connection.h
index eadad65..ad73e98 100644
--- a/quiche/quic/core/quic_connection.h
+++ b/quiche/quic/core/quic_connection.h
@@ -492,8 +492,6 @@
     RttStats rtt_stats;
     // rtt stats for the multi-port path when the default path is degrading.
     RttStats rtt_stats_when_default_path_degrading;
-    // number of path degrading triggered when multi-port is enabled.
-    size_t num_path_degrading = 0;
     // number of multi-port probe failures when path is not degrading
     size_t num_multi_port_probe_failures_when_path_not_degrading = 0;
     // number of multi-port probe failure when path is degrading
diff --git a/quiche/quic/core/quic_connection_stats.h b/quiche/quic/core/quic_connection_stats.h
index 336435e..1088e81 100644
--- a/quiche/quic/core/quic_connection_stats.h
+++ b/quiche/quic/core/quic_connection_stats.h
@@ -225,6 +225,10 @@
   size_t num_new_connection_id_sent = 0;
   // Number of RETIRE_CONNECTION_ID frames sent.
   size_t num_retire_connection_id_sent = 0;
+  // Number of path degrading.
+  size_t num_path_degrading = 0;
+  // Number of forward progress made after path degrading.
+  size_t num_forward_progress_after_path_degrading = 0;
 
   bool server_preferred_address_validated = false;
   bool failed_to_validate_server_preferred_address = false;
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc
index a274129..0a6c01c 100644
--- a/quiche/quic/core/quic_connection_test.cc
+++ b/quiche/quic/core/quic_connection_test.cc
@@ -7937,6 +7937,8 @@
   EXPECT_CALL(visitor_, OnForwardProgressMadeAfterPathDegrading()).Times(1);
   frame = InitAckFrame({{QuicPacketNumber(2), QuicPacketNumber(3)}});
   ProcessAckPacket(&frame);
+  EXPECT_EQ(1,
+            connection_.GetStats().num_forward_progress_after_path_degrading);
   EXPECT_FALSE(connection_.IsPathDegrading());
   EXPECT_TRUE(connection_.PathDegradingDetectionInProgress());
 }
@@ -13393,7 +13395,7 @@
   EXPECT_TRUE(alt_path->validated);
 
   auto stats = connection_.multi_port_stats();
-  EXPECT_EQ(1, stats->num_path_degrading);
+  EXPECT_EQ(1, connection_.GetStats().num_path_degrading);
   EXPECT_EQ(0, stats->num_multi_port_probe_failures_when_path_degrading);
   EXPECT_EQ(kTestRTT, stats->rtt_stats.latest_rtt());
   EXPECT_EQ(kTestRTT,
@@ -13426,7 +13428,7 @@
   EXPECT_TRUE(QuicConnectionPeer::IsAlternativePath(
       &connection_, kNewSelfAddress, connection_.peer_address()));
   EXPECT_TRUE(alt_path->validated);
-  EXPECT_EQ(1, stats->num_path_degrading);
+  EXPECT_EQ(1, connection_.GetStats().num_path_degrading);
   EXPECT_EQ(0, stats->num_multi_port_probe_failures_when_path_degrading);
   EXPECT_EQ(kTestRTT, stats->rtt_stats.latest_rtt());
   EXPECT_EQ(kTestRTT,
@@ -13454,7 +13456,7 @@
   EXPECT_FALSE(connection_.HasPendingPathValidation());
   EXPECT_FALSE(QuicConnectionPeer::IsAlternativePath(
       &connection_, kNewSelfAddress, connection_.peer_address()));
-  EXPECT_EQ(1, stats->num_path_degrading);
+  EXPECT_EQ(1, connection_.GetStats().num_path_degrading);
   EXPECT_EQ(1, stats->num_multi_port_probe_failures_when_path_degrading);
   EXPECT_EQ(0, stats->num_multi_port_probe_failures_when_path_not_degrading);
 }
@@ -13518,7 +13520,7 @@
   EXPECT_FALSE(connection_.HasPendingPathValidation());
   EXPECT_FALSE(QuicConnectionPeer::IsAlternativePath(
       &connection_, kNewSelfAddress, connection_.peer_address()));
-  EXPECT_EQ(1, stats->num_path_degrading);
+  EXPECT_EQ(1, connection_.GetStats().num_path_degrading);
   EXPECT_EQ(1, stats->num_multi_port_probe_failures_when_path_degrading);
 
   uint64_t connection_id = 1235;
@@ -13551,7 +13553,7 @@
     EXPECT_FALSE(connection_.HasPendingPathValidation());
     EXPECT_FALSE(QuicConnectionPeer::IsAlternativePath(
         &connection_, kNewSelfAddress, connection_.peer_address()));
-    EXPECT_EQ(1, stats->num_path_degrading);
+    EXPECT_EQ(1, connection_.GetStats().num_path_degrading);
     EXPECT_EQ(i + 2, stats->num_multi_port_probe_failures_when_path_degrading);
   }