Merge branch 'collectd-5.4' into collectd-5.5
[collectd.git] / bindings / perl / lib / Collectd / Plugins / OpenVZ.pm
index fb397d4..4c7c3fe 100644 (file)
@@ -39,35 +39,44 @@ my $enable_load      = 1;
 my $enable_processes = 1;
 my $enable_users     = 1;
 
-sub interface_read($$) {
-    my $veid = shift;
-    my $name = shift;
-    my ($key, $val, @lines, @parts, @counters);
-    my @if_instances = ('if_octets', 'if_packets', 'if_errors');
+# We probably don't care about loopback transfer
+my @ignored_interfaces = ( "lo" );
+
+sub interface_read {
+    my ($veid, $name) = @_;
+    my @rx_fields = qw(if_octets if_packets if_errors drop fifo frame compressed multicast);
+    my @tx_fields = qw(if_octets if_packets if_errors drop fifo frame compressed);
     my %v = _build_report_hash($name);
 
-    $v{'plugin'} = 'interface';
-    delete $v{'plugin_instance'};
+    my @lines = `$vzctl exec $veid cat /proc/net/dev`;
 
-    @lines = split(/\n/, `$vzctl exec $veid cat /proc/net/dev`);
-    foreach (@lines) {
-        next if (!/:/);
+    for my $line (@lines) {
+        # skip explanatory text
+        next if $line !~ /:/;
 
-        @parts = split(/:/);
-        ($key = $parts[0]) =~ s/^\s*(.*?)\s*$/$1/;
-        ($val = $parts[1]) =~ s/^\s*(.*?)\s*$/$1/;
-        @counters = split(/ +/, $val);
+        $line =~ s/^\s+|\s+$//g;
 
-        $v{'type_instance'} = $key;
-        for ($key = 0; $key <= $#if_instances; ++$key) {
-            $v{'type'} = $if_instances[$key];
-            $v{'values'} = [ $counters[$key], $counters[$key + 8] ];
-            plugin_dispatch_values(\%v);
+        my ($iface, %rx, %tx);
+
+        # read /proc/net/dev fields
+        ($iface, @rx{@rx_fields}, @tx{@tx_fields}) = split /[: ]+/, $line;
+
+        # Skip this interface if it is in the ignored list
+        next if grep { $iface eq $_ } @ignored_interfaces;
+
+        for my $instance (qw(if_octets if_packets if_errors)) {
+            plugin_dispatch_values({
+                'plugin'          => 'interface',
+                'plugin_instance' => $iface,
+                'type'            => $instance,
+                'values'          => [ $rx{$instance}, $tx{$instance} ],
+                %v,
+            });
+        }
     }
 }
-}
 
-sub cpu_read($$) {
+sub cpu_read {
     my $veid = shift;
     my $name = shift;
     my ($key, $val, $i, @lines, @counters);
@@ -105,7 +114,7 @@ sub cpu_read($$) {
 }
 }
 
-sub df_read($$) {
+sub df_read {
     my $veid = shift;
     my $name = shift;
     my ($key, $val, @lines, @parts);
@@ -131,7 +140,7 @@ sub df_read($$) {
 }
 }
 
-sub load_read($$) {
+sub load_read {
     my $veid = shift;
     my $name = shift;
     my ($key, $val, @lines, @parts);
@@ -147,7 +156,7 @@ sub load_read($$) {
     plugin_dispatch_values(\%v);
 }
 
-sub processes_read($$) {
+sub processes_read {
     my $veid = shift;
     my $name = shift;
     my ($key, $val, @lines);
@@ -174,7 +183,7 @@ sub processes_read($$) {
 }
 }
 
-sub users_read($$) {
+sub users_read {
     my $veid = shift;
     my $name = shift;
     my ($key, $val, @lines);
@@ -190,7 +199,7 @@ sub users_read($$) {
     plugin_dispatch_values(\%v);
 }
 
-sub _build_report_hash($) {
+sub _build_report_hash {
     my $name = shift;
     return (time => time(), interval => plugin_get_interval(), host => $name);
 }