Merge branch 'collectd-5.4'
[collectd.git] / src / cpu.c
index b92b0e2..f1aa4ab 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
@@ -1,8 +1,9 @@
 /**
  * collectd - src/cpu.c
- * Copyright (C) 2005-2009  Florian octo Forster
+ * Copyright (C) 2005-2010  Florian octo Forster
  * Copyright (C) 2008       Oleg King
  * Copyright (C) 2009       Simon Kuhnle
+ * Copyright (C) 2009       Manuel Sanmartin
  *
  * 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
@@ -21,6 +22,7 @@
  *   Florian octo Forster <octo at verplant.org>
  *   Oleg King <king2 at kaluga.ru>
  *   Simon Kuhnle <simon at blarzwurst.de>
+ *   Manuel Sanmartin
  **/
 
 #include "collectd.h"
 # include <statgrab.h>
 #endif
 
+# ifdef HAVE_PERFSTAT
+#  include <sys/protosw.h>
+#  include <libperfstat.h>
+# endif /* HAVE_PERFSTAT */
+
 #if !PROCESSOR_CPU_LOAD_INFO && !KERNEL_LINUX && !HAVE_LIBKSTAT \
-       && !CAN_USE_SYSCTL && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB
+       && !CAN_USE_SYSCTL && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB && !HAVE_PERFSTAT
 # error "No applicable input method."
 #endif
 
@@ -130,7 +137,13 @@ static int maxcpu;
 
 #elif defined(HAVE_LIBSTATGRAB)
 /* no variables needed */
-#endif /* HAVE_LIBSTATGRAB */
+/* #endif  HAVE_LIBSTATGRAB */
+
+#elif defined(HAVE_PERFSTAT)
+static perfstat_cpu_t *perfcpu;
+static int numcpu;
+static int pnumcpu;
+#endif /* HAVE_PERFSTAT */
 
 static int init (void)
 {
@@ -150,7 +163,7 @@ static int init (void)
        DEBUG ("host_processors returned %i %s", (int) cpu_list_len, cpu_list_len == 1 ? "processor" : "processors");
        INFO ("cpu plugin: Found %i processor%s.", (int) cpu_list_len, cpu_list_len == 1 ? "" : "s");
 
-       cpu_temp_retry_max = 86400 / interval_g;
+       cpu_temp_retry_max = 86400 / CDTIME_T_TO_TIME_T (plugin_get_interval ());
 /* #endif PROCESSOR_CPU_LOAD_INFO */
 
 #elif defined(HAVE_LIBKSTAT)
@@ -219,17 +232,21 @@ static int init (void)
 
 #elif defined(HAVE_LIBSTATGRAB)
        /* nothing to initialize */
-#endif /* HAVE_LIBSTATGRAB */
+/* #endif HAVE_LIBSTATGRAB */
+
+#elif defined(HAVE_PERFSTAT)
+       /* nothing to initialize */
+#endif /* HAVE_PERFSTAT */
 
        return (0);
 } /* int init */
 
-static void submit (int cpu_num, const char *type_instance, counter_t value)
+static void submit (int cpu_num, const char *type_instance, derive_t value)
 {
        value_t values[1];
        value_list_t vl = VALUE_LIST_INIT;
 
-       values[0].counter = value;
+       values[0].derive = value;
 
        vl.values = values;
        vl.values_len = 1;
@@ -251,6 +268,7 @@ static int cpu_read (void)
        kern_return_t status;
        
 #if PROCESSOR_CPU_LOAD_INFO
+       derive_t                       cpu_active;
        processor_cpu_load_info_data_t cpu_info;
        mach_msg_type_number_t         cpu_info_len;
 #endif
@@ -281,10 +299,15 @@ static int cpu_read (void)
                        continue;
                }
 
-               submit (cpu, "user", (counter_t) cpu_info.cpu_ticks[CPU_STATE_USER]);
-               submit (cpu, "nice", (counter_t) cpu_info.cpu_ticks[CPU_STATE_NICE]);
-               submit (cpu, "system", (counter_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM]);
-               submit (cpu, "idle", (counter_t) cpu_info.cpu_ticks[CPU_STATE_IDLE]);
+               submit (cpu, "user", (derive_t) cpu_info.cpu_ticks[CPU_STATE_USER]);
+               submit (cpu, "nice", (derive_t) cpu_info.cpu_ticks[CPU_STATE_NICE]);
+               submit (cpu, "system", (derive_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM]);
+               submit (cpu, "idle", (derive_t) cpu_info.cpu_ticks[CPU_STATE_IDLE]);
+               cpu_active = (derive_t) (cpu_info.cpu_ticks[CPU_STATE_USER] +
+                                        cpu_info.cpu_ticks[CPU_STATE_NICE] +
+                                        cpu_info.cpu_ticks[CPU_STATE_SYSTEM]);
+               submit (cpu, "active", cpu_active);
+                                        
 #endif /* PROCESSOR_CPU_LOAD_INFO */
 #if PROCESSOR_TEMPERATURE
                /*
@@ -327,16 +350,15 @@ static int cpu_read (void)
 
                cpu_temp_retry_counter = 0;
                cpu_temp_retry_step    = 1;
-
-               DEBUG ("cpu_temp = %i", (int) cpu_temp);
 #endif /* PROCESSOR_TEMPERATURE */
        }
 /* #endif PROCESSOR_CPU_LOAD_INFO */
 
 #elif defined(KERNEL_LINUX)
        int cpu;
-       counter_t user, nice, syst, idle;
-       counter_t wait, intr, sitr; /* sitr == soft interrupt */
+       derive_t cpu_active;
+       derive_t user, nice, syst, idle;
+       derive_t wait, intr, sitr; /* sitr == soft interrupt */
        FILE *fh;
        char buf[1024];
 
@@ -372,6 +394,7 @@ static int cpu_read (void)
                submit (cpu, "nice", nice);
                submit (cpu, "system", syst);
                submit (cpu, "idle", idle);
+               cpu_active = user + nice + syst;
 
                if (numfields >= 8)
                {
@@ -382,10 +405,14 @@ static int cpu_read (void)
                        submit (cpu, "wait", wait);
                        submit (cpu, "interrupt", intr);
                        submit (cpu, "softirq", sitr);
+                       
+                       cpu_active += wait + intr + sitr;
 
                        if (numfields >= 9)
+                               cpu_active += (derive_t) atoll (fields[8]);
                                submit (cpu, "steal", atoll (fields[8]));
                }
+               submit (cpu, "active", cpu_active);
        }
 
        fclose (fh);
@@ -393,7 +420,7 @@ static int cpu_read (void)
 
 #elif defined(HAVE_LIBKSTAT)
        int cpu;
-       counter_t user, syst, idle, wait;
+       derive_t user, syst, idle, wait;
        static cpu_stat_t cs;
 
        if (kc == NULL)
@@ -404,15 +431,16 @@ static int cpu_read (void)
                if (kstat_read (kc, ksp[cpu], &cs) == -1)
                        continue; /* error message? */
 
-               idle = (counter_t) cs.cpu_sysinfo.cpu[CPU_IDLE];
-               user = (counter_t) cs.cpu_sysinfo.cpu[CPU_USER];
-               syst = (counter_t) cs.cpu_sysinfo.cpu[CPU_KERNEL];
-               wait = (counter_t) cs.cpu_sysinfo.cpu[CPU_WAIT];
+               idle = (derive_t) cs.cpu_sysinfo.cpu[CPU_IDLE];
+               user = (derive_t) cs.cpu_sysinfo.cpu[CPU_USER];
+               syst = (derive_t) cs.cpu_sysinfo.cpu[CPU_KERNEL];
+               wait = (derive_t) cs.cpu_sysinfo.cpu[CPU_WAIT];
 
                submit (ksp[cpu]->ks_instance, "user", user);
                submit (ksp[cpu]->ks_instance, "system", syst);
                submit (ksp[cpu]->ks_instance, "idle", idle);
                submit (ksp[cpu]->ks_instance, "wait", wait);
+               submit (ksp[cpu]->ks_instance, "active", user + syst + wait);
        }
 /* #endif defined(HAVE_LIBKSTAT) */
 
@@ -477,6 +505,10 @@ static int cpu_read (void)
                submit (i, "system",    cpuinfo[i][CP_SYS]);
                submit (i, "idle",      cpuinfo[i][CP_IDLE]);
                submit (i, "interrupt", cpuinfo[i][CP_INTR]);
+               submit (i, "active",    cpuinfo[i][CP_USER] +
+                                       cpuinfo[i][CP_NICE] +
+                                       cpuinfo[i][CP_SYS] +
+                                       cpuinfo[i][CP_INTR]);
        }
 /* #endif CAN_USE_SYSCTL */
 #elif defined(HAVE_SYSCTLBYNAME) && defined(HAVE_SYSCTL_KERN_CP_TIMES)
@@ -501,6 +533,10 @@ static int cpu_read (void)
                submit (i, "system", cpuinfo[i][CP_SYS]);
                submit (i, "idle", cpuinfo[i][CP_IDLE]);
                submit (i, "interrupt", cpuinfo[i][CP_INTR]);
+               submit (i, "active", cpuinfo[i][CP_USER] +
+                       cpuinfo[i][CP_NICE] +
+                       cpuinfo[i][CP_SYS] +
+                       cpuinfo[i][CP_INTR]);
        }
 /* #endif HAVE_SYSCTL_KERN_CP_TIMES */
 #elif defined(HAVE_SYSCTLBYNAME)
@@ -522,6 +558,10 @@ static int cpu_read (void)
        submit (0, "system", cpuinfo[CP_SYS]);
        submit (0, "idle", cpuinfo[CP_IDLE]);
        submit (0, "interrupt", cpuinfo[CP_INTR]);
+       submit (0, "active", cpuinfo[CP_USER] +
+               cpuinfo[CP_NICE] +
+               cpuinfo[CP_SYS] +
+               cpuinfo[CP_INTR]);
 /* #endif HAVE_SYSCTLBYNAME */
 
 #elif defined(HAVE_LIBSTATGRAB)
@@ -534,13 +574,61 @@ static int cpu_read (void)
                return (-1);
        }
 
-       submit (0, "idle",   (counter_t) cs->idle);
-       submit (0, "nice",   (counter_t) cs->nice);
-       submit (0, "swap",   (counter_t) cs->swap);
-       submit (0, "system", (counter_t) cs->kernel);
-       submit (0, "user",   (counter_t) cs->user);
-       submit (0, "wait",   (counter_t) cs->iowait);
-#endif /* HAVE_LIBSTATGRAB */
+       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 (0, "active", (derive_t) cs->nice + 
+               cs->swap +
+               cs->kernel +
+               cs->user +
+               cs->iowait +
+               cs->nice);
+/* #endif HAVE_LIBSTATGRAB */
+
+#elif defined(HAVE_PERFSTAT)
+       perfstat_id_t id;
+       int i, cpus;
+
+       numcpu =  perfstat_cpu(NULL, NULL, sizeof(perfstat_cpu_t), 0);
+       if(numcpu == -1)
+       {
+               char errbuf[1024];
+               WARNING ("cpu plugin: perfstat_cpu: %s",
+                       sstrerror (errno, errbuf, sizeof (errbuf)));
+               return (-1);
+       }
+       
+       if (pnumcpu != numcpu || perfcpu == NULL) 
+       {
+               if (perfcpu != NULL) 
+                       free(perfcpu);
+               perfcpu = malloc(numcpu * sizeof(perfstat_cpu_t));
+       }
+       pnumcpu = numcpu;
+
+       id.name[0] = '\0';
+       if ((cpus = perfstat_cpu(&id, perfcpu, sizeof(perfstat_cpu_t), numcpu)) < 0)
+       {
+               char errbuf[1024];
+               WARNING ("cpu plugin: perfstat_cpu: %s",
+                       sstrerror (errno, errbuf, sizeof (errbuf)));
+               return (-1);
+       }
+
+       for (i = 0; i < cpus; i++) 
+       {
+               submit (i, "idle",   (derive_t) perfcpu[i].idle);
+               submit (i, "system", (derive_t) perfcpu[i].sys);
+               submit (i, "user",   (derive_t) perfcpu[i].user);
+               submit (i, "wait",   (derive_t) perfcpu[i].wait);
+               submit (i, "active", (derive_t) perfcpu[i].sys +
+                       perfcpu[i].user +
+                       perfcpu[i].wait);
+       }
+#endif /* HAVE_PERFSTAT */
 
        return (0);
 }