+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
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.
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.
* libganglia (optional)
Used by the `gmond' plugin to process data received from Ganglia.
+ <http://ganglia.info/>
* libgcrypt (optional)
Used by the `network' plugin for encryption and authentication.
+ <http://www.gnupg.org/>
* libhal (optional)
If present, the uuid plugin will check for UUID from HAL.
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.
+ <http://openjdk.java.net/> (and others)
* libmemcached (optional)
Used by the `memcachec' plugin to connect to a memcache daemon.
+ <http://tangent.org/552/libmemcached.html>
* libmysqlclient (optional)
Unsurprisingly used by the `mysql' plugin.
and/or Solaris.
<http://www.i-scream.org/libstatgrab/>
+ * libtokyotyrant (optional)
+ Used by the tokyotyrant plugin.
+ <http://1978th.net/tokyotyrant/>
+
* libupsclient/nut (optional)
For the `nut' plugin which queries nut's `upsd'.
<http://networkupstools.org/>
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])
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])
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])
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"
I<Value> is added to gauge-values returned by the SNMP-agent after they have
been multiplied by any B<Scale> 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.
#@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
# HostnameFormat name
#</Plugin>
+#<Plugin madwifi>
+# Interface "wlan0"
+# IgnoreSelected false
+# Source "SysFS"
+# WatchSet "None"
+# WatchAdd "node_octets"
+# WatchAdd "node_rssi"
+# WatchAdd "is_rx_acl"
+# WatchAdd "is_scan_active"
+#</Plugin>
+
#<Plugin mbmon>
# Host "127.0.0.1"
# Port "411"
##############################################################################
# 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
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<ProcessMatch> I<name> I<regex>
#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)
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
}
/* #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;
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);
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;
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;
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;
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))
{
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;
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 ------- */
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];
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 (...) */
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;
* 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;
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
#!/bin/sh
-DEFAULT_VERSION="4.8.0.git"
+DEFAULT_VERSION="4.8.1.git"
VERSION="`git describe 2> /dev/null | sed -e 's/^collectd-//'`"