Skip to content

Commit fbd286f

Browse files
authored
Merge pull request #637 from Icinga:feature/new_plugin_provider_handling
Feature: Adds new plugin data provider handling and cpu data Adds new base handling for future data providers with first metrics for `CPU` information
2 parents e436bd9 + 6de511c commit fbd286f

6 files changed

+187
-1
lines changed

doc/100-General/10-Changelog.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ documentation before upgrading to a new release.
77

88
Released closed milestones can be found on [GitHub](https://github.com/Icinga/icinga-powershell-framework/milestones?state=closed).
99

10-
## 1.11.0 (2023-05-16)
10+
## 1.11.0 (2023-08-01)
1111

1212
[Issues and PRs](https://github.com/Icinga/icinga-powershell-framework/milestone/26)
1313

@@ -29,6 +29,7 @@ Released closed milestones can be found on [GitHub](https://github.com/Icinga/ic
2929
* [#623](https://github.com/Icinga/icinga-powershell-framework/issues/623) Adds support to provide the Icinga service user written as `user@domain`
3030
* [#633](https://github.com/Icinga/icinga-powershell-framework/pull/633) Adds support for Icinga 2.14.0 native Icinga for Windows API communication
3131
* [#635](https://github.com/Icinga/icinga-powershell-framework/pull/635) Adds support for `Write-IcingaAgentApiConfig` function to configure the Icinga Agent TLS cipher list setting by new argument `-CipherList`
32+
* [#637](https://github.com/Icinga/icinga-powershell-framework/pull/637) Adds new base handling for future data providers with first metrics for `CPU` information
3233
* [#640](https://github.com/Icinga/icinga-powershell-framework/issues/640) Adds support to set the flag `-NoSSLValidation` for Cmdlets `icinga` and `Install-Icinga`, to ignore errors on self-signed certificates within the environment
3334
* [#643](https://github.com/Icinga/icinga-powershell-framework/pull/643) Adds support for `-RebuildCache` flag on `icinga` cmd to rebuild component cache as well
3435
* [#644](https://github.com/Icinga/icinga-powershell-framework/pull/644) Adds progress bar output to repository interaction (sync, update, new) instead of plain text output
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
function Test-IcingaForWindowsCmdletLoader()
2+
{
3+
param (
4+
[string]$Path = ''
5+
);
6+
7+
if ([string]::IsNullOrEmpty($Path)) {
8+
return $FALSE;
9+
}
10+
11+
if ((Test-Path -Path $Path) -eq $FALSE) {
12+
return $FALSE;
13+
}
14+
15+
$FrameworkRootDir = [string]::Format('{0}*', (Get-IcingaForWindowsRootPath));
16+
17+
if ($Path -NotLike $FrameworkRootDir) {
18+
return $FALSE;
19+
}
20+
21+
return $TRUE;
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
function Get-IcingaProviderDataValuesCpu()
2+
{
3+
param (
4+
[switch]$IncludeDetails = $FALSE
5+
);
6+
7+
$CpuData = New-IcingaProviderObject -Name 'Cpu';
8+
$CpuCounter = New-IcingaPerformanceCounterArray '\Processor Information(*)\% Processor Utility';
9+
$CounterStructure = New-IcingaPerformanceCounterStructure -CounterCategory 'Processor Information' -PerformanceCounterHash $CpuCounter;
10+
[int]$TotalCpuThreads = 0;
11+
[decimal]$TotalCpuLoad = 0;
12+
[hashtable]$SocketList = @{ };
13+
14+
foreach ($core in $CounterStructure.Keys) {
15+
[string]$Socket = $core.Split(',')[0];
16+
[string]$CoreId = $core.Split(',')[1];
17+
[string]$SocketName = [string]::Format('Socket #{0}', $Socket);
18+
19+
if ($Socket -eq '_Total' -Or $CoreId -eq '_Total') {
20+
continue;
21+
}
22+
23+
if ($SocketList.ContainsKey($SocketName) -eq $FALSE) {
24+
$SocketList.Add(
25+
$SocketName,
26+
@{
27+
'ThreadCount' = 0;
28+
'TotalLoad' = 0;
29+
}
30+
);
31+
}
32+
33+
if ((Test-PSCustomObjectMember -PSObject $CpuData.Metrics -Name $SocketName) -eq $FALSE) {
34+
$CpuData.Metrics | Add-Member -MemberType NoteProperty -Name $SocketName -Value (New-Object PSCustomObject);
35+
}
36+
37+
[decimal]$CoreLoad = $CounterStructure[$core]['% Processor Utility'].value;
38+
39+
$CpuData.Metrics.$SocketName | Add-Member -MemberType NoteProperty -Name $CoreId -Value $CoreLoad;
40+
$CpuData.MetricsOverTime.MetricContainer | Add-Member -MemberType NoteProperty -Name $SocketName -Value $null -Force;
41+
42+
$SocketList[$SocketName].ThreadCount += 1;
43+
$SocketList[$SocketName].TotalLoad += $CoreLoad;
44+
}
45+
46+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'Sockets' -Value (New-Object PSCustomObject);
47+
48+
foreach ($entry in $SocketList.Keys) {
49+
$SocketList[$entry].TotalLoad = $SocketList[$entry].TotalLoad / $SocketList[$entry].ThreadCount;
50+
$TotalCpuLoad += $SocketList[$entry].TotalLoad;
51+
$TotalCpuThreads += $SocketList[$entry].ThreadCount;
52+
53+
$CpuData.Metadata.Sockets | Add-Member -MemberType NoteProperty -Name $entry -Value (New-Object PSCustomObject);
54+
$CpuData.Metadata.Sockets.$entry | Add-Member -MemberType NoteProperty -Name 'Threads' -Value $SocketList[$entry].ThreadCount;
55+
$CpuData.Metrics.$entry | Add-Member -MemberType NoteProperty -Name 'Total' -Value $SocketList[$entry].TotalLoad;
56+
}
57+
58+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalLoad' -Value $TotalCpuLoad;
59+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalThreads' -Value $TotalCpuThreads;
60+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDigits' -Value ([string]$TotalCpuThreads).Length;
61+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDetails' -Value (New-Object PSCustomObject);
62+
63+
if ($IncludeDetails) {
64+
[array]$CPUCIMData = Get-IcingaWindowsInformation Win32_Processor;
65+
66+
foreach ($cpu in $CPUCIMData) {
67+
if ((Test-PSCustomObjectMember -PSObject $CpuData.Metadata.CoreDetails -Name $cpu.DeviceID) -eq $FALSE) {
68+
$CpuData.Metadata.CoreDetails | Add-Member -MemberType NoteProperty -Name $cpu.DeviceID -Value (New-Object PSCustomObject);
69+
}
70+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Architecture' -Value $cpu.Architecture;
71+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'ProcessorType' -Value $cpu.ProcessorType;
72+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'StatusInfo' -Value $cpu.StatusInfo;
73+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Family' -Value $cpu.Family;
74+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentVoltage' -Value $cpu.CurrentVoltage;
75+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L3CacheSize' -Value $cpu.L3CacheSize;
76+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSize' -Value $cpu.L2CacheSize;
77+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSpeed' -Value $cpu.L2CacheSpeed;
78+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'VoltageCaps' -Value $cpu.VoltageCaps;
79+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentClockSpeed' -Value $cpu.CurrentClockSpeed;
80+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Caption' -Value $cpu.Caption;
81+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Name' -Value $cpu.Name;
82+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'SerialNumber' -Value $cpu.SerialNumber;
83+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Manufacturer' -Value $cpu.Manufacturer;
84+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'AddressWidth' -Value $cpu.AddressWidth;
85+
}
86+
}
87+
88+
return $CpuData;
89+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
function Get-IcingaProviderData()
2+
{
3+
param (
4+
[array]$Name = ''
5+
);
6+
7+
[hashtable]$ProviderData = @{ };
8+
9+
foreach ($entry in $Name) {
10+
[array]$ProviderDataList = Get-Command -Name ([string]::Format('Get-IcingaProviderDataValues{0}', $entry)) -ErrorAction SilentlyContinue;
11+
12+
if ($null -eq $ProviderDataList -Or $ProviderDataList.Count -eq 0) {
13+
$ProviderData.Add($entry, 'Provider not Found');
14+
continue;
15+
}
16+
17+
if ($ProviderDataList.Count -gt 1) {
18+
$ProviderData.Add($entry, 'Provider name not unique enough');
19+
continue;
20+
}
21+
22+
if ((Test-IcingaForWindowsCmdletLoader -Path $ProviderDataList.Module.ModuleBase) -eq $FALSE) {
23+
$ProviderData.Add($entry, 'Security violation. Provider not installed at Framework location');
24+
continue;
25+
}
26+
27+
$ProviderCmd = $ProviderDataList[0];
28+
29+
$ProviderContent = (& $ProviderCmd -IncludeDetails);
30+
31+
if ($ProviderData.ContainsKey($ProviderContent.Name) -eq $FALSE) {
32+
$ProviderData.Add($ProviderContent.Name, $ProviderContent);
33+
} else {
34+
$ProviderData[$ProviderContent.Name] = $ProviderContent;
35+
}
36+
}
37+
38+
return $ProviderData;
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function Get-IcingaProviderElement()
2+
{
3+
param (
4+
$Object = $null
5+
);
6+
7+
if ($null -eq $Object) {
8+
return @();
9+
}
10+
11+
try {
12+
return $Object.PSObject.Properties
13+
} catch {
14+
return @();
15+
}
16+
17+
return @();
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
function New-IcingaProviderObject()
2+
{
3+
param (
4+
[string]$Name = 'Undefined'
5+
);
6+
7+
$ProviderObject = New-Object PSCustomObject;
8+
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'Name' -Value $Name;
9+
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'Metadata' -Value (New-Object PSCustomObject);
10+
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'Metrics' -Value (New-Object PSCustomObject);
11+
$ProviderObject | Add-Member -MemberType NoteProperty -Name 'MetricsOverTime' -Value (New-Object PSCustomObject);
12+
$ProviderObject.MetricsOverTime | Add-Member -MemberType NoteProperty -Name 'MetricContainer' -Value (New-Object PSCustomObject);
13+
$ProviderObject.MetricsOverTime | Add-Member -MemberType NoteProperty -Name 'Cache' -Value (New-Object PSCustomObject);
14+
$ProviderObject.MetricsOverTime | Add-Member -MemberType NoteProperty -Name 'Compiled' -Value (New-Object PSCustomObject);
15+
16+
return $ProviderObject;
17+
}

0 commit comments

Comments
 (0)