pve-manager/PVE/ExtMetric.pm
Dominik Csapak fa97819773 status/plugin: extend send/_connect/_disconnect/test_connection
by providing the id or cfg to have better context in those methods
we will need that for influxdb http api

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
2021-01-28 17:32:23 +01:00

83 lines
1.8 KiB
Perl

package PVE::ExtMetric;
use strict;
use warnings;
use PVE::Status::Plugin;
use PVE::Status::Graphite;
use PVE::Status::InfluxDB;
PVE::Status::Graphite->register();
PVE::Status::InfluxDB->register();
PVE::Status::Plugin->init();
sub foreach_plug($&) {
my ($status_cfg, $code) = @_;
for my $id (sort keys %{$status_cfg->{ids}}) {
my $plugin_config = $status_cfg->{ids}->{$id};
next if $plugin_config->{disable};
my $plugin = PVE::Status::Plugin->lookup($plugin_config->{type});
$code->($plugin, $id, $plugin_config);
}
}
sub update_all($$@) {
my ($transactions, $subsystem, @params) = @_;
my $method = "update_${subsystem}_status";
for my $txn (@$transactions) {
my $plugin = PVE::Status::Plugin->lookup($txn->{cfg}->{type});
$plugin->$method($txn, @params);
}
}
# must return a transaction hash with the format:
# {
# cfg => $plugin_config,
# connection => ..., # the connected socket
# data => '', # payload, will be sent at the trannsaction flush
# }
sub transactions_start {
my ($cfg) = @_;
my $transactions = [];
foreach_plug($cfg, sub {
my ($plugin, $id, $plugin_config) = @_;
my $connection = $plugin->_connect($plugin_config, $id);
push @$transactions, {
connection => $connection,
cfg => $plugin_config,
id => $id,
data => '',
};
});
return $transactions;
}
sub transactions_finish {
my ($transactions) = @_;
for my $txn (@$transactions) {
my $plugin = PVE::Status::Plugin->lookup($txn->{cfg}->{type});
eval { $plugin->flush_data($txn) };
my $flush_err = $@;
warn "$flush_err" if $flush_err;
$plugin->_disconnect($txn->{connection}, $txn->{cfg});
$txn->{connection} = undef;
# avoid log spam, already got a send error; disconnect would fail too
warn "disconnect failed: $@" if $@ && !$flush_err;
}
}
1;