]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/statbag.cc
Merge pull request #9099 from PowerDNS/omoerbeek-patch-1
[thirdparty/pdns.git] / pdns / statbag.cc
index 35242e79aa86ed7215c85b79e46b0064655ce099..9d89d15b774294904e8450527ac8a99bb35bb916 100644 (file)
@@ -184,12 +184,19 @@ void StatRing<T,Comp>::account(const T& t)
 }
 
 template<typename T, typename Comp>
-unsigned int StatRing<T,Comp>::getSize()
+uint64_t StatRing<T,Comp>::getSize() const
 {
   std::lock_guard<std::mutex> l(d_lock);
   return d_items.capacity();
 }
 
+template<typename T, typename Comp>
+uint64_t StatRing<T,Comp>::getEntriesCount() const
+{
+  std::lock_guard<std::mutex> l(d_lock);
+  return d_items.size();
+}
+
 template<typename T, typename Comp>
 void StatRing<T,Comp>::resize(unsigned int newsize)
 {
@@ -197,7 +204,6 @@ void StatRing<T,Comp>::resize(unsigned int newsize)
   d_items.set_capacity(newsize);
 }
 
-
 template<typename T, typename Comp>
 void StatRing<T,Comp>::setHelp(const string &str)
 {
@@ -229,25 +235,33 @@ vector<pair<T, unsigned int> >StatRing<T,Comp>::get() const
   return tmp;
 }
 
+void StatBag::registerRingStats(const string& name)
+{
+  declare("ring-" + name + "-size", "Number of entries in the " + name + " ring", [this,name](const std::string&) { return static_cast<uint64_t>(getRingEntriesCount(name)); });
+  declare("ring-" + name + "-capacity", "Maximum number of entries in the " + name + " ring", [this,name](const std::string&) { return static_cast<uint64_t>(getRingSize(name)); });
+}
+
 void StatBag::declareRing(const string &name, const string &help, unsigned int size)
 {
   d_rings.emplace(name, size);
   d_rings[name].setHelp(help);
+  registerRingStats(name);
 }
 
 void StatBag::declareComboRing(const string &name, const string &help, unsigned int size)
 {
-  d_comborings.emplace(name, size);
-  d_comborings[name].setHelp(help);
+  d_comboRings.emplace(name, size);
+  d_comboRings[name].setHelp(help);
+  registerRingStats(name);
 }
 
 void StatBag::declareDNSNameQTypeRing(const string &name, const string &help, unsigned int size)
 {
   d_dnsnameqtyperings.emplace(name, size);
   d_dnsnameqtyperings[name].setHelp(help);
+  registerRingStats(name);
 }
 
-
 vector<pair<string, unsigned int> > StatBag::getRing(const string &name)
 {
   if(d_rings.count(name)) {
@@ -255,9 +269,9 @@ vector<pair<string, unsigned int> > StatBag::getRing(const string &name)
   }
   vector<pair<string, unsigned int> > ret;
 
-  if (d_comborings.count(name)) {
+  if (d_comboRings.count(name)) {
     typedef pair<SComboAddress, unsigned int> stor_t;
-    vector<stor_t> raw =d_comborings[name].get();
+    vector<stor_t> raw =d_comboRings[name].get();
     for(const stor_t& stor :  raw) {
       ret.push_back(make_pair(stor.first.ca.toString(), stor.second));
     }
@@ -281,8 +295,8 @@ void StatBag::resetRing(const string &name)
 {
   if(d_rings.count(name))
     d_rings[name].reset();
-  if(d_comborings.count(name))
-    d_comborings[name].reset();
+  if(d_comboRings.count(name))
+    d_comboRings[name].reset();
   if(d_dnsnameqtyperings.count(name))
     d_dnsnameqtyperings[name].reset();
 }
@@ -291,30 +305,41 @@ void StatBag::resizeRing(const string &name, unsigned int newsize)
 {
   if(d_rings.count(name))
     d_rings[name].resize(newsize);
-  if(d_comborings.count(name))
-    d_comborings[name].resize(newsize);
+  if(d_comboRings.count(name))
+    d_comboRings[name].resize(newsize);
   if(d_dnsnameqtyperings.count(name))
     return d_dnsnameqtyperings[name].resize(newsize);
 }
 
 
-unsigned int StatBag::getRingSize(const string &name)
+uint64_t StatBag::getRingSize(const string &name)
 {
   if(d_rings.count(name))
     return d_rings[name].getSize();
-  if(d_comborings.count(name))
-    return d_comborings[name].getSize();
+  if(d_comboRings.count(name))
+    return d_comboRings[name].getSize();
   if(d_dnsnameqtyperings.count(name))
     return d_dnsnameqtyperings[name].getSize();
   return 0;
 }
 
+uint64_t StatBag::getRingEntriesCount(const string &name)
+{
+  if(d_rings.count(name))
+    return d_rings[name].getEntriesCount();
+  if(d_comboRings.count(name))
+    return d_comboRings[name].getEntriesCount();
+  if(d_dnsnameqtyperings.count(name))
+    return d_dnsnameqtyperings[name].getEntriesCount();
+  return 0;
+}
+
 string StatBag::getRingTitle(const string &name)
 {
   if(d_rings.count(name))
     return d_rings[name].getHelp();
-  if(d_comborings.count(name))
-    return d_comborings[name].getHelp();
+  if(d_comboRings.count(name))
+    return d_comboRings[name].getHelp();
   if(d_dnsnameqtyperings.count(name))
     return d_dnsnameqtyperings[name].getHelp();
   return "";
@@ -325,7 +350,7 @@ vector<string>StatBag::listRings()
   vector<string> ret;
   for(auto i=d_rings.begin();i!=d_rings.end();++i)
     ret.push_back(i->first);
-  for(auto i=d_comborings.begin();i!=d_comborings.end();++i)
+  for(auto i=d_comboRings.begin();i!=d_comboRings.end();++i)
     ret.push_back(i->first);
   for(const auto &i : d_dnsnameqtyperings)
     ret.push_back(i.first);
@@ -335,7 +360,7 @@ vector<string>StatBag::listRings()
 
 bool StatBag::ringExists(const string &name)
 {
-  return d_rings.count(name) || d_comborings.count(name) || d_dnsnameqtyperings.count(name);
+  return d_rings.count(name) || d_comboRings.count(name) || d_dnsnameqtyperings.count(name);
 }
 
 void StatBag::blacklist(const string& str) {