},
timeout => {
type => 'integer',
- description => "graphite tcp socket timeout (default=1)",
+ description => "graphite TCP socket timeout (default=1)",
+ minimum => 0,
+ default => 1,
optional => 1
},
proto => {
type => 'string',
enum => ['udp', 'tcp'],
- description => "send graphite data using tcp or udp (default)",
+ description => "Protocol to send graphite data. TCP or UDP (default)",
optional => 1,
},
};
return {
server => {},
port => { optional => 1 },
+ mtu => { optional => 1 },
proto => { optional => 1 },
timeout => { optional => 1 },
path => { optional => 1 },
# Plugin implementation
sub update_node_status {
- my ($class, $plugin_config, $node, $data, $ctime) = @_;
+ my ($class, $txn, $node, $data, $ctime) = @_;
- write_graphite_hash($plugin_config, $data, $ctime, "nodes.$node");
+ return assemble($class, $txn, $data, $ctime, "nodes.$node");
}
sub update_qemu_status {
- my ($class, $plugin_config, $vmid, $data, $ctime, $nodename) = @_;
- write_graphite_hash($plugin_config, $data, $ctime, "qemu.$vmid");
+ my ($class, $txn, $vmid, $data, $ctime, $nodename) = @_;
+
+ return assemble($class, $txn, $data, $ctime, "qemu.$vmid");
}
sub update_lxc_status {
- my ($class, $plugin_config, $vmid, $data, $ctime, $nodename) = @_;
+ my ($class, $txn, $vmid, $data, $ctime, $nodename) = @_;
- write_graphite_hash($plugin_config, $data, $ctime, "lxc.$vmid");
+ return assemble($class, $txn, $data, $ctime, "lxc.$vmid");
}
sub update_storage_status {
- my ($class, $plugin_config, $nodename, $storeid, $data, $ctime) = @_;
+ my ($class, $txn, $nodename, $storeid, $data, $ctime) = @_;
+
+ return assemble($class, $txn, $data, $ctime, "storages.$nodename.$storeid");
+}
- write_graphite_hash($plugin_config, $data, $ctime, "storages.$nodename.$storeid");
+sub _send_batch_size {
+ my ($class, $cfg) = @_;
+ my $proto = $cfg->{proto} || 'udp';
+ if ($proto eq 'tcp') {
+ return 56000;
+ }
+ return $class->SUPER::_send_batch_size($cfg);
}
sub _connect {
return $carbon_socket;
}
-sub write_graphite_hash {
- my ($plugin_config, $d, $ctime, $object) = @_;
-
- my $path = $plugin_config->{path} // 'proxmox';
-
- my $carbon_socket = __PACKAGE__->_connect($plugin_config);
-
- write_graphite($carbon_socket, $d, $ctime, $path.".$object");
-
- $carbon_socket->close() if $carbon_socket;
-
-}
+sub assemble {
+ my ($class, $txn, $data, $ctime, $object) = @_;
-sub write_graphite {
- my ($carbon_socket, $d, $ctime, $path) = @_;
+ my $path = $txn->{cfg}->{path} // 'proxmox';
+ $path .= ".$object";
# we do not want boolean/state information to export to graphite
my $key_blacklist = {
'serial' => 1,
};
- my $graphite_data = '';
my $assemble_graphite_data;
$assemble_graphite_data = sub {
my ($metric, $path) = @_;
for my $key (sort keys %$metric) {
- my $value = $d->{$key} // next;
+ my $value = $metric->{$key};
+ next if !defined($value);
$key =~ s/\./-/g;
my $metricpath = $path . ".$key";
if (ref($value) eq 'HASH') {
$assemble_graphite_data->($value, $metricpath);
} elsif ($value =~ m/^[+-]?[0-9]*\.?[0-9]+$/ && !$key_blacklist->{$key}) {
- $graphite_data .= "$metricpath $value $ctime\n";
+ $class->add_metric_data($txn, "$metricpath $value $ctime\n");
}
}
};
- $assemble_graphite_data->($d, $path);
+ $assemble_graphite_data->($data, $path);
- $carbon_socket->send($graphite_data) if $graphite_data ne '';
+ $assemble_graphite_data = undef; # avoid cyclic reference!
}
PVE::JSONSchema::register_format('graphite-path', \&pve_verify_graphite_path);