X-Git-Url: http://git.rot13.org/?p=influxdb-pipes;a=blobdiff_plain;f=ifstat.pl;h=a43b626cc267917383a68c40011a2b177995eabf;hp=4b213f96bd01331fe21a32b2505e97da9bc7123e;hb=ac5e07b7f49645d60a5e53cc7bbeb19cd0e39f1e;hpb=1e61428737a3f953af8b271a369f33df8e218238 diff --git a/ifstat.pl b/ifstat.pl index 4b213f9..a43b626 100755 --- a/ifstat.pl +++ b/ifstat.pl @@ -2,19 +2,103 @@ 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-community $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(@_), join(' ',caller), "\n"; }; + +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{$ENV{SSH}ifstat -s '$community@#$host' -a -l -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 -XPOST $influx --data-binary \@- )); + } else { + open($curl, '|-', 'tee /dev/shm/curl.debug'); + } +} + +my $stat; + +my @if; +my @direction; + +my $lines; +my $host_tags = $host; +$host_tags =~ s/\./,domain=/; while(<$ifstat>) { chomp; - warn "# [$_]\n"; + #warn "# [$_]\n"; s/^\s+//; + s/(\w) (in|out)/$1_$2/g; my @v = split(/\s+/); - XXX(@v); + #warn "## [",join(' ',@v), "]\n"; + 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++; + $hour = $1; $min = $2; $sec = $3; update_time; + + reopen_curl; + my $total; + + foreach my $i ( 0 .. $#if ) { + + 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]; + + $lines++; + } + warn "# $host ", $curl->tell, " total=$total\n"; + close($curl); + } else { + die "UNPARSED [$_]"; + } }