icinga-powershell-framework/modules/process.ps1

113 lines
4.7 KiB
PowerShell
Raw Normal View History

2018-11-06 11:14:49 -05:00
param($Config = $null);
$CachedProcessList = $Icinga2.Utils.Modules.GetCacheElement(
$MyInvocation.MyCommand.Name,
'ProcessList'
);
$ProcessList = Get-WmiObject Win32_Process;
$ProcessPerfList = Get-WmiObject Win32_PerfFormattedData_PerfProc_Process;
$NumberOfCPUThreads = $Icinga2.System.NumberOfCPUThreads;
[hashtable]$ProcessReference = @{};
[hashtable]$Processes = @{};
[hashtable]$ProcessValues = @{
FullList = @{ };
Removed = @( );
Added = $null;
Modified = @{ };
}
foreach ($process in $ProcessList) {
[string]$ProcessKey = [string]::Format(
'{0} [{1}]',
$process.ProcessName,
$process.ProcessId
);
[hashtable]$ProcessInfo = @{};
$ProcessInfo.Add('Name', $process.Name);
$ProcessInfo.Add('ProcessId', $process.ProcessId);
$ProcessInfo.Add('Priority', $process.Priority);
$ProcessInfo.Add('PageFileUsage', $process.PageFileUsage);
$ProcessInfo.Add('ThreadCount', $process.ThreadCount);
$ProcessInfo.Add('KernelModeTime', $process.KernelModeTime);
$ProcessInfo.Add('UserModeTime', $process.UserModeTime);
$ProcessInfo.Add('WorkingSetSize', $process.WorkingSetSize);
$ProcessInfo.Add('CommandLine', $process.CommandLine);
<#
# These are not required by now
$ProcessInfo.Add('Caption', $process.Caption);
$ProcessInfo.Add('CreationClassName', $process.CreationClassName);
$ProcessInfo.Add('CreationDate', $process.CreationDate);
$ProcessInfo.Add('CSCreationClassName', $process.CSCreationClassName);
$ProcessInfo.Add('CSName', $process.CSName);
$ProcessInfo.Add('Description', $process.Description);
$ProcessInfo.Add('ExecutablePath', $process.ExecutablePath);
$ProcessInfo.Add('ExecutionState', $process.ExecutionState);
$ProcessInfo.Add('Handle', $process.Handle);
$ProcessInfo.Add('HandleCount', $process.HandleCount);
$ProcessInfo.Add('InstallDate', $process.InstallDate);
$ProcessInfo.Add('MaximumWorkingSetSize', $process.MaximumWorkingSetSize);
$ProcessInfo.Add('MinimumWorkingSetSize', $process.MinimumWorkingSetSize);
$ProcessInfo.Add('OSCreationClassName', $process.OSCreationClassName);
$ProcessInfo.Add('OSName', $process.OSName);
$ProcessInfo.Add('OtherOperationCount', $process.OtherOperationCount);
$ProcessInfo.Add('OtherTransferCount', $process.OtherTransferCount);
$ProcessInfo.Add('PageFaults', $process.PageFaults);
$ProcessInfo.Add('ParentProcessId', $process.ParentProcessId);
$ProcessInfo.Add('PeakPageFileUsage', $process.PeakPageFileUsage);
$ProcessInfo.Add('PeakVirtualSize', $process.PeakVirtualSize);
$ProcessInfo.Add('PeakWorkingSetSize', $process.PeakWorkingSetSize);
$ProcessInfo.Add('PrivatePageCount', $process.PrivatePageCount);
$ProcessInfo.Add('QuotaNonPagedPoolUsage', $process.QuotaNonPagedPoolUsage);
$ProcessInfo.Add('QuotaPagedPoolUsage', $process.QuotaPagedPoolUsage);
$ProcessInfo.Add('QuotaPeakNonPagedPoolUsage', $process.QuotaPeakNonPagedPoolUsage);
$ProcessInfo.Add('QuotaPeakPagedPoolUsage', $process.QuotaPeakPagedPoolUsage);
$ProcessInfo.Add('ReadOperationCount', $process.ReadOperationCount);
$ProcessInfo.Add('ReadTransferCount', $process.ReadTransferCount);
$ProcessInfo.Add('SessionId', $process.SessionId);
$ProcessInfo.Add('Status', $process.Status);
$ProcessInfo.Add('TerminationDate', $process.TerminationDate);
$ProcessInfo.Add('VirtualSize', $process.VirtualSize);
$ProcessInfo.Add('WindowsVersion', $process.WindowsVersion);
$ProcessInfo.Add('WriteOperationCount', $process.WriteOperationCount);
$ProcessInfo.Add('WriteTransferCount', $process.WriteTransferCount);
#>
$ProcessReference.Add($process.ProcessId, $ProcessKey);
$Processes.Add($ProcessKey, $ProcessInfo);
}
foreach ($perfdata in $ProcessPerfList) {
if ($perfdata.Name -eq '_Total') {
continue;
}
if ($ProcessReference.ContainsKey($perfdata.IDProcess)) {
$Processes[$ProcessReference[$perfdata.IDProcess]].Add(
'WorkingSetPrivate',
$perfdata.WorkingSetPrivate
);
# Note: In order to get the correct CPU time in % we have to divide the
# Processor Time with the amount of threads installed on our CPU
$Processes[$ProcessReference[$perfdata.IDProcess]].Add(
'PercentProcessorTime',
[math]::Round(($perfdata.PercentProcessorTime / $NumberOfCPUThreads), 2)
);
}
}
$Processes.Add('count', $Processes.count);
$Icinga2.Utils.Modules.AddCacheElement(
$MyInvocation.MyCommand.Name,
'ProcessList',
$Processes
);
return $Icinga2.Utils.Modules.GetHashtableDiff(
$Processes.Clone(),
$CachedProcessList.Clone(),
@('ProcessId')
);