From: Andrei Pavel Date: Fri, 28 Apr 2023 12:11:16 +0000 (+0300) Subject: [#2797] add lease reuse statistics X-Git-Tag: Kea-2.3.8~194 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df49587577a14fef50ec5ea0c113e9f98a039687;p=thirdparty%2Fkea.git [#2797] add lease reuse statistics 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. --- diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 8a63102ff9..66659fa2c9 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -136,7 +136,8 @@ std::set 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) diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index cdcdcd9c23..4675a0ba09 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -201,7 +201,9 @@ std::set 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((*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((*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, diff --git a/src/lib/dhcpsrv/cfg_subnets4.cc b/src/lib/dhcpsrv/cfg_subnets4.cc index 9d017426e3..381b4d4404 100644 --- a/src/lib/dhcpsrv/cfg_subnets4.cc +++ b/src/lib/dhcpsrv/cfg_subnets4.cc @@ -561,6 +561,11 @@ CfgSubnets4::updateStatistics() { stats_mgr.setValue(name, static_cast(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(0)); diff --git a/src/lib/dhcpsrv/cfg_subnets6.cc b/src/lib/dhcpsrv/cfg_subnets6.cc index 9632d2f88c..45b42fd99f 100644 --- a/src/lib/dhcpsrv/cfg_subnets6.cc +++ b/src/lib/dhcpsrv/cfg_subnets6.cc @@ -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(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.