]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a Lua FFI interface for metrics 12385/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 24 Jun 2022 13:49:17 +0000 (15:49 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 16 Dec 2022 09:36:42 +0000 (10:36 +0100)
pdns/dnsdist.hh
pdns/dnsdistdist/dnsdist-lua-ffi-interface.h
pdns/dnsdistdist/dnsdist-lua-ffi.cc

index f93ee063a66f59f78d716c7071beb5003d3b9fd9..0880e150d951cbfb092ec61be0b6ae7b73afb00f 100644 (file)
@@ -452,8 +452,8 @@ struct DNSDistStats
     {"latency-sum", &latencySum},
     {"latency-count", &latencyCount},
   };
-  std::map<std::string, stat_t> customCounters;
-  std::map<std::string, pdns::stat_t_trait<double> > customGauges;
+  std::map<std::string, stat_t, std::less<>> customCounters;
+  std::map<std::string, pdns::stat_t_trait<double>, std::less<>> customGauges;
 };
 
 extern struct DNSDistStats g_stats;
index 7f2cc601b186e1fcbbd8b31955de378550f9169f..b74409f2c7691ff65e6f75bcd1f7f386bf76c771 100644 (file)
@@ -202,3 +202,8 @@ uint32_t dnsdist_ffi_dnspacket_get_record_ttl(const dnsdist_ffi_dnspacket_t* pac
 uint16_t dnsdist_ffi_dnspacket_get_record_content_length(const dnsdist_ffi_dnspacket_t* packet, size_t idx) __attribute__ ((visibility ("default")));
 uint16_t dnsdist_ffi_dnspacket_get_record_content_offset(const dnsdist_ffi_dnspacket_t* packet, size_t idx) __attribute__ ((visibility ("default")));
 void dnsdist_ffi_dnspacket_free(dnsdist_ffi_dnspacket_t*) __attribute__ ((visibility ("default")));
+
+void dnsdist_ffi_metric_inc(const char* metricName, size_t metricNameLen) __attribute__ ((visibility ("default")));
+void dnsdist_ffi_metric_dec(const char* metricName, size_t metricNameLen) __attribute__ ((visibility ("default")));
+void dnsdist_ffi_metric_set(const char* metricName, size_t metricNameLen, double value) __attribute__ ((visibility ("default")));
+double dnsdist_ffi_metric_get(const char* metricName, size_t metricNameLen, bool isCounter) __attribute__ ((visibility ("default")));
index 9ff6a2d429cbfd2d4a84f465a526e31e42d32ce9..8fc98ae49c013da6fbe00b5ce5b6e8c16d73e013 100644 (file)
@@ -1249,3 +1249,45 @@ void dnsdist_ffi_dnspacket_free(dnsdist_ffi_dnspacket_t* packet)
     delete packet;
   }
 }
+
+void dnsdist_ffi_metric_inc(const char* metricName, size_t metricNameLen)
+{
+  auto metric = g_stats.customCounters.find(std::string_view(metricName, metricNameLen));
+  if (metric != g_stats.customCounters.end()) {
+    ++metric->second;
+  }
+}
+
+void dnsdist_ffi_metric_dec(const char* metricName, size_t metricNameLen)
+{
+  auto metric = g_stats.customCounters.find(std::string_view(metricName, metricNameLen));
+  if (metric != g_stats.customCounters.end()) {
+    --metric->second;
+  }
+}
+
+void dnsdist_ffi_metric_set(const char* metricName, size_t metricNameLen, double value)
+{
+  auto metric = g_stats.customGauges.find(std::string_view(metricName, metricNameLen));
+  if (metric != g_stats.customGauges.end()) {
+    metric->second = value;
+  }
+}
+
+double dnsdist_ffi_metric_get(const char* metricName, size_t metricNameLen, bool isCounter)
+{
+  auto name = std::string_view(metricName, metricNameLen);
+  if (isCounter) {
+    auto counter = g_stats.customCounters.find(name);
+    if (counter != g_stats.customCounters.end()) {
+      return (double)counter->second.load();
+    }
+  }
+  else {
+    auto gauge = g_stats.customGauges.find(name);
+    if (gauge != g_stats.customGauges.end()) {
+      return gauge->second.load();
+    }
+  }
+  return 0.;
+}