From: Florian Forster Date: Tue, 8 Dec 2009 14:43:47 +0000 (+0100) Subject: Merge branch 'ms/aix' X-Git-Tag: collectd-4.9.0~27 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=389bd16230471c130f36532096bb3c92ab8c3b0b;hp=bb1db6bf6481a6e8ee48144860cb640b3bd2a36d;p=collectd.git Merge branch 'ms/aix' --- diff --git a/AUTHORS b/AUTHORS index 5abbfa33..4b133fa0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -82,6 +82,17 @@ Luke Herberling Lyonel Vincent - 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 - uptime plugin. - ip6tables support in the iptables plugin. diff --git a/configure.in b/configure.in index b02f004f..a11e3ba7 100644 --- a/configure.in +++ b/configure.in @@ -63,6 +63,10 @@ case $host_os in *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 @@ -629,6 +633,8 @@ static float foo = NAN; 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( @@ -655,6 +661,7 @@ static float foo = NAN; [c_cv_have_nan_zero="no"] ) ) + LDFLAGS=$SAVE_LDFLAGS if test "x$c_cv_have_nan_zero" = "xyes" then nan_type="zero" @@ -1054,6 +1061,38 @@ fi 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" @@ -3825,6 +3864,22 @@ then 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 @@ -4299,6 +4354,7 @@ Configuration: libopenipmi . . . . . $with_libopenipmipthread liboping . . . . . . $with_liboping libpcap . . . . . . . $with_libpcap + libperfstat . . . . . $with_perfstat libperl . . . . . . . $with_libperl libpq . . . . . . . . $with_libpq libpthread . . . . . $with_libpthread diff --git a/src/Makefile.am b/src/Makefile.am index 4b9fa0ee..d928311a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -68,6 +68,10 @@ endif 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 @@ -91,6 +95,10 @@ collectd_nagios_LDADD = 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 @@ -197,6 +205,9 @@ if BUILD_WITH_LIBSTATGRAB 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 @@ -284,6 +295,9 @@ if BUILD_WITH_LIBSTATGRAB 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 @@ -374,6 +388,9 @@ if BUILD_WITH_LIBDEVINFO 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 @@ -452,6 +469,9 @@ if BUILD_WITH_LIBSTATGRAB 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 @@ -562,6 +582,9 @@ if BUILD_WITH_LIBSTATGRAB 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 @@ -906,6 +929,10 @@ if BUILD_WITH_LIBSTATGRAB 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 diff --git a/src/cpu.c b/src/cpu.c index b92b0e2f..7aa6361b 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -3,6 +3,7 @@ * 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 @@ -21,6 +22,7 @@ * Florian octo Forster * Oleg King * Simon Kuhnle + * Manuel Sanmartin **/ #include "collectd.h" @@ -88,8 +90,13 @@ # include #endif +# ifdef HAVE_PERFSTAT +# include +# include +# 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) { @@ -219,7 +232,11 @@ 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 */ @@ -540,7 +557,46 @@ static int cpu_read (void) 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); } diff --git a/src/disk.c b/src/disk.c index 94257fef..0a908992 100644 --- a/src/disk.c +++ b/src/disk.c @@ -1,6 +1,7 @@ /** * 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 @@ -17,6 +18,7 @@ * * Authors: * Florian octo Forster + * Manuel Sanmartin **/ #include "collectd.h" @@ -63,6 +65,14 @@ # include #endif +#if HAVE_PERFSTAT +# ifndef _AIXVERSION_610 +# include +# endif +# include +# include +#endif + #if HAVE_IOKIT_IOKITLIB_H static mach_port_t io_master_port = MACH_PORT_NULL; /* #endif HAVE_IOKIT_IOKITLIB_H */ @@ -105,6 +115,12 @@ static int numdisk = 0; #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 @@ -681,7 +697,60 @@ static int disk_read (void) 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 */ diff --git a/src/interface.c b/src/interface.c index 8557cb10..1ba6c8c3 100644 --- a/src/interface.c +++ b/src/interface.c @@ -1,6 +1,7 @@ /** * 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 @@ -18,6 +19,7 @@ * Authors: * Florian octo Forster * Sune Marcher + * Manuel Sanmartin **/ #include "collectd.h" @@ -51,6 +53,11 @@ # include #endif +#if HAVE_PERFSTAT +# include +# include +#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 @@ -63,7 +70,13 @@ # 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 @@ -308,7 +321,44 @@ static int interface_read (void) 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 */ diff --git a/src/liboconfig/parser.y b/src/liboconfig/parser.y index 49cd139d..5b7aa94a 100644 --- a/src/liboconfig/parser.y +++ b/src/liboconfig/parser.y @@ -46,7 +46,7 @@ extern char *c_file; } %token NUMBER -%token TRUE FALSE +%token BTRUE BFALSE %token QUOTED_STRING UNQUOTED_STRING %token SLASH OPENBRAC CLOSEBRAC EOL @@ -76,8 +76,8 @@ string: 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;} ; diff --git a/src/liboconfig/scanner.l b/src/liboconfig/scanner.l index b559e863..9f0cd8e3 100644 --- a/src/liboconfig/scanner.l +++ b/src/liboconfig/scanner.l @@ -69,8 +69,8 @@ IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})? "/" {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);} diff --git a/src/load.c b/src/load.c index 575b4ca4..0188da7e 100644 --- a/src/load.c +++ b/src/load.c @@ -1,6 +1,7 @@ /** * 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 @@ -17,6 +18,7 @@ * * Authors: * Florian octo Forster + * Manuel Sanmartin **/ #define _BSD_SOURCE @@ -41,6 +43,12 @@ #endif #endif /* defined(HAVE_GETLOADAVG) */ +#ifdef HAVE_PERFSTAT +# include /* AIX 5 */ +# include +# include +#endif /* HAVE_PERFSTAT */ + static void load_submit (gauge_t snum, gauge_t mnum, gauge_t lnum) { value_t values[3]; @@ -132,6 +140,25 @@ static int load_read (void) 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< * Simon Kuhnle + * Manuel Sanmartin **/ #include "collectd.h" @@ -49,6 +51,11 @@ # include #endif +#if HAVE_PERFSTAT +# include +# include +#endif /* HAVE_PERFSTAT */ + /* vm_statistics_data_t */ #if HAVE_HOST_STATISTICS static mach_port_t port_host; @@ -75,7 +82,10 @@ static int pagesize; #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 @@ -116,8 +126,11 @@ static int memory_init (void) #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 */ @@ -364,7 +377,22 @@ static int memory_read (void) 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); } diff --git a/src/processes.c b/src/processes.c index 35f99a9b..576a5b15 100644 --- a/src/processes.c +++ b/src/processes.c @@ -4,6 +4,7 @@ * 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 @@ -24,6 +25,7 @@ * Florian octo Forster * Oleg King * Sebastian Harl + * Manuel Sanmartin **/ #include "collectd.h" @@ -94,6 +96,15 @@ # include /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */ +#elif HAVE_PROCINFO_H +# include +# include + +#define MAXPROCENTRY 32 +#define MAXTHRDENTRY 16 +#define MAXARGLN 1024 +/* #endif HAVE_PROCINFO_H */ + #else # error "No applicable input method." #endif @@ -191,7 +202,19 @@ static long pagesize_g; #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 @@ -563,7 +586,11 @@ static int ps_init (void) #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 */ @@ -1542,7 +1569,133 @@ static int ps_read (void) 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 */ diff --git a/src/swap.c b/src/swap.c index 6ccae563..7f41c9ea 100644 --- a/src/swap.c +++ b/src/swap.c @@ -2,6 +2,7 @@ * 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 @@ -18,6 +19,7 @@ * * Authors: * Florian octo Forster + * Manuel Sanmartin **/ #if HAVE_CONFIG_H @@ -57,6 +59,11 @@ # include #endif +#if HAVE_PERFSTAT +# include +# include +#endif + #undef MAX #define MAX(x,y) ((x) > (y) ? (x) : (y)) @@ -86,6 +93,11 @@ int kvm_pagesize; /* 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 */ @@ -134,7 +146,11 @@ static int swap_init (void) #elif HAVE_LIBSTATGRAB /* No init stuff */ -#endif /* HAVE_LIBSTATGRAB */ +/* #endif HAVE_LIBSTATGRAB */ + +#elif HAVE_PERFSTAT + pagesize = getpagesize(); +#endif /* HAVE_PERFSTAT */ return (0); } @@ -449,7 +465,19 @@ static int swap_read (void) 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 */ diff --git a/version-gen.sh b/version-gen.sh index e0114d04..a36d6f5e 100755 --- a/version-gen.sh +++ b/version-gen.sh @@ -10,4 +10,8 @@ fi 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