Lyonel Vincent <lyonel at ezix.org>
- processes plugin.
+Manuel Sanmartin
+ - AIX port of the following plugins:
+ + cpu
+ + disk
+ + interface
+ + load
+ + memory
+ + processes
+ + swap
+ - Various AIX-related fixes and hacks.
+
Marco Chiappero <marco at absence.it>
- uptime plugin.
- ip6tables support in the iptables plugin.
*openbsd*)
ac_system="OpenBSD"
;;
+ *aix*)
+ AC_DEFINE([KERNEL_AIX], 1, [True if program is to be compiled for a AIX kernel])
+ ac_system="AIX"
+ ;;
*)
ac_system="unknown"
esac
fi
fi
if test "x$nan_type" = "xnone"; then
+ SAVE_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -lm"
AC_CACHE_CHECK([whether NAN can be defined by 0/0],
[c_cv_have_nan_zero],
AC_RUN_IFELSE(
[c_cv_have_nan_zero="no"]
)
)
+ LDFLAGS=$SAVE_LDFLAGS
if test "x$c_cv_have_nan_zero" = "xyes"
then
nan_type="zero"
m4_divert_once([HELP_WITH], [
collectd additional packages:])
+AM_CONDITIONAL([BUILD_AIX],[test "x$x$ac_system" = "xAIX"])
+
+if test "x$ac_system" = "xAIX"
+then
+ with_perfstat="yes"
+ with_procinfo="yes"
+else
+ with_perfstat="no (AIX only)"
+ with_procinfo="no (AIX only)"
+fi
+
+if test "x$with_perfstat" = "xyes"
+then
+ AC_CHECK_LIB(perfstat, perfstat_reset, [with_perfstat="yes"], [with_perfstat="no (perfstat not found)"], [])
+# AC_CHECK_HEADERS(sys/protosw.h libperfstat.h,, [with_perfstat="no (perfstat not found)"])
+fi
+if test "x$with_perfstat" = "xyes"
+then
+ AC_DEFINE(HAVE_PERFSTAT, 1, [Define to 1 if you have the 'perfstat' library (-lperfstat)])
+fi
+AM_CONDITIONAL(BUILD_WITH_PERFSTAT, test "x$with_perfstat" = "xyes")
+
+# Processes plugin under AIX.
+if test "x$with_procinfo" = "xyes"
+then
+ AC_CHECK_HEADERS(procinfo.h,, [with_procinfo="no (procinfo.h not found)"])
+fi
+if test "x$with_procinfo" = "xyes"
+then
+ AC_DEFINE(HAVE_PROCINFO_H, 1, [Define to 1 if you have the procinfo.h])
+fi
+
if test "x$ac_system" = "xSolaris"
then
with_kstat="yes"
plugin_disk="yes"
fi
+# AIX
+if test "x$with_perfstat" = "xyes"
+then
+ plugin_cpu="yes"
+ plugin_disk="yes"
+ plugin_memory="yes"
+ plugin_swap="yes"
+ plugin_interface="yes"
+ plugin_load="yes"
+fi
+
+if test "x$with_procinfo" = "xyes"
+then
+ plugin_processes="yes"
+fi
+
# Solaris
if test "x$with_kstat" = "xyes"
then
libopenipmi . . . . . $with_libopenipmipthread
liboping . . . . . . $with_liboping
libpcap . . . . . . . $with_libpcap
+ libperfstat . . . . . $with_perfstat
libperl . . . . . . . $with_libperl
libpq . . . . . . . . $with_libpq
libpthread . . . . . $with_libpthread
if BUILD_WITH_LIBDEVINFO
collectd_LDADD += -ldevinfo
endif
+if BUILD_AIX
+collectd_LDFLAGS += -Wl,-bexpall,-brtllib
+collectd_LDADD += -lm
+endif
# The daemon needs to call sg_init, so we need to link it against libstatgrab,
# too. -octo
if BUILD_WITH_LIBSOCKET
collectd_nagios_LDADD += -lsocket
endif
+if BUILD_AIX
+collectd_nagios_LDADD += -lm
+endif
+
collectd_nagios_LDADD += libcollectdclient/libcollectdclient.la
collectd_nagios_DEPENDENCIES = libcollectdclient/libcollectdclient.la
cpu_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
cpu_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
endif
+if BUILD_WITH_PERFSTAT
+cpu_la_LIBADD += -lperfstat
+endif
collectd_LDADD += "-dlopen" cpu.la
collectd_DEPENDENCIES += cpu.la
endif
disk_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
disk_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
endif
+if BUILD_WITH_PERFSTAT
+disk_la_LIBADD += -lperfstat
+endif
collectd_LDADD += "-dlopen" disk.la
collectd_DEPENDENCIES += disk.la
endif
interface_la_LIBADD += -ldevinfo
endif # BUILD_WITH_LIBDEVINFO
endif # !BUILD_WITH_LIBSTATGRAB
+if BUILD_WITH_PERFSTAT
+interface_la_LIBADD += -lperfstat
+endif
endif # BUILD_PLUGIN_INTERFACE
if BUILD_PLUGIN_IPTABLES
load_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
load_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
endif # BUILD_WITH_LIBSTATGRAB
+if BUILD_WITH_PERFSTAT
+load_la_LIBADD += -lperfstat
+endif
endif # BUILD_PLUGIN_LOAD
if BUILD_PLUGIN_LOGFILE
memory_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
memory_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
endif
+if BUILD_WITH_PERFSTAT
+memory_la_LIBADD += -lperfstat
+endif
endif
if BUILD_PLUGIN_MULTIMETER
swap_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
swap_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
endif
+if BUILD_WITH_PERFSTAT
+swap_la_LIBADD += -lperfstat
+endif
+
endif
if BUILD_PLUGIN_SYSLOG
* Copyright (C) 2005-2009 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
* 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
#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)
{
#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 */
submit (0, "system", (counter_t) cs->kernel);
submit (0, "user", (counter_t) cs->user);
submit (0, "wait", (counter_t) cs->iowait);
-#endif /* HAVE_LIBSTATGRAB */
+/* #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", (counter_t) perfcpu[i].idle);
+ submit (i, "system", (counter_t) perfcpu[i].sys);
+ submit (i, "user", (counter_t) perfcpu[i].user);
+ submit (i, "wait", (counter_t) perfcpu[i].wait);
+ }
+#endif /* HAVE_PERFSTAT */
return (0);
}
/**
* collectd - src/disk.c
* Copyright (C) 2005-2008 Florian octo Forster
+ * 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
*
* Authors:
* Florian octo Forster <octo at verplant.org>
+ * Manuel Sanmartin
**/
#include "collectd.h"
# include <statgrab.h>
#endif
+#if HAVE_PERFSTAT
+# ifndef _AIXVERSION_610
+# include <sys/systemcfg.h>
+# endif
+# include <sys/protosw.h>
+# include <libperfstat.h>
+#endif
+
#if HAVE_IOKIT_IOKITLIB_H
static mach_port_t io_master_port = MACH_PORT_NULL;
/* #endif HAVE_IOKIT_IOKITLIB_H */
#elif defined(HAVE_LIBSTATGRAB)
/* #endif HAVE_LIBKSTATGRAB */
+#elif HAVE_PERFSTAT
+static perfstat_disk_t * stat_disk;
+static int numdisk;
+static int pnumdisk;
+/* #endif HAVE_PERFSTAT */
+
#else
# error "No applicable input method."
#endif
disk_submit (name, "disk_octets", ds->read_bytes, ds->write_bytes);
ds++;
}
-#endif /* defined(HAVE_LIBSTATGRAB) */
+/* #endif defined(HAVE_LIBSTATGRAB) */
+
+#elif defined(HAVE_PERFSTAT)
+ counter_t read_sectors;
+ counter_t write_sectors;
+ counter_t read_time;
+ counter_t write_time;
+ counter_t read_ops;
+ counter_t write_ops;
+ perfstat_id_t firstpath;
+ int rnumdisk;
+ int i;
+
+ if ((numdisk = perfstat_disk(NULL, NULL, sizeof(perfstat_disk_t), 0)) < 0)
+ {
+ char errbuf[1024];
+ WARNING ("disk plugin: perfstat_disk: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+
+ if (numdisk != pnumdisk || stat_disk==NULL) {
+ if (stat_disk!=NULL)
+ free(stat_disk);
+ stat_disk = (perfstat_disk_t *)calloc(numdisk, sizeof(perfstat_disk_t));
+ }
+ pnumdisk = numdisk;
+
+ firstpath.name[0]='\0';
+ if ((rnumdisk = perfstat_disk(&firstpath, stat_disk, sizeof(perfstat_disk_t), numdisk)) < 0)
+ {
+ char errbuf[1024];
+ WARNING ("disk plugin: perfstat_disk : %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+
+ for (i = 0; i < rnumdisk; i++)
+ {
+ read_sectors = stat_disk[i].rblks*stat_disk[i].bsize;
+ write_sectors = stat_disk[i].wblks*stat_disk[i].bsize;
+ disk_submit (stat_disk[i].name, "disk_octets", read_sectors, write_sectors);
+
+ read_ops = stat_disk[i].xrate;
+ write_ops = stat_disk[i].xfers - stat_disk[i].xrate;
+ disk_submit (stat_disk[i].name, "disk_ops", read_ops, write_ops);
+
+ read_time = stat_disk[i].rserv;
+ read_time *= ((double)(_system_configuration.Xint)/(double)(_system_configuration.Xfrac)) / 1000000.0;
+ write_time = stat_disk[i].wserv;
+ write_time *= ((double)(_system_configuration.Xint)/(double)(_system_configuration.Xfrac)) / 1000000.0;
+ disk_submit (stat_disk[i].name, "disk_time", read_time, write_time);
+ }
+#endif /* defined(HAVE_PERFSTAT) */
return (0);
} /* int disk_read */
/**
* collectd - src/interface.c
* Copyright (C) 2005-2008 Florian octo Forster
+ * 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
* Authors:
* Florian octo Forster <octo at verplant.org>
* Sune Marcher <sm at flork.dk>
+ * Manuel Sanmartin
**/
#include "collectd.h"
# include <statgrab.h>
#endif
+#if HAVE_PERFSTAT
+# include <sys/protosw.h>
+# include <libperfstat.h>
+#endif
+
/*
* Various people have reported problems with `getifaddrs' and varying versions
* of `glibc'. That's why it's disabled by default. Since more statistics are
# endif /* !COLLECT_GETIFADDRS */
#endif /* KERNEL_LINUX */
-#if !HAVE_GETIFADDRS && !KERNEL_LINUX && !HAVE_LIBKSTAT && !HAVE_LIBSTATGRAB
+#if HAVE_PERFSTAT
+static perfstat_netinterface_t *ifstat;
+static int nif;
+static int pnif;
+#endif /* HAVE_PERFSTAT */
+
+#if !HAVE_GETIFADDRS && !KERNEL_LINUX && !HAVE_LIBKSTAT && !HAVE_LIBSTATGRAB && !HAVE_PERFSTAT
# error "No applicable input method."
#endif
for (i = 0; i < num; i++)
if_submit (ios[i].interface_name, "if_octets", ios[i].rx, ios[i].tx);
-#endif /* HAVE_LIBSTATGRAB */
+/* #endif HAVE_LIBSTATGRAB */
+
+#elif defined(HAVE_PERFSTAT)
+ perfstat_id_t id;
+ int i, ifs;
+
+ if ((nif = perfstat_netinterface(NULL, NULL, sizeof(perfstat_netinterface_t), 0)) < 0)
+ {
+ char errbuf[1024];
+ WARNING ("interface plugin: perfstat_netinterface: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+
+ if (pnif != nif || ifstat == NULL)
+ {
+ if (ifstat != NULL)
+ free(ifstat);
+ ifstat = malloc(nif * sizeof(perfstat_netinterface_t));
+ }
+ pnif = nif;
+
+ id.name[0]='\0';
+ if ((ifs = perfstat_netinterface(&id, ifstat, sizeof(perfstat_netinterface_t), nif)) < 0)
+ {
+ char errbuf[1024];
+ WARNING ("interface plugin: perfstat_netinterface (interfaces=%d): %s",
+ nif, sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+
+ for (i = 0; i < ifs; i++)
+ {
+ if_submit (ifstat[i].name, "if_octets", ifstat[i].ibytes, ifstat[i].obytes);
+ if_submit (ifstat[i].name, "if_packets", ifstat[i].ipackets ,ifstat[i].opackets);
+ if_submit (ifstat[i].name, "if_errors", ifstat[i].ierrors, ifstat[i].oerrors );
+ }
+#endif /* HAVE_PERFSTAT */
return (0);
} /* int interface_read */
}
%token <number> NUMBER
-%token <boolean> TRUE FALSE
+%token <boolean> BTRUE BFALSE
%token <string> QUOTED_STRING UNQUOTED_STRING
%token SLASH OPENBRAC CLOSEBRAC EOL
argument:
NUMBER {$$.value.number = $1; $$.type = OCONFIG_TYPE_NUMBER;}
- | TRUE {$$.value.boolean = 1; $$.type = OCONFIG_TYPE_BOOLEAN;}
- | FALSE {$$.value.boolean = 0; $$.type = OCONFIG_TYPE_BOOLEAN;}
+ | BTRUE {$$.value.boolean = 1; $$.type = OCONFIG_TYPE_BOOLEAN;}
+ | BFALSE {$$.value.boolean = 0; $$.type = OCONFIG_TYPE_BOOLEAN;}
| string {$$.value.string = $1; $$.type = OCONFIG_TYPE_STRING;}
;
"/" {return (SLASH);}
"<" {return (OPENBRAC);}
">" {return (CLOSEBRAC);}
-{BOOL_TRUE} {yylval.boolean = 1; return (TRUE);}
-{BOOL_FALSE} {yylval.boolean = 0; return (FALSE);}
+{BOOL_TRUE} {yylval.boolean = 1; return (BTRUE);}
+{BOOL_FALSE} {yylval.boolean = 0; return (BFALSE);}
{IPV4_ADDR} {yylval.string = yytext; return (UNQUOTED_STRING);}
/**
* collectd - src/load.c
* Copyright (C) 2005-2008 Florian octo Forster
+ * 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
*
* Authors:
* Florian octo Forster <octo at verplant.org>
+ * Manuel Sanmartin
**/
#define _BSD_SOURCE
#endif
#endif /* defined(HAVE_GETLOADAVG) */
+#ifdef HAVE_PERFSTAT
+# include <sys/proc.h> /* AIX 5 */
+# include <sys/protosw.h>
+# include <libperfstat.h>
+#endif /* HAVE_PERFSTAT */
+
static void load_submit (gauge_t snum, gauge_t mnum, gauge_t lnum)
{
value_t values[3];
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<<SBITS);
+ mnum = (float)cputotal.loadavg[1]/(float)(1<<SBITS);
+ lnum = (float)cputotal.loadavg[2]/(float)(1<<SBITS);
+
+ load_submit (snum, mnum, lnum);
+/* #endif HAVE_PERFSTAT */
+
#else
# error "No applicable input method."
#endif
* collectd - src/memory.c
* Copyright (C) 2005-2008 Florian octo Forster
* 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
* Authors:
* Florian octo Forster <octo at verplant.org>
* Simon Kuhnle <simon at blarzwurst.de>
+ * Manuel Sanmartin
**/
#include "collectd.h"
# include <statgrab.h>
#endif
+#if HAVE_PERFSTAT
+# include <sys/protosw.h>
+# include <libperfstat.h>
+#endif /* HAVE_PERFSTAT */
+
/* vm_statistics_data_t */
#if HAVE_HOST_STATISTICS
static mach_port_t port_host;
#elif HAVE_LIBSTATGRAB
/* no global variables */
/* endif HAVE_LIBSTATGRAB */
-
+#elif HAVE_PERFSTAT
+static int pagesize;
+static perfstat_memory_total_t pmemory;
+/* endif HAVE_PERFSTAT */
#else
# error "No applicable input method."
#endif
#elif HAVE_LIBSTATGRAB
/* no init stuff */
-#endif /* HAVE_LIBSTATGRAB */
+/* #endif HAVE_LIBSTATGRAB */
+#elif HAVE_PERFSTAT
+ pagesize = getpagesize ();
+#endif /* HAVE_PERFSTAT */
return (0);
} /* int memory_init */
memory_submit ("cached", ios->cache);
memory_submit ("free", ios->free);
}
-#endif /* HAVE_LIBSTATGRAB */
+/* #endif HAVE_LIBSTATGRAB */
+
+#elif HAVE_PERFSTAT
+ if (perfstat_memory_total(NULL, &pmemory, sizeof(perfstat_memory_total_t), 1) < 0)
+ {
+ char errbuf[1024];
+ WARNING ("memory plugin: perfstat_memory_total failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+ memory_submit ("used", pmemory.real_inuse * pagesize);
+ memory_submit ("free", pmemory.real_free * pagesize);
+ memory_submit ("cached", pmemory.numperm * pagesize);
+ memory_submit ("system", pmemory.real_system * pagesize);
+ memory_submit ("user", pmemory.real_process * pagesize);
+#endif /* HAVE_PERFSTAT */
return (0);
}
* Copyright (C) 2006-2008 Florian octo Forster
* Copyright (C) 2008 Oleg King
* Copyright (C) 2009 Sebastian Harl
+ * 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
* Florian octo Forster <octo at verplant.org>
* Oleg King <king2 at kaluga.ru>
* Sebastian Harl <sh at tokkee.org>
+ * Manuel Sanmartin
**/
#include "collectd.h"
# include <sys/proc.h>
/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+#elif HAVE_PROCINFO_H
+# include <procinfo.h>
+# include <sys/types.h>
+
+#define MAXPROCENTRY 32
+#define MAXTHRDENTRY 16
+#define MAXARGLN 1024
+/* #endif HAVE_PROCINFO_H */
+
#else
# error "No applicable input method."
#endif
#elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD
/* no global variables */
-#endif /* HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+
+#elif HAVE_PROCINFO_H
+static struct procentry64 procentry[MAXPROCENTRY];
+static struct thrdentry64 thrdentry[MAXTHRDENTRY];
+static int pagesize;
+
+#ifndef _AIXVERSION_610
+int getprocs64 (void *procsinfo, int sizproc, void *fdsinfo, int sizfd, pid_t *index, int count);
+int getthrds64( pid_t, void *, int, tid64_t *, int );
+#endif
+int getargs (struct procentry64 *processBuffer, int bufferLen, char *argsBuffer, int argsLen);
+#endif /* HAVE_PROCINFO_H */
/* put name of process from config to list_head_g tree
list_head_g is a list of 'procstat_t' structs with
#elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD
/* no initialization */
-#endif /* HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+
+#elif HAVE_PROCINFO_H
+ pagesize = getpagesize();
+#endif /* HAVE_PROCINFO_H */
return (0);
} /* int ps_init */
for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next)
ps_submit_proc_list (ps_ptr);
-#endif /* HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+
+#elif HAVE_PROCINFO_H
+ /* AIX */
+ int running = 0;
+ int sleeping = 0;
+ int zombies = 0;
+ int stopped = 0;
+ int paging = 0;
+ int blocked = 0;
+
+ pid_t pindex = 0;
+ int nprocs;
+
+ procstat_t *ps;
+ procstat_entry_t pse;
+
+ ps_list_reset ();
+ while ((nprocs = getprocs64 (procentry, sizeof(struct procentry64),
+ /* fdsinfo = */ NULL, sizeof(struct fdsinfo64),
+ &pindex, MAXPROCENTRY)) > 0)
+ {
+ int i;
+
+ for (i = 0; i < nprocs; i++)
+ {
+ tid64_t thindex;
+ int nthreads;
+ char arglist[MAXARGLN+1];
+ char *cargs;
+ char *cmdline;
+
+ if (procentry[i].pi_state == SNONE) continue;
+ /* if (procentry[i].pi_state == SZOMB) FIXME */
+
+ cmdline = procentry[i].pi_comm;
+ cargs = procentry[i].pi_comm;
+ if ( procentry[i].pi_flags & SKPROC )
+ {
+ if (procentry[i].pi_pid == 0)
+ cmdline = "swapper";
+ cargs = cmdline;
+ }
+ else
+ {
+ if (getargs(&procentry[i], sizeof(struct procentry64), arglist, MAXARGLN) >= 0)
+ {
+ int n;
+
+ n = -1;
+ while (++n < MAXARGLN)
+ {
+ if (arglist[n] == '\0')
+ {
+ if (arglist[n+1] == '\0')
+ break;
+ arglist[n] = ' ';
+ }
+ }
+ cargs = arglist;
+ }
+ }
+
+ pse.id = procentry[i].pi_pid;
+ pse.age = 0;
+ pse.num_lwp = procentry[i].pi_thcount;
+ pse.num_proc = 1;
+
+ thindex=0;
+ while ((nthreads = getthrds64(procentry[i].pi_pid,
+ thrdentry, sizeof(struct thrdentry64),
+ &thindex, MAXTHRDENTRY)) > 0)
+ {
+ int j;
+
+ for (j=0; j< nthreads; j++)
+ {
+ switch (thrdentry[j].ti_state)
+ {
+ /* case TSNONE: break; */
+ case TSIDL: blocked++; break; /* FIXME is really blocked */
+ case TSRUN: running++; break;
+ case TSSLEEP: sleeping++; break;
+ case TSSWAP: paging++; break;
+ case TSSTOP: stopped++; break;
+ case TSZOMB: zombies++; break;
+ }
+ }
+ if (nthreads < MAXTHRDENTRY)
+ break;
+ }
+
+ pse.cpu_user = 0;
+ /* tv_usec is nanosec ??? */
+ pse.cpu_user_counter = procentry[i].pi_ru.ru_utime.tv_sec * 1000000 +
+ procentry[i].pi_ru.ru_utime.tv_usec / 1000;
+
+ pse.cpu_system = 0;
+ /* tv_usec is nanosec ??? */
+ pse.cpu_system_counter = procentry[i].pi_ru.ru_stime.tv_sec * 1000000 +
+ procentry[i].pi_ru.ru_stime.tv_usec / 1000;
+
+ pse.vmem_minflt = 0;
+ pse.vmem_minflt_counter = procentry[i].pi_minflt;
+ pse.vmem_majflt = 0;
+ pse.vmem_majflt_counter = procentry[i].pi_majflt;
+
+ pse.vmem_size = procentry[i].pi_tsize + procentry[i].pi_dvm * pagesize;
+ pse.vmem_rss = (procentry[i].pi_drss + procentry[i].pi_trss) * pagesize;
+ pse.stack_size = 0;
+
+ ps_list_add (cmdline, cargs, &pse);
+ } /* for (i = 0 .. nprocs) */
+
+ if (nprocs < MAXPROCENTRY)
+ break;
+ } /* while (getprocs64() > 0) */
+ ps_submit_state ("running", running);
+ ps_submit_state ("sleeping", sleeping);
+ ps_submit_state ("zombies", zombies);
+ ps_submit_state ("stopped", stopped);
+ ps_submit_state ("paging", paging);
+ ps_submit_state ("blocked", blocked);
+
+ for (ps = list_head_g; ps != NULL; ps = ps->next)
+ ps_submit_proc_list (ps);
+#endif /* HAVE_PROCINFO_H */
return (0);
} /* int ps_read */
* collectd - src/swap.c
* Copyright (C) 2005-2009 Florian octo Forster
* Copyright (C) 2009 Stefan Völkel
+ * 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
*
* Authors:
* Florian octo Forster <octo at verplant.org>
+ * Manuel Sanmartin
**/
#if HAVE_CONFIG_H
# include <statgrab.h>
#endif
+#if HAVE_PERFSTAT
+# include <sys/protosw.h>
+# include <libperfstat.h>
+#endif
+
#undef MAX
#define MAX(x,y) ((x) > (y) ? (x) : (y))
/* No global variables */
/* #endif HAVE_LIBSTATGRAB */
+#elif HAVE_PERFSTAT
+static int pagesize;
+static perfstat_memory_total_t pmemory;
+/*# endif HAVE_PERFSTAT */
+
#else
# error "No applicable input method."
#endif /* HAVE_LIBSTATGRAB */
#elif HAVE_LIBSTATGRAB
/* No init stuff */
-#endif /* HAVE_LIBSTATGRAB */
+/* #endif HAVE_LIBSTATGRAB */
+
+#elif HAVE_PERFSTAT
+ pagesize = getpagesize();
+#endif /* HAVE_PERFSTAT */
return (0);
}
swap_submit ("used", (derive_t) swap->used, DS_TYPE_GAUGE);
swap_submit ("free", (derive_t) swap->free, DS_TYPE_GAUGE);
-#endif /* HAVE_LIBSTATGRAB */
+/* #endif HAVE_LIBSTATGRAB */
+
+#elif HAVE_PERFSTAT
+ if(perfstat_memory_total(NULL, &pmemory, sizeof(perfstat_memory_total_t), 1) < 0)
+ {
+ char errbuf[1024];
+ WARNING ("memory plugin: perfstat_memory_total failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+ swap_submit ("used", (derive_t) (pmemory.pgsp_total - pmemory.pgsp_free) * pagesize, DS_TYPE_GAUGE);
+ swap_submit ("free", (derive_t) pmemory.pgsp_free * pagesize , DS_TYPE_GAUGE);
+#endif /* HAVE_PERFSTAT */
return (0);
} /* int swap_read */
VERSION="`echo \"$VERSION\" | sed -e 's/-/./g'`"
-echo -n "$VERSION"
+if test "x`uname -s`" = "xAIX" ; then
+ echo "$VERSION\c"
+else
+ echo -n "$VERSION"
+fi