From 8077d94a024c7725e70d14a030b499a6822f94a3 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Mon, 7 Jan 2019 13:59:47 +0100 Subject: [PATCH] fix #2030: use looks_like_number for number check since numbers can also be in '1.e-10' format, we have to change how we check for a number Scalar::Util is already core and we use it in PVE::Tools, so no new dependecy. in case of "NaN" or "Infinity" we omit the key/value pair else we quote like before Signed-off-by: Dominik Csapak --- PVE/Status/InfluxDB.pm | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/PVE/Status/InfluxDB.pm b/PVE/Status/InfluxDB.pm index 7364e572..d119becb 100644 --- a/PVE/Status/InfluxDB.pm +++ b/PVE/Status/InfluxDB.pm @@ -5,6 +5,8 @@ use warnings; use PVE::Status::Plugin; use Data::Dumper; use PVE::SafeSyslog; +use POSIX qw(isnan isinf); +use Scalar::Util 'looks_like_number'; # example config (/etc/pve/status.cfg) #influxdb: @@ -111,8 +113,9 @@ sub build_influxdb_payload { if (!ref($value) && $value ne '') { # value is scalar - $value = prepare_value($value); - push @values, "$key=$value"; + if (defined(my $v = prepare_value($value))) { + push @values, "$key=$v"; + } } elsif (ref($value) eq 'HASH') { # value is a hash @@ -145,8 +148,9 @@ sub get_recursive_values { if(ref($value) eq 'HASH') { push(@values, get_recursive_values($value)); } elsif (!ref($value) && $value ne '') { - $value = prepare_value($value); - push @values, "$key=$value"; + if (defined(my $v = prepare_value($value))) { + push @values, "$key=$v"; + } } } @@ -156,13 +160,21 @@ sub get_recursive_values { sub prepare_value { my ($value) = @_; + if (looks_like_number($value)) { + if (isnan($value) || isinf($value)) { + # we cannot send influxdb NaN or Inf + return undef; + } + + # influxdb also accepts 1.0e+10, etc. + return $value; + } + # if value is not just a number we # have to replace " with \" # and surround it with " - if ($value =~ m/[^\d\.]/) { - $value =~ s/\"/\\\"/g; - $value = "\"$value\""; - } + $value =~ s/\"/\\\"/g; + $value = "\"$value\""; return $value; }