Also, use a safe copy to dump the maps.
#endif /* __linux__ */
static const oid sourceDisallowedNotifyOID[] = {RECURSOR_STATS_OID, 124};
static const oid zoneDisallowedNotifyOID[] = {RECURSOR_STATS_OID, 125};
+static const oid nonResolvingNSEntriesOID[] = {RECURSOR_STATS_OID, 126};
static std::unordered_map<oid, std::string> s_statsMap;
registerCounter64Stat("almost-expired-pushed", almostExpiredPushed, OID_LENGTH(almostExpiredPushed));
registerCounter64Stat("almost-expired-run", almostExpiredRun, OID_LENGTH(almostExpiredRun));
registerCounter64Stat("almost-expired-exceptions", almostExpiredExceptions, OID_LENGTH(almostExpiredExceptions));
+ registerCounter64Stat("non-resolving-ns-entries", nonResolvingNSEntriesOID, OID_LENGTH(nonResolvingNSEntriesOID));
#endif /* HAVE_NET_SNMP */
}
if (threads) {
int fd = fdw;
total = broadcastAccFunction<uint64_t>([function, fd] { return function(fd); });
- } else {
+ }
+ else {
auto ret = function(fdw);
total = *ret;
delete ret;
return g_negCache->size();
}
-static uint64_t* pleaseGetFailedHostsSize()
-{
- uint64_t tmp = (SyncRes::getThrottledServersSize());
- return new uint64_t(tmp);
-}
-
-static uint64_t getFailedHostsSize()
-{
- return broadcastAccFunction<uint64_t>(pleaseGetFailedHostsSize);
-}
-
uint64_t* pleaseGetNsSpeedsSize()
{
return new uint64_t(SyncRes::getNSSpeedsSize());
return broadcastAccFunction<uint64_t>(pleaseGetNsSpeedsSize);
}
-uint64_t* pleaseGetFailedServersSize()
-{
- return new uint64_t(SyncRes::getFailedServersSize());
-}
-
uint64_t* pleaseGetEDNSStatusesSize()
{
return new uint64_t(SyncRes::getEDNSStatusesSize());
addGetStat("throttle-entries", getThrottleSize);
addGetStat("nsspeeds-entries", getNsSpeedsSize);
- addGetStat("failed-host-entries", getFailedHostsSize);
+ addGetStat("failed-host-entries", SyncRes::getFailedServersSize);
+ addGetStat("non-resolving-ns-entries", SyncRes::getNonResolvingNSSize);
addGetStat("concurrent-queries", getConcurrentQueries);
addGetStat("security-status", &g_security_status);
REVISION "202111090000Z"
DESCRIPTION "Added NOTIFY-related metrics."
+ REVISION "202201310000Z"
+ DESCRIPTION "Added non-resolving NS name metric."
+
::= { powerdns 2 }
powerdns OBJECT IDENTIFIER ::= { enterprises 43315 }
MAX-ACCESS read-only
STATUS current
DESCRIPTION
- "Number of failed host entries"
+ "Number of entries in the failed NS cache"
::= { stats 52 }
concurrentQueries OBJECT-TYPE
DESCRIPTION
"Number of NOTIFY operations not allowed by allow-notify-for"
::= { stats 125 }
+
+nonResolvingNSEntries OBJECT-TYPE
+ SYNTAX CounterBasedGauge64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of entries in the non-resolving NS name cache"
+ ::= { stats 126 }
+
---
--- Traps / Notifications
---
failed-host-entries
^^^^^^^^^^^^^^^^^^^
-number of servers that failed to resolve
+number of addresses in the failed NS cache.
.. _stat-fd-usage:
^^^^^^^^^^^^^^^
counts the number of times it answered NOERROR since starting
+non-resolving-ns-entries
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+number of entries in the non-resolving NS name cache
+
noping-outqueries
^^^^^^^^^^^^^^^^^
number of queries sent out without ENDS PING
g_log << Logger::Notice << "stats: throttle map: "
<< broadcastAccFunction<uint64_t>(pleaseGetThrottleSize) << ", ns speeds: "
<< broadcastAccFunction<uint64_t>(pleaseGetNsSpeedsSize) << ", failed ns: "
- << broadcastAccFunction<uint64_t>(pleaseGetFailedServersSize) << ", ednsmap: "
+ << SyncRes::getFailedServersSize() << ", ednsmap: "
<< broadcastAccFunction<uint64_t>(pleaseGetEDNSStatusesSize) << endl;
g_log << Logger::Notice << "stats: outpacket/query ratio " << ratePercentage(SyncRes::s_outqueries, SyncRes::s_queries) << "%";
g_log << Logger::Notice << ", " << ratePercentage(SyncRes::s_throttledqueries, SyncRes::s_outqueries + SyncRes::s_throttledqueries) << "% throttled" << endl;
fprintf(fp.get(), "; remote IP\tcount\ttimestamp\n");
uint64_t count=0;
- for(const auto& i : s_fails.lock()->getMap())
+ // We get a copy, so the I/O does not need to happen while holding the lock
+ for (const auto& i : s_fails.lock()->getMapCopy())
{
count++;
char tmp[26];
fprintf(fp.get(), "; name\tcount\ttimestamp\n");
uint64_t count=0;
- for(const auto& i : s_nonresolving.lock()->getMap())
+ // We get a copy, so the I/O does not need to happen while holding the lock
+ for (const auto& i : s_nonresolving.lock()->getMapCopy())
{
count++;
char tmp[26];
ordered_non_unique<tag<time_t>, member<value_t, time_t, &value_t::last>>
>> cont_t;
- const cont_t& getMap() const {
+ cont_t getMapCopy() const {
return d_cont;
}
+
counter_t value(const T& t) const
{
auto i = d_cont.find(t);
MetricDefinition(PrometheusMetricType::counter,
"Number of servers that sent an invalid EDNS PING response")},
{"failed-host-entries",
- MetricDefinition(PrometheusMetricType::counter,
- "Number of servers that failed to resolve")},
+ MetricDefinition(PrometheusMetricType::gauge,
+ "Number of entries in the failed NS cache")},
+ {"non-resolving-ns-entries",
+ MetricDefinition(PrometheusMetricType::gauge,
+ "Number of entries in the non-resolving NS name cache")},
{"ignored-packets",
MetricDefinition(PrometheusMetricType::counter,
"Number of non-query packets received on server sockets that should only get query packets")},