From 1ab8c23aeee8e0e2655406648f430a08eb83deba Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Sun, 11 Dec 2016 15:17:06 +0100 Subject: [PATCH] parse ifstat output and feed it into influxdb --- ifstat.pl | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/ifstat.pl b/ifstat.pl index 4b213f9..496a7fd 100755 --- a/ifstat.pl +++ b/ifstat.pl @@ -2,19 +2,90 @@ use warnings; use strict; use autodie; -use Data::Dump; -sub XXX { warn "### ",Data::Dump::dump(@_) }; -open(my $ifstat, '-|', -qq{ifstat -s 'infosl_com_koo7Kaph@#10.20.0.2' -t -b -a -n -A 1 1}); +my $host = shift @ARGV || die "usage: INFLUX=http://127.0.0.1:8086/write?db=snmp COMMUNITY=snmp-comminity $0 host"; +my $community = $ENV{COMMUNITY} || 'public'; +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(@_) }; + +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"; + $time = timelocal($sec,$min,$hour,$dd,$mm-1,$yyyy) * 1000_000_000; + return $time; +} + +# 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}; +warn "# $cmd\n"; +open(my $ifstat, '-|', $cmd); + +my $first_skipped = 0; + +my $curl; +sub reopen_curl { + if ( $ENV{INFLUX} ) { + open($curl, '|-', qq( curl -i -XPOST $influx --data-binary \@- )); + } else { + open($curl, '|-', 'cat'); + } +} + +my $stat; + +my @if; +my @direction; + +my $lines; while(<$ifstat>) { chomp; - warn "# [$_]\n"; + #warn "# [$_]\n"; s/^\s+//; + s/(\w) (in|out)/$1_$2/g; my @v = split(/\s+/); - XXX(@v); + if ( $v[0] eq 'Time' ) { + shift @v; + @if = @v; + } elsif ( $v[0] eq 'HH:MM:SS' ) { + shift @v; + @direction = map { s/\W+/_/g; s/^K//; $_ } @v; + } elsif ( $v[0] =~ m/^(\d\d):(\d\d):(\d\d)/ ) { + next unless $first_skipped++; +XXX $stat; + $hour = $1; $min = $2; $sec = $3; update_time; + + reopen_curl; + my $total; + + 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"; + + $total += $v[$i*2+1]; + + $lines++; + } + warn "# $host ", $curl->tell, " total=$total\n"; + close($curl); + } else { + die "UNPARSED [$_]"; + } } -- 2.20.1