From f0553866f860ecaeb4e4d1632ce28e3d292b28dc Mon Sep 17 00:00:00 2001 From: Justine Date: Sun, 3 Jul 2022 17:04:01 +0200 Subject: [PATCH] Now using labels --- knot-prom.py | 86 ++++++++++++++++++++++------------------------------ 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/knot-prom.py b/knot-prom.py index 559e96d..70adee6 100644 --- a/knot-prom.py +++ b/knot-prom.py @@ -24,62 +24,28 @@ def get_stats(): statname = statname.replace("[", "_") statname = statname.replace("]", "") stats[statname] = int(result[1]) - return stats def gen_metrics(): ''' Generate all the prometheus metrics + Set labels. We only have single-labels for now. Please don't try multi-labels. Return them as a list ''' metrics = [ Gauge('server_zone_count', 'Number of zones'), - Gauge('mod_rrl_slipped', 'Queries that were truncated because of response rate limiting'), - Gauge('mod_rrl_dropped', 'Queries that were dropped because of response rate limiting'), - Gauge('mod_stats_request_protocol_udp4', 'requests via udp in ipv4'), - Gauge('mod_stats_request_protocol_tcp4', 'requests via tcp in ipv4'), - Gauge('mod_stats_server_operation_query', 'Total number of incoming queries'), - Gauge('mod_stats_server_operation_axfr', 'Total number of incoming complete transfer requests'), - Gauge('mod_stats_server_operation_ixfr', 'Total number of incoming incremental transfer requests'), - Gauge('mod_stats_server_operation_invalid', 'Invalid requests received'), - Gauge('mod_stats_request_bytes_query', 'Bytes received responding to queries'), - Gauge('mod_stats_request_bytes_other', 'Bytes received responding to other things'), - Gauge('mod_stats_response_bytes_reply', 'Bytes sent responding to queries'), - Gauge('mod_stats_response_bytes_transfer', 'Bytes sent responding to transfers'), - Gauge('mod_stats_response_bytes_other', 'Bytes sent responding to other'), - Gauge('mod_stats_edns_presence_request', 'DNS Extension (EDNS) present in request'), - Gauge('mod_stats_edns_presence_response', 'DNS Extension (EDNS) present in response'), - Gauge('mod_stats_flag_presence_DO', 'Flag DNSSEC OK present in request'), - Gauge('mod_stats_flag_presence_TC', 'Truncated Answer in response'), - Gauge('mod_stats_response_code_NOERROR', 'outgoing response code NOERROR'), - Gauge('mod_stats_response_code_FORMERR', 'outgoing response code FORMERR'), - Gauge('mod_stats_response_code_NXDOMAIN', 'outgoing response code NXDOMAIN'), - Gauge('mod_stats_response_code_NOTIMPL', 'outgoing response code NOTIMPL'), - Gauge('mod_stats_response_code_REFUSED', 'outgoing response code REFUSED'), - Gauge('mod_stats_response_code_NOTAUTH', 'outgoing response code NOTAUTH'), - Gauge('mod_stats_request_edns_option_NSID', 'Extended DNS (EDNS) option NSID in request'), - Gauge('mod_stats_request_edns_option_EDNS_CLIENT_SUBNET', 'Extended DNS (EDNS) option CLIENT_SUBNET in request'), - Gauge('mod_stats_request_edns_option_COOKIE', 'Extended DNS (EDNS) option COOKIE in request'), - Gauge('mod_stats_response_edns_option_NSID', 'Extended DNS (EDNS) option NSID in response'), - Gauge('mod_stats_reply_nodata_A', 'RFC 2308 Nodata A in reply'), - Gauge('mod_stats_reply_nodata_AAAA', 'RFC 2308 Nodata AAAA in reply'), - Gauge('mod_stats_reply_nodata_other', 'RFC 2308 Nodata other in reply'), - Gauge('mod_stats_query_type_A', 'Number of A queries'), - Gauge('mod_stats_query_type_NS', 'Number of A queries'), - Gauge('mod_stats_query_type_CNAME', 'Number of A queries'), - Gauge('mod_stats_query_type_SOA', 'Number of A queries'), - Gauge('mod_stats_query_type_MX', 'Number of A queries'), - Gauge('mod_stats_query_type_TXT', 'Number of A queries'), - Gauge('mod_stats_query_type_AAAA', 'Number of A queries'), - Gauge('mod_stats_query_type_SRV', 'Number of A queries'), - Gauge('mod_stats_query_type_DNAME', 'Number of A queries'), - Gauge('mod_stats_query_type_DS', 'Number of A queries'), - Gauge('mod_stats_query_type_RRSIG', 'Number of A queries'), - Gauge('mod_stats_query_type_DNSKEY', 'Number of A queries'), - Gauge('mod_stats_query_type_TLSA', 'Number of A queries'), - Gauge('mod_stats_query_type_HTTPS', 'Number of A queries'), - Gauge('mod_stats_query_type_ANY', 'Number of A queries'), - Gauge('mod_stats_query_type_CAA', 'Number of A queries') + Gauge('mod_rrl', 'Queries that were truncated or dropped because of response rate limiting', ['type']), + Gauge('mod_stats_request_protocol', 'requests via udp or tcp in ipv4', ['protocol']), + Gauge('mod_stats_server_operation', 'Total number of incoming queries', ['type']), + Gauge('mod_stats_request_bytes', 'Bytes received responding to queries', ['type']), + Gauge('mod_stats_response_bytes', 'Bytes sent responding to queries', ['type']), + Gauge('mod_stats_edns_presence', 'DNS Extension (EDNS) present in request or response', ['type']), + Gauge('mod_stats_flag_presence', 'Flag present in request', ['flag']), + Gauge('mod_stats_response_code', 'outgoing response code', ['code']), + Gauge('mod_stats_request_edns_option', 'Extended DNS (EDNS) option in request', ['option']), + Gauge('mod_stats_response_edns_option', 'Extended DNS (EDNS) option in response', ['option']), + Gauge('mod_stats_reply_nodata', 'RFC 2308 Nodata in reply', ['type']), + Gauge('mod_stats_query_type', 'Number of queries by type', ['type']), ] return metrics @@ -89,17 +55,39 @@ def populate_metrics(stats, metrics): Populate the metrics with the stats Return the metrics ''' + #These metrics don't use labels + nolabel_metrics = ["server_zone_count"] + for statname in stats: + statvalue = stats[statname] + if statname not in nolabel_metrics: + #Getting the statname, its label's value, and corresponding metric to set to it + #A metrics label value is implied by the last field in the stats name + #Example : stat mods_query_type_A corresponds will be metrics mods_query_type with label + #type set to A + statname = statname.split("_") + label = statname.pop(-1) + statname = "_".join(statname) + else: + label = "Nolabel" + for metric in metrics: - if statname == metric._name: - metric.set(stats[statname]) + if statname == metric._name and label != "Nolabel": + labelname = metric._labelnames + for i in labelname: + labelname = i + metric.labels(label).set(statvalue) + elif statname == metric._name and label == "Nolabel": + metric.set(statvalue) return metrics def main(): + print("Initializing knot's prometheus exporter...") metrics = gen_metrics() start_http_server(8001) + print("Started http server on port 8001") while True: stats = get_stats() metrics = populate_metrics(stats, metrics)