X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fnginx.c;h=4de59f3752b8827f28bf8885ec2f3c9073dd6c5d;hb=2c8470d917b2f0a17326ee1336081dcffbd6a347;hp=e5848ee3c530218e50418d23b1555f4f1de6389b;hpb=58ecdb7ff9a4d90e87daecca05b9cb4a43070fd7;p=collectd.git diff --git a/src/nginx.c b/src/nginx.c index e5848ee3..4de59f37 100644 --- a/src/nginx.c +++ b/src/nginx.c @@ -23,60 +23,35 @@ #include "collectd.h" #include "common.h" #include "plugin.h" -#include "utils_debug.h" #include "configfile.h" -#define MODULE_NAME "nginx" +#include -#if HAVE_LIBCURL && HAVE_CURL_CURL_H -# define NGINX_HAVE_READ 1 -# include -#else -# define NGINX_HAVE_READ 0 -#endif +static char *url = NULL; +static char *user = NULL; +static char *pass = NULL; +static char *verify_peer = NULL; +static char *verify_host = NULL; +static char *cacert = NULL; -static char *url = NULL; -static char *user = NULL; -static char *pass = NULL; -static char *cacert = NULL; - -#if HAVE_LIBCURL 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]; -#endif /* HAVE_LIBCURL */ - -static char *connections_file = "nginx/nginx_connections-%s.rrd"; -static char *connections_ds_def[] = -{ - "DS:value:GAUGE:"COLLECTD_HEARTBEAT":0:U", - NULL -}; -static int connections_ds_num = 1; - -/* Limit to 2^20 requests/s */ -static char *requests_file = "nginx/nginx_requests.rrd"; -static char *requests_ds_def[] = -{ - "DS:value:COUNTER:"COLLECTD_HEARTBEAT":0:1048576", - NULL -}; -static int requests_ds_num = 1; -static char *config_keys[] = +static const char *config_keys[] = { "URL", "User", "Password", - "CACert", - NULL + "VerifyPeer", + "VerifyHost", + "CACert" }; -static int config_keys_num = 4; +static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); -#if HAVE_LIBCURL static size_t nginx_curl_callback (void *buf, size_t size, size_t nmemb, void *stream) { size_t len = size * nmemb; @@ -95,9 +70,8 @@ static size_t nginx_curl_callback (void *buf, size_t size, size_t nmemb, void *s return (len); } -#endif /* HAVE_LIBCURL */ -static int config_set (char **var, char *value) +static int config_set (char **var, const char *value) { if (*var != NULL) { @@ -111,7 +85,7 @@ static int config_set (char **var, char *value) return (0); } -static int config (char *key, char *value) +static int config (const char *key, const char *value) { if (strcasecmp (key, "url") == 0) return (config_set (&url, value)); @@ -119,26 +93,27 @@ static int config (char *key, char *value) return (config_set (&user, value)); else if (strcasecmp (key, "password") == 0) return (config_set (&pass, value)); + else if (strcasecmp (key, "verifypeer") == 0) + return (config_set (&verify_peer, value)); + else if (strcasecmp (key, "verifyhost") == 0) + return (config_set (&verify_host, value)); else if (strcasecmp (key, "cacert") == 0) return (config_set (&cacert, value)); else return (-1); -} +} /* int config */ -static void init (void) +static int init (void) { -#if HAVE_LIBCURL static char credentials[1024]; if (curl != NULL) - { curl_easy_cleanup (curl); - } if ((curl = curl_easy_init ()) == NULL) { - syslog (LOG_ERR, "nginx: `curl_easy_init' failed."); - return; + ERROR ("nginx plugin: curl_easy_init failed."); + return (-1); } curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, nginx_curl_callback); @@ -147,10 +122,11 @@ static void init (void) if (user != NULL) { - if (snprintf (credentials, 1024, "%s:%s", user, pass == NULL ? "" : pass) >= 1024) + if (ssnprintf (credentials, sizeof (credentials), + "%s:%s", user, pass == NULL ? "" : pass) >= sizeof (credentials)) { - syslog (LOG_ERR, "nginx: Credentials would have been truncated."); - return; + ERROR ("nginx plugin: Credentials would have been truncated."); + return (-1); } curl_easy_setopt (curl, CURLOPT_USERPWD, credentials); @@ -161,50 +137,59 @@ static void init (void) curl_easy_setopt (curl, CURLOPT_URL, url); } + if ((verify_peer == NULL) || (strcmp (verify_peer, "true") == 0)) + { + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1); + } + else + { + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0); + } + + if ((verify_host == NULL) || (strcmp (verify_host, "true") == 0)) + { + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2); + } + else + { + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0); + } + if (cacert != NULL) { curl_easy_setopt (curl, CURLOPT_CAINFO, cacert); } -#endif /* HAVE_LIBCURL */ + + return (0); } /* void init */ -static void connections_write (char *host, char *inst, char *val) +static void submit (char *type, char *inst, long long value) { - char buf[1024]; + value_t values[1]; + value_list_t vl = VALUE_LIST_INIT; - if (snprintf (buf, 1024, connections_file, inst) >= 1024) + if (strcmp (type, "nginx_connections") == 0) + values[0].gauge = value; + else if (strcmp (type, "nginx_requests") == 0) + values[0].counter = value; + else return; - rrd_update_file (host, buf, val, - connections_ds_def, connections_ds_num); -} - -static void requests_write (char *host, char *inst, char *val) -{ - rrd_update_file (host, requests_file, val, - requests_ds_def, requests_ds_num); -} - -#if NGINX_HAVE_READ -static void submit (char *type, char *inst, long long value) -{ - char buf[1024]; - int status; - - DBG ("type = %s; inst = %s; value = %lli;", - type, (inst == NULL) ? "(nil)" : inst, value); + 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.type, type, sizeof (vl.type)); - status = snprintf (buf, 1024, "%u:%lli", (unsigned int) curtime, value); - if ((status < 0) || (status >= 1024)) - { - syslog (LOG_ERR, "nginx: snprintf failed"); - return; - } + if (inst != NULL) + sstrncpy (vl.type_instance, inst, sizeof (vl.type_instance)); - plugin_submit (type, inst, buf); -} + plugin_dispatch_values (&vl); +} /* void submit */ -static void nginx_read (void) +static int nginx_read (void) { int i; @@ -216,15 +201,15 @@ static void nginx_read (void) int fields_num; if (curl == NULL) - return; + return (-1); if (url == NULL) - return; + return (-1); nginx_buffer_len = 0; if (curl_easy_perform (curl) != 0) { - syslog (LOG_WARNING, "nginx: curl_easy_perform failed: %s", nginx_curl_error); - return; + WARNING ("nginx plugin: curl_easy_perform failed: %s", nginx_curl_error); + return (-1); } ptr = nginx_buffer; @@ -276,20 +261,16 @@ static void nginx_read (void) } nginx_buffer_len = 0; -} -#else -# define nginx_read NULL -#endif /* NGINX_HAVE_READ */ + + return (0); +} /* int nginx_read */ void module_register (void) { - plugin_register (MODULE_NAME, init, nginx_read, NULL); - plugin_register ("nginx_requests", NULL, NULL, requests_write); - plugin_register ("nginx_connections", NULL, NULL, connections_write); - cf_register (MODULE_NAME, config, config_keys, config_keys_num); -} - -#undef MODULE_NAME + plugin_register_config ("nginx", config, config_keys, config_keys_num); + plugin_register_init ("nginx", init); + plugin_register_read ("nginx", nginx_read); +} /* void module_register */ /* * vim: set shiftwidth=2 softtabstop=2 tabstop=8 :