From 9d37535bec02016b505c636b01534f9f14985e43 Mon Sep 17 00:00:00 2001 From: Markus Frank Date: Fri, 28 Jan 2022 11:03:39 +0100 Subject: [PATCH] fix #3815: metrics: influxdb: coerce guest name always to string InfluxDB interprets the guest name '66601' as a number and the guest name 'vm42' as a String. This leads to problematic metrics, that will be dropped by influxdb. Whichever comes first decides how the "schema" is defined. To change that add a $to_quote hashmap to define which value shouldn't get interpreted as number by always send it quoted. For now only quote 'name'. Note, that while the 'nodename' and 'host' properties would have the same problem, they are tags in InfluxDB which are always interpreted as strings: https://docs.influxdata.com/influxdb/v2.1/reference/syntax/line-protocol/ Signed-off-by: Markus Frank Signed-off-by: Thomas Lamprecht --- PVE/Status/InfluxDB.pm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/PVE/Status/InfluxDB.pm b/PVE/Status/InfluxDB.pm index def7e2fd..63a865df 100644 --- a/PVE/Status/InfluxDB.pm +++ b/PVE/Status/InfluxDB.pm @@ -276,6 +276,8 @@ sub test_connection { sub build_influxdb_payload { my ($class, $txn, $data, $ctime, $tags, $excluded, $measurement, $instance) = @_; + # 'abc' and '123' are both valid hostnames, that confuses influx's type detection + my $to_quote = { name => 1 }; my @values = (); foreach my $key (sort keys %$data) { @@ -286,7 +288,7 @@ sub build_influxdb_payload { if (!ref($value) && $value ne '') { # value is scalar - if (defined(my $v = prepare_value($value))) { + if (defined(my $v = prepare_value($value, $to_quote->{$key}))) { push @values, "$key=$v"; } } elsif (ref($value) eq 'HASH') { @@ -331,9 +333,10 @@ sub get_recursive_values { } sub prepare_value { - my ($value) = @_; + my ($value, $quote) = @_; - if (looks_like_number($value)) { + # don't treat value like a number if quote is 1 + if (looks_like_number($value) && !$quote) { if (isnan($value) || isinf($value)) { # we cannot send influxdb NaN or Inf return undef;