icinga-powershell-framework/lib/core/perfcounter/New-IcingaPerformanceCounterObject.psm1
Lord Hepipud 4ef55bddb4 Fixes lots of code styling, spelling and script analyzer
Disabling UseConsistentIndentation because it is not
properly working for multi-line commands with arguments
and array/hashtable objects
2022-01-14 22:26:53 +01:00

137 lines
5.4 KiB
PowerShell

<#
.SYNOPSIS
Creates a new Performance Counter object based on given input filters.
Returns a PSObject with custom members to access the data of the counter
.DESCRIPTION
Creates a new Performance Counter object based on given input filters.
Returns a PSObject with custom members to access the data of the counter
.FUNCTIONALITY
Creates a new Performance Counter object based on given input filters.
Returns a PSObject with custom members to access the data of the counter
.EXAMPLE
PS>New-IcingaPerformanceCounterObject -FullName '\Processor(*)\% processor time' -Category 'Processor' -Instance '*' -Counter '% processor time';
Category : Processor
Instance : *
Counter : % processor time
PerfCounter : System.Diagnostics.PerformanceCounter
SkipWait : False
.EXAMPLE
PS>New-IcingaPerformanceCounterObject -FullName '\Processor(*)\% processor time' -Category 'Processor' -Instance '*' -Counter '% processor time' -SkipWait;
Category : Processor
Instance : *
Counter : % processor time
PerfCounter : System.Diagnostics.PerformanceCounter
SkipWait : True
.PARAMETER FullName
The full path to the Performance Counter
.PARAMETER Category
The name of the category of the Performance Counter
.PARAMETER Instance
The instance of the Performance Counter
.PARAMETER Counter
The actual name of the counter to fetch
.PARAMETER SkipWait
Set this if no sleep is intended for initialising the counter. This can be useful
if multiple counters are fetched during one call with this function if the sleep
is done afterwards manually. A sleep is set to 500ms to ensure counter data is
valid and contains an offset from previous/current values
.INPUTS
System.String
.OUTPUTS
System.PSObject
.LINK
https://github.com/Icinga/icinga-powershell-framework
#>
function New-IcingaPerformanceCounterObject()
{
param(
[string]$FullName = '',
[string]$Category = '',
[string]$Instance = '',
[string]$Counter = '',
[boolean]$SkipWait = $FALSE
);
$pc_instance = New-Object -TypeName PSObject;
$pc_instance | Add-Member -MemberType NoteProperty -Name 'FullName' -Value $FullName;
$pc_instance | Add-Member -MemberType NoteProperty -Name 'Category' -Value $Category;
$pc_instance | Add-Member -MemberType NoteProperty -Name 'Instance' -Value $Instance;
$pc_instance | Add-Member -MemberType NoteProperty -Name 'Counter' -Value $Counter;
$pc_instance | Add-Member -MemberType NoteProperty -Name 'PerfCounter' -Value $Counter;
$pc_instance | Add-Member -MemberType NoteProperty -Name 'SkipWait' -Value $SkipWait;
$pc_instance | Add-Member -MemberType ScriptMethod -Name 'Init' -Value {
Write-IcingaConsoleDebug `
-Message 'Creating new Counter for Category "{0}" with Instance "{1}" and Counter "{2}". Full Name "{3}"' `
-Objects $this.Category, $this.Instance, $this.Counter, $this.FullName;
# Create the Performance Counter object we want to access
$this.PerfCounter = New-Object System.Diagnostics.PerformanceCounter;
$this.PerfCounter.CategoryName = $this.Category;
$this.PerfCounter.CounterName = $this.Counter;
# Only add an instance in case it is defined
if ([string]::IsNullOrEmpty($this.Instance) -eq $FALSE) {
$this.PerfCounter.InstanceName = $this.Instance
}
# Initialise the counter
try {
$this.PerfCounter.NextValue() | Out-Null;
} catch {
# Nothing to do here, will be handled later
}
<#
# For some counters we require to wait a small amount of time to receive proper data
# Other counters do not need these informations and we do also not require to wait
# for every counter we use, once the counter is initialised within our environment.
# This will allow us to skip the sleep to speed up loading counters
#>
if ($this.SkipWait -eq $FALSE) {
Start-Sleep -Milliseconds 500;
}
}
# Return the name of the counter as string
$pc_instance | Add-Member -MemberType ScriptMethod -Name 'Name' -Value {
return $this.FullName;
}
<#
# Return a hashtable containing the counter value including the
# Sample values for the counter itself. In case we run into an error,
# keep the counter construct but add an error message in addition.
#>
$pc_instance | Add-Member -MemberType ScriptMethod -Name 'Value' -Value {
[hashtable]$CounterData = @{ };
try {
[string]$CounterType = $this.PerfCounter.CounterType;
$CounterData.Add('value', ([math]::Round([decimal]$this.PerfCounter.NextValue(), 6)));
$CounterData.Add('sample', $this.PerfCounter.NextSample());
$CounterData.Add('help', $this.PerfCounter.CounterHelp);
$CounterData.Add('type', $CounterType);
$CounterData.Add('error', $null);
} catch {
$CounterData = @{ };
$CounterData.Add('value', $null);
$CounterData.Add('sample', $null);
$CounterData.Add('help', $null);
$CounterData.Add('type', $null);
$CounterData.Add('error', $_.Exception.Message);
}
return $CounterData;
}
# Initialise the entire counter and internal handlers
$pc_instance.Init();
# Return this custom object
return $pc_instance;
}