mirror of
https://github.com/Icinga/icinga-powershell-framework.git
synced 2025-12-20 23:00:35 -05:00
109 lines
4.3 KiB
PowerShell
109 lines
4.3 KiB
PowerShell
|
|
<#
|
||
|
|
# This function will create a custom Performance Counter object with
|
||
|
|
# already initialised counters, which can be accessed with the
|
||
|
|
# following members:
|
||
|
|
# Name
|
||
|
|
# Value
|
||
|
|
# Like the New-IcingaPerformanceCounterArray, this will allow to fetch the
|
||
|
|
# current values of a single counter instance including the name
|
||
|
|
# of the counter. Within the New-IcingaPerformanceCounterArray function,
|
||
|
|
# objects created by this function are used.
|
||
|
|
#>
|
||
|
|
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 {
|
||
|
|
|
||
|
|
# TODO: Re-Implement debug logging
|
||
|
|
<#$Icinga2.Log.Write(
|
||
|
|
$Icinga2.Enums.LogState.Debug,
|
||
|
|
[string]::Format('Creating new Counter for Category {0} with Instance {1} and Counter {2}. Full Name "{3}"',
|
||
|
|
$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 containting 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', $this.PerfCounter.NextValue());
|
||
|
|
$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;
|
||
|
|
}
|
||
|
|
|
||
|
|
# Initialiste the entire counter and internal handlers
|
||
|
|
$pc_instance.Init();
|
||
|
|
|
||
|
|
# Return this custom object
|
||
|
|
return $pc_instance;
|
||
|
|
}
|