File Coverage

blib/lib/Schedule/Load/Reporter/Network.pm
Criterion Covered Total %
statement 57 59 96.6
branch 12 18 66.6
condition n/a
subroutine 10 10 100.0
pod 3 3 100.0
total 82 90 91.1


line stmt bran cond sub pod time code
1             # See copyright, etc in below POD section.
2             ######################################################################
3              
4             package Schedule::Load::Reporter::Network;
5 1     1   48912 use Schedule::Load qw (:_utils);
  1         4  
  1         187  
6 1     1   6 use Time::HiRes qw (gettimeofday);
  1         2  
  1         6  
7 1     1   101 use IO::File;
  1         2  
  1         172  
8 1     1   6 use strict;
  1         1  
  1         30  
9 1     1   6 use Carp;
  1         2  
  1         723  
10              
11             our $Debug;
12              
13             ######################################################################
14             #### Configuration Section
15              
16             our $_Proc_Filename = "/proc/net/dev";
17              
18             ######################################################################
19             #### Methods
20              
21             sub new {
22 1     1 1 431 my $class = shift;
23 1         68 my $self = {_stats => {},
24             skip_device_regexp => qr/^lo$/, # Skip loopback device
25             enabled => (-e $_Proc_Filename),
26             @_};
27              
28 1         5 return bless $self, $class;
29             }
30              
31 2     2 1 15 sub stats { return $_[0]->{_stats}; }
32              
33             sub poll {
34 2     2 1 175 my $self = shift;
35 2         3 my $now_sec = shift; my $now_usec = shift;
  2         4  
36 2 50       5 if (!$now_sec) { ($now_sec, $now_usec) = gettimeofday(); }
  2         16  
37 2 50       7 return if !$self->{enabled};
38              
39 2         5 my @stats = $self->_net_raw_stats();
40              
41 2 100       8 if (my $last = $self->{_net_last_stats}) {
42 1         5 my $delt = ($now_sec - $self->{_net_last_sec})
43             + ($now_usec - $self->{_net_last_usec})*1e-6;
44 1         3 $self->{_stats}{network_rx_bytes} = _diff($stats[0], $last->[0],$delt);
45 1         5 $self->{_stats}{network_rx_packets} = _diff($stats[1], $last->[1],$delt);
46 1         3 $self->{_stats}{network_tx_bytes} = _diff($stats[2], $last->[2],$delt);
47 1         4 $self->{_stats}{network_tx_packets} = _diff($stats[3], $last->[3],$delt);
48             }
49 2         6 $self->{_net_last_stats} = \@stats;
50 2         3 $self->{_net_last_sec} = $now_sec;
51 2         7 $self->{_net_last_usec} = $now_usec;
52             }
53              
54             sub _net_raw_stats {
55 2     2   3 my $self = shift;
56 2         15 my $fh = IO::File->new("<$_Proc_Filename");
57 2 50       152 if (!$fh) {
58             #warn "%Warning: $! $_Proc_Filename," if $Debug;
59 0         0 return undef;
60             }
61              
62 2         3 my @data;
63 2         60 while (defined(my $line = $fh->getline)) {
64 8 100       387 if ($line =~ /:/) {
65 4 100       56 next if $line =~ /^\s+lo:/; # Ignore loopback
66 2         7 $line =~ s/^ +//;
67 2         25 my @linedata = split(/[ \t:]+/,$line);
68 2 50       10 next if $linedata[0] =~ /$self->{skip_device_regexp}/;
69              
70 2         5 $data[0] += $linedata[1]; # bytes rx
71 2         2 $data[1] += $linedata[2]; # packets rx
72 2         3 $data[2] += $linedata[9]; # bytes tx
73 2         48 $data[3] += $linedata[10]; # packets tx
74             }
75             }
76 2         71 $fh->close();
77             #print "_net_raw_stats ",join(' ',@data),"\n" if $Debug;
78 2         33 return @data;
79             }
80              
81             #######################################################################
82              
83             sub _diff {
84 4     4   7 my $new = shift;
85 4         4 my $old = shift;
86 4         6 my $delt = shift;
87             # Note statistics CAN WRAP!
88 4 50       9 return undef if !defined $new;
89 4 50       11 if ($old > $new) { $new += 4*1024*1024*1024; }
  0         0  
90 4         14 return ($new - $old)/$delt;
91             }
92              
93             ######################################################################
94             #### Package return
95             1;
96             __END__