From: Remi Gacogne Date: Fri, 24 Jun 2022 13:49:17 +0000 (+0200) Subject: dnsdist: Add a Lua FFI interface for metrics X-Git-Tag: dnsdist-1.8.0-rc1~128^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec0799ed6b26a2f67c5f4e03722aae6500712613;p=thirdparty%2Fpdns.git dnsdist: Add a Lua FFI interface for metrics --- diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index f93ee063a6..0880e150d9 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -452,8 +452,8 @@ struct DNSDistStats {"latency-sum", &latencySum}, {"latency-count", &latencyCount}, }; - std::map customCounters; - std::map > customGauges; + std::map> customCounters; + std::map, std::less<>> customGauges; }; extern struct DNSDistStats g_stats; diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h index 7f2cc601b1..b74409f2c7 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h +++ b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h @@ -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"))); diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index 9ff6a2d429..8fc98ae49c 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -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.; +}