X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fnginx.c;h=08c24f9a5b8fb93e6d2a3d0eb00e4bd4818b4f0d;hb=0a8741b9061f8df4a78a448c021612db06e17425;hp=de52262f4ec817b1b54ca876652b02e06a845252;hpb=c1219a1c9db2e8400e2ee94b87f86ccd441485d5;p=collectd.git diff --git a/src/nginx.c b/src/nginx.c index de52262f..08c24f9a 100644 --- a/src/nginx.c +++ b/src/nginx.c @@ -3,19 +3,23 @@ * Copyright (C) 2006-2010 Florian octo Forster * Copyright (C) 2008 Sebastian Harl * - * 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 - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * Authors: * Florian octo Forster @@ -23,9 +27,9 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" #include @@ -35,6 +39,7 @@ static char *pass = NULL; static char *verify_peer = NULL; static char *verify_host = NULL; static char *cacert = NULL; +static char *timeout = NULL; static CURL *curl = NULL; @@ -49,7 +54,8 @@ static const char *config_keys[] = "Password", "VerifyPeer", "VerifyHost", - "CACert" + "CACert", + "Timeout" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); @@ -65,7 +71,7 @@ static size_t nginx_curl_callback (void *buf, size_t size, size_t nmemb, len = (sizeof (nginx_buffer) - 1) - nginx_buffer_len; } - if (len <= 0) + if (len == 0) return (len); memcpy (&nginx_buffer[nginx_buffer_len], buf, len); @@ -103,14 +109,14 @@ static int config (const char *key, const char *value) return (config_set (&verify_host, value)); else if (strcasecmp (key, "cacert") == 0) return (config_set (&cacert, value)); + else if (strcasecmp (key, "timeout") == 0) + return (config_set (&timeout, value)); else return (-1); } /* int config */ static int init (void) { - static char credentials[1024]; - if (curl != NULL) curl_easy_cleanup (curl); @@ -122,13 +128,18 @@ static int init (void) curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, nginx_curl_callback); - curl_easy_setopt (curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION); + curl_easy_setopt (curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT); curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, nginx_curl_error); if (user != NULL) { +#ifdef HAVE_CURLOPT_USERNAME + curl_easy_setopt (curl, CURLOPT_USERNAME, user); + curl_easy_setopt (curl, CURLOPT_PASSWORD, (pass == NULL) ? "" : pass); +#else + static char credentials[1024]; int status = ssnprintf (credentials, sizeof (credentials), - "%s:%s", user, pass == NULL ? "" : pass); + "%s:%s", user, pass == NULL ? "" : pass); if ((status < 0) || ((size_t) status >= sizeof (credentials))) { ERROR ("nginx plugin: Credentials would have been truncated."); @@ -136,6 +147,7 @@ static int init (void) } curl_easy_setopt (curl, CURLOPT_USERPWD, credentials); +#endif } if (url != NULL) @@ -169,10 +181,21 @@ static int init (void) curl_easy_setopt (curl, CURLOPT_CAINFO, cacert); } +#ifdef HAVE_CURLOPT_TIMEOUT_MS + if (timeout != NULL) + { + curl_easy_setopt (curl, CURLOPT_TIMEOUT_MS, atol(timeout)); + } + else + { + curl_easy_setopt (curl, CURLOPT_TIMEOUT_MS, (long) CDTIME_T_TO_MS(plugin_get_interval())); + } +#endif + return (0); } /* void init */ -static void submit (char *type, char *inst, long long value) +static void submit (const char *type, const char *inst, long long value) { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; @@ -187,10 +210,8 @@ static void submit (char *type, char *inst, long long value) return; vl.values = values; - vl.values_len = 1; - sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + vl.values_len = STATIC_ARRAY_SIZE (values); sstrncpy (vl.plugin, "nginx", sizeof (vl.plugin)); - sstrncpy (vl.plugin_instance, "", sizeof (vl.plugin_instance)); sstrncpy (vl.type, type, sizeof (vl.type)); if (inst != NULL) @@ -201,8 +222,6 @@ static void submit (char *type, char *inst, long long value) static int nginx_read (void) { - int i; - char *ptr; char *lines[16]; int lines_num = 0; @@ -237,39 +256,43 @@ static int nginx_read (void) /* * Active connections: 291 * server accepts handled requests - * 16630948 16630948 31070465 + * 101059015 100422216 347910649 * Reading: 6 Writing: 179 Waiting: 106 */ - for (i = 0; i < lines_num; i++) + for (int i = 0; i < lines_num; i++) { fields_num = strsplit (lines[i], fields, - (sizeof (fields) / sizeof (fields[0]))); + (sizeof (fields) / sizeof (fields[0]))); if (fields_num == 3) { if ((strcmp (fields[0], "Active") == 0) - && (strcmp (fields[1], "connections:") == 0)) + && (strcmp (fields[1], "connections:") == 0)) { - submit ("nginx_connections", "active", atoll (fields[2])); + submit ("nginx_connections", "active", atoll (fields[2])); } else if ((atoll (fields[0]) != 0) - && (atoll (fields[1]) != 0) - && (atoll (fields[2]) != 0)) + && (atoll (fields[1]) != 0) + && (atoll (fields[2]) != 0)) { - submit ("connections", "accepted", atoll (fields[0])); - submit ("connections", "handled", atoll (fields[1])); - submit ("nginx_requests", NULL, atoll (fields[2])); + submit ("connections", "accepted", atoll (fields[0])); + /* TODO: The legacy metric "handled", which is the sum of "accepted" and + * "failed", is reported for backwards compatibility only. Remove in the + * next major version. */ + submit ("connections", "handled", atoll (fields[1])); + submit ("connections", "failed", (atoll(fields[0]) - atoll (fields[1]))); + submit ("nginx_requests", NULL, atoll (fields[2])); } } else if (fields_num == 6) { if ((strcmp (fields[0], "Reading:") == 0) - && (strcmp (fields[2], "Writing:") == 0) - && (strcmp (fields[4], "Waiting:") == 0)) + && (strcmp (fields[2], "Writing:") == 0) + && (strcmp (fields[4], "Waiting:") == 0)) { - submit ("nginx_connections", "reading", atoll (fields[1])); - submit ("nginx_connections", "writing", atoll (fields[3])); - submit ("nginx_connections", "waiting", atoll (fields[5])); + submit ("nginx_connections", "reading", atoll (fields[1])); + submit ("nginx_connections", "writing", atoll (fields[3])); + submit ("nginx_connections", "waiting", atoll (fields[5])); } } }