boost::replace_all(hostname, ".", "_");
}
for(const auto& e : g_stats.entries) {
- str<<"dnsdist."<<hostname<<".main."<<e.first<<' '<<e.second->load()<<' '<<now<<"\r\n";
+ str<<"dnsdist."<<hostname<<".main."<<e.first<<' ';
+ if(const auto& val = boost::get<DNSDistStats::stat_t*>(&e.second))
+ str<<(*val)->load();
+ else
+ str<<*boost::get<double*>(e.second);
+ str<<' '<<now<<"\r\n";
}
const string msg = str.str();
{ "over-capacity-drops", 0 },
{ "too-old-drops", 0 },
{ "uptime", uptimeOfProcess()},
- { "qa-latency", (int)g_stats.latency},
+ { "qa-latency", (int)g_stats.latencyAvg1000},
+ { "qa-latency1000", (int)g_stats.latencyAvg1000},
+ { "qa-latency10000", (int)g_stats.latencyAvg10000},
+ { "qa-latency1000000", (int)g_stats.latencyAvg1000000},
{ "something", Json::array { 1, 2, 3 } },
};
else if(udiff < 1000000) g_stats.latency100_1000++;
else g_stats.latencySlow++;
- g_stats.latency = (1023.0*g_stats.latency/1024.0) + udiff/1024.0;
+ auto doAvg = [](double& var, double n, double weight) {
+ var = (weight -1) * var/weight + n/weight;
+ };
+
+ doAvg(g_stats.latencyAvg100, udiff, 100);
+ doAvg(g_stats.latencyAvg1000, udiff, 1000);
+ doAvg(g_stats.latencyAvg10000, udiff, 10000);
+ doAvg(g_stats.latencyAvg1000000, udiff, 1000000);
ids->origFD = -1;
}
int main(int argc, char** argv)
try
{
- g_stats.latency=0;
rl_attempted_completion_function = my_completion;
rl_completion_append_character = 0;
if(g_cmdLine.beClient || !g_cmdLine.command.empty()) {
setupLua(true, g_cmdLine.config);
doClient(g_serverControl, g_cmdLine.command);
- exit(EXIT_SUCCESS);
+ _exit(EXIT_SUCCESS);
}
auto todo=setupLua(false, g_cmdLine.config);
#include "dnsname.hh"
#include <atomic>
#include <boost/circular_buffer.hpp>
+#include <boost/variant.hpp>
#include <mutex>
#include <thread>
#include "sholder.hh"
stat_t noPolicy{0};
stat_t latency0_1{0}, latency1_10{0}, latency10_50{0}, latency50_100{0}, latency100_1000{0}, latencySlow{0};
- double latency{0};
- std::vector<std::pair<std::string, stat_t*>> entries{
+ double latencyAvg100{0}, latencyAvg1000{0}, latencyAvg10000{0}, latencyAvg1000000{0};
+ typedef boost::variant<stat_t*, double*> entry_t;
+ std::vector<std::pair<std::string, entry_t>> entries{
{"responses", &responses}, {"servfail-responses", &servfailResponses},
{"queries", &queries}, {"acl-drops", &aclDrops},
{"block-filter", &blockFilter}, {"rule-drop", &ruleDrop},
{"trunc-failures", &truncFail}, {"no-policy", &noPolicy},
{"latency0-1", &latency0_1}, {"latency1-10", &latency1_10},
{"latency10-50", &latency10_50}, {"latency50-100", &latency50_100},
- {"latency100-1000", &latency100_1000}, {"latency-slow", &latencySlow}
+ {"latency100-1000", &latency100_1000}, {"latency-slow", &latencySlow},
+ {"latency-avg100", &latencyAvg100}, {"latency-avg1000", &latencyAvg1000},
+ {"latency-avg10000", &latencyAvg10000}, {"latency-avg1000000", &latencyAvg1000000}
};
};
+
extern struct DNSDistStats g_stats;