diff --git a/src/net_processing.h b/src/net_processing.h
--- a/src/net_processing.h
+++ b/src/net_processing.h
@@ -43,6 +43,8 @@
     int m_starting_height = -1;
     std::chrono::microseconds m_ping_wait;
     std::vector<int> vHeightInFlight;
+    uint64_t m_addr_processed = 0;
+    uint64_t m_addr_rate_limited = 0;
 };
 
 class PeerManager : public CValidationInterface, public NetEventsInterface {
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -409,6 +409,13 @@
     /** When m_addr_token_bucket was last updated */
     std::chrono::microseconds m_addr_token_timestamp{
         GetTime<std::chrono::microseconds>()};
+    /** Total number of addresses that were dropped due to rate limiting. */
+    std::atomic<uint64_t> m_addr_rate_limited{0};
+    /**
+     * Total number of addresses that were processed (excludes rate limited
+     * ones).
+     */
+    std::atomic<uint64_t> m_addr_processed{0};
 
     /**
      * Set of txids to reconsider once their parent transactions have been
@@ -1623,6 +1630,8 @@
     }
 
     stats.m_ping_wait = ping_wait;
+    stats.m_addr_processed = peer->m_addr_processed.load();
+    stats.m_addr_rate_limited = peer->m_addr_rate_limited.load();
 
     return true;
 }
@@ -3688,6 +3697,8 @@
 
         const bool rate_limited =
             !pfrom.HasPermission(NetPermissionFlags::PF_ADDR);
+        uint64_t num_proc = 0;
+        uint64_t num_rate_limit = 0;
         Shuffle(vAddr.begin(), vAddr.end(), FastRandomContext());
         for (CAddress &addr : vAddr) {
             if (interruptMsgProc) {
@@ -3697,7 +3708,8 @@
             // Apply rate limiting.
             if (rate_limited) {
                 if (peer->m_addr_token_bucket < 1.0) {
-                    break;
+                    ++num_rate_limit;
+                    continue;
                 }
                 peer->m_addr_token_bucket -= 1.0;
             }
@@ -3720,6 +3732,7 @@
                 // remembering we received them
                 continue;
             }
+            ++num_proc;
             bool fReachable = IsReachable(addr);
             if (addr.nTime > nSince && !peer->m_getaddr_sent &&
                 vAddr.size() <= 10 && addr.IsRoutable()) {
@@ -3731,6 +3744,13 @@
                 vAddrOk.push_back(addr);
             }
         }
+        peer->m_addr_processed += num_proc;
+        peer->m_addr_rate_limited += num_rate_limit;
+        LogPrint(BCLog::NET,
+                 "Received addr: %u addresses (%u processed, %u rate-limited) "
+                 "from peer=%d%s\n",
+                 vAddr.size(), num_proc, num_rate_limit, pfrom.GetId(),
+                 fLogIPs ? ", peeraddr=" + pfrom.addr.ToString() : "");
 
         m_connman.AddNewAddresses(vAddrOk, pfrom.addr, 2 * 60 * 60);
         if (vAddr.size() < 1000) {
diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp
--- a/src/rpc/net.cpp
+++ b/src/rpc/net.cpp
@@ -281,6 +281,9 @@
                         heights.push_back(height);
                     }
                     obj.pushKV("inflight", heights);
+                    obj.pushKV("addr_processed", statestats.m_addr_processed);
+                    obj.pushKV("addr_rate_limited",
+                               statestats.m_addr_rate_limited);
                 }
                 if (IsDeprecatedRPCEnabled(gArgs, "whitelisted")) {
                     // whitelisted is deprecated in v0.24.7 for removal in v0.25