stats<<"# TYPE "<<prefix<<"domains gauge"<<std::endl;
stats<<prefix<<"domains "<<domainStats.size()<<std::endl;
- uint64_t numSOAinQueries{0}, numIXFRinQueries{0}, numAXFRinQueries{0}, numAXFRFailures{0}, numIXFRFailures{0};
+ uint64_t numSOAChecks{0}, numSOAChecksFailed{0}, numSOAinQueries{0}, numIXFRinQueries{0}, numAXFRinQueries{0}, numAXFRFailures{0}, numIXFRFailures{0};
for (auto const &d : domainStats) {
if(d.second.haveZone)
stats<<prefix<<"soa_serial{domain="<<d.first<<"} "<<d.second.currentSOA<<std::endl;
else
stats<<prefix<<"soa_serial{domain="<<d.first<<"} NaN"<<std::endl;
+ stats<<prefix<<"soa_checks{domain="<<d.first<<"} "<<d.second.numSOAChecks<<std::endl;
+ numSOAChecks += d.second.numSOAChecks;
+
+ stats<<prefix<<"soa_checks_failed{domain="<<d.first<<"} "<<d.second.numSOAChecksFailed<<std::endl;
+ numSOAChecksFailed += d.second.numSOAChecksFailed;
+
stats<<prefix<<"soa_inqueries{domain="<<d.first<<"} "<<d.second.numSOAinQueries<<std::endl;
numSOAinQueries += d.second.numSOAinQueries;
numIXFRFailures += d.second.numIXFRFailures;
}
+ stats<<prefix<<"soa_checks "<<numSOAChecks<<std::endl;
+ stats<<prefix<<"soa_checks_failed "<<numSOAChecksFailed<<std::endl;
stats<<prefix<<"soa_inqueries "<<numSOAinQueries<<std::endl;
stats<<prefix<<"axfr_inqueries "<<numAXFRinQueries<<std::endl;
stats<<prefix<<"ixfr_inqueries "<<numIXFRinQueries<<std::endl;
void incrementSOAinQueries(const DNSName& d, const uint64_t amount = 1) {
domainStats[d].numSOAinQueries += amount;
}
- void incrementAXFRQueries(const DNSName& d, const uint64_t amount = 1) {
+ void incrementAXFRinQueries(const DNSName& d, const uint64_t amount = 1) {
domainStats[d].numAXFRinQueries += amount;
}
- void incrementIXFRQueries(const DNSName& d, const uint64_t amount = 1) {
+ void incrementIXFRinQueries(const DNSName& d, const uint64_t amount = 1) {
domainStats[d].numIXFRinQueries += amount;
}
void incrementAXFRFailures(const DNSName& d, const uint64_t amount = 1) {
std::atomic<uint32_t> numSOAChecksFailed;
std::atomic<uint64_t> numSOAinQueries;
- std::atomic<uint64_t> numIXFRinQueries;
std::atomic<uint64_t> numAXFRinQueries;
+ std::atomic<uint64_t> numIXFRinQueries;
std::atomic<uint64_t> numAXFRFailures;
std::atomic<uint64_t> numIXFRFailures;
std::lock_guard<std::mutex> guard(g_soas_mutex);
g_soas[domain] = newInfo;
g_stats.setSOASerial(domain, newInfo->soa->d_st.serial);
+ // FIXME: also report zone size?
}
void updateThread(const string& workdir, const uint16_t& keep, const uint16_t& axfrTimeout, const uint16_t& soaRetry) {
shared_ptr<SOARecordContent> sr;
try {
zoneLastCheck = now;
+ g_stats.incrementSOAChecks(domain);
auto newSerial = getSerialFromMaster(master, domain, sr); // TODO TSIG
if(current_soa != nullptr) {
g_log<<Logger::Info<<"Got SOA Serial for "<<domain<<" from "<<master.toStringWithPort()<<": "<< newSerial<<", had Serial: "<<current_soa->d_st.serial;
}
} catch (runtime_error &e) {
g_log<<Logger::Warning<<"Unable to get SOA serial update for '"<<domain<<"' from master "<<master.toStringWithPort()<<": "<<e.what()<<endl;
+ g_stats.incrementSOAChecksFailed(domain);
continue;
}
// Now get the full zone!
}
axfr_now = time(nullptr);
if (axfr_now - t_start > axfrTimeout) {
+ g_stats.incrementAXFRFailures(domain);
throw PDNSException("Total AXFR time exceeded!");
}
}
if (soa == nullptr) {
+ g_stats.incrementAXFRFailures(domain);
g_log<<Logger::Warning<<"No SOA was found in the AXFR of "<<domain<<endl;
continue;
}
g_log<<Logger::Notice<<"Retrieved all zone data for "<<domain<<". Received "<<nrecords<<" records."<<endl;
} catch (PDNSException &e) {
+ g_stats.incrementAXFRFailures(domain);
g_log<<Logger::Warning<<"Could not retrieve AXFR for '"<<domain<<"': "<<e.reason<<endl;
continue;
} catch (runtime_error &e) {
+ g_stats.incrementAXFRFailures(domain);
g_log<<Logger::Warning<<"Could not retrieve AXFR for zone '"<<domain<<"': "<<e.what()<<endl;
continue;
}
zoneInfo->soa = soa;
updateCurrentZoneInfo(domain, zoneInfo);
} catch (PDNSException &e) {
+ g_stats.incrementAXFRFailures(domain);
g_log<<Logger::Warning<<"Could not save zone '"<<domain<<"' to disk: "<<e.reason<<endl;
} catch (runtime_error &e) {
+ g_stats.incrementAXFRFailures(domain);
g_log<<Logger::Warning<<"Could not save zone '"<<domain<<"' to disk: "<<e.what()<<endl;
}
A newer one may arise in the meantime, but this one will stay valid
until we release it.
*/
+
+ g_stats.incrementAXFRinQueries(mdp.d_qname);
+
auto zoneInfo = getCurrentZoneInfo(mdp.d_qname);
if (zoneInfo == nullptr) {
return false;
A newer one may arise in the meantime, but this one will stay valid
until we release it.
*/
+
+ g_stats.incrementIXFRinQueries(mdp.d_qname);
+
auto zoneInfo = getCurrentZoneInfo(mdp.d_qname);
if (zoneInfo == nullptr) {
return false;
}
if (toSend.empty()) {
+ // FIXME: incrementIXFRFallbacks
g_log<<Logger::Warning<<"No IXFR available from serial "<<clientSOA->d_st.serial<<" for zone "<<mdp.d_qname<<", attempting to send AXFR"<<endl;
return handleAXFR(fd, mdp);
}
* Let's not complicate this with IXFR over UDP (and looking if we need to truncate etc).
* Just send the current SOA and let the client try over TCP
*/
+ g_stats.incrementSOAinQueries(mdp.d_qname); // FIXME: this also counts IXFR queries (but the response is the same as to a SOA query)
makeSOAPacket(mdp, packet);
} else {
makeRefusedPacket(mdp, packet);