Merge branch 'collectd-4.9' into collectd-4.10
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 27 Nov 2010 10:00:29 +0000 (11:00 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 27 Nov 2010 10:00:29 +0000 (11:00 +0100)
Conflicts:
ChangeLog
src/collectd.conf.pod
version-gen.sh

1  2 
ChangeLog
src/collectd.conf.pod
src/netapp.c
src/processes.c

diff --combined ChangeLog
+++ b/ChangeLog
 +2010-07-09, Version 4.10.1
 +      * Build system: Checking for "strtok_r" under Solaris has been fixed.
 +      * Portability: Fixes for Solaris 8 have been applied. Thanks to
 +        Alexander Wuerstlein for his patch.
 +      * collectd: The shutdown speed when terminating the read threads has
 +        been improved.
 +      * libcollectdclient: A format error in the PUTVAL command has been
 +        removed. Thanks to Johan Van den Brande for fixing this.
 +      * df plugin: An error message shown when "cu_mount_getlist" fails has
 +        been added.
 +      * processes plugin: Missing initialization code for IO members of a
 +        struct has been added. Thanks to Aurélien Reynaud for fixing this.
 +      * python plugin: Memory leaks in the write and notification callbacks
 +        have been fixed. A possible crash when the plugin was loaded but not
 +        configured has been fixed. Thanks to Sven Trenkel for his patches.
 +      * snmp plugin: Verbosity with regard to unknown ASN types has been
 +        increased. A build problem on PowerPC and ARM processors has been
 +        fixed by Aurélien Reynaud; thanks!
 +      * powerdns plugin: Compatibility changes for PowerDNS 2.9.22 and above
 +        have been applied. Thanks to Luke Heberling for his changes.
 +
 +2010-05-01, Version 4.10.0
 +      * collectd: JSON output now includes the "dstypes" and "dsnames"
 +        fields. This makes it easier for external applications to interpret
 +        the data. Thanks to Chris Buben for his work.
 +      * collectd: The new "Timeout" option can be used to specify a
 +        "timeout" for missing values. This is used in the threshold checking
 +        code to detect missing values. Thanks to Andrés J. Díaz for the
 +        patch.
 +      * apache plugin: Support for "IdleWorkers" (Apache 1.*: "IdleServers")
 +        has been added.
 +      * curl plugin: The new "ExcludeRegex" allows to easily exclude certain
 +        lines from the match.
 +      * curl_xml plugin: This new plugin allows to read XML files using cURL
 +        and extract metrics included in the files. Thanks to Amit Gupta for
 +        his work.
 +      * filecount plugin: The new "IncludeHidden" option allows to include
 +        "hidden" files and directories in the statistics. Thanks to Vaclav
 +        Malek for the patch.
 +      * logfile plugin: The new "PrintSeverity" option allows to include the
 +        severity of a message in the output. Thanks to Clément Stenac for
 +        his patch.
 +      * memcachec plugin: The new "ExcludeRegex" allows to easily exclude
 +        certain lines from the match.
 +      * modbus plugin: This new plugin allows to read registers from
 +        Modbus-TCP enabled devices.
 +      * network plugin: The new "Interface" option allows to set the
 +        interface to be used for multicast and, if supported, unicast
 +        traffic. Thanks to Max Henkel for his work.
 +      * openvpn plugin: The "CollectUserCount" and "CollectIndividualUsers"
 +        options allow more detailed control over how to report sessions of
 +        multiple users. Thanks to Fabian Schuh for his work.
 +      * pinba plugin: This new plugin receives timing information from the
 +        Pinba PHP extension, which can be used for profiling PHP code and
 +        webserver performance. Thanks to Phoenix Kayo for his work.
 +      * ping plugin: The new "MaxMissed" allows to re-resolve a hosts
 +        address when it doesn't reply to a number of ping requests. Thanks
 +        to Stefan Völkel for the patch.
 +      * postgresql plugin: The "Interval" config option has been added. The
 +        plugin has been relicensed under the 2-clause BSD license. Thanks to
 +        Sebastian Harl for his work.
 +      * processes plugin: Support for "code" and "data" virtual memory sizes
 +        has been added. Thanks to Clément Stenac for his patch.
 +      * python plugin: Support for Python 3 has been implemented. Thanks to
 +        Sven Trenkel for his work.
 +      * routeros plugin: Support for collecting CPU load, memory usage, used
 +        and free disk space, sectors written and number of bad blocks from
 +        MikroTik devices has been added.
 +      * swap plugin: Support for Linux < 2.6 has been added. Thanks to Lorin
 +        Scraba for his patch.
 +      * tail plugin: The new "ExcludeRegex" allows to easily exclude certain
 +        lines from the match. Thanks to Peter Warasin for his patch.
 +      * write_http plugin: The "StoreRates" option has been added. Thanks to
 +        Paul Sadauskas for his patch.
 +      * regex match: The "Invert" option has been added. Thanks to Julien
 +        Ammous for his patch.
 +
+ 2010-11-27, Version 4.9.4
+       * Documentation: Various documentation fixes.
+       * collectd: If including one configuration file fails, continue with
+         the rest of the configuration if possible.
+       * collectd: Fix a bug in the read function scheduling. In rare cases
+         read functions may not have been called as often as requested.
+       * collectd: Concurrency issues with errno(3) under AIX have been
+         fixed: A thread-safe version of errno has to be requested under AIX.
+         Thanks to Aurélien Reynaud for his patch.
+       * curl, memcachec, tail plugins: Fix handling of "DERIVE" data
+         sources. Matching the end of a string has been improved; thanks to
+         Sebastian Harl for the patch.
+       * curl_json plugin: Fix a problem when parsing 64bit integers. Reading
+         JSON data from non-HTTP sources has been fixed.
+       * netapp plugin: Pass the interval setting to the dispatch function.
+         Restore compatibility to NetApp Release 7.3. Thanks to Sven Trenkel
+         for the patch.
+       * network plugin: Be less verbose about unchecked signatures, in order
+         to prevent spamming the logs.
+       * notify_email plugin: Concurrency problems have been fixed.
+       * python plugin: Set "sys.argv", since many scripts don't expect that
+         it may not be set. Thanks to Sven Trenkel for the patch.
+       * rrdtool, rrdcached plugin: Fix a too strict assertion when creating
+         RRD files.
+       * value match: A minor memory leak has been fixed. Thanks to Sven
+         Trenkel for the patch.
  2010-07-09, Version 4.9.3
        * Build system: Checking for "strtok_r" under Solaris has been fixed.
        * Portability: Fixes for Solaris 8 have been applied. Thanks to
diff --combined src/collectd.conf.pod
@@@ -129,16 -129,10 +129,20 @@@ Configures the interval in which to que
  values lead to a higher system load produced by collectd, while higher values
  lead to more coarse statistics.
  
+ B<Warning:> You should set this once and then never touch it again. If you do,
+ I<you will have to delete all your RRD files> or know some serious RRDtool
+ magic! (Assuming you're using the I<RRDtool> or I<RRDCacheD> plugin.)
 +=item B<Timeout> I<Iterations>
 +
 +Consider a value list "missing" when no update has been read or received for
 +I<Iterations> iterations. By default, I<collectd> considers a value list
 +missing when no update has been received for twice the update interval. Since
 +this setting uses iterations, the maximum allowed time without update depends
 +on the I<Interval> information contained in each value list. This is used in
 +the I<Threshold> configuration to dispatch notifications about missing values,
 +see L<"THRESHOLD CONFIGURATION"> below.
 +
  =item B<ReadThreads> I<Num>
  
  Number of threads to start for reading plugins. The default value is B<5>, but
@@@ -656,110 -650,6 +660,110 @@@ Type-instance to use. Defaults to the c
  
  =back
  
 +=head2 Plugin C<curl_xml>
 +
 +The B<curl_xml plugin> uses B<libcurl> (L<http://curl.haxx.se/>) and B<libxml2>
 +(L<http://xmlsoft.org/>) to retrieve XML data via cURL.
 +
 + <Plugin "curl_xml">
 +   <URL "http://localhost/stats.xml">
 +     Host "my_host"
 +     Instance "some_instance"
 +     User "collectd"
 +     Password "thaiNg0I"
 +     VerifyPeer true
 +     VerifyHost true
 +     CACert "/path/to/ca.crt"
 +
 +     <XPath "table[@id=\"magic_level\"]/tr">
 +       Type "magic_level"
 +       #InstancePrefix "prefix-"
 +       InstanceFrom "td[1]"
 +       ValuesFrom "td[2]/span[@class=\"level\"]"
 +     </XPath>
 +   </URL>
 + </Plugin>
 +
 +In the B<Plugin> block, there may be one or more B<URL> blocks, each defining a
 +URL to be fetched via HTTP (using libcurl). Within each B<URL> block there are
 +options which specify the connection parameters, for example authentication
 +information, and one or more B<XPath> blocks.
 +
 +Each B<XPath> block specifies how to get one type of information. The
 +string argument must be a valid XPath expression which returns a list
 +of "base elements". One value is dispatched for each "base element". The
 +I<type instance> and values are looked up using further I<XPath> expressions
 +that should be relative to the base element.
 +
 +Within the B<URL> block the following options are accepted:
 +
 +=over 4
 +
 +=item B<Host> I<Name>
 +
 +Use I<Name> as the host name when submitting values. Defaults to the global
 +host name setting.
 +
 +=item B<Instance> I<Instance>
 +
 +Use I<Instance> as the plugin instance when submitting values. Defaults to an
 +empty string (no plugin instance).
 +
 +=item B<User> I<User>
 +=item B<Password> I<Password>
 +=item B<VerifyPeer> B<true>|B<false>
 +=item B<VerifyHost> B<true>|B<false>
 +=item B<CACert> I<CA Cert File>
 +
 +These options behave exactly equivalent to the appropriate options of the
 +I<cURL> and I<cURL-JSON> plugins. Please see there for a detailed description.
 +
 +=item E<lt>B<XPath> I<XPath-expression>E<gt>
 +
 +Within each B<URL> block, there must be one or more B<XPath> blocks. Each
 +B<XPath> block specifies how to get one type of information. The string
 +argument must be a valid XPath expression which returns a list of "base
 +elements". One value is dispatched for each "base element".
 +
 +Within the B<XPath> block the following options are accepted:
 +
 +=over 4
 +
 +=item B<Type> I<Type>
 +
 +Specifies the I<Type> used for submitting patches. This determines the number
 +of values that are required / expected and whether the strings are parsed as
 +signed or unsigned integer or as double values. See L<types.db(5)> for details.
 +This option is required.
 +
 +=item B<InstancePrefix> I<InstancePrefix>
 +
 +Prefix the I<type instance> with I<InstancePrefix>. The values are simply
 +concatenated together without any separator.
 +This option is optional.
 +
 +=item B<InstanceFrom> I<InstanceFrom>
 +
 +Specifies a XPath expression to use for determining the I<type instance>. The
 +XPath expression must return exactly one element. The element's value is then
 +used as I<type instance>, possibly prefixed with I<InstancePrefix> (see above).
 +
 +This value is required. As a special exception, if the "base XPath expression"
 +(the argument to the B<XPath> block) returns exactly one argument, then this
 +option may be omitted.
 +
 +=item B<ValuesFrom> I<ValuesFrom> [I<ValuesFrom> ...]
 +
 +Specifies one or more XPath expression to use for reading the values. The
 +number of XPath expressions must match the number of data sources in the
 +I<type> specified with B<Type> (see above). Each XPath expression must return
 +exactly one element. The element's value is then parsed as a number and used as
 +value for the appropriate value in the value list dispatched to the daemon.
 +
 +=back
 +
 +=back
 +
  =head2 Plugin C<dbi>
  
  This plugin uses the B<dbi> library (L<http://libdbi.sourceforge.net/>) to
@@@ -1245,12 -1135,6 +1249,12 @@@ note that there are 1000 bytes in a kil
  
  Controls whether or not to recurse into subdirectories. Enabled by default.
  
 +=item B<IncludeHidden> I<true>|I<false>
 +
 +Controls whether or not to include "hidden" files and directories in the count.
 +"Hidden" files and directories are those, whose name begins with a dot.
 +Defaults to I<false>, i.e. by default hidden files and directories are ignored.
 +
  =back
  
  =head2 Plugin C<GenericJMX>
@@@ -1620,11 -1504,6 +1624,11 @@@ running in foreground- or non-daemon-mo
  
  Prefix all lines printed by the current time. Defaults to B<true>.
  
 +=item B<PrintSeverity> B<true>|B<false>
 +
 +When enabled, all lines are prefixed by the severity of the log message, for
 +example "warning". Defaults to B<false>.
 +
  =back
  
  B<Note>: There is no need to notify the daemon after moving or removing the
@@@ -1725,132 -1604,6 +1729,132 @@@ TCP-Port to connect to. Defaults to B<1
  
  =back
  
 +=head2 Plugin C<modbus>
 +
 +The B<modbus plugin> connects to a Modbus "slave" via Modbus/TCP and reads
 +register values. It supports reading single registers (unsigned 16E<nbsp>bit
 +values), large integer values (unsigned 32E<nbsp>bit values) and floating point
 +values (two registers interpreted as IEEE floats in big endian notation).
 +
 +Synopsis:
 +
 + <Data "voltage-input-1">
 +   RegisterBase 0
 +   RegisterType float
 +   Type voltage
 +   Instance "input-1"
 + </Data>
 + 
 + <Data "voltage-input-2">
 +   RegisterBase 2
 +   RegisterType float
 +   Type voltage
 +   Instance "input-2"
 + </Data>
 + 
 + <Host "modbus.example.com">
 +   Address "192.168.0.42"
 +   Port    "502"
 +   Interval 60
 +   
 +   <Slave 1>
 +     Instance "power-supply"
 +     Collect  "voltage-input-1"
 +     Collect  "voltage-input-2"
 +   </Slave>
 + </Host>
 +
 +=over 4
 +
 +=item E<lt>B<Data> I<Name>E<gt> blocks
 +
 +Data blocks define a mapping between register numbers and the "types" used by
 +I<collectd>.
 +
 +Within E<lt>DataE<nbsp>/E<gt> blocks, the following options are allowed:
 +
 +=over 4
 +
 +=item B<RegisterBase> I<Number>
 +
 +Configures the base register to read from the device. If the option
 +B<RegisterType> has been set to B<Uint32> or B<Float>, this and the next
 +register will be read (the register number is increased by one).
 +
 +=item B<RegisterType> B<Uint16>|B<Uint32>|B<Float>
 +
 +Specifies what kind of data is returned by the device. If the type is B<Uint32>
 +or B<Float>, two 16E<nbsp>bit registers will be read and the data is combined
 +into one value. Defaults to B<Uint16>.
 +
 +=item B<Type> I<Type>
 +
 +Specifies the "type" (data set) to use when dispatching the value to
 +I<collectd>. Currently, only data sets with exactly one data source are
 +supported.
 +
 +=item B<Instance> I<Instance>
 +
 +Sets the type instance to use when dispatching the value to I<collectd>. If
 +unset, an empty string (no type instance) is used.
 +
 +=back
 +
 +=item E<lt>B<Host> I<Name>E<gt> blocks
 +
 +Host blocks are used to specify to which hosts to connect and what data to read
 +from their "slaves". The string argument I<Name> is used as hostname when
 +dispatching the values to I<collectd>.
 +
 +Within E<lt>HostE<nbsp>/E<gt> blocks, the following options are allowed:
 +
 +=over 4
 +
 +=item B<Address> I<Hostname>
 +
 +Specifies the node name (the actual network address) used to connect to the
 +host. This may be an IP address or a hostname. Please note that the used
 +I<libmodbus> library only supports IPv4 at the moment.
 +
 +=item B<Port> I<Service>
 +
 +Specifies the port used to connect to the host. The port can either be given as
 +a number or as a service name. Please note that the I<Service> argument must be
 +a string, even if ports are given in their numerical form. Defaults to "502".
 +
 +=item B<Interval> I<Interval>
 +
 +Sets the interval (in seconds) in which the values will be collected from this
 +host. By default the global B<Interval> setting will be used.
 +
 +=item E<lt>B<Slave> I<ID>E<gt>
 +
 +Over each TCP connection, multiple Modbus devices may be reached. The slave ID
 +is used to specify which device should be addressed. For each device you want
 +to query, one B<Slave> block must be given.
 +
 +Within E<lt>SlaveE<nbsp>/E<gt> blocks, the following options are allowed:
 +
 +=over 4
 +
 +=item B<Instance> I<Instance>
 +
 +Specify the plugin instance to use when dispatching the values to I<collectd>.
 +By default "slave_I<ID>" is used.
 +
 +=item B<Collect> I<DataName>
 +
 +Specifies which data to retrieve from the device. I<DataName> must be the same
 +string as the I<Name> argument passed to a B<Data> block. You can specify this
 +option multiple times to collect more than one value from a slave. At least one
 +B<Collect> option is mandatory.
 +
 +=back
 +
 +=back
 +
 +=back
 +
  =head2 Plugin C<mysql>
  
  The C<mysql plugin> requires B<mysqlclient> to be installed. It connects to
@@@ -2549,15 -2302,6 +2553,15 @@@ B<None> require this setting
  This feature is only available if the I<network> plugin was linked with
  I<libgcrypt>.
  
 +=item B<Interface> I<Interface name>
 +
 +Set the outgoing interface for IP packets. This applies at least
 +to IPv6 packets and if possible to IPv4. If this option is not applicable,
 +undefined or a non-existent interface name is specified, the default
 +behavior is to let the kernel choose the appropriate interface. Be warned
 +that the manual selection of an interface for unicast traffic is only
 +necessary in rare cases.
 +
  =back
  
  =item B<E<lt>Listen> I<Host> [I<Port>]B<E<gt>>
@@@ -2606,14 -2350,6 +2610,14 @@@ Each time a packet is received, the mod
  using L<stat(2)>. If the file has been changed, the contents is re-read. While
  the file is being read, it is locked using L<fcntl(2)>.
  
 +=item B<Interface> I<Interface name>
 +
 +Set the incoming interface for IP packets explicitly. This applies at least
 +to IPv6 packets and if possible to IPv4. If this option is not applicable,
 +undefined or a non-existent interface name is specified, the default
 +behavior is, to let the kernel choose the appropriate interface. Thus incoming
 +traffic gets only accepted, if it arrives on the given interface.
 +
  =back
  
  =item B<TimeToLive> I<1-255>
@@@ -2963,24 -2699,12 +2967,24 @@@ and the client's "common name" will be 
  when reading multiple status files. Enabling this option is recommended, but to
  maintain backwards compatibility this option is disabled by default.
  
 -=item B<Compression> B<true>|B<false>
 +=item B<CollectCompression> B<true>|B<false>
  
  Sets whether or not statistics about the compression used by OpenVPN should be
  collected. This information is only available in I<single> mode. Enabled by
  default.
  
 +=item B<CollectIndividualUsers> B<true>|B<false>
 +
 +Sets whether or not traffic information is collected for each connected client
 +individually. If set to false, currently no traffic data is collected at all
 +because aggregating this data in a save manner is tricky. Defaults to B<true>.
 +
 +=item B<CollectUserCount> B<true>|B<false>
 +
 +When enabled, the number of currently connected clients or users is collected.
 +This is especially interesting when B<CollectIndividualUsers> is disabled, but
 +can be configured independently from that option. Defaults to B<false>.
 +
  =back
  
  =head2 Plugin C<oracle>
@@@ -3050,83 -2774,6 +3054,83 @@@ refer to them from
  This plugin embeds a Perl-interpreter into collectd and provides an interface
  to collectd's plugin system. See L<collectd-perl(5)> for its documentation.
  
 +=head2 Plugin C<pinba>
 +
 +The I<Pinba plugin> receives profiling information from I<Pinba>, an extension
 +for the I<PHP> interpreter. At the end of executing a script, i.e. after a
 +PHP-based webpage has been delivered, the extension will send a UDP packet
 +containing timing information, peak memory usage and so on. The plugin will
 +wait for such packets, parse them and account the provided information, which
 +is then dispatched to the daemon once per interval.
 +
 +Synopsis:
 +
 + <Plugin pinba>
 +   Address "::0"
 +   Port "30002"
 +   # Overall statistics for the website.
 +   <View "www-total">
 +     Server "www.example.com"
 +   </View>
 +   # Statistics for www-a only
 +   <View "www-a">
 +     Host "www-a.example.com"
 +     Server "www.example.com"
 +   </View>
 +   # Statistics for www-b only
 +   <View "www-b">
 +     Host "www-b.example.com"
 +     Server "www.example.com"
 +   </View>
 + </Plugin>
 +
 +The plugin provides the following configuration options:
 +
 +=over 4
 +
 +=item B<Address> I<Node>
 +
 +Configures the address used to open a listening socket. By default, plugin will
 +bind to the I<any> address C<::0>.
 +
 +=item B<Port> I<Service>
 +
 +Configures the port (service) to bind to. By default the default Pinba port
 +"30002" will be used. The option accepts service names in addition to port
 +numbers and thus requires a I<string> argument.
 +
 +=item E<lt>B<View> I<Name>E<gt> block
 +
 +The packets sent by the Pinba extension include the hostname of the server, the
 +server name (the name of the virtual host) and the script that was executed.
 +Using B<View> blocks it is possible to separate the data into multiple groups
 +to get more meaningful statistics. Each packet is added to all matching groups,
 +so that a packet may be accounted for more than once.
 +
 +=over 4
 +
 +=item B<Host> I<Host>
 +
 +Matches the hostname of the system the webserver / script is running on. This
 +will contain the result of the L<gethostname(2)> system call. If not
 +configured, all hostnames will be accepted.
 +
 +=item B<Server> I<Server>
 +
 +Matches the name of the I<virtual host>, i.e. the contents of the
 +C<$_SERVER["SERVER_NAME"]> variable when within PHP. If not configured, all
 +server names will be accepted.
 +
 +=item B<Script> I<Script>
 +
 +Matches the name of the I<script name>, i.e. the contents of the
 +C<$_SERVER["SCRIPT_NAME"]> variable when within PHP. If not configured, all
 +script names will be accepted.
 +
 +=back
 +
 +=back
 +
  =head2 Plugin C<ping>
  
  The I<Ping> plugin starts a new thread which sends ICMP "ping" packets to the
@@@ -3180,7 -2827,7 +3184,7 @@@ operating systems
  
  =item B<MaxMissed> I<Packets>
  
 -Trigger a DNS resolv after the host has not replied to I<Packets> packets. This
 +Trigger a DNS resolve after the host has not replied to I<Packets> packets. This
  enables the use of dynamic DNS services (like dyndns.org) with the ping plugin.
  
  Default: B<-1> (disabled)
@@@ -3245,7 -2892,6 +3249,7 @@@ L<http://www.postgresql.org/docs/manual
      </Database>
  
      <Database bar>
 +      Interval 300
        Service "service_name"
        Query backend # predefined
        Query rt36_tickets
@@@ -3309,8 -2955,7 +3313,8 @@@ The username used to connect to the dat
  
  =item I<interval>
  
 -The interval collectd is using (as specified by the B<Interval> option).
 +The interval with which this database is queried (as specified by the database
 +specific or global B<Interval> options).
  
  =back
  
@@@ -3448,11 -3093,6 +3452,11 @@@ for details
  
  =over 4
  
 +=item B<Interval> I<seconds>
 +
 +Specify the interval with which the database should be queried. The default is
 +to use the global B<Interval> setting.
 +
  =item B<Host> I<hostname>
  
  Specify the hostname or IP of the PostgreSQL server to connect to. If the
@@@ -3733,8 -3373,6 +3737,8 @@@ multiple routers
        User "collectd"
        Password "secr3t"
        CollectInterface true
 +      CollectCPULoad true
 +      CollectMemory true
      </Router>
      <Router>
        Host "router1.example.com"
        Password "5ecret"
        CollectInterface true
        CollectRegistrationTable true
 +      CollectDF true
 +      CollectDisk true
      </Router>
    </Plugin>
  
@@@ -3781,29 -3417,6 +3785,29 @@@ present on the device. Defaults to B<fa
  When set to B<true>, information about wireless LAN connections will be
  collected. Defaults to B<false>.
  
 +=item B<CollectCPULoad> B<true>|B<false>
 +
 +When set to B<true>, information about the CPU usage will be collected. The
 +number is a dimensionless value where zero indicates no CPU usage at all.
 +Defaults to B<false>.
 +
 +=item B<CollectMemory> B<true>|B<false>
 +
 +When enabled, the amount of used and free memory will be collected. How used
 +memory is calculated is unknown, for example whether or not caches are counted
 +as used space.
 +Defaults to B<false>.
 +
 +=item B<CollectDF> B<true>|B<false>
 +
 +When enabled, the amount of used and free disk space will be collected.
 +Defaults to B<false>.
 +
 +=item B<CollectDisk> B<true>|B<false>
 +
 +When enabled, the number of sectors written and bad blocks will be collected.
 +Defaults to B<false>.
 +
  =back
  
  =head2 Plugin C<rrdcached>
@@@ -4136,7 -3749,6 +4140,7 @@@ user using (extended) regular expressio
        </Match>
        <Match>
          Regex "\\<R=local_user\\>"
 +        ExcludeRegex "\\<R=local_user\\>.*mail_spool defer"
          DSType "CounterInc"
          Type "counter"
          Instance "local_user"
@@@ -4171,13 -3783,6 +4175,13 @@@ want to match literal parentheses you n
  
    Regex "SPAM \\(Score: (-?[0-9]+\\.[0-9]+)\\)"
  
 +=item B<ExcludeRegex> I<regex>
 +
 +Sets an optional regular expression to use for excluding lines from the match.
 +An example which excludes all connections from localhost from the match:
 +
 +  ExcludeRegex "127\\.0\\.0\\.1"
 +
  =item B<DSType> I<Type>
  
  Sets how the values are cumulated. I<Type> is one of:
@@@ -4545,12 -4150,6 +4549,12 @@@ create output in the I<JavaScript Objec
  
  Defaults to B<Command>.
  
 +=item B<StoreRates> B<true|false>
 +
 +If set to B<true>, convert counter values to rates. If set to B<false> (the
 +default) counter values are stored as is, i.E<nbsp>e. as an increasing integer
 +number.
 +
  =back
  
  =head1 THRESHOLD CONFIGURATION
@@@ -4572,12 -4171,10 +4576,12 @@@ as a moving average or similar - at lea
  
  Also, all values that match a threshold are considered to be relevant or
  "interesting". As a consequence collectd will issue a notification if they are
 -not received for twice the last timeout of the values. If, for example, some
 -hosts sends it's CPU statistics to the server every 60 seconds, a notification
 -will be dispatched after about 120 seconds. It may take a little longer because
 -the timeout is checked only once each B<Interval> on the server.
 +not received for B<Timeout> iterations. The B<Timeout> configuration option is
 +explained in section L<"GLOBAL OPTIONS">. If, for example, B<Timeout> is set to
 +"2" (the default) and some hosts sends it's CPU statistics to the server every
 +60 seconds, a notification will be dispatched after about 120 seconds. It may
 +take a little longer because the timeout is checked only once each B<Interval>
 +on the server.
  
  When a value comes within range again or is received after it was missing, an
  "OKAY-notification" is dispatched.
@@@ -5060,12 -4657,6 +5064,12 @@@ Match values where the given regular ex
  the identifier of a value. If multiple regular expressions are given, B<all>
  regexen must match for a value to match.
  
 +=item B<Invert> B<false>|B<true>
 +
 +When set to B<true>, the result of the match is inverted, i.e. all value lists
 +where all regular expressions apply are not matched, all other value lists are
 +matched. Defaults to B<false>.
 +
  =back
  
  Example:
diff --combined src/netapp.c
@@@ -1590,6 -1590,9 +1590,9 @@@ static int cna_handle_volume_usage_dat
                if (sis == NULL)
                        continue;
  
+               if (na_elem_child(sis, "sis-info"))
+                       sis = na_elem_child(sis, "sis-info");
+               
                sis_state = na_child_get_string(sis, "state");
                if (sis_state == NULL)
                        continue;
@@@ -2563,7 -2566,7 +2566,7 @@@ static int cna_config (oconfig_item_t *
                        ud.data = host;
                        ud.free_func = (void (*) (void *)) free_host_config;
  
 -                      plugin_register_complex_read (cb_name,
 +                      plugin_register_complex_read (/* group = */ NULL, cb_name,
                                        /* callback  = */ cna_read, 
                                        /* interval  = */ (host->interval > 0) ? &interval : NULL,
                                        /* user data = */ &ud);
diff --combined src/processes.c
@@@ -6,7 -6,6 +6,7 @@@
   * Copyright (C) 2009       Sebastian Harl
   * Copyright (C) 2009       Andrés J. Díaz
   * Copyright (C) 2009       Manuel Sanmartin
 + * Copyright (C) 2010       Clément Stenac
   *
   * 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
@@@ -29,7 -28,6 +29,7 @@@
   *   Sebastian Harl <sh at tokkee.org>
   *   Andrés J. Díaz <ajdiaz at connectical.com>
   *   Manuel Sanmartin
 + *   Clément Stenac <clement.stenac at diwi.org>
   **/
  
  #include "collectd.h"
  #  define ARG_MAX 4096
  #endif
  
 -#define BUFSIZE 256
 -
  static const char *config_keys[] =
  {
        "Process",
@@@ -137,8 -137,6 +137,8 @@@ typedef struct procstat_entry_
        unsigned long num_lwp;
        unsigned long vmem_size;
        unsigned long vmem_rss;
 +      unsigned long vmem_data;
 +      unsigned long vmem_code;
        unsigned long stack_size;
  
        unsigned long vmem_minflt;
@@@ -172,8 -170,6 +172,8 @@@ typedef struct procsta
        unsigned long num_lwp;
        unsigned long vmem_size;
        unsigned long vmem_rss;
 +      unsigned long vmem_data;
 +      unsigned long vmem_code;
        unsigned long stack_size;
  
        unsigned long vmem_minflt_counter;
@@@ -368,8 -364,6 +368,8 @@@ static void ps_list_add (const char *na
                pse->num_lwp    = entry->num_lwp;
                pse->vmem_size  = entry->vmem_size;
                pse->vmem_rss   = entry->vmem_rss;
 +              pse->vmem_data  = entry->vmem_data;
 +              pse->vmem_code  = entry->vmem_code;
                pse->stack_size = entry->stack_size;
                pse->io_rchar   = entry->io_rchar;
                pse->io_wchar   = entry->io_wchar;
                ps->num_lwp    += pse->num_lwp;
                ps->vmem_size  += pse->vmem_size;
                ps->vmem_rss   += pse->vmem_rss;
 +              ps->vmem_data  += pse->vmem_data;
 +              ps->vmem_code  += pse->vmem_code;
                ps->stack_size += pse->stack_size;
  
                ps->io_rchar   += ((pse->io_rchar == -1)?0:pse->io_rchar);
@@@ -478,8 -470,6 +478,8 @@@ static void ps_list_reset (void
                ps->num_lwp     = 0;
                ps->vmem_size   = 0;
                ps->vmem_rss    = 0;
 +              ps->vmem_data   = 0;
 +              ps->vmem_code   = 0;
                ps->stack_size  = 0;
                ps->io_rchar = -1;
                ps->io_wchar = -1;
@@@ -648,16 -638,6 +648,16 @@@ static void ps_submit_proc_list (procst
        vl.values_len = 1;
        plugin_dispatch_values (&vl);
  
 +      sstrncpy (vl.type, "ps_data", sizeof (vl.type));
 +      vl.values[0].gauge = ps->vmem_data;
 +      vl.values_len = 1;
 +      plugin_dispatch_values (&vl);
 +
 +      sstrncpy (vl.type, "ps_code", sizeof (vl.type));
 +      vl.values[0].gauge = ps->vmem_code;
 +      vl.values_len = 1;
 +      plugin_dispatch_values (&vl);
 +
        sstrncpy (vl.type, "ps_stacksize", sizeof (vl.type));
        vl.values[0].gauge = ps->stack_size;
        vl.values_len = 1;
                plugin_dispatch_values (&vl);
        }
  
 -      DEBUG ("name = %s; num_proc = %lu; num_lwp = %lu; vmem_rss = %lu; "
 +      DEBUG ("name = %s; num_proc = %lu; num_lwp = %lu; "
 +                        "vmem_size = %lu; vmem_rss = %lu; vmem_data = %lu; "
 +                      "vmem_code = %lu; "
                        "vmem_minflt_counter = %lu; vmem_majflt_counter = %lu; "
                        "cpu_user_counter = %lu; cpu_system_counter = %lu; "
                        "io_rchar = %"PRIi64"; io_wchar = %"PRIi64"; "
                        "io_syscr = %"PRIi64"; io_syscw = %"PRIi64";",
 -                      ps->name, ps->num_proc, ps->num_lwp, ps->vmem_rss,
 +                      ps->name, ps->num_proc, ps->num_lwp,
 +                      ps->vmem_size, ps->vmem_rss,
 +                      ps->vmem_data, ps->vmem_code,
                        ps->vmem_minflt_counter, ps->vmem_majflt_counter,
                        ps->cpu_user_counter, ps->cpu_system_counter,
                        ps->io_rchar, ps->io_wchar, ps->io_syscr, ps->io_syscw);
@@@ -743,69 -719,6 +743,69 @@@ static int ps_read_tasks (int pid
        return ((count >= 1) ? count : 1);
  } /* int *ps_read_tasks */
  
 +/* Read advanced virtual memory data from /proc/pid/status */
 +static procstat_t *ps_read_vmem (int pid, procstat_t *ps)
 +{
 +      FILE *fh;
 +      char buffer[1024];
 +      char filename[64];
 +      unsigned long long lib = 0;
 +      unsigned long long exe = 0;
 +      unsigned long long data = 0;
 +      char *fields[8];
 +      int numfields;
 +
 +      ssnprintf (filename, sizeof (filename), "/proc/%i/status", pid);
 +      if ((fh = fopen (filename, "r")) == NULL)
 +              return (NULL);
 +
 +      while (fgets (buffer, sizeof(buffer), fh) != NULL)
 +      {
 +              long long tmp;
 +              char *endptr;
 +
 +              if (strncmp (buffer, "Vm", 2) != 0)
 +                      continue;
 +
 +              numfields = strsplit (buffer, fields,
 +                                      STATIC_ARRAY_SIZE (fields));
 +
 +              if (numfields < 2)
 +                      continue;
 +
 +              errno = 0;
 +              endptr = NULL;
 +              tmp = strtoll (fields[1], &endptr, /* base = */ 10);
 +              if ((errno == 0) && (endptr != fields[1]))
 +              {
 +                      if (strncmp (buffer, "VmData", 6) == 0) 
 +                      {
 +                              data = tmp;
 +                      }
 +                      else if (strncmp (buffer, "VmLib", 5) == 0)
 +                      {
 +                              lib = tmp;
 +                      }
 +                      else if  (strncmp(buffer, "VmExe", 5) == 0)
 +                      {
 +                              exe = tmp;
 +                      }
 +              }
 +      } /* while (fgets) */
 +
 +      if (fclose (fh))
 +      {
 +              char errbuf[1024];
 +              WARNING ("processes: fclose: %s",
 +                              sstrerror (errno, errbuf, sizeof (errbuf)));
 +      }
 +
 +      ps->vmem_data = data * 1024;
 +      ps->vmem_code = (exe + lib) * 1024;
 +
 +      return (ps);
 +} /* procstat_t *ps_read_vmem */
 +
  static procstat_t *ps_read_io (int pid, procstat_t *ps)
  {
        FILE *fh;
        if ((fh = fopen (filename, "r")) == NULL)
                return (NULL);
  
 -      while (fgets (buffer, 1024, fh) != NULL)
 +      while (fgets (buffer, sizeof (buffer), fh) != NULL)
        {
                derive_t *val = NULL;
                long long tmp;
                else
                        continue;
  
 -              numfields = strsplit (buffer, fields, 8);
 +              numfields = strsplit (buffer, fields,
 +                              STATIC_ARRAY_SIZE (fields));
  
                if (numfields < 2)
                        continue;
@@@ -889,7 -801,7 +889,7 @@@ int ps_read_process (int pid, procstat_
                return (-1);
        buffer[i] = 0;
  
 -      fields_len = strsplit (buffer, fields, 64);
 +      fields_len = strsplit (buffer, fields, STATIC_ARRAY_SIZE (fields));
        if (fields_len < 24)
        {
                DEBUG ("processes plugin: ps_read_process (pid = %i):"
        cpu_system_counter = cpu_system_counter * 1000000 / CONFIG_HZ;
        vmem_rss = vmem_rss * pagesize_g;
  
 +      if ( (ps_read_vmem(pid, ps)) == NULL)
 +      {
 +              /* No VMem data */
 +              ps->vmem_data = -1;
 +              ps->vmem_code = -1;
 +              DEBUG("ps_read_process: did not get vmem data for pid %i",pid);
 +      }
 +
        ps->cpu_user_counter = (unsigned long) cpu_user_counter;
        ps->cpu_system_counter = (unsigned long) cpu_system_counter;
        ps->vmem_size = (unsigned long) vmem_size;
@@@ -999,13 -903,18 +999,18 @@@ static char *ps_get_cmdline (pid_t pid
        if ((pid < 1) || (NULL == buf) || (buf_len < 2))
                return NULL;
  
-       ssnprintf (file, sizeof (file), "/proc/%u/cmdline", pid);
+       ssnprintf (file, sizeof (file), "/proc/%u/cmdline",
+                       (unsigned int) pid);
  
+       errno = 0;
        fd = open (file, O_RDONLY);
        if (fd < 0) {
                char errbuf[4096];
-               WARNING ("processes plugin: Failed to open `%s': %s.", file,
-                               sstrerror (errno, errbuf, sizeof (errbuf)));
+               /* ENOENT means the process exited while we were handling it.
+                * Don't complain about this, it only fills the logs. */
+               if (errno != ENOENT)
+                       WARNING ("processes plugin: Failed to open `%s': %s.", file,
+                                       sstrerror (errno, errbuf, sizeof (errbuf)));
                return NULL;
        }
  
                status = read (fd, (void *)buf_ptr, len);
  
                if (status < 0) {
-                       char errbuf[4096];
+                       char errbuf[1024];
  
                        if ((EAGAIN == errno) || (EINTR == errno))
                                continue;
@@@ -1105,7 -1014,7 +1110,7 @@@ static unsigned long read_fork_rate (
  
                errno = 0;
                endptr = NULL;
 -              result = strtoul(fields[1], &endptr, 10);
 +              result = strtoul(fields[1], &endptr, /* base = */ 10);
                if ((endptr == fields[1]) || (errno != 0)) {
                        ERROR ("processes plugin: Cannot parse fork rate: %s",
                                        fields[1]);
@@@ -1304,11 -1213,7 +1309,11 @@@ static int ps_read (void
                                }
  
                                pse.num_proc++;
 +                              pse.vmem_size = task_basic_info.virtual_size;
                                pse.vmem_rss = task_basic_info.resident_size;
 +                              /* Does not seem to be easily exposed */
 +                              pse.vmem_data = 0;
 +                              pse.vmem_code = 0;
  
                                pse.vmem_minflt_counter = task_events_info.cow_faults;
                                pse.vmem_majflt_counter = task_events_info.faults;
                pse.num_lwp    = ps.num_lwp;
                pse.vmem_size  = ps.vmem_size;
                pse.vmem_rss   = ps.vmem_rss;
 +              pse.vmem_data  = ps.vmem_data;
 +              pse.vmem_code  = ps.vmem_code;
                pse.stack_size = ps.stack_size;
  
                pse.vmem_minflt = 0;
  
                pse.vmem_size = procs[i].ki_size;
                pse.vmem_rss = procs[i].ki_rssize * getpagesize();
 +              pse.vmem_data = procs[i].ki_dsize * getpagesize();
 +              pse.vmem_code = procs[i].ki_tsize * getpagesize();
                pse.stack_size = procs[i].ki_ssize * getpagesize();
                pse.vmem_minflt = 0;
                pse.vmem_minflt_counter = procs[i].ki_rusage.ru_minflt;
  
                        pse.vmem_size = procentry[i].pi_tsize + procentry[i].pi_dvm * pagesize;
                        pse.vmem_rss = (procentry[i].pi_drss + procentry[i].pi_trss) * pagesize;
 +                      /* Not supported */
 +                      pse.vmem_data = 0;
 +                      pse.vmem_code = 0;
                        pse.stack_size =  0;
  
                        pse.io_rchar = -1;