X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl.c;h=31cda39a2514f8d0a1993d4482e8525dbdb35cb0;hb=e35f3c5c634216860f14586a7d17232022d8b588;hp=a43e7ed9000781b16390dfb024ce270858b64b86;hpb=19a08d266f623d3697b5ca55689bd57eeaae46a6;p=collectd.git diff --git a/src/curl.c b/src/curl.c index a43e7ed9..31cda39a 100644 --- a/src/curl.c +++ b/src/curl.c @@ -1,6 +1,7 @@ /** * collectd - src/curl.c * Copyright (C) 2006-2009 Florian octo Forster + * Copyright (C) 2009 Aman Gupta * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -17,6 +18,7 @@ * * Authors: * Florian octo Forster + * Aman Gupta **/ #include "collectd.h" @@ -35,6 +37,7 @@ typedef struct web_match_s web_match_t; struct web_match_s /* {{{ */ { char *regex; + char *exclude_regex; int dstype; char *type; char *instance; @@ -57,6 +60,7 @@ struct web_page_s /* {{{ */ int verify_peer; int verify_host; char *cacert; + int response_time; CURL *curl; char curl_errbuf[CURL_ERROR_SIZE]; @@ -288,6 +292,8 @@ static int cc_config_add_match (web_page_t *page, /* {{{ */ if (strcasecmp ("Regex", child->key) == 0) status = cc_config_add_string ("Regex", &match->regex, child); + else if (strcasecmp ("ExcludeRegex", child->key) == 0) + status = cc_config_add_string ("ExcludeRegex", &match->exclude_regex, child); else if (strcasecmp ("DSType", child->key) == 0) status = cc_config_add_match_dstype (&match->dstype, child); else if (strcasecmp ("Type", child->key) == 0) @@ -330,7 +336,8 @@ static int cc_config_add_match (web_page_t *page, /* {{{ */ if (status != 0) return (status); - match->match = match_create_simple (match->regex, match->dstype); + match->match = match_create_simple (match->regex, match->exclude_regex, + match->dstype); if (match->match == NULL) { ERROR ("curl plugin: tail_match_add_match_simple failed."); @@ -363,6 +370,7 @@ static int cc_page_init_curl (web_page_t *wp) /* {{{ */ return (-1); } + curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt (wp->curl, CURLOPT_WRITEFUNCTION, cc_curl_callback); curl_easy_setopt (wp->curl, CURLOPT_WRITEDATA, wp); curl_easy_setopt (wp->curl, CURLOPT_USERAGENT, @@ -424,6 +432,7 @@ static int cc_config_add_page (oconfig_item_t *ci) /* {{{ */ page->pass = NULL; page->verify_peer = 1; page->verify_host = 1; + page->response_time = 0; page->instance = strdup (ci->values[0].value.string); if (page->instance == NULL) @@ -449,6 +458,8 @@ static int cc_config_add_page (oconfig_item_t *ci) /* {{{ */ status = cc_config_set_boolean ("VerifyPeer", &page->verify_peer, child); else if (strcasecmp ("VerifyHost", child->key) == 0) status = cc_config_set_boolean ("VerifyHost", &page->verify_host, child); + else if (strcasecmp ("MeasureResponseTime", child->key) == 0) + status = cc_config_set_boolean (child->key, &page->response_time, child); else if (strcasecmp ("CACert", child->key) == 0) status = cc_config_add_string ("CACert", &page->cacert, child); else if (strcasecmp ("Match", child->key) == 0) @@ -473,11 +484,11 @@ static int cc_config_add_page (oconfig_item_t *ci) /* {{{ */ status = -1; } - if (page->matches == NULL) + if (page->matches == NULL && !page->response_time) { assert (page->instance != NULL); WARNING ("curl plugin: No (valid) `Match' block " - "within `Page' block `%s'.", page->instance); + "or MeasureResponseTime within `Page' block `%s'.", page->instance); status = -1; } @@ -577,10 +588,32 @@ static void cc_submit (const web_page_t *wp, const web_match_t *wm, /* {{{ */ plugin_dispatch_values (&vl); } /* }}} void cc_submit */ +static void cc_submit_response_time (const web_page_t *wp, double seconds) /* {{{ */ +{ + value_t values[1]; + value_list_t vl = VALUE_LIST_INIT; + + values[0].gauge = seconds; + + vl.values = values; + vl.values_len = 1; + vl.time = time (NULL); + sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + sstrncpy (vl.plugin, "curl", sizeof (vl.plugin)); + sstrncpy (vl.plugin_instance, wp->instance, sizeof (vl.plugin_instance)); + sstrncpy (vl.type, "response_time", sizeof (vl.type)); + + plugin_dispatch_values (&vl); +} /* }}} void cc_submit_response_time */ + static int cc_read_page (web_page_t *wp) /* {{{ */ { web_match_t *wm; int status; + struct timeval start, end; + + if (wp->response_time) + gettimeofday (&start, NULL); wp->buffer_fill = 0; status = curl_easy_perform (wp->curl); @@ -591,6 +624,15 @@ static int cc_read_page (web_page_t *wp) /* {{{ */ return (-1); } + if (wp->response_time) + { + double secs = 0; + gettimeofday (&end, NULL); + secs += end.tv_sec - start.tv_sec; + secs += (end.tv_usec - start.tv_usec) / 1000000.0; + cc_submit_response_time (wp, secs); + } + for (wm = wp->matches; wm != NULL; wm = wm->next) { cu_match_value_t *mv;