enum class StatComponent { API, Carbon, RecControl, SNMP };
-std::map<std::string, std::string> getAllStatsMap(StatComponent component, bool prometheusName = false);
+struct StatsMapEntry {
+ std::string d_prometheusName;
+ std::string d_value;
+};
+typedef std::map<std::string, StatsMapEntry> StatsMap;
+StatsMap getAllStatsMap(StatComponent component);
+
extern std::mutex g_carbon_config_lock;
std::vector<std::pair<DNSName, uint16_t> >* pleaseGetQueryRing();
std::vector<std::pair<DNSName, uint16_t> >* pleaseGetServfailQueryRing();
d_get64bitmembers[name]=f;
}
+static std::string getPrometheusName(const std::string& arg)
+{
+ std::string name = arg;
+ std::replace_if(name.begin(), name.end(), [](char c){
+ return !isalnum(static_cast<unsigned char>(c));}, '_');
+ return "pdns_recursor_" + name;
+}
+
std::atomic<unsigned long>* getDynMetric(const std::string& str, const std::string& prometheusName)
{
std::lock_guard<std::mutex> l(d_dynmetricslock);
if (!prometheusName.empty()) {
name = prometheusName;
} else {
- std::replace_if(name.begin(), name.end(), [](char c){
- return !isalnum(static_cast<unsigned char>(c));}, '_');
+ name = getPrometheusName(name);
}
auto ret = dynmetrics{new std::atomic<unsigned long>(), name};
return get(name);
}
-map<string,string> getAllStatsMap(StatComponent component, bool prometheusNames)
+StatsMap getAllStatsMap(StatComponent component)
{
- map<string,string> ret;
+ StatsMap ret;
const auto& blacklistMap = s_blacklistedStats.at(component);
for(const auto& the32bits : d_get32bitpointers) {
if (blacklistMap.count(the32bits.first) == 0) {
- ret.insert(make_pair(the32bits.first, std::to_string(*the32bits.second)));
+ ret.insert(make_pair(the32bits.first, StatsMapEntry{getPrometheusName(the32bits.first), std::to_string(*the32bits.second)}));
}
}
for(const auto& atomic : d_getatomics) {
if (blacklistMap.count(atomic.first) == 0) {
- ret.insert(make_pair(atomic.first, std::to_string(atomic.second->load())));
+ ret.insert(make_pair(atomic.first, StatsMapEntry{getPrometheusName(atomic.first), std::to_string(atomic.second->load())}));
}
}
for(const auto& the64bitmembers : d_get64bitmembers) {
if (blacklistMap.count(the64bitmembers.first) == 0) {
- ret.insert(make_pair(the64bitmembers.first, std::to_string(the64bitmembers.second())));
+ ret.insert(make_pair(the64bitmembers.first, StatsMapEntry{getPrometheusName(the64bitmembers.first), std::to_string(the64bitmembers.second())}));
}
}
std::lock_guard<std::mutex> l(d_dynmetricslock);
for(const auto& a : d_dynmetrics) {
if (blacklistMap.count(a.first) == 0) {
- ret.insert({prometheusNames ? a.second.d_prometheusName : a.first,
- std::to_string(*a.second.d_ptr)});
+ ret.insert(make_pair(a.first, StatsMapEntry{a.second.d_prometheusName, std::to_string(*a.second.d_ptr)}));
}
}
}
static string getAllStats()
{
- typedef map<string, string> varmap_t;
- varmap_t varmap = getAllStatsMap(StatComponent::RecControl);
+ auto varmap = getAllStatsMap(StatComponent::RecControl);
string ret;
- for(varmap_t::value_type& tup : varmap) {
- ret += tup.first + "\t" + tup.second +"\n";
+ for (const auto& tup : varmap) {
+ ret += tup.first + "\t" + tup.second.d_value + "\n";
}
return ret;
}
void productServerStatisticsFetch(map<string,string>& out)
{
- map<string,string> stats = getAllStatsMap(StatComponent::API);
- out.swap(stats);
+ auto stats = getAllStatsMap(StatComponent::API);
+ map<string,string> ret;
+ for (const auto& entry: stats) {
+ ret.insert(make_pair(entry.first, entry.second.d_value));
+ }
+ out.swap(ret);
}
boost::optional<uint64_t> productServerStatisticsFetch(const std::string& name)
registerAllStats();
-
std::ostringstream output;
- typedef map <string, string> varmap_t;
-
+
// Argument controls blacklisting of any stats. So
// stats-api-blacklist will be used to block returned stats.
- // Second arg tells to use the prometheus names.
- varmap_t varmap = getAllStatsMap(StatComponent::API, true);
- for (const auto &tup : varmap) {
+ auto varmap = getAllStatsMap(StatComponent::API);
+ for (const auto& tup : varmap) {
std::string metricName = tup.first;
- std::string prometheusMetricName = "pdns_recursor_" + metricName;
+ std::string prometheusMetricName = tup.second.d_prometheusName;
MetricDefinition metricDetails;
output << "# HELP " << prometheusMetricName << " " << metricDetails.description << "\n";
output << "# TYPE " << prometheusMetricName << " " << prometheusTypeName << "\n";
}
- output << prometheusMetricName << " " << tup.second << "\n";
+ output << prometheusMetricName << " " << tup.second.d_value << "\n";
}
output << "# HELP pdns_recursor_info " << "Info from pdns_recursor, value is always 1" << "\n";
resp->body = output.str();
resp->headers["Content-Type"] = "text/plain";
resp->status = 200;
-
}