]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2797] add lease reuse statistics
authorAndrei Pavel <andrei@isc.org>
Fri, 28 Apr 2023 12:11:16 +0000 (15:11 +0300)
committerAndrei Pavel <andrei@isc.org>
Wed, 3 May 2023 19:26:09 +0000 (22:26 +0300)
v4 reuses leases both on fake allocation and on real allocation, while
v6 only reuses leases on real allocation. This is a discrepancy that is
also exposed in the statistics, and may seem confusing. However, this
seems like the candidate for a new issue.

src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp6/dhcp6_srv.cc
src/lib/dhcpsrv/cfg_subnets4.cc
src/lib/dhcpsrv/cfg_subnets6.cc

index 8a63102ff95ddbb7f9e1ae840b3d9141755db07e..66659fa2c959900350017e2e5d7e952afe0ea906 100644 (file)
@@ -136,7 +136,8 @@ std::set<std::string> dhcp4_statistics = {
     "v4-allocation-fail-subnet",
     "v4-allocation-fail-no-pools",
     "v4-allocation-fail-classes",
-    "v4-reservation-conflicts"
+    "v4-reservation-conflicts",
+    "v4-lease-reuses",
 };
 
 } // end of anonymous namespace
@@ -2852,6 +2853,12 @@ Dhcpv4Srv::assignLease(Dhcpv4Exchange& ex) {
                 .arg(query->getLabel())
                 .arg(lease->addr_.toText())
                 .arg(Lease::lifetimeToText(lease->valid_lft_));
+
+            // Increment the reuse statistics.
+            StatsMgr::instance().addValue("v4-lease-reuses", int64_t(1));
+            StatsMgr::instance().addValue(StatsMgr::generateName("subnet", lease->subnet_id_,
+                                                                 "v4-lease-reuses"),
+                                          int64_t(1));
         }
 
         // IP Address Lease time (type 51)
index cdcdcd9c2343a7ccdafd0a7b923fd9decb9f48fa..4675a0ba0933fbb0b1c130e06e4c4f15d10b1b12 100644 (file)
@@ -201,7 +201,9 @@ std::set<std::string> dhcp6_statistics = {
     "v6-allocation-fail-shared-network",
     "v6-allocation-fail-subnet",
     "v6-allocation-fail-no-pools",
-    "v6-allocation-fail-classes"
+    "v6-allocation-fail-classes",
+    "v6-ia-na-lease-reuses",
+    "v6-ia-pd-lease-reuses",
 };
 
 }  // namespace
@@ -2407,6 +2409,12 @@ Dhcpv6Srv::assignIA_NA(const Pkt6Ptr& query,
                 .arg(lease->addr_.toText())
                 .arg(ia->getIAID())
                 .arg(Lease::lifetimeToText(lease->valid_lft_));
+
+            // Increment the reuse statistics.
+            StatsMgr::instance().addValue("v6-ia-na-lease-reuses", int64_t(1));
+            StatsMgr::instance().addValue(StatsMgr::generateName("subnet", lease->subnet_id_,
+                                                                 "v6-ia-na-lease-reuses"),
+                                          int64_t(1));
         }
         LOG_DEBUG(lease6_logger, DBG_DHCP6_DETAIL_DATA, DHCP6_LEASE_DATA)
             .arg(query->getLabel())
@@ -2533,6 +2541,12 @@ Dhcpv6Srv::assignIA_PD(const Pkt6Ptr& query,
                     .arg(static_cast<int>((*l)->prefixlen_))
                     .arg(ia->getIAID())
                     .arg(Lease::lifetimeToText((*l)->valid_lft_));
+
+                // Increment the reuse statistics.
+                StatsMgr::instance().addValue("v6-ia-pd-lease-reuses", int64_t(1));
+                StatsMgr::instance().addValue(StatsMgr::generateName("subnet", (*l)->subnet_id_,
+                                                                    "v6-ia-pd-lease-reuses"),
+                                            int64_t(1));
             }
 
             // Check for new minimum lease time
@@ -2672,6 +2686,12 @@ Dhcpv6Srv::extendIA_NA(const Pkt6Ptr& query,
                 .arg((*l)->addr_.toText())
                 .arg(ia->getIAID())
                 .arg(Lease::lifetimeToText((*l)->valid_lft_));
+
+            // Increment the reuse statistics.
+            StatsMgr::instance().addValue("v6-ia-na-lease-reuses", int64_t(1));
+            StatsMgr::instance().addValue(StatsMgr::generateName("subnet", (*l)->subnet_id_,
+                                                                 "v6-ia-na-lease-reuses"),
+                                          int64_t(1));
         }
 
         Option6IAAddrPtr iaaddr(new Option6IAAddr(D6O_IAADDR,
@@ -2862,6 +2882,12 @@ Dhcpv6Srv::extendIA_PD(const Pkt6Ptr& query,
                 .arg(static_cast<int>((*l)->prefixlen_))
                 .arg(ia->getIAID())
                 .arg(Lease::lifetimeToText((*l)->valid_lft_));
+
+            // Increment the reuse statistics.
+            StatsMgr::instance().addValue("v6-ia-pd-lease-reuses", int64_t(1));
+            StatsMgr::instance().addValue(StatsMgr::generateName("subnet", (*l)->subnet_id_,
+                                                                 "v6-ia-pd-lease-reuses"),
+                                          int64_t(1));
         }
 
         Option6IAPrefixPtr prf(new Option6IAPrefix(D6O_IAPREFIX,
index 9d017426e34ae01a69684ec60e6f0d550dcfab60..381b4d44042cd6d7ee072398293cfe588bea7aa3 100644 (file)
@@ -561,6 +561,11 @@ CfgSubnets4::updateStatistics() {
             stats_mgr.setValue(name, static_cast<int64_t>(0));
         }
 
+        name = StatsMgr::generateName("subnet", subnet_id, "v4-lease-reuses");
+        if (!stats_mgr.getObservation(name)) {
+            stats_mgr.setValue(name, int64_t(0));
+        }
+
         name = StatsMgr::generateName("subnet", subnet_id, "v4-reservation-conflicts");
         if (!stats_mgr.getObservation(name)) {
             stats_mgr.setValue(name, static_cast<int64_t>(0));
index 9632d2f88caf91630862bcae818112dab8cb5349..45b42fd99f94bcc8ed81e478cfdcbf314ad7779f 100644 (file)
@@ -20,6 +20,8 @@
 using namespace isc::asiolink;
 using namespace isc::data;
 
+using namespace std;
+
 namespace isc {
 namespace dhcp {
 
@@ -467,6 +469,18 @@ CfgSubnets6::updateStatistics() {
         if (!stats_mgr.getObservation(name_pds)) {
             stats_mgr.setValue(name_pds, static_cast<int64_t>(0));
         }
+
+        string const& name_ia_na_reuses(
+            StatsMgr::generateName("subnet", subnet_id, "v6-ia-na-lease-reuses"));
+        if (!stats_mgr.getObservation(name_ia_na_reuses)) {
+            stats_mgr.setValue(name_ia_na_reuses, int64_t(0));
+        }
+
+        string const& name_ia_pd_reuses(
+            StatsMgr::generateName("subnet", subnet_id, "v6-ia-pd-lease-reuses"));
+        if (!stats_mgr.getObservation(name_ia_pd_reuses)) {
+            stats_mgr.setValue(name_ia_pd_reuses, int64_t(0));
+        }
     }
 
     // Only recount the stats if we have subnets.