icinga-powershell-framework/lib/core/perfcounter/New-IcingaPerformanceCounterStructure.psm1

130 lines
6.4 KiB
PowerShell
Raw Normal View History

<#
.SYNOPSIS
Will use an array of provided Performance Counter and sort the input by
a given counter category. In this case we can fetch all Processor instances
and receive values for each core which can then be accessed from a hashtable
with an eady query. Allows to modify output in addition
.DESCRIPTION
Will use an array of provided Performance Counter and sort the input by
a given counter category. In this case we can fetch all Processor instances
and receive values for each core which can then be accessed from a hashtable
with an eady query. Allows to modify output in addition
.FUNCTIONALITY
Will use an array of provided Performance Counter and sort the input by
a given counter category. In this case we can fetch all Processor instances
and receive values for each core which can then be accessed from a hashtable
with an eady query. Allows to modify output in addition
.EXAMPLE
PS>New-IcingaPerformanceCounterStructure -CounterCategory 'Processor' -PerformanceCounterHash (New-IcingaPerformanceCounterArray '\Processor(*)\% processor time');
Name Value
---- -----
7 {% processor time}
3 {% processor time}
4 {% processor time}
_Total {% processor time}
2 {% processor time}
1 {% processor time}
0 {% processor time}
6 {% processor time}
5 {% processor time}
.EXAMPLE
PS>New-IcingaPerformanceCounterStructure -CounterCategory 'Processor' -PerformanceCounterHash (New-IcingaPerformanceCounterArray '\Processor(*)\% processor time') -InstanceNameCleanupArray '_';
Name Value
---- -----
7 {% processor time}
Total {}
3 {% processor time}
4 {% processor time}
2 {% processor time}
1 {% processor time}
0 {% processor time}
6 {% processor time}
5 {% processor time}
.PARAMETER CounterCategory
The name of the category the sort algorithm will fetch the instances from for sorting
.PARAMETER PerformanceCounterHash
An array of Performance Counter objects provided by 'New-IcingaPerformanceCounterArray' to sort for
.PARAMETER InstanceNameCleanupArray
An array which will be used to remove string content from the sorted instances keys. For example '_' will change
'_Total' to 'Total'. Replacements are done in the order added to this array
.INPUTS
System.String
.OUTPUTS
System.Hashtable
.LINK
https://github.com/Icinga/icinga-powershell-framework
#>
function New-IcingaPerformanceCounterStructure()
{
param(
[string]$CounterCategory = '',
[hashtable]$PerformanceCounterHash = @{},
[array]$InstanceNameCleanupArray = @()
)
# The storage variables we require to store our data
[array]$AvailableInstances = @();
[hashtable]$StructuredCounterData = @{};
# With this little trick we can fetch all instances we have and get their unique name
$CounterInstances = New-Object System.Diagnostics.PerformanceCounterCategory($CounterCategory);
foreach ($instance in $CounterInstances.GetInstanceNames()) {
# For some counters we require to apply a 'cleanup' for the instance name
# Example Disks: Some disks are stored with the name
# 'HarddiskVolume1'
# To be able to map the volume correctly to disks, we require to remove
# 'HarddiskVolume' so only '1' will remain, which allows us to map the
# volume correctly afterwards
[string]$CleanInstanceName = $instance;
foreach ($cleanup in $InstanceNameCleanupArray) {
$CleanInstanceName = $CleanInstanceName.Replace($cleanup, '');
}
$AvailableInstances += $CleanInstanceName;
}
# Now let the real magic begin.
# At first we will loop all instances of our Performance Counters, which means all
# instances we have found above. We build a new hashtable then to list the instances
# by their individual name and all corresponding counters as children
# This allows us a structured output with all data for each instance
foreach ($instance in $AvailableInstances) {
# First build a hashtable for each instance to add data to later
$StructuredCounterData.Add($instance, @{});
# Now we need to loop all return values from our Performance Counters
foreach ($InterfaceCounter in $PerformanceCounterHash.Keys) {
# As we just looped the parent counter (Instance *), we now need to
# loop the actual counters for each instance
foreach ($interface in $PerformanceCounterHash[$InterfaceCounter]) {
# Finally let's loop through all the results which contain the values
# to build our new, structured hashtable
foreach ($entry in $interface.Keys) {
# Match the counters based on our current parent index
# (the instance name we want to add the values as children).
if ($entry.Contains('(' + $instance + ')')) {
# To ensure we don't transmit the entire counter name,
# we only want to include the name of the actual counter.
# There is no need to return
# \Network Interface(Desktopadapter Intel[R] Gigabit CT)\Bytes Received/sec
# the naming
# Bytes Received/sec
# is enough
[array]$TmpOutput = $entry.Split('\');
[string]$OutputName = $TmpOutput[$TmpOutput.Count - 1];
# Now add the actual value to our parent instance with the
# improved value name, including the sample and counter value data
$StructuredCounterData[$instance].Add($OutputName, $interface[$entry]);
}
}
}
}
}
return $StructuredCounterData;
}