[collectd] perl plugin: counter values > 2^31-1?

Chris Buben cbuben at eventlogic.com
Thu Feb 25 12:26:21 CET 2010

Hi all,

I ran into this scenario with a perl write plugin:

rhel5 i386, collectd 4.9.1

$ uname -a
Linux myhost 2.6.18-92.el5PAE #1 SMP Tue Apr 29 13:31:02 EDT 2008 i686
i686 i386 GNU/Linux

1) A read plugin submits a counter value > 2^31-1
2) When my perl write plugin sees value list, the value coming out is
interpreted as a signed 32-bit integer, i.e. wrapped negative.

I'm no perl wizard, but seeing newSViv in value_list2hv in perl.c:652
makes me think this will be the expected behavior for COUNTER, DERIVE,
and ABSOLUTE on 32-bit systems.  This issue should be ok on 64-bit
systems (disregarding some possible sign surprises for COUNTER and
ABSOLUTE due to SViv, not SVuv?) as an IV is guaranteed to hold a

===> Is there any way/reason/desire to make counter value
representation consistent in perl across 32 and 64 bit systems?  I'll
do some homework and see Net::SNMP's approach (but at a more
reasonable hour)


- C

Plugin code

package Collectd::Plugin::CounterTest;
use strict;
use warnings;
use Collectd qw( :all );

plugin_register (TYPE_WRITE, 'CounterTest', 'countertest_write');

sub countertest_write {
    my $type = shift;
    my $ds   = shift;
    my $vl   = shift;

    if($vl->{'type_instance'} eq 'countertest') {
        plugin_log(LOG_ERR, "CounterTest: " . $vl->{'values'}->[0]);

    return 1;


Submit two counter values, 2^31-1, then 2^31
$ nc -U /var/run/collectd/collectd-unixsock <<< "PUTVAL
$HOSTNAME/nada/counter-countertest N:$(bc <<< 2^31-1)"
0 Success: 1 value has been dispatched.
$ nc -U /var/run/collectd/collectd-unixsock <<< "PUTVAL
$HOSTNAME/nada/counter-countertest N:$(bc <<< 2^31)"
0 Success: 1 value has been dispatched.

in syslog...
Feb 25 05:06:41 myhost collectd[24475]: CounterTest: 2147483647
Feb 25 05:06:44 myhost collectd[24475]: CounterTest: -2147483648

More information about the collectd mailing list