CPU Monitoring and Alerting via Performance counters, Coral8, and PowerShell
The PowerShell team has a short post on using V2 cmdlets to Monitor performance counters.
Building on that, and the prior work with the PoShAdapter, here’s a sample with Coral8 and PowerShell to alert you via SMS when the rolling 30 seconds average CPU hits a threshold.
create VARIABLE float CPUThreashold = 70;
create OUTPUT STREAM fakeout SCHEMA (x string);
CREATE SCHEMA CPUSchema (cpu FLOAT);
create INPUT STREAM inCPU SCHEMA CPUSchema;
create OUTPUT STREAM highCPU SCHEMA CPUSchema;
create local STREAM avgCPU SCHEMA CPUSchema;
ATTACH OUTPUT ADAPTER smsAdapter TYPE PoShAdapter TO STREAM highCPU
PROPERTIES
BEGINBLOCK = [[
Add-Type -AssemblyName System.Security
Add-Type -Path "C:\Program Files\Coral8\Server\bin\GmailHelper.dll"
$pass = ".."
]],
PROCESSBlock = [[
foreach ($cpuSpike in $input)
{
$m = "CPU spike at {0:0.00}" -f $cpuSpike['cpu']
[RC.Gmail.GmailMessage]::SendFromGmail("user", $pass,"6465555555@tmomail.net",
"Via Powershell/Coral8",$m)
}
]];
ATTACH OUTPUT ADAPTER CPUAdapter TYPE PoShAdapter TO STREAM fakeout
PROPERTIES
RESULTSSTREAM = "ccl://localhost:6789/Stream/Default/MonitorCPU/inCPU",
INPUTBLOCK = [[
Get-Counter '\Processor(*)\% Processor Time' |
select -expand CounterSamples |
? { $_.InstanceName -eq "_total" } |
% { ,,($_.CookedValue,0) } #
]];
INSERT into avgCPU
select avg(cpu)
from inCPU
keep 30 SECONDS
OUTPUT EVERY 30 SECONDS;
INSERT into highCPU
select cpu
from avgCPU
WHERE cpu > CPUThreashold;
Yields:
*I lowered the threshold for testing
** Yes, I should check my voice mail