]>
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]), d_rcodecounters(new std::atomic
<unsigned long>[256])
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 for(unsigned int n
=0 ; n
< 256; ++n
)
25 d_rcodecounters
[n
] = 0;
30 static bool pcomp(const pair
<uint16_t, uint64_t>&a
, const pair
<uint16_t, uint64_t>&b
)
32 return a
.first
< b
.first
;
35 void ResponseStats::submitResponse(uint16_t qtype
,uint16_t respsize
, uint8_t rcode
, bool udpOrTCP
)
37 d_rcodecounters
[rcode
]++;
38 submitResponse(qtype
, respsize
, udpOrTCP
);
41 void ResponseStats::submitResponse(uint16_t qtype
,uint16_t respsize
, bool udpOrTCP
)
43 d_qtypecounters
[qtype
]++;
44 pair
<uint16_t, uint64_t> s(respsize
, 0);
45 sizecounters_t::iterator iter
= std::upper_bound(d_sizecounters
.begin(), d_sizecounters
.end(), s
, pcomp
);
46 if(iter
!= d_sizecounters
.begin())
51 map
<uint16_t, uint64_t> ResponseStats::getQTypeResponseCounts()
53 map
<uint16_t, uint64_t> ret
;
55 for(unsigned int i
= 0 ; i
< 65535 ; ++i
) {
56 count
= d_qtypecounters
[i
];
63 map
<uint16_t, uint64_t> ResponseStats::getSizeResponseCounts()
65 map
<uint16_t, uint64_t> ret
;
66 for(sizecounters_t::const_iterator iter
= d_sizecounters
.begin();
67 iter
!= d_sizecounters
.end();
69 ret
[iter
->first
]=iter
->second
;
74 map
<uint8_t, uint64_t> ResponseStats::getRCodeResponseCounts()
76 map
<uint8_t, uint64_t> ret
;
78 for(unsigned int i
= 0 ; i
< 256 ; ++i
) {
79 count
= d_rcodecounters
[i
];
86 string
ResponseStats::getQTypeReport()
88 typedef map
<uint16_t, uint64_t> qtypenums_t
;
89 qtypenums_t qtypenums
= getQTypeResponseCounts();
91 boost::format
fmt("%s\t%d\n");
92 for(const qtypenums_t::value_type
& val
: qtypenums
) {
93 os
<< (fmt
%DNSRecordContent::NumberToType( val
.first
) % val
.second
).str();