From 334cb27fab71187ee3f5374e08c4e2697f04f835 Mon Sep 17 00:00:00 2001
From: qgarnier <garnier.quentin@gmail.com>
Date: Wed, 8 Sep 2021 11:32:08 +0200
Subject: [PATCH] fix(docker): container-usage - illegal division if container
 not running (#3085)

---
 cloud/docker/restapi/mode/containerusage.pm | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/cloud/docker/restapi/mode/containerusage.pm b/cloud/docker/restapi/mode/containerusage.pm
index cf0338d57..a58bb462b 100644
--- a/cloud/docker/restapi/mode/containerusage.pm
+++ b/cloud/docker/restapi/mode/containerusage.pm
@@ -30,8 +30,7 @@ use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_
 sub custom_status_output {
     my ($self, %options) = @_;
 
-    my $msg = 'state : ' . $self->{result_values}->{state};
-    return $msg;
+    return 'state : ' . $self->{result_values}->{state};
 }
 
 sub custom_cpu_calc {
@@ -39,7 +38,14 @@ sub custom_cpu_calc {
 
     my $delta_cpu_total = $options{new_datas}->{$self->{instance} . '_cpu_total_usage'} - $options{old_datas}->{$self->{instance} . '_cpu_total_usage'};
     my $delta_cpu_system = $options{new_datas}->{$self->{instance} . '_cpu_system_usage'} - $options{old_datas}->{$self->{instance} . '_cpu_system_usage'};
-    $self->{result_values}->{prct_cpu} = (($delta_cpu_total / $delta_cpu_system) * $options{new_datas}->{$self->{instance} . '_cpu_number'}) * 100;
+    # container is not running
+    return -10 if ($options{new_datas}->{$self->{instance} . '_cpu_system_usage'} == 0);
+
+    if ($delta_cpu_system == 0) {
+        $self->{result_values}->{prct_cpu} = 0;
+    } else {
+        $self->{result_values}->{prct_cpu} = (($delta_cpu_total / $delta_cpu_system) * $options{new_datas}->{$self->{instance} . '_cpu_number'}) * 100;
+    }
     $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
 
     return 0;
@@ -94,6 +100,9 @@ sub custom_memory_calc {
     $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
     $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_memory_total'};
     $self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_memory_usage'};
+    # container is not running
+    return -10 if ($self->{result_values}->{used} == 0);
+
     $self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
     $self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
     $self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
@@ -104,8 +113,8 @@ sub set_counters {
     my ($self, %options) = @_;
     
     $self->{maps_counters_type} = [
-        { name => 'containers', type => 1, cb_prefix_output => 'prefix_containers_output', message_multiple => 'All containers are ok', skipped_code => { -11 => 1 } },
-        { name => 'containers_traffic', type => 1, cb_prefix_output => 'prefix_containers_traffic_output', message_multiple => 'All container traffics are ok', skipped_code => { -11 => 1 } },
+        { name => 'containers', type => 1, cb_prefix_output => 'prefix_containers_output', message_multiple => 'All containers are ok', skipped_code => { -10 => 1, -11 => 1 } },
+        { name => 'containers_traffic', type => 1, cb_prefix_output => 'prefix_containers_traffic_output', message_multiple => 'All container traffics are ok', skipped_code => { -11 => 1 } }
     ];
     
     $self->{maps_counters}->{containers} = [
@@ -244,7 +253,7 @@ sub manage_selection {
             cpu_number => defined($result->{$container_id}->{Stats}->{cpu_stats}->{cpu_usage}->{percpu_usage}) ?
                 scalar(@{$result->{$container_id}->{Stats}->{cpu_stats}->{cpu_usage}->{percpu_usage}}) : 1,
             memory_usage => $result->{$container_id}->{Stats}->{memory_stats}->{usage},
-            memory_total => $result->{$container_id}->{Stats}->{memory_stats}->{limit},
+            memory_total => $result->{$container_id}->{Stats}->{memory_stats}->{limit}
         };
         
         foreach my $interface (keys %{$result->{$container_id}->{Stats}->{networks}}) {