Skip to content

Commit

Permalink
Adds new plugin data provider handling and cpu data
Browse files Browse the repository at this point in the history
  • Loading branch information
LordHepipud committed Jun 29, 2023
1 parent e8c55d3 commit 416b380
Show file tree
Hide file tree
Showing 6 changed files with 186 additions and 0 deletions.
1 change: 1 addition & 0 deletions doc/100-General/10-Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Released closed milestones can be found on [GitHub](https://github.com/Icinga/ic
### Enhancements

* [#623](https://github.com/Icinga/icinga-powershell-framework/issues/623) Adds support to provide the Icinga service user written as `user@domain`
* [#637](https://github.com/Icinga/icinga-powershell-framework/pull/637) Adds new base handling for future data providers with first metrics for `CPU` information

### Enhancements

Expand Down
22 changes: 22 additions & 0 deletions lib/core/tools/Test-IcingaForWindowsCmdletLoader.psm1
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
function Test-IcingaForWindowsCmdletLoader()
{
param (
[string]$Path = ''
);

if ([string]::IsNullOrEmpty($Path)) {
return $FALSE;
}

if ((Test-Path -Path $Path) -eq $FALSE) {
return $FALSE;
}

$FrameworkRootDir = [string]::Format('{0}*', (Get-IcingaForWindowsRootPath));

if ($Path -NotLike $FrameworkRootDir) {
return $FALSE;
}

return $TRUE;
}
89 changes: 89 additions & 0 deletions lib/provider/assets/cpu/Get-IcingaProviderDataValuesCpu.psm1
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
function Get-IcingaProviderDataValuesCpu()
{
param (
[switch]$IncludeDetails = $FALSE
);

$CpuData = New-IcingaProviderObject -Name 'Cpu';
$CpuCounter = New-IcingaPerformanceCounterArray '\Processor Information(*)\% Processor Utility';
$CounterStructure = New-IcingaPerformanceCounterStructure -CounterCategory 'Processor Information' -PerformanceCounterHash $CpuCounter;
[int]$TotalCpuThreads = 0;
[decimal]$TotalCpuLoad = 0;
[hashtable]$SocketList = @{ };

foreach ($core in $CounterStructure.Keys) {
[string]$Socket = $core.Split(',')[0];
[string]$CoreId = $core.Split(',')[1];
[string]$SocketName = [string]::Format('Socket #{0}', $Socket);

if ($Socket -eq '_Total' -Or $CoreId -eq '_Total') {
continue;
}

if ($SocketList.ContainsKey($SocketName) -eq $FALSE) {
$SocketList.Add(
$SocketName,
@{
'ThreadCount' = 0;
'TotalLoad' = 0;
}
);
}

if ((Test-PSCustomObjectMember -PSObject $CpuData.Metrics -Name $SocketName) -eq $FALSE) {
$CpuData.Metrics | Add-Member -MemberType NoteProperty -Name $SocketName -Value (New-Object PSCustomObject);
}

[decimal]$CoreLoad = $CounterStructure[$core]['% Processor Utility'].value;

$CpuData.Metrics.$SocketName | Add-Member -MemberType NoteProperty -Name $CoreId -Value $CoreLoad;
$CpuData.MetricsOverTime.MetricContainer | Add-Member -MemberType NoteProperty -Name $SocketName -Value $null -Force;

$SocketList[$SocketName].ThreadCount += 1;
$SocketList[$SocketName].TotalLoad += $CoreLoad;
}

$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'Sockets' -Value (New-Object PSCustomObject);

foreach ($entry in $SocketList.Keys) {
$SocketList[$entry].TotalLoad = $SocketList[$entry].TotalLoad / $SocketList[$entry].ThreadCount;
$TotalCpuLoad += $SocketList[$entry].TotalLoad;
$TotalCpuThreads += $SocketList[$entry].ThreadCount;

$CpuData.Metadata.Sockets | Add-Member -MemberType NoteProperty -Name $entry -Value (New-Object PSCustomObject);
$CpuData.Metadata.Sockets.$entry | Add-Member -MemberType NoteProperty -Name 'Threads' -Value $SocketList[$entry].ThreadCount;
$CpuData.Metrics.$entry | Add-Member -MemberType NoteProperty -Name 'Total' -Value $SocketList[$entry].TotalLoad;
}

$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalLoad' -Value $TotalCpuLoad;
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalThreads' -Value $TotalCpuThreads;
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDigits' -Value ([string]$TotalCpuThreads).Length;
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDetails' -Value (New-Object PSCustomObject);

if ($IncludeDetails) {
[array]$CPUCIMData = Get-IcingaWindowsInformation Win32_Processor;

foreach ($cpu in $CPUCIMData) {
if ((Test-PSCustomObjectMember -PSObject $CpuData.Metadata.CoreDetails -Name $cpu.DeviceID) -eq $FALSE) {
$CpuData.Metadata.CoreDetails | Add-Member -MemberType NoteProperty -Name $cpu.DeviceID -Value (New-Object PSCustomObject);
}
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Architecture' -Value $cpu.Architecture;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'ProcessorType' -Value $cpu.ProcessorType;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'StatusInfo' -Value $cpu.StatusInfo;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Family' -Value $cpu.Family;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentVoltage' -Value $cpu.CurrentVoltage;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L3CacheSize' -Value $cpu.L3CacheSize;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSize' -Value $cpu.L2CacheSize;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSpeed' -Value $cpu.L2CacheSpeed;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'VoltageCaps' -Value $cpu.VoltageCaps;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentClockSpeed' -Value $cpu.CurrentClockSpeed;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Caption' -Value $cpu.Caption;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Name' -Value $cpu.Name;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'SerialNumber' -Value $cpu.SerialNumber;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Manufacturer' -Value $cpu.Manufacturer;
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'AddressWidth' -Value $cpu.AddressWidth;
}
}

return $CpuData;
}
39 changes: 39 additions & 0 deletions lib/provider/core/Get-IcingaProviderData.psm1
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
function Get-IcingaProviderData()
{
param (
[array]$Name = ''
);

[hashtable]$ProviderData = @{ };

foreach ($entry in $Name) {
[array]$ProviderDataList = Get-Command -Name ([string]::Format('Get-IcingaProviderDataValues{0}', $entry)) -ErrorAction SilentlyContinue;

if ($null -eq $ProviderDataList -Or $ProviderDataList.Count -eq 0) {
$ProviderData.Add($entry, 'Provider not Found');
continue;
}

if ($ProviderDataList.Count -gt 1) {
$ProviderData.Add($entry, 'Provider name not unique enough');
continue;
}

if ((Test-IcingaForWindowsCmdletLoader -Path $ProviderDataList.Module.ModuleBase) -eq $FALSE) {
$ProviderData.Add($entry, 'Security violation. Provider not installed at Framework location');
continue;
}

$ProviderCmd = $ProviderDataList[0];

$ProviderContent = (& $ProviderCmd -IncludeDetails);

if ($ProviderData.ContainsKey($ProviderContent.Name) -eq $FALSE) {
$ProviderData.Add($ProviderContent.Name, $ProviderContent);
} else {
$ProviderData[$ProviderContent.Name] = $ProviderContent;
}
}

return $ProviderData;
}
18 changes: 18 additions & 0 deletions lib/provider/core/Get-IcingaProviderElement.psm1
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
function Get-IcingaProviderElement()
{
param (
$Object = $null
);

if ($null -eq $Object) {
return @();
}

try {
return $Object.PSObject.Properties
} catch {
return @();
}

return @();
}
17 changes: 17 additions & 0 deletions lib/provider/core/New-IcingaProviderObject.psm1
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
function New-IcingaProviderObject()
{
param (
[string]$Name = 'Undefined'
);

$ProviderObject = New-Object PSCustomObject;
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'Name' -Value $Name;
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'Metadata' -Value (New-Object PSCustomObject);
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'Metrics' -Value (New-Object PSCustomObject);
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'MetricsOverTime' -Value (New-Object PSCustomObject);
$ProviderObject.MetricsOverTime | Add-Member -MemberType NoteProperty -Name 'MetricContainer' -Value (New-Object PSCustomObject);
$ProviderObject.MetricsOverTime | Add-Member -MemberType NoteProperty -Name 'Cache' -Value (New-Object PSCustomObject);
$ProviderObject.MetricsOverTime | Add-Member -MemberType NoteProperty -Name 'Compiled' -Value (New-Object PSCustomObject);

return $ProviderObject;
}

0 comments on commit 416b380

Please sign in to comment.