X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fpowerdns.c;h=c392f0f64e128970f5f52ed9977c309f1a9054d3;hb=4979d8dcd6f097eb8fd4661086e28accd31ff905;hp=c9e9359acca8adec99e8a5fbbcdd04dc5d708929;hpb=b4cc5c7399adf79198aea816d44a42df25431d15;p=collectd.git diff --git a/src/powerdns.c b/src/powerdns.c index c9e9359a..c392f0f6 100644 --- a/src/powerdns.c +++ b/src/powerdns.c @@ -25,9 +25,9 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" #include "utils_llist.h" #include @@ -37,7 +37,6 @@ #include #include #include -#include #include #ifndef UNIX_PATH_MAX @@ -51,7 +50,7 @@ #define RECURSOR_SOCKET LOCALSTATEDIR"/run/pdns_recursor.controlsocket" #define RECURSOR_COMMAND "get noerror-answers nxdomain-answers " \ "servfail-answers sys-msec user-msec qa-latency cache-entries cache-hits " \ - "cache-misses questions\n" + "cache-misses questions \n" struct list_item_s; typedef struct list_item_s list_item_t; @@ -76,52 +75,75 @@ struct list_item_s struct statname_lookup_s { - char *name; - char *type; - char *type_instance; + const char *name; + const char *type; + const char *type_instance; }; typedef struct statname_lookup_s statname_lookup_t; /* Description of statistics returned by the recursor: {{{ -all-outqueries counts the number of outgoing UDP queries since starting -answers0-1 counts the number of queries answered within 1 millisecond -answers100-1000 counts the number of queries answered within 1 second -answers10-100 counts the number of queries answered within 100 milliseconds -answers1-10 counts the number of queries answered within 10 milliseconds -answers-slow counts the number of queries answered after 1 second -cache-entries shows the number of entries in the cache -cache-hits counts the number of cache hits since starting -cache-misses counts the number of cache misses since starting -chain-resends number of queries chained to existing outstanding query -client-parse-errors counts number of client packets that could not be parsed -concurrent-queries shows the number of MThreads currently running -dlg-only-drops number of records dropped because of delegation only setting -negcache-entries shows the number of entries in the Negative answer cache -noerror-answers counts the number of times it answered NOERROR since starting -nsspeeds-entries shows the number of entries in the NS speeds map -nsset-invalidations number of times an nsset was dropped because it no longer worked -nxdomain-answers counts the number of times it answered NXDOMAIN since starting -outgoing-timeouts counts the number of timeouts on outgoing UDP queries since starting -qa-latency shows the current latency average -questions counts all End-user initiated queries with the RD bit set -resource-limits counts number of queries that could not be performed because of resource limits -server-parse-errors counts number of server replied packets that could not be parsed -servfail-answers counts the number of times it answered SERVFAIL since starting -spoof-prevents number of times PowerDNS considered itself spoofed, and dropped the data -sys-msec number of CPU milliseconds spent in 'system' mode -tcp-client-overflow number of times an IP address was denied TCP access because it already had too many connections -tcp-outqueries counts the number of outgoing TCP queries since starting -tcp-questions counts all incoming TCP queries (since starting) -throttled-out counts the number of throttled outgoing UDP queries since starting -throttle-entries shows the number of entries in the throttle map -unauthorized-tcp number of TCP questions denied because of allow-from restrictions -unauthorized-udp number of UDP questions denied because of allow-from restrictions -unexpected-packets number of answers from remote servers that were unexpected (might point to spoofing) -uptime number of seconds process has been running (since 3.1.5) -user-msec number of CPU milliseconds spent in 'user' mode +all-outqueries counts the number of outgoing UDP queries since starting +answers-slow counts the number of queries answered after 1 second +answers0-1 counts the number of queries answered within 1 millisecond +answers1-10 counts the number of queries answered within 10 milliseconds +answers10-100 counts the number of queries answered within 100 milliseconds +answers100-1000 counts the number of queries answered within 1 second +cache-bytes size of the cache in bytes (since 3.3.1) +cache-entries shows the number of entries in the cache +cache-hits counts the number of cache hits since starting, this does not include hits that got answered from the packet-cache +cache-misses counts the number of cache misses since starting +case-mismatches counts the number of mismatches in character case since starting +chain-resends number of queries chained to existing outstanding query +client-parse-errors counts number of client packets that could not be parsed +concurrent-queries shows the number of MThreads currently running +dlg-only-drops number of records dropped because of delegation only setting +dont-outqueries number of outgoing queries dropped because of 'dont-query' setting (since 3.3) +edns-ping-matches number of servers that sent a valid EDNS PING respons +edns-ping-mismatches number of servers that sent an invalid EDNS PING response +failed-host-entries number of servers that failed to resolve +ipv6-outqueries number of outgoing queries over IPv6 +ipv6-questions counts all End-user initiated queries with the RD bit set, received over IPv6 UDP +malloc-bytes returns the number of bytes allocated by the process (broken, always returns 0) +max-mthread-stack maximum amount of thread stack ever used +negcache-entries shows the number of entries in the Negative answer cache +no-packet-error number of errorneous received packets +noedns-outqueries number of queries sent out without EDNS +noerror-answers counts the number of times it answered NOERROR since starting +noping-outqueries number of queries sent out without ENDS PING +nsset-invalidations number of times an nsset was dropped because it no longer worked +nsspeeds-entries shows the number of entries in the NS speeds map +nxdomain-answers counts the number of times it answered NXDOMAIN since starting +outgoing-timeouts counts the number of timeouts on outgoing UDP queries since starting +over-capacity-drops questions dropped because over maximum concurrent query limit (since 3.2) +packetcache-bytes size of the packet cache in bytes (since 3.3.1) +packetcache-entries size of packet cache (since 3.2) +packetcache-hits packet cache hits (since 3.2) +packetcache-misses packet cache misses (since 3.2) +policy-drops packets dropped because of (Lua) policy decision +qa-latency shows the current latency average +questions counts all end-user initiated queries with the RD bit set +resource-limits counts number of queries that could not be performed because of resource limits +security-status security status based on security polling +server-parse-errors counts number of server replied packets that could not be parsed +servfail-answers counts the number of times it answered SERVFAIL since starting +spoof-prevents number of times PowerDNS considered itself spoofed, and dropped the data +sys-msec number of CPU milliseconds spent in 'system' mode +tcp-client-overflow number of times an IP address was denied TCP access because it already had too many connections +tcp-clients counts the number of currently active TCP/IP clients +tcp-outqueries counts the number of outgoing TCP queries since starting +tcp-questions counts all incoming TCP queries (since starting) +throttle-entries shows the number of entries in the throttle map +throttled-out counts the number of throttled outgoing UDP queries since starting +throttled-outqueries idem to throttled-out +unauthorized-tcp number of TCP questions denied because of allow-from restrictions +unauthorized-udp number of UDP questions denied because of allow-from restrictions +unexpected-packets number of answers from remote servers that were unexpected (might point to spoofing) +unreachables number of times nameservers were unreachable since starting +uptime number of seconds process has been running (since 3.1.5) +user-msec number of CPU milliseconds spent in 'user' mode }}} */ -const char* const default_server_fields[] = /* {{{ */ +static const char* const default_server_fields[] = /* {{{ */ { "latency", "packetcache-hit", @@ -136,9 +158,9 @@ const char* const default_server_fields[] = /* {{{ */ "udp-answers", "udp-queries", }; /* }}} */ -int default_server_fields_num = STATIC_ARRAY_SIZE (default_server_fields); +static int default_server_fields_num = STATIC_ARRAY_SIZE (default_server_fields); -statname_lookup_t lookup_table[] = /* {{{ */ +static statname_lookup_t lookup_table[] = /* {{{ */ { /********************* * Server statistics * @@ -157,8 +179,13 @@ statname_lookup_t lookup_table[] = /* {{{ */ {"udp-answers-bytes", "total_bytes", "udp-answers-bytes"}, /* Cache stuff */ + {"cache-bytes", "cache_size", "cache-bytes"}, + {"packetcache-bytes", "cache_size", "packet-bytes"}, + {"packetcache-entries", "cache_size", "packet-entries"}, {"packetcache-hit", "cache_result", "packet-hit"}, + {"packetcache-hits", "cache_result", "packet-hit"}, {"packetcache-miss", "cache_result", "packet-miss"}, + {"packetcache-misses", "cache_result", "packet-miss"}, {"packetcache-size", "cache_size", "packet"}, {"key-cache-size", "cache_size", "key"}, {"meta-cache-size", "cache_size", "meta"}, @@ -179,6 +206,7 @@ statname_lookup_t lookup_table[] = /* {{{ */ {"corrupt-packets", "ipt_packets", "corrupt"}, {"deferred-cache-inserts", "counter", "cache-deferred_insert"}, {"deferred-cache-lookup", "counter", "cache-deferred_lookup"}, + {"dont-outqueries", "dns_question", "dont-outqueries"}, {"qsize-a", "cache_size", "answers"}, {"qsize-q", "cache_size", "questions"}, {"servfail-packets", "ipt_packets", "servfail"}, @@ -195,54 +223,69 @@ statname_lookup_t lookup_table[] = /* {{{ */ * Recursor statistics * ***********************/ /* Answers by return code */ - {"noerror-answers", "dns_rcode", "NOERROR"}, - {"nxdomain-answers", "dns_rcode", "NXDOMAIN"}, - {"servfail-answers", "dns_rcode", "SERVFAIL"}, + {"noerror-answers", "dns_rcode", "NOERROR"}, + {"nxdomain-answers", "dns_rcode", "NXDOMAIN"}, + {"servfail-answers", "dns_rcode", "SERVFAIL"}, /* CPU utilization */ - {"sys-msec", "cpu", "system"}, - {"user-msec", "cpu", "user"}, + {"sys-msec", "cpu", "system"}, + {"user-msec", "cpu", "user"}, /* Question-to-answer latency */ - {"qa-latency", "latency", NULL}, + {"qa-latency", "latency", NULL}, /* Cache */ - {"cache-entries", "cache_size", NULL}, - {"cache-hits", "cache_result", "hit"}, - {"cache-misses", "cache_result", "miss"}, + {"cache-entries", "cache_size", NULL}, + {"cache-hits", "cache_result", "hit"}, + {"cache-misses", "cache_result", "miss"}, /* Total number of questions.. */ - {"questions", "dns_qtype", "total"}, + {"questions", "dns_qtype", "total"}, /* All the other stuff.. */ - {"all-outqueries", "dns_question", "outgoing"}, - {"answers0-1", "dns_answer", "0_1"}, - {"answers1-10", "dns_answer", "1_10"}, - {"answers10-100", "dns_answer", "10_100"}, - {"answers100-1000", "dns_answer", "100_1000"}, - {"answers-slow", "dns_answer", "slow"}, - {"chain-resends", "dns_question", "chained"}, - {"client-parse-errors", "counter", "drops-client_parse_error"}, - {"concurrent-queries", "dns_question", "concurrent"}, - {"dlg-only-drops", "counter", "drops-delegation_only"}, - {"negcache-entries", "cache_size", "negative"}, - {"nsspeeds-entries", "gauge", "entries-ns_speeds"}, - {"nsset-invalidations", "counter", "ns_set_invalidation"}, - {"outgoing-timeouts", "counter", "drops-timeout_outgoing"}, - {"resource-limits", "counter", "drops-resource_limit"}, - {"server-parse-errors", "counter", "drops-server_parse_error"}, - {"spoof-prevents", "counter", "drops-spoofed"}, - {"tcp-client-overflow", "counter", "denied-client_overflow_tcp"}, - {"tcp-outqueries", "dns_question", "outgoing-tcp"}, - {"tcp-questions", "dns_question", "incoming-tcp"}, - {"throttled-out", "dns_question", "outgoing-throttled"}, - {"throttle-entries", "gauge", "entries-throttle"}, - {"unauthorized-tcp", "counter", "denied-unauthorized_tcp"}, - {"unauthorized-udp", "counter", "denied-unauthorized_udp"}, - {"unexpected-packets", "dns_answer", "unexpected"}, - {"uptime", "uptime", NULL} + {"all-outqueries", "dns_question", "outgoing"}, + {"answers0-1", "dns_answer", "0_1"}, + {"answers1-10", "dns_answer", "1_10"}, + {"answers10-100", "dns_answer", "10_100"}, + {"answers100-1000", "dns_answer", "100_1000"}, + {"answers-slow", "dns_answer", "slow"}, + {"case-mismatches", "counter", "case_mismatches"}, + {"chain-resends", "dns_question", "chained"}, + {"client-parse-errors", "counter", "drops-client_parse_error"}, + {"concurrent-queries", "dns_question", "concurrent"}, + {"dlg-only-drops", "counter", "drops-delegation_only"}, + {"edns-ping-matches", "counter", "edns-ping_matches"}, + {"edns-ping-mismatches", "counter", "edns-ping_mismatches"}, + {"failed-host-entries", "counter", "entries-failed_host"}, + {"ipv6-outqueries", "dns_question", "outgoing-ipv6"}, + {"ipv6-questions", "dns_question", "incoming-ipv6"}, + {"malloc-bytes", "gauge", "malloc_bytes"}, + {"max-mthread-stack", "gauge", "max_mthread_stack"}, + {"no-packet-error", "gauge", "no_packet_error"}, + {"noedns-outqueries", "dns_question", "outgoing-noedns"}, + {"noping-outqueries", "dns_question", "outgoing-noping"}, + {"over-capacity-drops", "dns_question", "incoming-over_capacity"}, + {"negcache-entries", "cache_size", "negative"}, + {"nsspeeds-entries", "gauge", "entries-ns_speeds"}, + {"nsset-invalidations", "counter", "ns_set_invalidation"}, + {"outgoing-timeouts", "counter", "drops-timeout_outgoing"}, + {"policy-drops", "counter", "drops-policy"}, + {"resource-limits", "counter", "drops-resource_limit"}, + {"server-parse-errors", "counter", "drops-server_parse_error"}, + {"spoof-prevents", "counter", "drops-spoofed"}, + {"tcp-client-overflow", "counter", "denied-client_overflow_tcp"}, + {"tcp-clients", "gauge", "clients-tcp"}, + {"tcp-outqueries", "dns_question", "outgoing-tcp"}, + {"tcp-questions", "dns_question", "incoming-tcp"}, + {"throttled-out", "dns_question", "outgoing-throttled"}, + {"throttle-entries", "gauge", "entries-throttle"}, + {"throttled-outqueries", "dns_question", "outgoing-throttle"}, + {"unauthorized-tcp", "counter", "denied-unauthorized_tcp"}, + {"unauthorized-udp", "counter", "denied-unauthorized_udp"}, + {"unexpected-packets", "dns_answer", "unexpected"}, + {"uptime", "uptime", NULL} }; /* }}} */ -int lookup_table_length = STATIC_ARRAY_SIZE (lookup_table); +static int lookup_table_length = STATIC_ARRAY_SIZE (lookup_table); static llist_t *list = NULL; @@ -250,14 +293,12 @@ static llist_t *list = NULL; static char *local_sockpath = NULL; /* TODO: Do this before 4.4: - * - Recursor: - * - Complete list of known pdns -> collectd mappings. * - Update the collectd.conf(5) manpage. * * -octo */ -/* */ +/* */ static void submit (const char *plugin_instance, /* {{{ */ const char *pdns_type, const char *value) { @@ -298,7 +339,7 @@ static void submit (const char *plugin_instance, /* {{{ */ if (ds->ds_num != 1) { - ERROR ("powerdns plugin: type `%s' has %i data sources, " + ERROR ("powerdns plugin: type `%s' has %zu data sources, " "but I can only handle one.", type, ds->ds_num); return; @@ -334,7 +375,7 @@ static int powerdns_get_data_dgram (list_item_t *item, /* {{{ */ char *buffer = NULL; size_t buffer_size = 0; - struct sockaddr_un sa_unix; + struct sockaddr_un sa_unix = { 0 }; struct timeval stv_timeout; cdtime_t cdt_timeout; @@ -346,7 +387,6 @@ static int powerdns_get_data_dgram (list_item_t *item, /* {{{ */ return (-1); } - memset (&sa_unix, 0, sizeof (sa_unix)); sa_unix.sun_family = AF_UNIX; sstrncpy (sa_unix.sun_path, (local_sockpath != NULL) ? local_sockpath : PDNS_LOCAL_SOCKPATH, @@ -424,7 +464,7 @@ static int powerdns_get_data_dgram (list_item_t *item, /* {{{ */ return (-1); assert (buffer_size > 0); - buffer = (char *) malloc (buffer_size); + buffer = malloc (buffer_size); if (buffer == NULL) { FUNC_ERROR ("malloc"); @@ -501,7 +541,7 @@ static int powerdns_get_data_stream (list_item_t *item, /* {{{ */ else if (status == 0) break; - buffer_new = (char *) realloc (buffer, buffer_size + status + 1); + buffer_new = realloc (buffer, buffer_size + status + 1); if (buffer_new == NULL) { FUNC_ERROR ("realloc"); @@ -590,8 +630,6 @@ static int powerdns_read_server (list_item_t *item) /* {{{ */ saveptr = NULL; while ((key = strtok_r (dummy, ",", &saveptr)) != NULL) { - int i; - dummy = NULL; value = strchr (key, '='); @@ -605,6 +643,7 @@ static int powerdns_read_server (list_item_t *item) /* {{{ */ continue; /* Check if this item was requested. */ + int i; for (i = 0; i < fields_num; i++) if (strcasecmp (key, fields[i]) == 0) break; @@ -650,12 +689,12 @@ static int powerdns_update_recursor_command (list_item_t *li) /* {{{ */ return (-1); } buffer[sizeof (buffer) - 1] = 0; - int i = strlen (buffer); - if (i < sizeof (buffer) - 2) + size_t len = strlen (buffer); + if (len < sizeof (buffer) - 2) { - buffer[i++] = ' '; - buffer[i++] = '\n'; - buffer[i++] = '\0'; + buffer[len++] = ' '; + buffer[len++] = '\n'; + buffer[len++] = '\0'; } } @@ -740,7 +779,6 @@ static int powerdns_read_recursor (list_item_t *item) /* {{{ */ static int powerdns_config_add_collect (list_item_t *li, /* {{{ */ oconfig_item_t *ci) { - int i; char **temp; if (ci->values_num < 1) @@ -750,7 +788,7 @@ static int powerdns_config_add_collect (list_item_t *li, /* {{{ */ return (-1); } - for (i = 0; i < ci->values_num; i++) + for (int i = 0; i < ci->values_num; i++) if (ci->values[i].type != OCONFIG_TYPE_STRING) { WARNING ("powerdns plugin: Only string arguments are allowed to " @@ -758,7 +796,7 @@ static int powerdns_config_add_collect (list_item_t *li, /* {{{ */ return (-1); } - temp = (char **) realloc (li->fields, + temp = realloc (li->fields, sizeof (char *) * (li->fields_num + ci->values_num)); if (temp == NULL) { @@ -767,7 +805,7 @@ static int powerdns_config_add_collect (list_item_t *li, /* {{{ */ } li->fields = temp; - for (i = 0; i < ci->values_num; i++) + for (int i = 0; i < ci->values_num; i++) { li->fields[li->fields_num] = strdup (ci->values[i].value.string); if (li->fields[li->fields_num] == NULL) @@ -790,7 +828,6 @@ static int powerdns_config_add_server (oconfig_item_t *ci) /* {{{ */ list_item_t *item; int status; - int i; if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { @@ -799,13 +836,12 @@ static int powerdns_config_add_server (oconfig_item_t *ci) /* {{{ */ return (-1); } - item = (list_item_t *) malloc (sizeof (list_item_t)); + item = calloc (1, sizeof (*item)); if (item == NULL) { - ERROR ("powerdns plugin: malloc failed."); + ERROR ("powerdns plugin: calloc failed."); return (-1); } - memset (item, '\0', sizeof (list_item_t)); item->instance = strdup (ci->values[0].value.string); if (item->instance == NULL) @@ -840,7 +876,7 @@ static int powerdns_config_add_server (oconfig_item_t *ci) /* {{{ */ } status = 0; - for (i = 0; i < ci->children_num; i++) + for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; @@ -900,8 +936,6 @@ static int powerdns_config_add_server (oconfig_item_t *ci) /* {{{ */ static int powerdns_config (oconfig_item_t *ci) /* {{{ */ { - int i; - DEBUG ("powerdns plugin: powerdns_config (ci = %p);", (void *) ci); if (list == NULL) @@ -915,7 +949,7 @@ static int powerdns_config (oconfig_item_t *ci) /* {{{ */ } } - for (i = 0; i < ci->children_num; i++) + for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; @@ -948,9 +982,7 @@ static int powerdns_config (oconfig_item_t *ci) /* {{{ */ static int powerdns_read (void) { - llentry_t *e; - - for (e = llist_head (list); e != NULL; e = e->next) + for (llentry_t *e = llist_head (list); e != NULL; e = e->next) { list_item_t *item = e->value; item->func (item); @@ -961,12 +993,10 @@ static int powerdns_read (void) static int powerdns_shutdown (void) { - llentry_t *e; - if (list == NULL) return (0); - for (e = llist_head (list); e != NULL; e = e->next) + for (llentry_t *e = llist_head (list); e != NULL; e = e->next) { list_item_t *item = (list_item_t *) e->value; e->value = NULL;