]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/responsestats.cc
Merge pull request #6967 from gibson042/2018-08-trailing-data
[thirdparty/pdns.git] / pdns / responsestats.cc
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4 #include "responsestats.hh"
5 #include <limits>
6 #include "namespaces.hh"
7 #include "logger.hh"
8
9 #include "dnsparser.hh"
10
11 ResponseStats::ResponseStats() : d_qtypecounters(new std::atomic<unsigned long>[65536])
12 {
13 d_sizecounters.push_back(make_pair(20,0));
14 d_sizecounters.push_back(make_pair(40,0));
15 d_sizecounters.push_back(make_pair(60,0));
16 d_sizecounters.push_back(make_pair(80,0));
17 d_sizecounters.push_back(make_pair(100,0));
18 d_sizecounters.push_back(make_pair(150,0));
19 for(int n=200; n < 65000 ; n+=200)
20 d_sizecounters.push_back(make_pair(n,0));
21 d_sizecounters.push_back(make_pair(std::numeric_limits<uint16_t>::max(),0));
22 for(unsigned int n =0 ; n < 65535; ++n)
23 d_qtypecounters[n] = 0;
24 }
25
26 ResponseStats g_rs;
27
28 static bool pcomp(const pair<uint16_t, uint64_t>&a , const pair<uint16_t, uint64_t>&b)
29 {
30 return a.first < b.first;
31 }
32
33 void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP)
34 {
35 d_qtypecounters[qtype]++;
36 pair<uint16_t, uint64_t> s(respsize, 0);
37 sizecounters_t::iterator iter = std::upper_bound(d_sizecounters.begin(), d_sizecounters.end(), s, pcomp);
38 if(iter!= d_sizecounters.begin())
39 --iter;
40 iter->second++;
41 }
42
43 map<uint16_t, uint64_t> ResponseStats::getQTypeResponseCounts()
44 {
45 map<uint16_t, uint64_t> ret;
46 uint64_t count;
47 for(unsigned int i = 0 ; i < 65535 ; ++i) {
48 count= d_qtypecounters[i];
49 if(count)
50 ret[i]=count;
51 }
52 return ret;
53 }
54
55 map<uint16_t, uint64_t> ResponseStats::getSizeResponseCounts()
56 {
57 map<uint16_t, uint64_t> ret;
58 for(sizecounters_t::const_iterator iter = d_sizecounters.begin();
59 iter != d_sizecounters.end();
60 ++iter) {
61 ret[iter->first]=iter->second;
62 }
63 return ret;
64 }
65
66 string ResponseStats::getQTypeReport()
67 {
68 typedef map<uint16_t, uint64_t> qtypenums_t;
69 qtypenums_t qtypenums = getQTypeResponseCounts();
70 ostringstream os;
71 boost::format fmt("%s\t%d\n");
72 for(const qtypenums_t::value_type& val : qtypenums) {
73 os << (fmt %DNSRecordContent::NumberToType( val.first) % val.second).str();
74 }
75 return os.str();
76 }
77