X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fload.c;h=18b5f8e87457b2f9dbdc9e723e9f6b6da9967843;hb=3b618a331d47fa5868f414b42439f7a0f08667cd;hp=bff629dcb06cb9ad6a1c2255c02d2fff65a9fd0a;hpb=db4535ae6cac033d869be59a148c25149bd8f80c;p=collectd.git diff --git a/src/load.c b/src/load.c index bff629dc..18b5f8e8 100644 --- a/src/load.c +++ b/src/load.c @@ -1,11 +1,12 @@ /** * collectd - src/load.c - * Copyright (C) 2005,2006 Florian octo Forster + * Copyright (C) 2005-2008 Florian octo Forster + * Copyright (C) 2009 Manuel Sanmartin + * Copyright (C) 2013 Vedran Bartonicek * * 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. + * Free Software Foundation; only version 2 of the License is applicable. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -17,25 +18,28 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: - * Florian octo Forster + * Florian octo Forster + * Manuel Sanmartin + * Vedran Bartonicek **/ +#define _DEFAULT_SOURCE +#define _BSD_SOURCE + #include "collectd.h" #include "common.h" #include "plugin.h" -#define MODULE_NAME "load" - -#if defined(HAVE_GETLOADAVG) || defined(KERNEL_LINUX) || defined(HAVE_LIBSTATGRAB) -# define LOAD_HAVE_READ 1 -#else -# define LOAD_HAVE_READ 0 -#endif +#include #ifdef HAVE_SYS_LOADAVG_H #include #endif +#if HAVE_STATGRAB_H +# include +#endif + #ifdef HAVE_GETLOADAVG #if !defined(LOADAVG_1MIN) || !defined(LOADAVG_5MIN) || !defined(LOADAVG_15MIN) #define LOADAVG_1MIN 0 @@ -44,36 +48,71 @@ #endif #endif /* defined(HAVE_GETLOADAVG) */ -static data_source_t dsrc[3] = +#ifdef HAVE_PERFSTAT +# include /* AIX 5 */ +# include +# include +#endif /* HAVE_PERFSTAT */ + +static _Bool report_relative_load = 0; + +static const char *config_keys[] = { - {"shortterm", DS_TYPE_GAUGE, 0.0, 100.0}, - {"midterm", DS_TYPE_GAUGE, 0.0, 100.0}, - {"longterm", DS_TYPE_GAUGE, 0.0, 100.0} + "ReportRelative" }; +static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); -static data_set_t ds = +static int load_config (const char *key, const char *value) { - "load", 3, dsrc -}; + if (strcasecmp (key, "ReportRelative") == 0) +#ifdef _SC_NPROCESSORS_ONLN + report_relative_load = IS_TRUE (value) ? 1 : 0; +#else + WARNING ("load plugin: The \"ReportRelative\" configuration " + "is not available, because I can't determine the " + "number of CPUS on this system. Sorry."); +#endif + return (-1); -#if LOAD_HAVE_READ -static void load_submit (double snum, double mnum, double lnum) +} +static void load_submit (gauge_t snum, gauge_t mnum, gauge_t lnum) { value_t values[3]; - value_list_t vl; + value_list_t vl = VALUE_LIST_INIT; + int cores = 0; + char errbuf[1024]; + +#ifdef _SC_NPROCESSORS_ONLN + if (report_relative_load) { + if ((cores = sysconf(_SC_NPROCESSORS_ONLN)) < 1) { + WARNING ("load: sysconf failed : %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } + } +#endif + if (cores > 0) { + snum /= cores; + mnum /= cores; + lnum /= cores; + } values[0].gauge = snum; values[1].gauge = mnum; values[2].gauge = lnum; vl.values = values; - vl.values_len = 3; - strcpy (vl.host, "localhost"); /* FIXME */ - strcpy (vl.plugin, "load"); - strcpy (vl.plugin_instance, ""); - strcpy (vl.type_instance, ""); + vl.values_len = STATIC_ARRAY_SIZE (values); + + sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + sstrncpy (vl.plugin, "load", sizeof (vl.plugin)); + sstrncpy (vl.type, "load", sizeof (vl.type)); + + if (cores > 0) { + sstrncpy(vl.type_instance, "relative", + sizeof (vl.type_instance)); + } - plugin_dispatch_values ("load", &vl); + plugin_dispatch_values (&vl); } static int load_read (void) @@ -82,49 +121,61 @@ static int load_read (void) double load[3]; if (getloadavg (load, 3) == 3) - load_submit (load[LOADAVG_1MIN], load[LOADAVG_5MIN], load[LOADAVG_15MIN]); - else - syslog (LOG_WARNING, "load: getloadavg failed: %s", strerror (errno)); + load_submit (load[LOADAVG_1MIN], load[LOADAVG_5MIN], load[LOADAVG_15MIN]); + else + { + char errbuf[1024]; + WARNING ("load: getloadavg failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } /* #endif HAVE_GETLOADAVG */ #elif defined(KERNEL_LINUX) - double snum, mnum, lnum; + gauge_t snum, mnum, lnum; FILE *loadavg; char buffer[16]; char *fields[8]; int numfields; - + if ((loadavg = fopen ("/proc/loadavg", "r")) == NULL) { - syslog (LOG_WARNING, "load: fopen: %s", strerror (errno)); - return; + char errbuf[1024]; + WARNING ("load: fopen: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); } if (fgets (buffer, 16, loadavg) == NULL) { - syslog (LOG_WARNING, "load: fgets: %s", strerror (errno)); + char errbuf[1024]; + WARNING ("load: fgets: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); fclose (loadavg); - return; + return (-1); } if (fclose (loadavg)) - syslog (LOG_WARNING, "load: fclose: %s", strerror (errno)); + { + char errbuf[1024]; + WARNING ("load: fclose: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } numfields = strsplit (buffer, fields, 8); if (numfields < 3) - return; + return (-1); snum = atof (fields[0]); mnum = atof (fields[1]); lnum = atof (fields[2]); - load_submit (snum, mnum, lnum); + load_submit(snum, mnum, lnum); /* #endif KERNEL_LINUX */ -#elif defined(HAVE_LIBSTATGRAB) - double snum, mnum, lnum; +#elif HAVE_LIBSTATGRAB + gauge_t snum, mnum, lnum; sg_load_stats *ls; if ((ls = sg_get_load_stats ()) == NULL) @@ -133,20 +184,36 @@ static int load_read (void) snum = ls->min1; mnum = ls->min5; lnum = ls->min15; + load_submit(snum, mnum, lnum); +/* #endif HAVE_LIBSTATGRAB */ - load_submit (snum, mnum, lnum); -#endif /* HAVE_LIBSTATGRAB */ +#elif HAVE_PERFSTAT + gauge_t snum, mnum, lnum; + perfstat_cpu_total_t cputotal; + + if (perfstat_cpu_total(NULL, &cputotal, sizeof(perfstat_cpu_total_t), 1) < 0) + { + char errbuf[1024]; + WARNING ("load: perfstat_cpu : %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } + + snum = (float)cputotal.loadavg[0]/(float)(1<