X-Git-Url: http://git.rot13.org/?p=influxdb-pipes;a=blobdiff_plain;f=ifstat.pl;h=b146801305ba18be4a53848cb1a52687da856331;hp=5f630d7176bedddb1273d1352d33755d8cf4b3ae;hb=HEAD;hpb=9f40a76e048736a1efe9f0cd5581ef4fdd6886b1 diff --git a/ifstat.pl b/ifstat.pl index 5f630d7..b146801 100755 --- 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); -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 { - 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; } @@ -22,7 +22,7 @@ sub update_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}; +my $cmd = qq{$ENV{SSH}ifstat -s '$community@#$host' -a -l -b -n -t 1}; warn "# $cmd\n"; open(my $ifstat, '-|', $cmd); @@ -31,9 +31,9 @@ my $first_skipped = 0; 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 { - open($curl, '|-', 'cat'); + open($curl, '|-', 'tee /dev/shm/curl.debug'); } } @@ -43,6 +43,10 @@ my @if; my @direction; my $lines; +my $host_tags = $host; +$host_tags =~ s/\./,domain=/; + +my $last_hour = $hour; while(<$ifstat>) { chomp; @@ -50,6 +54,7 @@ while(<$ifstat>) { 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; @@ -58,30 +63,55 @@ while(<$ifstat>) { @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; - my $total; + 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++; + 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 = $v[$i*2+1]; + my $v2 = $v[$i*2+2]; + + if ( $v1 =~ m/^\d+\.\d++$/ && $v2 =~ m/^\d+\.\d++$/ ) { + + $total[0] += $v1; + $total[1] += $v2; + + $v1 = int( $v1 * 1024 ); + $v2 = int( $v2 * 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; + + $lines++; + } else { + warn "IGNORED $if $v1 $v2\n"; + } } - warn "# $host ", $curl->tell, " total=$total\n"; + warn "# $host ", $curl->tell, " totals: $total[0] $total[1]\n"; close($curl); } else { die "UNPARSED [$_]";