S.declare("uptime", "Uptime of process in seconds", uptimeOfProcess);
S.declare("real-memory-usage", "Actual unique use of memory in bytes (approx)", getRealMemoryUsage);
+ S.declare("special-memory-usage", "Actual unique use of memory in bytes (approx)", getSpecialMemoryUsage);
S.declare("fd-usage", "Number of open filedescriptors", getOpenFileDescriptors);
#ifdef __linux__
S.declare("udp-recvbuf-errors", "UDP 'recvbuf' errors", udpErrorStats);
static const oid dynBlockedNMGSizeOID[] = { DNSDIST_STATS_OID, 36 };
static const oid ruleServFailOID[] = { DNSDIST_STATS_OID, 37 };
static const oid securityStatusOID[] = { DNSDIST_STATS_OID, 38 };
+static const oid specialMemoryUsageOID[] = { DNSDIST_STATS_OID, 39 };
static std::unordered_map<oid, DNSDistStats::entry_t> s_statsMap;
registerFloatStat("latencyAvg10000", latencyAvg10000OID, OID_LENGTH(latencyAvg10000OID), &g_stats.latencyAvg10000);
registerFloatStat("latencyAvg1000000", latencyAvg1000000OID, OID_LENGTH(latencyAvg1000000OID), &g_stats.latencyAvg1000000);
registerGauge64Stat("uptime", uptimeOID, OID_LENGTH(uptimeOID), &uptimeOfProcess);
- registerGauge64Stat("realMemoryUsage", realMemoryUsageOID, OID_LENGTH(realMemoryUsageOID), &getRealMemoryUsage);
+ registerGauge64Stat("specialMemoryUsage", specialMemoryUsageOID, OID_LENGTH(specialMemoryUsageOID), &getSpecialMemoryUsage);
registerGauge64Stat("cpuUserMSec", cpuUserMSecOID, OID_LENGTH(cpuUserMSecOID), &getCPUTimeUser);
registerGauge64Stat("cpuSysMSec", cpuSysMSecOID, OID_LENGTH(cpuSysMSecOID), &getCPUTimeSystem);
registerGauge64Stat("fdUsage", fdUsageOID, OID_LENGTH(fdUsageOID), &getOpenFileDescriptors);
registerGauge64Stat("dynBlockedNMGSize", dynBlockedNMGSizeOID, OID_LENGTH(dynBlockedNMGSizeOID), [](const std::string&) { return g_dynblockNMG.getLocal()->size(); });
registerGauge64Stat("securityStatus", securityStatusOID, OID_LENGTH(securityStatusOID), [](const std::string&) { return g_stats.securityStatus.load(); });
+ registerGauge64Stat("realMemoryUsage", realMemoryUsageOID, OID_LENGTH(realMemoryUsageOID), &getRealMemoryUsage);
netsnmp_table_registration_info* table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
};
for(const auto& e : g_stats.entries) {
+ if (e.first == "special-memory-usage")
+ continue; // Too expensive for get-all
if(const auto& val = boost::get<DNSDistStats::stat_t*>(&e.second))
obj.insert({e.first, (double)(*val)->load()});
else if (const auto& dval = boost::get<double*>(&e.second))
std::ostringstream output;
for (const auto& e : g_stats.entries) {
+ if (e.first == "special-memory-usage")
+ continue; // Too expensive for get-all
std::string metricName = std::get<0>(e);
// Prometheus suggest using '_' instead of '-'
Json::array doc;
for(const auto& item : g_stats.entries) {
+ if (item.first == "special-memory-usage")
+ continue; // Too expensive for get-all
+
if(const auto& val = boost::get<DNSDistStats::stat_t*>(&item.second)) {
doc.push_back(Json::object {
{ "type", "StatisticItem" },
{"latency-avg1000000", &latencyAvg1000000},
{"uptime", uptimeOfProcess},
{"real-memory-usage", getRealMemoryUsage},
+ {"special-memory-usage", getSpecialMemoryUsage},
{"noncompliant-queries", &nonCompliantQueries},
{"noncompliant-responses", &nonCompliantResponses},
{"rdqueries", &rdQueries},
"Number of ServFail responses returned because of a rule"
::= { stats 37 }
+specialMemoryUsage OBJECT-TYPE
+ SYNTAX CounterBasedGauge64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Memory usage (more precise but expensive to retrieve)"
+ ::= { stats 38 }
+
securityStatus OBJECT-TYPE
SYNTAX CounterBasedGauge64
MAX-ACCESS read-only
uint64_t getRealMemoryUsage(const std::string&)
{
+#ifdef __linux__
+ ifstream ifs("/proc/"+std::to_string(getpid())+"/statm");
+ if(!ifs)
+ return 0;
+
+ uint64_t size, resident, shared, text, lib, data;
+ ifs >> size >> resident >> shared >> text >> lib >> data;
+
+ return data * getpagesize();
+#else
+ struct rusage ru;
+ if (getrusage(RUSAGE_SELF, &ru) != 0)
+ return 0;
+ return ru.ru_maxrss * 1024;
+#endif
+}
+
+
+uint64_t getSpecialMemoryUsage(const std::string&)
+{
#ifdef __linux__
ifstream ifs("/proc/"+std::to_string(getpid())+"/smaps");
if(!ifs)
uint64_t udpErrorStats(const std::string& str);
uint64_t getRealMemoryUsage(const std::string&);
+uint64_t getSpecialMemoryUsage(const std::string&);
uint64_t getOpenFileDescriptors(const std::string&);
uint64_t getCPUTimeUser(const std::string&);
uint64_t getCPUTimeSystem(const std::string&);
static const oid dnssecAuthenticDataQueriesOID[] = { RECURSOR_STATS_OID, 95 };
static const oid dnssecCheckDisabledQueriesOID[] = { RECURSOR_STATS_OID, 96 };
static const oid variableResponsesOID[] = { RECURSOR_STATS_OID, 97 };
+static const oid specialMemoryUsageOID[] = { RECURSOR_STATS_OID, 98 };
static std::unordered_map<oid, std::string> s_statsMap;
registerCounter64Stat("policy-result-nodata", policyResultNodataOID, OID_LENGTH(policyResultNodataOID));
registerCounter64Stat("policy-result-truncate", policyResultTruncateOID, OID_LENGTH(policyResultTruncateOID));
registerCounter64Stat("policy-result-custom", policyResultCustomOID, OID_LENGTH(policyResultCustomOID));
+ registerCounter64Stat("special-memory-usage", specialMemoryUsageOID, OID_LENGTH(specialMemoryUsageOID));
#endif /* HAVE_NET_SNMP */
}
ret.insert(make_pair(atomic.first, std::to_string(atomic.second->load())));
}
- for(const auto& the64bitmembers : d_get64bitmembers) {
+ for(const auto& the64bitmembers : d_get64bitmembers) {
if(the64bitmembers.first == "cache-bytes" || the64bitmembers.first=="packetcache-bytes")
continue; // too slow for 'get-all'
+ if(the64bitmembers.first == "special-memory-usage")
+ continue; // too slow for 'get-all'
ret.insert(make_pair(the64bitmembers.first, std::to_string(the64bitmembers.second())));
}
Lock l(&d_dynmetricslock);
addGetStat("uptime", calculateUptime);
addGetStat("real-memory-usage", boost::bind(getRealMemoryUsage, string()));
- addGetStat("fd-usage", boost::bind(getOpenFileDescriptors, string()));
+ addGetStat("special-memory-usage", boost::bind(getSpecialMemoryUsage, string()));
+ addGetStat("fd-usage", boost::bind(getOpenFileDescriptors, string()));
// addGetStat("query-rate", getQueryRate);
addGetStat("user-msec", getUserTimeMsec);
"Number of variable responses"
::= { stats 97 }
+specialMemoryUsage OBJECT-TYPE
+ SYNTAX CounterBasedGauge64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Memory usage (more precise bbut expensive to retrieve)"
+ ::= { stats 98 }
+
---
--- Traps / Notifications
---
$SDIG ::1 $port example.com SOA tcp >&2 >/dev/null
$PDNSCONTROL --config-name= --no-config --socket-dir=./ 'show *' | \
- tr ',' '\n'| grep -v -E '(user-msec|sys-msec|uptime|udp-noport-errors|udp-in-errors|real-memory-usage|udp-recvbuf-errors|udp-sndbuf-errors|-hit|-miss|fd-usage|latency)' | LC_ALL=C sort
+ tr ',' '\n'| grep -v -E '(user-msec|sys-msec|uptime|udp-noport-errors|udp-in-errors|real-memory-usage|special-memory-usage|udp-recvbuf-errors|udp-sndbuf-errors|-hit|-miss|fd-usage|latency)' | LC_ALL=C sort
kill $(cat pdns*.pid)
rm pdns*.pid