From: Garret Heaton Date: Mon, 9 Nov 2009 16:53:51 +0000 (-0800) Subject: Merge branch 'master' of git://github.com/octo/collectd X-Git-Tag: collectd-4.10.0~2^2~1 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=0f512f5546c5d45721171d6dc891488b47b601a3;hp=c901e521eea4a7f066e9e359e8dca49935064d61;p=collectd.git Merge branch 'master' of git://github.com/octo/collectd --- diff --git a/ChangeLog b/ChangeLog index 83980834..ecc3869d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-10-04, Version 4.8.1 + * Build system: Issues when building the iptables plugin have been + fixed. + * exec plugin: Clear the signal block mask before calling exec(2). + * perl plugin: Declare the “environ” variable. This solves build + issues on some platforms. + * processes plugin: Remove unnecessary call of realloc(3). Thanks to + Andrés J. Díaz for the patch. + * unixsock plugin: Fix a (well hidden) race condition related to file + descriptor handling. + 2009-09-13, Version 4.8.0 * collectd: Two new data source types, “DERIVE” and “ABSOLUTE”, have been added. “DERIVE” can be used for counters that are reset @@ -47,6 +58,17 @@ lists, where at least one data source is of type COUNTER and the counter value of all counter data sources is zero. +2009-10-03, Version 4.7.4 + * Build system: Issues when building the iptables plugin have been + fixed. + * exec plugin: Clear the signal block mask before calling exec(2). + * perl plugin: Declare the “environ” variable. This solves build + issues on some platforms. + * processes plugin: Remove unnecessary call of realloc(3). Thanks to + Andrés J. Díaz for the patch. + * unixsock plugin: Fix a (well hidden) race condition related to file + descriptor handling. + 2009-09-13, Version 4.7.3 * collectd: Fix a possible but very rare invalid “free” in the caching code. Thanks to Sebastian Harl for the patch. diff --git a/README b/README index 796fb8ff..d40fd2f0 100644 --- a/README +++ b/README @@ -180,7 +180,7 @@ Features Network UPS tools: UPS current, voltage, power, charge, utilisation, temperature, etc. See upsd(8). - - olsr + - olsrd Queries routing information from the “Optimized Link State Routing” daemon. @@ -480,9 +480,11 @@ Prerequisites * libganglia (optional) Used by the `gmond' plugin to process data received from Ganglia. + * libgcrypt (optional) Used by the `network' plugin for encryption and authentication. + * libhal (optional) If present, the uuid plugin will check for UUID from HAL. @@ -502,9 +504,11 @@ Prerequisites Library that encapsulates the `Java Virtual Machine' (JVM). This library is used by the Java plugin to execute Java bytecode. See “Configuring with libjvm” below. + (and others) * libmemcached (optional) Used by the `memcachec' plugin to connect to a memcache daemon. + * libmysqlclient (optional) Unsurprisingly used by the `mysql' plugin. @@ -567,6 +571,10 @@ Prerequisites and/or Solaris. + * libtokyotyrant (optional) + Used by the tokyotyrant plugin. + + * libupsclient/nut (optional) For the `nut' plugin which queries nut's `upsd'. diff --git a/configure.in b/configure.in index 9ab3006e..b3d9516e 100644 --- a/configure.in +++ b/configure.in @@ -1589,7 +1589,7 @@ then if test -d "$with_java_home" then AC_MSG_CHECKING([for jni.h]) - TMPDIR=`find -L "$with_java_home" -name jni.h -type f -exec 'dirname' '{}' ';' | head -n 1` + TMPDIR=`find "$with_java_home" -name jni.h -type f -exec 'dirname' '{}' ';' | head -n 1` if test "x$TMPDIR" != "x" then AC_MSG_RESULT([found in $TMPDIR]) @@ -1599,7 +1599,7 @@ then fi AC_MSG_CHECKING([for jni_md.h]) - TMPDIR=`find -L "$with_java_home" -name jni_md.h -type f -exec 'dirname' '{}' ';' | head -n 1` + TMPDIR=`find "$with_java_home" -name jni_md.h -type f -exec 'dirname' '{}' ';' | head -n 1` if test "x$TMPDIR" != "x" then AC_MSG_RESULT([found in $TMPDIR]) @@ -1609,7 +1609,7 @@ then fi AC_MSG_CHECKING([for libjvm.so]) - TMPDIR=`find -L "$with_java_home" -name libjvm.so -type f -exec 'dirname' '{}' ';' | head -n 1` + TMPDIR=`find "$with_java_home" -name libjvm.so -type f -exec 'dirname' '{}' ';' | head -n 1` if test "x$TMPDIR" != "x" then AC_MSG_RESULT([found in $TMPDIR]) @@ -1621,7 +1621,7 @@ then if test "x$JAVAC" = "x" then AC_MSG_CHECKING([for javac]) - TMPDIR=`find -L "$with_java_home" -name javac -type f | head -n 1` + TMPDIR=`find "$with_java_home" -name javac -type f | head -n 1` if test "x$TMPDIR" != "x" then JAVAC="$TMPDIR" diff --git a/src/collectd-snmp.pod b/src/collectd-snmp.pod index f34113d9..51e04813 100644 --- a/src/collectd-snmp.pod +++ b/src/collectd-snmp.pod @@ -184,7 +184,7 @@ This value is not applied to counter-values. I is added to gauge-values returned by the SNMP-agent after they have been multiplied by any B value. If, for example, a thermometer returns degrees Kelvin you could specify a shift of B<273.15> here to store values in -degrees Celsius. The default value is is course B<0.0>. +degrees Celsius. The default value is of course B<0.0>. This value is not applied to counter-values. diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 11ae7485..ad13353f 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -82,6 +82,7 @@ FQDNLookup true #@BUILD_PLUGIN_JAVA_TRUE@LoadPlugin java #@BUILD_PLUGIN_LIBVIRT_TRUE@LoadPlugin libvirt @BUILD_PLUGIN_LOAD_TRUE@@BUILD_PLUGIN_LOAD_TRUE@LoadPlugin load +#@BUILD_PLUGIN_MADWIFI_TRUE@LoadPlugin madwifi #@BUILD_PLUGIN_MBMON_TRUE@LoadPlugin mbmon #@BUILD_PLUGIN_MEMCACHEC_TRUE@LoadPlugin memcachec #@BUILD_PLUGIN_MEMCACHED_TRUE@LoadPlugin memcached @@ -360,6 +361,17 @@ FQDNLookup true # HostnameFormat name # +# +# Interface "wlan0" +# IgnoreSelected false +# Source "SysFS" +# WatchSet "None" +# WatchAdd "node_octets" +# WatchAdd "node_rssi" +# WatchAdd "is_rx_acl" +# WatchAdd "is_scan_active" +# + # # Host "127.0.0.1" # Port "411" @@ -727,6 +739,7 @@ FQDNLookup true ############################################################################## # Load required matches: +#@BUILD_PLUGIN_MATCH_EMPTY_COUNTER_TRUE@LoadPlugin match_empty_counter #@BUILD_PLUGIN_MATCH_REGEX_TRUE@LoadPlugin match_regex #@BUILD_PLUGIN_MATCH_VALUE_TRUE@LoadPlugin match_value #@BUILD_PLUGIN_MATCH_TIMEDIFF_TRUE@LoadPlugin match_timediff diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 3ea3d4dd..6bae3393 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -3235,7 +3235,7 @@ C/var/run/collectd-powerdns>. Select more detailed statistics of processes matching this name. The statistics collected for these selected processes are size of the resident segment size (RSS), user- and system-time used, number of processes and number of threads, -and minor and major pagefaults. +io data (where available) and minor and major pagefaults. =item B I I diff --git a/src/cpu.c b/src/cpu.c index c4bd1a6d..b92b0e2f 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -123,6 +123,9 @@ static int numcpu; #elif defined(HAVE_SYSCTLBYNAME) static int numcpu; +# ifdef HAVE_SYSCTL_KERN_CP_TIMES +static int maxcpu; +# endif /* HAVE_SYSCTL_KERN_CP_TIMES */ /* #endif HAVE_SYSCTLBYNAME */ #elif defined(HAVE_LIBSTATGRAB) @@ -193,12 +196,22 @@ static int init (void) if (sysctlbyname ("hw.ncpu", &numcpu, &numcpu_size, NULL, 0) < 0) { char errbuf[1024]; - WARNING ("cpu plugin: sysctlbyname: %s", + WARNING ("cpu plugin: sysctlbyname(hw.ncpu): %s", sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } -#ifndef HAVE_SYSCTL_KERN_CP_TIMES +#ifdef HAVE_SYSCTL_KERN_CP_TIMES + numcpu_size = sizeof (maxcpu); + + if (sysctlbyname("kern.smp.maxcpus", &maxcpu, &numcpu_size, NULL, 0) < 0) + { + char errbuf[1024]; + WARNING ("cpu plugin: sysctlbyname(kern.smp.maxcpus): %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } +#else if (numcpu != 1) NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu); #endif @@ -467,7 +480,7 @@ static int cpu_read (void) } /* #endif CAN_USE_SYSCTL */ #elif defined(HAVE_SYSCTLBYNAME) && defined(HAVE_SYSCTL_KERN_CP_TIMES) - long cpuinfo[numcpu][CPUSTATES]; + long cpuinfo[maxcpu][CPUSTATES]; size_t cpuinfo_size; int i; diff --git a/src/gmond.c b/src/gmond.c index 3357ea0b..2ffc42a5 100644 --- a/src/gmond.c +++ b/src/gmond.c @@ -542,9 +542,9 @@ static int staging_entry_update (const char *host, const char *name, /* {{{ */ else if (ds_type == DS_TYPE_GAUGE) se->vl.values[ds_index].gauge = value.gauge; else if (ds_type == DS_TYPE_DERIVE) - se->vl.values[ds_index].DERIVE += value.derive; + se->vl.values[ds_index].derive += value.derive; else if (ds_type == DS_TYPE_ABSOLUTE) - se->vl.values[ds_index].ABSOLUTE = value.absolute; + se->vl.values[ds_index].absolute = value.absolute; se->flags |= (0x01 << ds_index); diff --git a/src/processes.c b/src/processes.c index 5f67abaa..5ef4acc0 100644 --- a/src/processes.c +++ b/src/processes.c @@ -136,6 +136,12 @@ typedef struct procstat_entry_s unsigned long cpu_user_counter; unsigned long cpu_system_counter; + /* io data */ + long io_rchar; + long io_wchar; + long io_syscr; + long io_syscw; + struct procstat_entry_s *next; } procstat_entry_t; @@ -159,6 +165,12 @@ typedef struct procstat unsigned long cpu_user_counter; unsigned long cpu_system_counter; + /* io data */ + long io_rchar; + long io_wchar; + long io_syscr; + long io_syscw; + struct procstat *next; struct procstat_entry_s *instances; } procstat_t; @@ -328,6 +340,10 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t pse->vmem_size = entry->vmem_size; pse->vmem_rss = entry->vmem_rss; pse->stack_size = entry->stack_size; + pse->io_rchar = entry->io_rchar; + pse->io_wchar = entry->io_wchar; + pse->io_syscr = entry->io_syscr; + pse->io_syscw = entry->io_syscw; ps->num_proc += pse->num_proc; ps->num_lwp += pse->num_lwp; @@ -335,6 +351,11 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t ps->vmem_rss += pse->vmem_rss; ps->stack_size += pse->stack_size; + ps->io_rchar += ((pse->io_rchar == -1)?0:pse->io_rchar); + ps->io_wchar += ((pse->io_wchar == -1)?0:pse->io_wchar); + ps->io_syscr += ((pse->io_syscr == -1)?0:pse->io_syscr); + ps->io_syscw += ((pse->io_syscw == -1)?0:pse->io_syscw); + if ((entry->vmem_minflt_counter == 0) && (entry->vmem_majflt_counter == 0)) { @@ -425,6 +446,10 @@ static void ps_list_reset (void) ps->vmem_size = 0; ps->vmem_rss = 0; ps->stack_size = 0; + ps->io_rchar = -1; + ps->io_wchar = -1; + ps->io_syscr = -1; + ps->io_syscw = -1; pse_prev = NULL; pse = ps->instances; @@ -607,12 +632,33 @@ static void ps_submit_proc_list (procstat_t *ps) vl.values_len = 2; plugin_dispatch_values (&vl); + if ( (ps->io_rchar != -1) && (ps->io_wchar != -1) ) + { + sstrncpy (vl.type, "ps_disk_octets", sizeof (vl.type)); + vl.values[0].counter = ps->io_rchar; + vl.values[1].counter = ps->io_wchar; + vl.values_len = 2; + plugin_dispatch_values (&vl); + } + + if ( (ps->io_syscr != -1) && (ps->io_syscw != -1) ) + { + sstrncpy (vl.type, "ps_disk_ops", sizeof (vl.type)); + vl.values[0].counter = ps->io_syscr; + vl.values[1].counter = ps->io_syscw; + vl.values_len = 2; + plugin_dispatch_values (&vl); + } + DEBUG ("name = %s; num_proc = %lu; num_lwp = %lu; vmem_rss = %lu; " "vmem_minflt_counter = %lu; vmem_majflt_counter = %lu; " - "cpu_user_counter = %lu; cpu_system_counter = %lu;", + "cpu_user_counter = %lu; cpu_system_counter = %lu; " + "io_rchar = %ld; io_wchar = %ld; " + "io_syscr = %ld; io_syscw = %ld;", ps->name, ps->num_proc, ps->num_lwp, ps->vmem_rss, ps->vmem_minflt_counter, ps->vmem_majflt_counter, - ps->cpu_user_counter, ps->cpu_system_counter); + ps->cpu_user_counter, ps->cpu_system_counter, + ps->io_rchar, ps->io_wchar, ps->io_syscr, ps->io_syscw); } /* void ps_submit_proc_list */ /* ------- additional functions for KERNEL_LINUX/HAVE_THREAD_INFO ------- */ @@ -644,6 +690,52 @@ static int ps_read_tasks (int pid) return ((count >= 1) ? count : 1); } /* int *ps_read_tasks */ +static procstat_t *ps_read_io (int pid, procstat_t *ps) +{ + FILE *fh; + char buffer[1024]; + char filename[64]; + + char *fields[8]; + int numfields; + + ssnprintf (filename, sizeof (filename), "/proc/%i/io", pid); + if ((fh = fopen (filename, "r")) == NULL) + return (NULL); + + while (fgets (buffer, 1024, fh) != NULL) + { + long *val = NULL; + + if (strncasecmp (buffer, "rchar:", 6) == 0) + val = &(ps->io_rchar); + else if (strncasecmp (buffer, "wchar:", 6) == 0) + val = &(ps->io_wchar); + else if (strncasecmp (buffer, "syscr:", 6) == 0) + val = &(ps->io_syscr); + else if (strncasecmp (buffer, "syscw:", 6) == 0) + val = &(ps->io_syscw); + else + continue; + + numfields = strsplit (buffer, fields, 8); + + if (numfields < 2) + continue; + + *val = atol (fields[1]); + } + + if (fclose (fh)) + { + char errbuf[1024]; + WARNING ("processes: fclose: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + } + + return (ps); +} /* procstat_t *ps_read_io */ + int ps_read_process (int pid, procstat_t *ps, char *state) { char filename[64]; @@ -746,6 +838,17 @@ int ps_read_process (int pid, procstat_t *ps, char *state) ps->vmem_rss = (unsigned long) vmem_rss; ps->stack_size = (unsigned long) stack_size; + if ( (ps_read_io (pid, ps)) == NULL) + { + /* no io data */ + ps->io_rchar = -1; + ps->io_wchar = -1; + ps->io_syscr = -1; + ps->io_syscw = -1; + + DEBUG("ps_read_process: not get io data for pid %i",pid); + } + /* success */ return (0); } /* int ps_read_process (...) */ @@ -1274,6 +1377,11 @@ static int ps_read (void) pse.cpu_system = 0; pse.cpu_system_counter = ps.cpu_system_counter; + pse.io_rchar = ps.io_rchar; + pse.io_wchar = ps.io_wchar; + pse.io_syscr = ps.io_syscr; + pse.io_syscw = ps.io_syscw; + switch (state) { case 'R': running++; break; @@ -1402,6 +1510,12 @@ static int ps_read (void) * 1000 + procs[i].ki_rusage.ru_stime.tv_usec; + /* no io data */ + pse.io_rchar = -1; + pse.io_wchar = -1; + pse.io_syscr = -1; + pse.io_syscw = -1; + switch (procs[i].ki_stat) { case SSTOP: stopped++; break; diff --git a/src/types.db b/src/types.db index 0225e0f6..c8c6b98a 100644 --- a/src/types.db +++ b/src/types.db @@ -123,6 +123,8 @@ protocol_counter value:COUNTER:0:U ps_count processes:GAUGE:0:1000000, threads:GAUGE:0:1000000 ps_cputime user:COUNTER:0:16000000, syst:COUNTER:0:16000000 ps_pagefaults minflt:COUNTER:0:9223372036854775807, majflt:COUNTER:0:9223372036854775807 +ps_disk_octets read:DERIVE:0:U, write:DERIVE:0:U +ps_disk_ops read:DERIVE:0:U, write:DERIVE:0:U ps_rss value:GAUGE:0:9223372036854775807 ps_stacksize value:GAUGE:0:9223372036854775807 ps_state value:GAUGE:0:65535 diff --git a/version-gen.sh b/version-gen.sh index f2c61f54..e0114d04 100755 --- a/version-gen.sh +++ b/version-gen.sh @@ -1,6 +1,6 @@ #!/bin/sh -DEFAULT_VERSION="4.8.0.git" +DEFAULT_VERSION="4.8.1.git" VERSION="`git describe 2> /dev/null | sed -e 's/^collectd-//'`"