X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fnginx.c;h=cea3c844c5eee6d33ee9b38071e003d196a2633a;hb=633c3966f770e4d46651a2fe219a18d8a9907a9f;hp=3b107fb72ad209c41d08c22ded54fe349310d305;hpb=62430c784cf53c7dccb6fec021f9bb4c0d790a0f;p=collectd.git diff --git a/src/nginx.c b/src/nginx.c index 3b107fb7..e8282f23 100644 --- a/src/nginx.c +++ b/src/nginx.c @@ -1,23 +1,29 @@ /** * collectd - src/nginx.c - * Copyright (C) 2006,2007 Florian octo Forster + * 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 + * Florian octo Forster + * Sebastian Harl **/ #include "collectd.h" @@ -36,10 +42,9 @@ static char *cacert = NULL; static CURL *curl = NULL; -#define ABUFFER_SIZE 16384 -static char nginx_buffer[ABUFFER_SIZE]; -static int nginx_buffer_len = 0; -static char nginx_curl_error[CURL_ERROR_SIZE]; +static char nginx_buffer[16384]; +static size_t nginx_buffer_len = 0; +static char nginx_curl_error[CURL_ERROR_SIZE]; static const char *config_keys[] = { @@ -52,21 +57,24 @@ static const char *config_keys[] = }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); -static size_t nginx_curl_callback (void *buf, size_t size, size_t nmemb, void *stream) +static size_t nginx_curl_callback (void *buf, size_t size, size_t nmemb, + void __attribute__((unused)) *stream) { size_t len = size * nmemb; - if ((nginx_buffer_len + len) >= ABUFFER_SIZE) + /* Check if the data fits into the memory. If not, truncate it. */ + if ((nginx_buffer_len + len) >= sizeof (nginx_buffer)) { - len = (ABUFFER_SIZE - 1) - nginx_buffer_len; + assert (sizeof (nginx_buffer) > nginx_buffer_len); + len = (sizeof (nginx_buffer) - 1) - nginx_buffer_len; } if (len <= 0) return (len); - memcpy (nginx_buffer + nginx_buffer_len, (char *) buf, len); + memcpy (&nginx_buffer[nginx_buffer_len], buf, len); nginx_buffer_len += len; - nginx_buffer[nginx_buffer_len] = '\0'; + nginx_buffer[nginx_buffer_len] = 0; return (len); } @@ -116,13 +124,16 @@ static int init (void) return (-1); } + 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) { - if (snprintf (credentials, 1024, "%s:%s", user, pass == NULL ? "" : pass) >= 1024) + int status = ssnprintf (credentials, sizeof (credentials), + "%s:%s", user, pass == NULL ? "" : pass); + if ((status < 0) || ((size_t) status >= sizeof (credentials))) { ERROR ("nginx plugin: Credentials would have been truncated."); return (-1); @@ -136,22 +147,25 @@ static int init (void) curl_easy_setopt (curl, CURLOPT_URL, url); } - if ((verify_peer == NULL) || (strcmp (verify_peer, "true") == 0)) + curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt (curl, CURLOPT_MAXREDIRS, 50L); + + if ((verify_peer == NULL) || IS_TRUE (verify_peer)) { - curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1); + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1L); } else { - curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L); } - if ((verify_host == NULL) || (strcmp (verify_host, "true") == 0)) + if ((verify_host == NULL) || IS_TRUE (verify_host)) { - curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2); + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2L); } else { - curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L); } if (cacert != NULL) @@ -170,24 +184,23 @@ static void submit (char *type, char *inst, long long value) if (strcmp (type, "nginx_connections") == 0) values[0].gauge = value; else if (strcmp (type, "nginx_requests") == 0) - values[0].counter = value; + values[0].derive = value; + else if (strcmp (type, "connections") == 0) + values[0].derive = value; else return; vl.values = values; vl.values_len = 1; - vl.time = time (NULL); - strcpy (vl.host, hostname_g); - strcpy (vl.plugin, "nginx"); - strcpy (vl.plugin_instance, ""); + sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + 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) - { - strncpy (vl.type_instance, inst, sizeof (vl.type_instance)); - vl.type_instance[sizeof (vl.type_instance) - 1] = '\0'; - } + sstrncpy (vl.type_instance, inst, sizeof (vl.type_instance)); - plugin_dispatch_values (type, &vl); + plugin_dispatch_values (&vl); } /* void submit */ static int nginx_read (void) @@ -197,6 +210,7 @@ static int nginx_read (void) char *ptr; char *lines[16]; int lines_num = 0; + char *saveptr; char *fields[16]; int fields_num; @@ -207,14 +221,15 @@ static int nginx_read (void) return (-1); nginx_buffer_len = 0; - if (curl_easy_perform (curl) != 0) + if (curl_easy_perform (curl) != CURLE_OK) { WARNING ("nginx plugin: curl_easy_perform failed: %s", nginx_curl_error); return (-1); } ptr = nginx_buffer; - while ((lines[lines_num] = strtok (ptr, "\n\r")) != NULL) + saveptr = NULL; + while ((lines[lines_num] = strtok_r (ptr, "\n\r", &saveptr)) != NULL) { ptr = NULL; lines_num++; @@ -245,6 +260,8 @@ static int nginx_read (void) && (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])); } }