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.csa...@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;
_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel