* Updated scan-network to delete old TX/RX records.
Signed-off-by: Digimer <digimer@alteeve.ca>
This commit is contained in:
parent
a1604344c7
commit
2557fa454a
@ -82,7 +82,10 @@ find_changes($anvil);
|
||||
# Finally, process health weights.
|
||||
process_health($anvil);
|
||||
|
||||
# Shut down.
|
||||
# This clears the TX and RX variable data for interfaces older than 'scancore::database::age_out'.
|
||||
clear_old_variables($anvil);
|
||||
|
||||
# Shut down.
|
||||
$anvil->ScanCore->agent_shutdown({agent => $THIS_FILE});
|
||||
|
||||
|
||||
@ -90,6 +93,136 @@ $anvil->ScanCore->agent_shutdown({agent => $THIS_FILE});
|
||||
# Functions #
|
||||
#############################################################################################################
|
||||
|
||||
# This clears the TX and RX variable data for interfaces older than 'scancore::database::age_out'.
|
||||
sub clear_old_variables
|
||||
{
|
||||
my ($anvil) = @_;
|
||||
|
||||
# Only Strikers run this.
|
||||
my $host_type = $anvil->Get->host_type();
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { host_type => $host_type }});
|
||||
if ($host_type ne "striker")
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
# Read in all interfaces and for each, delete historical records over the age-out time.
|
||||
my $age = $anvil->data->{scancore}{database}{age_out};
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { age => $age }});
|
||||
|
||||
if ($age =~ /\D/)
|
||||
{
|
||||
# Age is not valid, set it to defaults.
|
||||
$age = 24;
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { age => $age }});
|
||||
}
|
||||
|
||||
# Get the timestamp to delete thermal and power records older than $age hours.
|
||||
my $query = "SELECT now() - '".$age."h'::interval;";
|
||||
my $old_timestamp = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__})->[0]->[0];
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||||
query => $query,
|
||||
old_timestamp => $old_timestamp,
|
||||
}});
|
||||
|
||||
# Read in all interface RX and TX variables.
|
||||
foreach my $uuid (keys %{$anvil->data->{cache}{database_handle}})
|
||||
{
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||||
uuid => $uuid,
|
||||
db_host => $anvil->Get->host_name_from_uuid({host_uuid => $uuid}),
|
||||
}});
|
||||
my $queries = [];
|
||||
$query = "
|
||||
SELECT
|
||||
variable_uuid,
|
||||
variable_name
|
||||
FROM
|
||||
variables
|
||||
WHERE
|
||||
variable_name LIKE '%::tx_bytes'
|
||||
OR
|
||||
variable_name LIKE '%::rx_bytes'
|
||||
;";
|
||||
my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__});
|
||||
my $count = @{$results};
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||||
results => $results,
|
||||
count => $count,
|
||||
}});
|
||||
foreach my $row (@{$results})
|
||||
{
|
||||
my $variable_uuid = $row->[0];
|
||||
my $variable_name = $row->[1];
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||||
's1:variable_name' => $variable_name,
|
||||
's2:variable_uuid' => $variable_uuid,
|
||||
}});
|
||||
|
||||
# Find out of there are any records to remove at all.
|
||||
my $query = "SELECT history_id FROM history.variables WHERE variable_uuid = ".$anvil->Database->quote($variable_uuid)." AND modified_date <= '".$old_timestamp."';";
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
|
||||
|
||||
my $results = $anvil->Database->query({uuid => $uuid, query => $query, source => $THIS_FILE, line => __LINE__});
|
||||
my $count = @{$results};
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||||
results => $results,
|
||||
count => $count,
|
||||
}});
|
||||
|
||||
if ($count)
|
||||
{
|
||||
# Find how many records will be left. If it's 0, we'll use an OFFSET 1.
|
||||
my $query = "SELECT history_id FROM history.variables WHERE variable_uuid = ".$anvil->Database->quote($variable_uuid)." AND modified_date > '".$old_timestamp."';";
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
|
||||
|
||||
my $results = $anvil->Database->query({uuid => $uuid, query => $query, source => $THIS_FILE, line => __LINE__});
|
||||
my $count = @{$results};
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||||
results => $results,
|
||||
count => $count,
|
||||
}});
|
||||
if ($count)
|
||||
{
|
||||
# At least one record will be left, we can do a simple delete.
|
||||
my $query = "DELETE FROM history.variables WHERE variable_uuid = ".$anvil->Database->quote($variable_uuid)." AND modified_date <= '".$old_timestamp."';";
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
|
||||
push @{$queries}, $query;
|
||||
}
|
||||
else
|
||||
{
|
||||
# This would delete everything, reserve at least one record.
|
||||
foreach my $row (@{$results})
|
||||
{
|
||||
my $history_id = $row->[0];
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { history_id => $history_id }});
|
||||
|
||||
my $query = "DELETE FROM history.variables WHERE variable_uuid = ".$anvil->Database->quote($variable_uuid)." AND history_id = '".$history_id."';";
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
|
||||
push @{$queries}, $query;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
my $commits = @{$queries};
|
||||
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { commits => $commits }});
|
||||
if ($commits)
|
||||
{
|
||||
# Commit the DELETEs.
|
||||
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "scan_network_log_0001", variables => {
|
||||
age => $age,
|
||||
records => $commits,
|
||||
host => $anvil->Get->host_name_from_uuid({host_uuid => $uuid}),
|
||||
}});
|
||||
$anvil->Database->write({debug => 2, uuid => $uuid, query => $queries, source => $THIS_FILE, line => __LINE__});
|
||||
undef $queries;
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
# This reads in all of the network data
|
||||
sub collect_data
|
||||
{
|
||||
@ -3178,6 +3311,7 @@ AND
|
||||
source_name => $source_name,
|
||||
}});
|
||||
|
||||
### TODO: Don't set / clear interfaces that appear down but aren't named ifn/bcn/sn as they're probably unconfigured/unusued interfaces.
|
||||
my $problem = 0;
|
||||
if ((not $new_link_state) or ($new_operational eq "down") or ($new_duplex ne "full"))
|
||||
{
|
||||
|
@ -214,9 +214,6 @@ Prerequisites:
|
||||
This mode is NOT supported by the Anvil! Intelligent Availability™ platform!
|
||||
</key>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<key name="scan_network_log_0001">Aging out RX and TX data under: [#!variable!records!#] interfaces. These have 1 or more historical records older than: [#!variable!age!#] hours old from the database host: [#!variable!host!#].</key>
|
||||
</language>
|
||||
</words>
|
||||
|
Loading…
Reference in New Issue
Block a user