From: Pieter Lexis Date: Wed, 20 Feb 2019 12:25:51 +0000 (+0100) Subject: Add StatRings for DNSName, QType tuples X-Git-Tag: dnsdist-1.4.0-alpha1~46^2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f2b2f3ad3dd8b174d465e7c1f50c9e8309e2fd6c;p=thirdparty%2Fpdns.git Add StatRings for DNSName, QType tuples --- diff --git a/pdns/statbag.cc b/pdns/statbag.cc index adcd35f2ab..c4f46a5b1f 100644 --- a/pdns/statbag.cc +++ b/pdns/statbag.cc @@ -228,21 +228,33 @@ void StatBag::declareComboRing(const string &name, const string &help, unsigned d_comborings[name].setHelp(help); } +void StatBag::declareDNSNameQTypeRing(const string &name, const string &help, unsigned int size) +{ + d_dnsnameqtyperings[name] = StatRing >(size); + d_dnsnameqtyperings[name].setHelp(help); +} + vector > StatBag::getRing(const string &name) { - if(d_rings.count(name)) + if(d_rings.count(name)) { return d_rings[name].get(); - else { + } + vector > ret; + + if (d_comborings.count(name)) { typedef pair stor_t; vector raw =d_comborings[name].get(); - vector > ret; for(const stor_t& stor : raw) { ret.push_back(make_pair(stor.first.ca.toString(), stor.second)); } - return ret; + } else if(d_dnsnameqtyperings.count(name)) { + auto raw = d_dnsnameqtyperings[name].get(); + for (auto const &e : raw) { + ret.push_back(make_pair(std::get<0>(e.first).toLogString() + "/" + std::get<1>(e.first).getName(), e.second)); + } } - + return ret; } template @@ -256,16 +268,20 @@ void StatBag::resetRing(const string &name) { if(d_rings.count(name)) d_rings[name].reset(); - else + if(d_comborings.count(name)) d_comborings[name].reset(); + if(d_dnsnameqtyperings.count(name)) + d_dnsnameqtyperings[name].reset(); } void StatBag::resizeRing(const string &name, unsigned int newsize) { if(d_rings.count(name)) d_rings[name].resize(newsize); - else + if(d_comborings.count(name)) d_comborings[name].resize(newsize); + if(d_dnsnameqtyperings.count(name)) + return d_dnsnameqtyperings[name].resize(newsize); } @@ -273,16 +289,22 @@ unsigned int StatBag::getRingSize(const string &name) { if(d_rings.count(name)) return d_rings[name].getSize(); - else + if(d_comborings.count(name)) return d_comborings[name].getSize(); + if(d_dnsnameqtyperings.count(name)) + return d_dnsnameqtyperings[name].getSize(); + return 0; } string StatBag::getRingTitle(const string &name) { if(d_rings.count(name)) return d_rings[name].getHelp(); - else + if(d_comborings.count(name)) return d_comborings[name].getHelp(); + if(d_dnsnameqtyperings.count(name)) + return d_dnsnameqtyperings[name].getHelp(); + return ""; } vectorStatBag::listRings() @@ -292,14 +314,17 @@ vectorStatBag::listRings() ret.push_back(i->first); 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); return ret; } bool StatBag::ringExists(const string &name) { - return d_rings.count(name) || d_comborings.count(name); + return d_rings.count(name) || d_comborings.count(name) || d_dnsnameqtyperings.count(name); } template class StatRing; template class StatRing; +template class StatRing >; diff --git a/pdns/statbag.hh b/pdns/statbag.hh index 130c4014fd..2c8ca2850d 100644 --- a/pdns/statbag.hh +++ b/pdns/statbag.hh @@ -66,6 +66,7 @@ class StatBag map d_keyDescrips; map >d_rings; map >d_comborings; + map > >d_dnsnameqtyperings; typedef boost::function func_t; typedef map funcstats_t; funcstats_t d_funcstats; @@ -79,6 +80,7 @@ public: void declareRing(const string &name, const string &title, unsigned int size=10000); void declareComboRing(const string &name, const string &help, unsigned int size=10000); + void declareDNSNameQTypeRing(const string &name, const string &help, unsigned int size=10000); vector >getRing(const string &name); string getRingTitle(const string &name); void ringAccount(const char* name, const string &item) @@ -98,6 +100,14 @@ public: d_comborings[name].account(item); } } + void ringAccount(const char* name, const DNSName &dnsname, const QType &qtype) + { + if(d_doRings) { + if(!d_dnsnameqtyperings.count(name)) + throw runtime_error("Attempting to account to non-existent dnsname+qtype ring '"+std::string(name)+"'"); + d_dnsnameqtyperings[name].account(std::make_tuple(dnsname, qtype)); + } + } void doRings() {