1 package PVE
::ExtMetric
;
6 use PVE
::Status
::Plugin
;
7 use PVE
::Status
::Graphite
;
8 use PVE
::Status
::InfluxDB
;
10 PVE
::Status
::Graphite-
>register();
11 PVE
::Status
::InfluxDB-
>register();
12 PVE
::Status
::Plugin-
>init();
14 sub foreach_plug
($&) {
15 my ($status_cfg, $code) = @_;
17 for my $id (sort keys %{$status_cfg->{ids
}}) {
18 my $plugin_config = $status_cfg->{ids
}->{$id};
19 next if $plugin_config->{disable
};
21 my $plugin = PVE
::Status
::Plugin-
>lookup($plugin_config->{type
});
22 $code->($plugin, $id, $plugin_config);
27 my ($transactions, $subsystem, @params) = @_;
29 my $method = "update_${subsystem}_status";
31 for my $txn (@$transactions) {
32 my $plugin = PVE
::Status
::Plugin-
>lookup($txn->{cfg
}->{type
});
34 $plugin->$method($txn, @params);
38 # must return a transaction hash with the format:
40 # cfg => $plugin_config,
41 # connection => ..., # the connected socket
42 # data => '', # payload, will be sent at the trannsaction flush
44 sub transactions_start
{
47 my $transactions = [];
49 foreach_plug
($cfg, sub {
50 my ($plugin, $id, $plugin_config) = @_;
52 my $connection = $plugin->_connect($plugin_config, $id);
54 push @$transactions, {
55 connection
=> $connection,
56 cfg
=> $plugin_config,
65 sub transactions_finish
{
66 my ($transactions) = @_;
68 for my $txn (@$transactions) {
69 my $plugin = PVE
::Status
::Plugin-
>lookup($txn->{cfg
}->{type
});
71 eval { $plugin->flush_data($txn) };
73 warn "$flush_err" if $flush_err;
75 $plugin->_disconnect($txn->{connection
}, $txn->{cfg
});
76 $txn->{connection
} = undef;
77 # avoid log spam, already got a send error; disconnect would fail too
78 warn "disconnect failed: $@" if $@ && !$flush_err;