From: Jakub Jankowski Date: Tue, 14 May 2019 00:00:18 +0000 (+0200) Subject: curl_json plugin: add AddressFamily X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=b167ebe5bbd250659b21177414671e6fdb1b3bd0;p=collectd.git curl_json plugin: add AddressFamily In situations when hostnames in URLs resolve to both IPv4 and IPv6 addresses, sometimes it's useful to have separate statistics for both of these separately. With this commit, within block you can set AddressFamily "ipv6" or AddressFamily "ipv4" to specifically use one or the other. Signed-off-by: Jakub Jankowski --- diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 335ec8c5..f1c82c55 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -426,6 +426,7 @@ # # +# AddressFamily "any" # Instance "test_http_json" # # Type "gauge" @@ -462,6 +463,7 @@ # } ## See: http://wiki.apache.org/couchdb/Runtime_Statistics # +# AddressFamily "ipv4" # Instance "httpd" # # Type "http_requests" @@ -477,6 +479,7 @@ # ## Database status metrics: # +# AddressFamily "ipv6" # Instance "dbs" # # Type "gauge" diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 56be262c..70ed9bce 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -1959,6 +1959,7 @@ C<_stats> runtime statistics module of I + AddressFamily "any" Instance "httpd" Type "http_requests" @@ -2003,6 +2004,18 @@ The following options are valid within B blocks: =over 4 +=item B I + +IP version to resolve URL to. Useful in cases when hostname in URL resolves +to both IPv4 and IPv6 addresses, and you are interested in using one of them +specifically. +Use C to enforce IPv4, C to enforce IPv6, or C to keep the +default behavior of resolving addresses to all IP versions your system allows. +If C is compiled without IPv6 support, using C will result in +a warning and fallback to C. +If C cannot be parsed, a warning will be printed and the whole B +block will be ignored. + =item B I Use I as the host name when submitting values. Defaults to the global diff --git a/src/curl_json.c b/src/curl_json.c index dedfed05..4f7852f9 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -88,6 +88,7 @@ struct cj_s /* {{{ */ char *sock; char *url; + int address_family; char *user; char *pass; char *credentials; @@ -582,6 +583,7 @@ static int cj_init_curl(cj_t *db) /* {{{ */ curl_easy_setopt(db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf); curl_easy_setopt(db->curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(db->curl, CURLOPT_MAXREDIRS, 50L); + curl_easy_setopt(db->curl, CURLOPT_IPRESOLVE, db->address_family); if (db->user != NULL) { #ifdef HAVE_CURLOPT_USERNAME @@ -649,6 +651,7 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */ } db->timeout = -1; + db->address_family = CURL_IPRESOLVE_WHATEVER; if (strcasecmp("URL", ci->key) == 0) status = cf_util_get_string(ci, &db->url); @@ -702,6 +705,31 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */ db->stats = curl_stats_from_config(child); if (db->stats == NULL) status = -1; + } else if (db->url && strcasecmp("AddressFamily", child->key) == 0) { + char *af = NULL; + status = cf_util_get_string(child, &af); + if (status != 0 || af == NULL) { + WARNING("curl_json plugin: Cannot parse value of `%s' for URL `%s'.", + child->key, db->url); + } else if (strcasecmp("any", af) == 0) { + db->address_family = CURL_IPRESOLVE_WHATEVER; + } else if (strcasecmp("ipv4", af) == 0) { + db->address_family = CURL_IPRESOLVE_V4; + } else if (strcasecmp("ipv6", af) == 0) { + /* If curl supports ipv6, use it. If not, log a warning and + * fall back to default - don't set status to non-zero. + */ + curl_version_info_data *curl_info = curl_version_info(CURLVERSION_NOW); + if (curl_info->features & CURL_VERSION_IPV6) + db->address_family = CURL_IPRESOLVE_V6; + else + WARNING("curl_json plugin: IPv6 not supported by this libCURL. " + "Using fallback `any'."); + } else { + WARNING("curl_json plugin: Unsupported value of `%s' for URL `%s'.", + child->key, db->url); + status = -1; + } } else { WARNING("curl_json plugin: Option `%s' not allowed here.", child->key); status = -1;