}
if (suffixMatchRuleMatches) {
- root.submit(c.name, ((c.dh.rcode == 0 && c.usec == std::numeric_limits<unsigned int>::max()) ? -1 : c.dh.rcode), boost::none);
+ root.submit(c.name, ((c.dh.rcode == 0 && c.usec == std::numeric_limits<unsigned int>::max()) ? -1 : c.dh.rcode), c.size, boost::none);
}
}
}
if (seconds && c.when < cutoff)
continue;
- root.submit(c.name, ((c.dh.rcode == 0 && c.usec == std::numeric_limits<unsigned int>::max()) ? -1 : c.dh.rcode), boost::none);
+ root.submit(c.name, ((c.dh.rcode == 0 && c.usec == std::numeric_limits<unsigned int>::max()) ? -1 : c.dh.rcode), c.size, boost::none);
}
}
g_lua.registerMember("queries", &StatNode::Stat::queries);
g_lua.registerMember("noerrors", &StatNode::Stat::noerrors);
g_lua.registerMember("drops", &StatNode::Stat::drops);
+ g_lua.registerMember("bytes", &StatNode::Stat::bytes);
g_lua.writeFunction("statNodeRespRing", [](statvisitor_t visitor, boost::optional<unsigned int> seconds) {
statNodeRespRing(visitor, seconds ? *seconds : 0);
return node->self.drops;
}
+uint64_t dnsdist_ffi_stat_node_get_bytes(const dnsdist_ffi_stat_node_t* node)
+{
+ return node->self.bytes;
+}
+
unsigned int dnsdist_ffi_stat_node_get_labels_count(const dnsdist_ffi_stat_node_t* node)
{
return node->node.labelsCount;
{
return node->children.drops;
}
+
+uint64_t dnsdist_ffi_stat_node_get_children_bytes_count(const dnsdist_ffi_stat_node_t* node)
+{
+ return node->children.bytes;
+}
uint64_t dnsdist_ffi_stat_node_get_nxdomains_count(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
uint64_t dnsdist_ffi_stat_node_get_servfails_count(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
uint64_t dnsdist_ffi_stat_node_get_drops_count(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
+ uint64_t dnsdist_ffi_stat_node_get_bytes(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
unsigned int dnsdist_ffi_stat_node_get_labels_count(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
void dnsdist_ffi_stat_node_get_full_name_raw(const dnsdist_ffi_stat_node_t* node, const char** name, size_t* nameSize) __attribute__ ((visibility ("default")));
uint64_t dnsdist_ffi_stat_node_get_children_nxdomains_count(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
uint64_t dnsdist_ffi_stat_node_get_children_servfails_count(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
uint64_t dnsdist_ffi_stat_node_get_children_drops_count(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
+ uint64_t dnsdist_ffi_stat_node_get_children_bytes(const dnsdist_ffi_stat_node_t* node) __attribute__ ((visibility ("default")));
}
rem.sin4.sin_port=0;
if(doServFailTree)
- root.submit(qname, header.rcode, rem);
+ root.submit(qname, header.rcode, pr.d_len, rem);
}
if(!qd.d_qcount || qd.d_qcount == qd.d_answercount) {
childstat.nxdomains += s.nxdomains;
childstat.servfails += s.servfails;
childstat.drops += s.drops;
+ childstat.bytes += s.bytes;
+
if(children.size()>1024 && !silent) {
cout<<string(depth, ' ')<<name<<": too many to print"<<endl;
}
childstat.noerrors<<" noerrors, "<<
childstat.nxdomains<<" nxdomains, "<<
childstat.servfails<<" servfails, "<<
- childstat.drops<<" drops"<<endl;
+ childstat.drops<<" drops, "<<
+ childstat.bytes<<" bytes"<<endl;
newstat+=childstat;
childstat.nxdomains += s.nxdomains;
childstat.servfails += s.servfails;
childstat.drops += s.drops;
+ childstat.bytes += s.bytes;
childstat.remotes = s.remotes;
Stat selfstat(childstat);
}
-void StatNode::submit(const DNSName& domain, int rcode, boost::optional<const ComboAddress&> remote)
+void StatNode::submit(const DNSName& domain, int rcode, unsigned int bytes, boost::optional<const ComboAddress&> remote)
{
// cerr<<"FIRST submit called on '"<<domain<<"'"<<endl;
std::vector<string> tmp = domain.getRawLabels();
return;
auto last = tmp.end() - 1;
- children[*last].submit(last, tmp.begin(), "", rcode, remote, 1);
+ children[*last].submit(last, tmp.begin(), "", rcode, bytes, remote, 1);
}
/* www.powerdns.com. ->
www.powerdns.com.
*/
-void StatNode::submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const std::string& domain, int rcode, boost::optional<const ComboAddress&> remote, unsigned int count)
+void StatNode::submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const std::string& domain, int rcode, unsigned int bytes, boost::optional<const ComboAddress&> remote, unsigned int count)
{
// cerr<<"Submit called for domain='"<<domain<<"': ";
// for(const std::string& n : labels)
}
// cerr<<"Hit the end, set our fullname to '"<<fullname<<"'"<<endl<<endl;
s.queries++;
+ s.bytes += bytes;
if(rcode<0)
s.drops++;
else if(rcode==0)
}
// cerr<<"Not yet end, set our fullname to '"<<fullname<<"', recursing"<<endl;
--end;
- children[*end].submit(end, begin, fullname, rcode, remote, count+1);
+ children[*end].submit(end, begin, fullname, rcode, bytes, remote, count+1);
}
}
struct Stat
{
- Stat() : queries(0), noerrors(0), nxdomains(0), servfails(0), drops(0){}
- uint64_t queries, noerrors, nxdomains, servfails, drops;
+ Stat(): queries(0), noerrors(0), nxdomains(0), servfails(0), drops(0), bytes(0)
+ {
+ }
+ uint64_t queries, noerrors, nxdomains, servfails, drops, bytes;
Stat& operator+=(const Stat& rhs) {
queries+=rhs.queries;
nxdomains+=rhs.nxdomains;
servfails+=rhs.servfails;
drops+=rhs.drops;
+ bytes+=rhs.bytes;
for(const remotes_t::value_type& rem : rhs.remotes) {
remotes[rem.first]+=rem.second;
std::string fullname;
unsigned int labelsCount{0};
- void submit(const DNSName& domain, int rcode, boost::optional<const ComboAddress&> remote);
+ void submit(const DNSName& domain, int rcode, unsigned int bytes, boost::optional<const ComboAddress&> remote);
Stat print(unsigned int depth=0, Stat newstat=Stat(), bool silent=false) const;
typedef boost::function<void(const StatNode*, const Stat& selfstat, const Stat& childstat)> visitor_t;
children_t children;
private:
- void submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const std::string& domain, int rcode, boost::optional<const ComboAddress&> remote, unsigned int count);
+ void submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const std::string& domain, int rcode, unsigned int bytes, boost::optional<const ComboAddress&> remote, unsigned int count);
};