]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/responsestats.cc
4 #include "responsestats.hh"
6 #include "namespaces.hh"
9 #include "dnsparser.hh"
11 ResponseStats::ResponseStats() : d_qtypecounters(new std::atomic
<unsigned long>[65536])
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;
28 static bool pcomp(const pair
<uint16_t, uint64_t>&a
, const pair
<uint16_t, uint64_t>&b
)
30 return a
.first
< b
.first
;
33 void ResponseStats::submitResponse(uint16_t qtype
, uint16_t respsize
, bool udpOrTCP
)
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())
43 map
<uint16_t, uint64_t> ResponseStats::getQTypeResponseCounts()
45 map
<uint16_t, uint64_t> ret
;
47 for(unsigned int i
= 0 ; i
< 65535 ; ++i
) {
48 count
= d_qtypecounters
[i
];
55 map
<uint16_t, uint64_t> ResponseStats::getSizeResponseCounts()
57 map
<uint16_t, uint64_t> ret
;
58 for(sizecounters_t::const_iterator iter
= d_sizecounters
.begin();
59 iter
!= d_sizecounters
.end();
61 ret
[iter
->first
]=iter
->second
;
66 string
ResponseStats::getQTypeReport()
68 typedef map
<uint16_t, uint64_t> qtypenums_t
;
69 qtypenums_t qtypenums
= getQTypeResponseCounts();
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();