mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-04-29 03:09:12 +00:00
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 <m.frank@proxmox.com> Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com> (cherry picked from commit 988150664900d447e7bdb5d0e23edadb4bd82f35) Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
fb64d2c785
commit
6ea437b237
@ -250,6 +250,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) {
|
||||
@ -260,7 +262,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') {
|
||||
@ -305,9 +307,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;
|
||||
|
Loading…
Reference in New Issue
Block a user