[pve-devel] [PATCH manager] fix influxdb field assignment and allow non integer field

Dominik Csapak d.csapak at proxmox.com
Tue Aug 2 10:52:54 CEST 2016


ping

On 07/26/2016 11:53 AM, Dominik Csapak wrote:
> this patch fixes an issue where we assemble the influxdb
> key value pairs to the wrong measurement
>
> and also we did only allow integer fields,
> excluding all cpu,load and wait measurements
>
> this patch fixes both issues with a rewrite of the
> recursive build_influxdb_payload sub
>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>  PVE/Status/InfluxDB.pm | 73 ++++++++++++++++++++++++++++++++------------------
>  1 file changed, 47 insertions(+), 26 deletions(-)
>
> diff --git a/PVE/Status/InfluxDB.pm b/PVE/Status/InfluxDB.pm
> index 8300147..8130795 100644
> --- a/PVE/Status/InfluxDB.pm
> +++ b/PVE/Status/InfluxDB.pm
> @@ -100,42 +100,63 @@ sub write_influxdb_hash {
>  }
>
>  sub build_influxdb_payload {
> -    my ($payload, $d, $ctime, $tags, $measurement, $depth) = @_;
> +    my ($payload, $data, $ctime, $tags, $measurement, $instance) = @_;
>
> -    $depth = 0 if !$depth;
>      my @values = ();
>
> -    for my $key (keys %$d) {
> +    foreach my $key (sort keys %$data) {
> +	my $value = $data->{$key};
> +	next if !defined($value);
>
> -        my $value = $d->{$key};
> -        my $oldtags = $tags;
> -	
> -        if ( defined $value ) {
> -            if ( ref $value eq 'HASH' ) {
> +	if (!ref($value) && $value ne '') {
> +	    # value is scalar
>
> -		if($depth == 0) {
> -		    $measurement = $key;
> -		}elsif($depth == 1){
> -		    $tags .= ",instance=$key";
> -		}
> +	    # 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\"";
> +	    }
> +	    push @values, "$key=$value";
> +	} elsif (ref($value) eq 'HASH') {
> +	    # value is a hash
>
> -		$depth++;
> -                build_influxdb_payload($payload, $value, $ctime, $tags, $measurement, $depth);
> -		$depth--;
> -
> -            }elsif ($value =~ m/^\d+$/) {
> -
> -		$measurement = "system" if !$measurement && $depth == 0;
> -		push(@values, "$key=$value");
> -            }
> -        }
> -        $tags = $oldtags;
> +	    if (!defined($measurement)) {
> +		build_influxdb_payload($payload, $value, $ctime, $tags, $key);
> +	    } elsif(!defined($instance)) {
> +		build_influxdb_payload($payload, $value, $ctime, $tags, $measurement, $key);
> +	    } else {
> +		push @values, get_recursive_values($value);
> +	    }
> +	}
>      }
>
> -    if(@values > 0) {
> +    if (@values > 0) {
> +	my $mm = $measurement // 'system';
> +	my $tagstring = $tags;
> +	$tagstring .= ",instance=$instance" if defined($instance);
>  	my $valuestr =  join(',', @values);
> -	$payload->{string} .= $measurement.",$tags $valuestr $ctime\n";
> +	$payload->{string} .= "$mm,$tagstring $valuestr $ctime\n";
>      }
>  }
>
> +sub get_recursive_values {
> +    my ($hash) = @_;
> +
> +    my @values = ();
> +
> +    foreach my $key (keys %$hash) {
> +	my $value = $hash->{$key};
> +	if(ref($value) eq 'HASH') {
> +	    push(@values, get_recursive_values($value));
> +	} elsif (!ref($value) && $value ne '') {
> +	    $value = prepare_value($value);
> +	    push @values, "$key=$value";
> +	}
> +    }
> +
> +    return @values;
> +}
> +
>  1;
>





More information about the pve-devel mailing list