reset date on each hour change in output
[influxdb-pipes] / ifstat.pl
index 5f630d7..832f24a 100755 (executable)
--- a/ifstat.pl
+++ b/ifstat.pl
@@ -8,13 +8,13 @@ my $community = $ENV{COMMUNITY} || 'public';
 my $influx    = $ENV{INFLUX} || 'http://127.0.0.1:8086/write?db=snmp';
 
 use Data::Dump qw(dump);
 my $influx    = $ENV{INFLUX} || 'http://127.0.0.1:8086/write?db=snmp';
 
 use Data::Dump qw(dump);
-sub XXX { warn "XXX ",scalar @_, Data::Dump::dump(@_) };
+sub XXX { warn "XXX ", scalar(@_), Data::Dump::dump(@_), join(' ',caller), "\n"; };
 
 my ($sec,$min,$hour,$dd,$mm,$yyyy) = localtime(time); $mm++;
 my $time;
 use Time::Local;
 sub update_time {
 
 my ($sec,$min,$hour,$dd,$mm,$yyyy) = localtime(time); $mm++;
 my $time;
 use Time::Local;
 sub update_time {
-       warn "# time $yyyy-$mm-$dd $hour:$min:$sec $time\n";
+       #warn "# time $yyyy-$mm-$dd $hour:$min:$sec $time\n";
        $time = timelocal($sec,$min,$hour,$dd,$mm-1,$yyyy) * 1000_000_000;
        return $time;
 }
        $time = timelocal($sec,$min,$hour,$dd,$mm-1,$yyyy) * 1000_000_000;
        return $time;
 }
@@ -22,7 +22,7 @@ sub update_time {
 # FIXME add -A to pull interfaces if they go up and down
 # -l loopback
 # -a all
 # FIXME add -A to pull interfaces if they go up and down
 # -l loopback
 # -a all
-my $cmd = qq{ifstat -s '$community@#$host' -b -n -t 1};
+my $cmd = qq{$ENV{SSH}ifstat -s '$community@#$host' -a -l -b -n -t 1};
 warn "# $cmd\n";
 open(my $ifstat, '-|', $cmd);
 
 warn "# $cmd\n";
 open(my $ifstat, '-|', $cmd);
 
@@ -31,9 +31,9 @@ my $first_skipped = 0;
 my $curl;
 sub reopen_curl {
        if ( $ENV{INFLUX} ) {
 my $curl;
 sub reopen_curl {
        if ( $ENV{INFLUX} ) {
-               open($curl, '|-', qq( curl -i -XPOST $influx --data-binary \@- ));
+               open($curl, '|-', qq( curl -XPOST $influx --data-binary \@- ));
        } else {
        } else {
-               open($curl, '|-', 'cat');
+               open($curl, '|-', 'tee /dev/shm/curl.debug');
        }
 }
 
        }
 }
 
@@ -43,6 +43,10 @@ my @if;
 my @direction;
 
 my $lines;
 my @direction;
 
 my $lines;
+my $host_tags = $host;
+$host_tags =~ s/\./,domain=/;
+
+my $last_hour = $hour;
 
 while(<$ifstat>) {
        chomp;
 
 while(<$ifstat>) {
        chomp;
@@ -50,6 +54,7 @@ while(<$ifstat>) {
        s/^\s+//;
        s/(\w) (in|out)/$1_$2/g;
        my @v = split(/\s+/);
        s/^\s+//;
        s/(\w) (in|out)/$1_$2/g;
        my @v = split(/\s+/);
+       #warn "## [",join(' ',@v), "]\n";
        if ( $v[0] eq 'Time' ) {
                shift @v;
                @if = @v;
        if ( $v[0] eq 'Time' ) {
                shift @v;
                @if = @v;
@@ -58,7 +63,12 @@ while(<$ifstat>) {
                @direction = map { s/\W+/_/g; s/^K//; $_ } @v;
        } elsif ( $v[0] =~ m/^(\d\d):(\d\d):(\d\d)/ ) {
                next unless $first_skipped++;
                @direction = map { s/\W+/_/g; s/^K//; $_ } @v;
        } elsif ( $v[0] =~ m/^(\d\d):(\d\d):(\d\d)/ ) {
                next unless $first_skipped++;
-XXX $stat;
+
+               if ( $last_hour != $hour ) {
+                       ($sec,$min,$hour,$dd,$mm,$yyyy) = localtime(time); $mm++;
+                       $last_hour = $hour;
+               }
+
                $hour = $1; $min = $2; $sec = $3; update_time;
 
                reopen_curl;
                $hour = $1; $min = $2; $sec = $3; update_time;
 
                reopen_curl;
@@ -66,15 +76,26 @@ XXX $stat;
 
                foreach my $i ( 0 .. $#if ) {
 
 
                foreach my $i ( 0 .. $#if ) {
 
-                       my $port = $if[$i];
-                       my $vlan = '';
-                       my $is_port = 'T';
-                       $vlan = ",vlan=$1" if $port =~ m/if(\d\d\d\d\d\d)/;
-
-                       print $curl "ifstat,host=$host,port=$port$vlan ",
-                               $direction[$i*2],   "=", $v[$i*2+1]   * 1024, ",",
-                               $direction[$i*2+1], "=", $v[$i*2+2] * 1024,
-                               " $time\n";
+                       my $if = $if[$i];
+                       
+                       my @tags = ( "if=$if", "host=$host_tags", $ENV{TAGS} || 'no_tags=true' );
+=for later
+                       if ( $if =~ m/if(\d\d)(\d\d\d\d)/ ) {
+                               push @tags, "is_vlan=T,prefix=$1,vlan=$2";
+                       } elsif ( $if =~ m/if(\d+)/ ) {
+                               push @tags, "is_vlan=F,port=$1";
+                       } else {
+                               push @tags, "unknown_if=$if";
+                       }
+=cut
+
+                       my $v1 = int( $v[$i*2+1] * 1024 );
+                       my $v2 = int( $v[$i*2+2] * 1024 );
+
+                       print $curl "ifstat,", join(',', @tags),
+                               " ", $direction[$i*2],   "=${v1}i",
+                               ",", $direction[$i*2+1], "=${v2}i",
+                               " $time\n" if $v1 < 100_000_000_000_000 && $v2 < 100_000_000_000_000;
 
                        $total += $v[$i*2+1];
 
 
                        $total += $v[$i*2+1];