icinga-powershell-framework/lib/daemons/ServiceCheckDaemon/task/Add-IcingaServiceCheckTask.psm1

139 lines
7 KiB
PowerShell
Raw Normal View History

2021-12-09 11:42:06 -05:00
function Add-IcingaServiceCheckTask()
{
param (
$CheckCommand,
$Arguments,
$Interval,
$TimeIndexes,
$CheckId
);
# $Global:Icinga.Private.Daemons.ServiceCheck
New-IcingaServiceCheckDaemonEnvironment `
-CheckCommand $CheckCommand `
-Arguments $Arguments `
-TimeIndexes $TimeIndexes;
# Read our check result store data from disk for this service check
Read-IcingaCheckResultStore -CheckCommand $CheckCommand;
while ($TRUE) {
if ($Global:Icinga.Private.Daemons.ServiceCheck.PassedTime -lt $Interval) {
$Global:Icinga.Private.Daemons.ServiceCheck.PassedTime += 1;
Start-Sleep -Seconds 1;
continue;
}
$Global:Icinga.Private.Daemons.ServiceCheck.PassedTime = 0;
# Execute our check with possible arguments
try {
& $CheckCommand @Arguments | Out-Null;
} catch {
Write-IcingaEventMessage -EventId 1451 -Namespace 'Framework' -ExceptionObject $_ -Objects $CheckCommand, ($Arguments | Out-String), (Get-IcingaInternalPluginOutput);
Clear-IcingaCheckSchedulerEnvironment;
# Force Icinga for Windows Garbage Collection
Optimize-IcingaForWindowsMemory -ClearErrorStack -SmartGC;
2021-12-09 11:42:06 -05:00
continue;
}
$UnixTime = Get-IcingaUnixTime;
try {
foreach ($result in $global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['results'].Keys) {
[string]$HashIndex = $result;
$Global:Icinga.Private.Daemons.ServiceCheck.SortedResult = $global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['results'][$HashIndex].GetEnumerator() | Sort-Object name -Descending;
Add-IcingaHashtableItem `
-Hashtable $Global:Icinga.Private.Daemons.ServiceCheck.PerformanceCache `
-Key $HashIndex `
-Value @{ } | Out-Null;
foreach ($timeEntry in $Global:Icinga.Private.Daemons.ServiceCheck.SortedResult) {
if ((Test-Numeric $timeEntry.Value) -eq $FALSE) {
continue;
}
foreach ($calc in $Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation.Keys) {
if (($UnixTime - $Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Time) -le [int]$timeEntry.Key) {
$Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Sum += $timeEntry.Value;
$Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Count += 1;
}
}
if (($UnixTime - $Global:Icinga.Private.Daemons.ServiceCheck.MaxTimeInSeconds) -le [int]$timeEntry.Key) {
Add-IcingaHashtableItem `
-Hashtable $Global:Icinga.Private.Daemons.ServiceCheck.PerformanceCache[$HashIndex] `
-Key ([string]$timeEntry.Key) `
-Value ([string]$timeEntry.Value) | Out-Null;
}
}
foreach ($calc in $Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation.Keys) {
if ($Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Count -ne 0) {
$AverageValue = ($Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Sum / $Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Count);
[string]$MetricName = Format-IcingaPerfDataLabel (
[string]::Format('{0}_{1}', $HashIndex, $Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Interval)
);
$Global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['average'] | Add-Member -MemberType NoteProperty -Name $MetricName -Value $AverageValue -Force;
}
$Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Sum = 0;
$Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation[$calc].Count = 0;
}
}
Write-IcingaDebugMessage `
-Message 'Object dump of service check daemon' `
-Objects @(
$CheckCommand,
'Average Calc',
($Global:Icinga.Private.Daemons.ServiceCheck.AverageCalculation | Out-String),
'PerformanceCache',
$Global:Icinga.Private.Daemons.ServiceCheck.PerformanceCache,
'Max Time in Seconds',
$Global:Icinga.Private.Daemons.ServiceCheck.MaxTimeInSeconds,
'Unix Time',
$UnixTime
);
# Flush data we no longer require in our cache to free memory
[array]$CheckStores = $Global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['results'].Keys;
foreach ($CheckStore in $CheckStores) {
[string]$CheckKey = $CheckStore;
[array]$CheckTimeStamps = $global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['results'][$CheckKey].Keys;
foreach ($TimeSample in $CheckTimeStamps) {
if (($UnixTime - $Global:Icinga.Private.Daemons.ServiceCheck.MaxTimeInSeconds) -gt [int]$TimeSample) {
Remove-IcingaHashtableItem -Hashtable $global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['results'][$CheckKey] -Key ([string]$TimeSample);
}
}
}
Set-IcingaCacheData -Space 'sc_daemon' -CacheStore 'checkresult' -KeyName $CheckCommand -Value $global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['average'];
# Make the performance data available for all threads
$Global:Icinga.Public.Daemons.ServiceCheck.PerformanceDataCache[$CheckCommand] = $global:Icinga.Private.Scheduler.CheckData[$CheckCommand]['average'];
# Write collected metrics to disk in case we reload the daemon. We will load them back into the module after reload then
Set-IcingaCacheData -Space 'sc_daemon' -CacheStore 'checkresult_store' -KeyName $CheckCommand -Value $Global:Icinga.Private.Daemons.ServiceCheck.PerformanceCache;
} catch {
Write-IcingaEventMessage -EventId 1452 -Namespace 'Framework' -ExceptionObject $_ -Objects $CheckCommand, ($Arguments | Out-String), (Get-IcingaInternalPluginOutput);
}
# Always ensure our check data is cleared regardless of possible
# exceptions which might occur
Clear-IcingaCheckSchedulerEnvironment;
# Reset certain values from the scheduler environment
Clear-IcingaServiceCheckDaemonEnvironment;
# Force Icinga for Windows Garbage Collection
Optimize-IcingaForWindowsMemory -ClearErrorStack -SmartGC;
2021-12-09 11:42:06 -05:00
}
}