Skip to content

Commit f2343fb

Browse files
committed
Adds option to CPU provider to limit thread usage to 100%
1 parent ca3be76 commit f2343fb

File tree

3 files changed

+115
-84
lines changed

3 files changed

+115
-84
lines changed

doc/100-General/10-Changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Released closed milestones can be found on [GitHub](https://github.com/Icinga/ic
2121

2222
* [#732](https://github.com/Icinga/icinga-powershell-framework/pull/732) Adds support for TLS 1.3 and improves startup response
2323
* [#735](https://github.com/Icinga/icinga-powershell-framework/pull/735) Adds support to provide occuring problem event id's for the Eventlog and corresponding acknowledgement id's, providing an indicator if certain issues are resolved or still present
24+
* [#742](https://github.com/Icinga/icinga-powershell-framework/pull/742) Adds support for the CPU provider to limit the CPU usage to 100% for each thread
2425

2526
## 1.12.3 (2024-04-24)
2627

Lines changed: 10 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,20 @@
11
function Get-IcingaProviderDataValuesCpu()
22
{
33
param (
4-
[array]$IncludeFilter = @(),
5-
[array]$ExcludeFilter = @(),
6-
[switch]$IncludeDetails = $FALSE
4+
[array]$IncludeFilter = @(),
5+
[array]$ExcludeFilter = @(),
6+
[hashtable]$ProviderFilter = @(),
7+
[switch]$IncludeDetails = $FALSE
78
);
89

9-
$CpuData = New-IcingaProviderObject -Name 'Cpu';
10-
$CpuCounter = New-IcingaPerformanceCounterArray '\Processor Information(*)\% Processor Utility';
11-
$CounterStructure = New-IcingaPerformanceCounterStructure -CounterCategory 'Processor Information' -PerformanceCounterHash $CpuCounter;
12-
[int]$TotalCpuThreads = 0;
13-
[decimal]$TotalCpuLoad = 0;
14-
[int]$SocketCount = 0;
15-
[hashtable]$SocketList = @{ };
10+
$CpuData = New-IcingaProviderObject -Name 'Cpu';
11+
[hashtable]$FilterObject = Get-IcingaProviderFilterData -ProviderName 'Cpu' -ProviderFilter $ProviderFilter;
1612

17-
foreach ($core in $CounterStructure.Keys) {
18-
[string]$Socket = $core.Split(',')[0];
19-
[string]$CoreId = $core.Split(',')[1];
20-
[string]$SocketName = [string]::Format('Socket #{0}', $Socket);
13+
$CpuData.Metrics = $FilterObject.Cpu.Query.Metrics;
14+
$CpuData.MetricsOverTime = $FilterObject.Cpu.Query.MetricsOverTime;
15+
$CpuData.Metadata = $FilterObject.Cpu.Query.Metadata;
2116

22-
if ($Socket -eq '_Total' -Or $CoreId -eq '_Total') {
23-
continue;
24-
}
25-
26-
if ($SocketList.ContainsKey($SocketName) -eq $FALSE) {
27-
$SocketList.Add(
28-
$SocketName,
29-
@{
30-
'ThreadCount' = 0;
31-
'TotalLoad' = 0;
32-
}
33-
);
34-
}
35-
36-
if ((Test-PSCustomObjectMember -PSObject $CpuData.Metrics -Name $SocketName) -eq $FALSE) {
37-
$CpuData.Metrics | Add-Member -MemberType NoteProperty -Name $SocketName -Value (New-Object PSCustomObject);
38-
}
39-
40-
[decimal]$CoreLoad = $CounterStructure[$core]['% Processor Utility'].value;
41-
42-
$CpuData.Metrics.$SocketName | Add-Member -MemberType NoteProperty -Name $CoreId -Value $CoreLoad;
43-
$CpuData.MetricsOverTime.MetricContainer | Add-Member -MemberType NoteProperty -Name $SocketName -Value $null -Force;
44-
45-
$SocketList[$SocketName].ThreadCount += 1;
46-
$SocketList[$SocketName].TotalLoad += $CoreLoad;
47-
}
48-
49-
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'Sockets' -Value (New-Object PSCustomObject);
50-
51-
foreach ($entry in $SocketList.Keys) {
52-
$SocketList[$entry].TotalLoad = $SocketList[$entry].TotalLoad / $SocketList[$entry].ThreadCount;
53-
$TotalCpuLoad += $SocketList[$entry].TotalLoad;
54-
$TotalCpuThreads += $SocketList[$entry].ThreadCount;
55-
$SocketCount += 1;
56-
57-
$CpuData.Metadata.Sockets | Add-Member -MemberType NoteProperty -Name $entry -Value (New-Object PSCustomObject);
58-
$CpuData.Metadata.Sockets.$entry | Add-Member -MemberType NoteProperty -Name 'Threads' -Value $SocketList[$entry].ThreadCount;
59-
$CpuData.Metrics.$entry | Add-Member -MemberType NoteProperty -Name 'Total' -Value $SocketList[$entry].TotalLoad;
60-
}
61-
62-
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalLoad' -Value ($TotalCpuLoad / $SocketCount);
63-
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalLoadSum' -Value $TotalCpuLoad;
64-
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalThreads' -Value $TotalCpuThreads;
65-
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDigits' -Value ([string]$TotalCpuThreads).Length;
66-
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDetails' -Value (New-Object PSCustomObject);
67-
68-
if ($IncludeDetails) {
69-
[array]$CPUCIMData = Get-IcingaWindowsInformation Win32_Processor;
70-
71-
foreach ($cpu in $CPUCIMData) {
72-
if ((Test-PSCustomObjectMember -PSObject $CpuData.Metadata.CoreDetails -Name $cpu.DeviceID) -eq $FALSE) {
73-
$CpuData.Metadata.CoreDetails | Add-Member -MemberType NoteProperty -Name $cpu.DeviceID -Value (New-Object PSCustomObject);
74-
}
75-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Architecture' -Value $cpu.Architecture;
76-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'ProcessorType' -Value $cpu.ProcessorType;
77-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'StatusInfo' -Value $cpu.StatusInfo;
78-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Family' -Value $cpu.Family;
79-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentVoltage' -Value $cpu.CurrentVoltage;
80-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L3CacheSize' -Value $cpu.L3CacheSize;
81-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSize' -Value $cpu.L2CacheSize;
82-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSpeed' -Value $cpu.L2CacheSpeed;
83-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'VoltageCaps' -Value $cpu.VoltageCaps;
84-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentClockSpeed' -Value $cpu.CurrentClockSpeed;
85-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Caption' -Value $cpu.Caption;
86-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Name' -Value $cpu.Name;
87-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'SerialNumber' -Value $cpu.SerialNumber;
88-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Manufacturer' -Value $cpu.Manufacturer;
89-
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'AddressWidth' -Value $cpu.AddressWidth;
90-
}
91-
}
17+
$FilterObject = $null;
9218

9319
return $CpuData;
9420
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<#
2+
.ROLE
3+
Query
4+
#>
5+
6+
function New-IcingaProviderFilterDataCpu()
7+
{
8+
param (
9+
[switch]$Limit100Percent = $FALSE,
10+
[switch]$IncludeDetails = $FALSE
11+
);
12+
13+
$CpuData = New-IcingaProviderObject -Name 'Cpu';
14+
$CpuCounter = New-IcingaPerformanceCounterArray '\Processor Information(*)\% Processor Utility';
15+
$CounterStructure = New-IcingaPerformanceCounterStructure -CounterCategory 'Processor Information' -PerformanceCounterHash $CpuCounter;
16+
[int]$TotalCpuThreads = 0;
17+
[decimal]$TotalCpuLoad = 0;
18+
[int]$SocketCount = 0;
19+
[hashtable]$SocketList = @{ };
20+
21+
foreach ($currentcore in $CounterStructure.Keys) {
22+
[string]$Socket = $currentcore.Split(',')[0];
23+
[string]$CoreId = $currentcore.Split(',')[1];
24+
[string]$SocketName = [string]::Format('Socket #{0}', $Socket);
25+
26+
if ($Socket -eq '_Total' -Or $CoreId -eq '_Total') {
27+
continue;
28+
}
29+
30+
if ($SocketList.ContainsKey($SocketName) -eq $FALSE) {
31+
$SocketList.Add(
32+
$SocketName,
33+
@{
34+
'ThreadCount' = 0;
35+
'TotalLoad' = 0;
36+
}
37+
);
38+
}
39+
40+
if ((Test-PSCustomObjectMember -PSObject $CpuData.Metrics -Name $SocketName) -eq $FALSE) {
41+
$CpuData.Metrics | Add-Member -MemberType NoteProperty -Name $SocketName -Value (New-Object PSCustomObject);
42+
}
43+
44+
[decimal]$CoreLoad = $CounterStructure[$currentcore]['% Processor Utility'].value;
45+
46+
if ($Limit100Percent) {
47+
if ($CoreLoad -gt 100) {
48+
$CoreLoad = 100;
49+
}
50+
}
51+
52+
$CpuData.Metrics.$SocketName | Add-Member -MemberType NoteProperty -Name $CoreId -Value $CoreLoad;
53+
$CpuData.MetricsOverTime.MetricContainer | Add-Member -MemberType NoteProperty -Name $SocketName -Value $null -Force;
54+
55+
$SocketList[$SocketName].ThreadCount += 1;
56+
$SocketList[$SocketName].TotalLoad += $CoreLoad;
57+
}
58+
59+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'Sockets' -Value (New-Object PSCustomObject);
60+
61+
foreach ($entry in $SocketList.Keys) {
62+
$SocketList[$entry].TotalLoad = $SocketList[$entry].TotalLoad / $SocketList[$entry].ThreadCount;
63+
$TotalCpuLoad += $SocketList[$entry].TotalLoad;
64+
$TotalCpuThreads += $SocketList[$entry].ThreadCount;
65+
$SocketCount += 1;
66+
67+
$CpuData.Metadata.Sockets | Add-Member -MemberType NoteProperty -Name $entry -Value (New-Object PSCustomObject);
68+
$CpuData.Metadata.Sockets.$entry | Add-Member -MemberType NoteProperty -Name 'Threads' -Value $SocketList[$entry].ThreadCount;
69+
$CpuData.Metrics.$entry | Add-Member -MemberType NoteProperty -Name 'Total' -Value $SocketList[$entry].TotalLoad;
70+
}
71+
72+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalLoad' -Value ($TotalCpuLoad / $SocketCount);
73+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalLoadSum' -Value $TotalCpuLoad;
74+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'TotalThreads' -Value $TotalCpuThreads;
75+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDigits' -Value ([string]$TotalCpuThreads).Length;
76+
$CpuData.Metadata | Add-Member -MemberType NoteProperty -Name 'CoreDetails' -Value (New-Object PSCustomObject);
77+
78+
if ($IncludeDetails) {
79+
[array]$CPUCIMData = Get-IcingaWindowsInformation Win32_Processor;
80+
81+
foreach ($cpu in $CPUCIMData) {
82+
if ((Test-PSCustomObjectMember -PSObject $CpuData.Metadata.CoreDetails -Name $cpu.DeviceID) -eq $FALSE) {
83+
$CpuData.Metadata.CoreDetails | Add-Member -MemberType NoteProperty -Name $cpu.DeviceID -Value (New-Object PSCustomObject);
84+
}
85+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Architecture' -Value $cpu.Architecture;
86+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'ProcessorType' -Value $cpu.ProcessorType;
87+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'StatusInfo' -Value $cpu.StatusInfo;
88+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Family' -Value $cpu.Family;
89+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentVoltage' -Value $cpu.CurrentVoltage;
90+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L3CacheSize' -Value $cpu.L3CacheSize;
91+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSize' -Value $cpu.L2CacheSize;
92+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'L2CacheSpeed' -Value $cpu.L2CacheSpeed;
93+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'VoltageCaps' -Value $cpu.VoltageCaps;
94+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'CurrentClockSpeed' -Value $cpu.CurrentClockSpeed;
95+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Caption' -Value $cpu.Caption;
96+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Name' -Value $cpu.Name;
97+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'SerialNumber' -Value $cpu.SerialNumber;
98+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'Manufacturer' -Value $cpu.Manufacturer;
99+
$CpuData.Metadata.CoreDetails.($cpu.DeviceID) | Add-Member -MemberType NoteProperty -Name 'AddressWidth' -Value $cpu.AddressWidth;
100+
}
101+
}
102+
103+
return $CpuData;
104+
}

0 commit comments

Comments
 (0)