]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Add metrics about the size of our in-memory rings
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 8 Jan 2020 15:54:08 +0000 (16:54 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 8 Jan 2020 15:54:08 +0000 (16:54 +0100)
pdns/statbag.cc
pdns/statbag.hh

index 35242e79aa86ed7215c85b79e46b0064655ce099..6aad23b1d2fdf951a07780d6fb8b7235d223eeee 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);
+  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)) {
@@ -298,7 +312,7 @@ void StatBag::resizeRing(const string &name, unsigned int 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();
@@ -309,6 +323,17 @@ unsigned int StatBag::getRingSize(const string &name)
   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))
index 1ac49f53fe2d738b29b27faa53ca9f3c3199cbe5..4d8bd3a308be73a0648935b9cb5775ffd01143fe 100644 (file)
@@ -45,7 +45,8 @@ public:
   
   void account(const T &item);
 
-  unsigned int getSize();
+  uint64_t getSize() const;
+  uint64_t getEntriesCount() const;
   void resize(unsigned int newsize);  
   void reset();
   void setHelp(const string &str);
@@ -78,6 +79,8 @@ class StatBag
   bool d_doRings;
   std::set<string> d_blacklist;
 
+  void registerRingStats(const string& name);
+
 public:
   StatBag(); //!< Naked constructor. You need to declare keys before this class becomes useful
   ~StatBag();
@@ -124,7 +127,8 @@ public:
   bool ringExists(const string &name);
   void resetRing(const string &name);
   void resizeRing(const string &name, unsigned int newsize);
-  unsigned int getRingSize(const string &name);
+  uint64_t getRingSize(const string &name);
+  uint64_t getRingEntriesCount(const string &name);
 
   string directory(); //!< Returns a list of all data stored
   vector<string> getEntries(); //!< returns a vector with datums (items)