The cpu plugin still uses /proc/stat to gather data, even if I compile
it with libstatgrab...
When collecting statistics with libstatgrab, the cpu plugin submit all
data to cpu-0, I've changed this to cpu-avg
This patch also add support for average (cpu-avg) collecting with
/proc/stat files, on linux of course..
Regards,
Hilst
--
Follow the white rabbit!
diff -Nurp -x lcc_features.h collectd-5.0.2/src/cpu.c
collectd-5.0.2-new/src/cpu.c
--- collectd-5.0.2/src/cpu.c 2012-01-22 09:10:04.000000000 -0200
+++ collectd-5.0.2-new/src/cpu.c 2012-05-09 16:03:59.000000000 -0300
@@ -252,7 +252,11 @@ static void submit (int cpu_num, const c
vl.values_len = 1;
sstrncpy (vl.host, hostname_g, sizeof (vl.host));
sstrncpy (vl.plugin, "cpu", sizeof (vl.plugin));
- ssnprintf (vl.plugin_instance, sizeof (vl.plugin_instance),
+ if (cpu_num < 0)
+ ssnprintf (vl.plugin_instance, sizeof (vl.plugin_instance),
+ "avg");
+ else
+ ssnprintf (vl.plugin_instance, sizeof (vl.plugin_instance),
"%i", cpu_num);
sstrncpy (vl.type, "cpu", sizeof (vl.type));
sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
@@ -349,65 +353,6 @@ static int cpu_read (void)
#endif /* PROCESSOR_TEMPERATURE */
}
/* #endif PROCESSOR_CPU_LOAD_INFO */
-
-#elif defined(KERNEL_LINUX)
- int cpu;
- derive_t user, nice, syst, idle;
- derive_t wait, intr, sitr; /* sitr == soft interrupt */
- FILE *fh;
- char buf[1024];
-
- char *fields[9];
- int numfields;
-
- if ((fh = fopen ("/proc/stat", "r")) == NULL)
- {
- char errbuf[1024];
- ERROR ("cpu plugin: fopen (/proc/stat) failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
- }
-
- while (fgets (buf, 1024, fh) != NULL)
- {
- if (strncmp (buf, "cpu", 3))
- continue;
- if ((buf[3] < '0') || (buf[3] > '9'))
- continue;
-
- numfields = strsplit (buf, fields, 9);
- if (numfields < 5)
- continue;
-
- cpu = atoi (fields[0] + 3);
- user = atoll (fields[1]);
- nice = atoll (fields[2]);
- syst = atoll (fields[3]);
- idle = atoll (fields[4]);
-
- submit (cpu, "user", user);
- submit (cpu, "nice", nice);
- submit (cpu, "system", syst);
- submit (cpu, "idle", idle);
-
- if (numfields >= 8)
- {
- wait = atoll (fields[5]);
- intr = atoll (fields[6]);
- sitr = atoll (fields[7]);
-
- submit (cpu, "wait", wait);
- submit (cpu, "interrupt", intr);
- submit (cpu, "softirq", sitr);
-
- if (numfields >= 9)
- submit (cpu, "steal", atoll (fields[8]));
- }
- }
-
- fclose (fh);
-/* #endif defined(KERNEL_LINUX) */
-
#elif defined(HAVE_LIBKSTAT)
int cpu;
derive_t user, syst, idle, wait;
@@ -545,20 +490,109 @@ static int cpu_read (void)
sg_cpu_stats *cs;
cs = sg_get_cpu_stats ();
+ DEBUG("cpu plugin: Using libstatgrab to gather statistics");
+
if (cs == NULL)
{
ERROR ("cpu plugin: sg_get_cpu_stats failed.");
return (-1);
}
- submit (0, "idle", (derive_t) cs->idle);
- submit (0, "nice", (derive_t) cs->nice);
- submit (0, "swap", (derive_t) cs->swap);
- submit (0, "system", (derive_t) cs->kernel);
- submit (0, "user", (derive_t) cs->user);
- submit (0, "wait", (derive_t) cs->iowait);
+ submit (-1, "idle", (derive_t) cs->idle);
+ submit (-1, "nice", (derive_t) cs->nice);
+ submit (-1, "swap", (derive_t) cs->swap);
+ submit (-1, "system", (derive_t) cs->kernel);
+ submit (-1, "user", (derive_t) cs->user);
+ submit (-1, "wait", (derive_t) cs->iowait);
/* #endif HAVE_LIBSTATGRAB */
+#elif defined(KERNEL_LINUX)
+ int cpu;
+ derive_t user, nice, syst, idle;
+ derive_t wait, intr, sitr; /* sitr == soft interrupt */
+ FILE *fh;
+ char buf[1024];
+
+ char *fields[9];
+ int numfields;
+ int coren = sysconf(_SC_NPROCESSORS_ONLN); /* number of cores */
+
+ if (coren == -1) { /* sysconf has returned an error */
+ char errbuf[1024];
+ ERROR ("cpu plugin: can't get the number of cores: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+
+
+ DEBUG ("cpu plugin: Reading /proc/stat for gather statistics");
+ DEBUG ("cpu plugin: number of cpus found: %d", coren);
+
+ if ((fh = fopen ("/proc/stat", "r")) == NULL)
+ {
+ char errbuf[1024];
+ ERROR ("cpu plugin: fopen (/proc/stat) failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+
+ while (fgets (buf, 1024, fh) != NULL)
+ {
+ if (strncmp (buf, "cpu", 3))
+ continue;
+
+ numfields = strsplit (buf, fields, 9);
+ if (numfields < 5)
+ continue;
+
+ if (!isdigit(fields[0][3])) {
+ DEBUG ("cpu plugin: gathering average");
+
+ cpu = -1;
+ user = atoll (fields[1]) / coren;
+ nice = atoll (fields[2]) / coren;
+ syst = atoll (fields[3]) / coren;
+ idle = atoll (fields[4]) / coren;
+ } else {
+ cpu = atoi (fields[0] + 3);
+ DEBUG ("cpu plugin: gathering cpu-%d", cpu);
+ user = atoll (fields[1]);
+ nice = atoll (fields[2]);
+ syst = atoll (fields[3]);
+ idle = atoll (fields[4]);
+ }
+ submit (cpu, "user", user);
+ submit (cpu, "nice", nice);
+ submit (cpu, "system", syst);
+ submit (cpu, "idle", idle);
+
+ if (numfields >= 8)
+ {
+ if (cpu < 0) {
+ wait = atoll (fields[5]) / coren;
+ intr = atoll (fields[6]) / coren;
+ sitr = atoll (fields[7]) / coren;
+ } else {
+ wait = atoll (fields[5]);
+ intr = atoll (fields[6]);
+ sitr = atoll (fields[7]);
+ }
+ submit (cpu, "wait", wait);
+ submit (cpu, "interrupt", intr);
+ submit (cpu, "softirq", sitr);
+
+
+ }
+ if (numfields >= 9) {
+ if (cpu < 0)
+ submit (cpu, "steal", atoll (fields[8]) /
coren);
+ else
+ submit (cpu, "steal", atoll (fields[8]));
+ }
+ }
+
+ fclose (fh);
+/* #endif defined(KERNEL_LINUX) */
#elif defined(HAVE_PERFSTAT)
perfstat_id_t id;
int i, cpus;
_______________________________________________
collectd mailing list
[email protected]
http://mailman.verplant.org/listinfo/collectd