BasicWatcher.WebService.DataSource.KPIs.Cookdown (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.PropertyBagData

Member Modules:

ID Module Type TypeId RunAs 
Scheduler DataSource System.SimpleScheduler Default
Script ProbeAction Microsoft.Windows.PowerShellPropertyBagProbe Default

Source Code:

<DataSourceModuleType ID="BasicWatcher.WebService.DataSource.KPIs.Cookdown" Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MonitorItem" type="xsd:string"/>
</Configuration>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="Scheduler" TypeID="System!System.SimpleScheduler">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime/>
</DataSource>
<ProbeAction ID="Script" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
<ScriptName>BasicWatcher.Collect.KPIs.ps1</ScriptName>
<ScriptBody><Script><![CDATA[param($MonitorItem)
$api = New-Object -comObject 'MOM.ScriptAPI'

$computerName = $env:COMPUTERNAME
$testedAt = "Tested on: $(Get-Date -Format u) / $(([TimeZoneInfo]::Local).DisplayName)"
$WindowsVersion = Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty Caption

try {
$computerDescription = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters | Select-Object -ExpandProperty srvcomment
} catch {
$computerDescription = [string]::Empty
}

$localComputerDomain = ([System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain()).Name
$computerName = $computerName + '.' + $localComputerDomain

if (([string]::IsNullOrEmpty($computerDescription))) {
$computerDescription = 'Not-Maintained'
} else {
$noActionRequiredSo = 'Keep description'
}


#$api.LogScriptEvent('BasicWatcher.Collect.KPIs.ps1',250,4,"On computer $($computerName) with searching for $($MonitorItem)")

if ($MonitorItem -eq 'svchost') {

# $api.LogScriptEvent('BasicWatcher.Collect.KPIs.ps1',251,2,"On computer $($computerName) with searching for $($MonitorItem) - SVCHOST ")

$allSvcHostProc = Get-Process | Where-Object {$_.Name -eq $MonitorItem}

$allSvcHostProc | ForEach-Object {
if ($_ | Select-Object -ExpandProperty Modules | Where-Object {$_.ModuleName -contains 'ftpsvc.dll'}){
$ftpPid = $($_ |Select-Object -ExpandProperty Id)
}
}

$allPerfCounter = Get-Counter "\Process($MonitorItem*)\*" | Select-Object -ExpandProperty CounterSamples
$perfCounterTmp = $allPerfCounter | Where-Object {$_.Path -match 'id Proces'} | Where-Object {$_.CookedValue -eq $ftpPid}
$perfCounterTmp = $perfCounterTmp | Select-Object -ExpandProperty Path
$svcPattern = [regex]::Match($perfCounterTmp,'\(svchost#?\d*\)') | Select-Object -ExpandProperty Value
$allPerfCounter = $allPerfCounter | Where-Object {$_.Path -match $svcPattern}

} else {

$allPerfCounter = Get-Counter "\Process($MonitorItem*)\*" | Select-Object -ExpandProperty CounterSamples

}

$perfCounterReg = '% processor time|working set \- private|io data bytes\/sec|handle count'
$perfCounterList = New-Object -TypeName 'System.Collections.ArrayList'

#$api.LogScriptEvent('BasicWatcher.Collect.KPIs.ps1',252,2,"On computer for $($MonitorItem) found No Counter: $($allPerCounter.count)")

$allPerfCounter | ForEach-Object {
if ($_.Path -match $perfCounterReg) {

$newPath = $_.Path -replace '(\\\\[\w]*\\process[()\w#]*\\)',''
[double]$newCookedValue = 1

if($newPath -match '% processor time') {
$newCookedValue = [Math]::Round($_.CookedValue)
$newPath = 'PercentProcessorTime'
} elseif ($newPath -match 'working set \- private') {
$newPath = 'WorkingSetPrivateMB'
if ($_.CookedValue) {
$newCookedValue = [Math]::Round($_.CookedValue / 1MB)
} else {
$newCookedValue = 1
}
} elseif ($newPath -match 'io data bytes\/sec') {
$newPath = 'IODataMBPerSec'
if ($_.CookedValue) {
$newCookedValue = [Math]::Round($_.CookedValue / 1MB)
} else {
$newCookedValue = 1
}
} elseif ($newPath -match 'handle count') {
$newPath = 'HandleCount'
if ($_.CookedValue) {
$newCookedValue = $_.CookedValue
} else {
$newCookedValue = 1
}
}

if ($newCookedValue -eq $null) {
$newCookedValue = 1
}

$newCookedValue = [double]::Parse($newCookedValue)

$perfHash = @{'Location' = $newPath}
$perfHash.Add('CookedValue',$newCookedValue)
$perfObj = New-Object -TypeName PSObject -Property $perfHash
$null = $perfCounterList.Add($perfObj)
}
}

$perfCounterSum = New-Object -TypeName 'System.Collections.ArrayList'

$perfCounterList | Group-Object -Property Location | ForEach-Object {
$perfSumHash = @{'Location' = ($_.Name)}
$perfSumHash.Add('CookedValue', (($_.Group | Measure-Object -Property CookedValue -Sum).Sum))
$perfSumObj = New-Object -TypeName PSObject -Property $perfSumHash
$null = $perfCounterSum.Add($perfSumObj)
}

$perfCounterSum | ForEach-Object {

$sumi = "ComputerName>$($ComputerName)< testedAt>$($testedAt)< WindowsVersion>$($WindowsVersion)< ComputerDescription>$($computerDescription)<"
$sumi += "Location>$($_.Location)< CookedValue>$($_.CookedValue)< TypeOfCookedValue $($_.CookedValue.GetType())"

if (($_.Location -ne $null -and ($_.Location.Gettype().Name -eq 'String' )) -and (($_.CookedValue -ne $null) -and ($_.CookedValue -match '\d'))) {
# $api.LogScriptEvent('BasicWatcher.Collect.KPIs.ps1',253,2,"On computer $($computerName) sending Bag with searching for $($MonitorItem)`n Bag: $($sumi)")
$foo = 'bar'
} else {
$api.LogScriptEvent('BasicWatcher.Collect.KPIs.ps1',253,1,"On computer $($computerName) NOT SENDING Bag with searching for $($MonitorItem)`n Bag: $($sumi)")
continue
}

$objekt = $MonitorItem + '.' + 'Info'

$bag = $api.CreatePropertybag()
$bag.AddValue("testedAt",$testedAt)
$bag.AddValue("WindowsVersion",$WindowsVersion)
$bag.AddValue("ComputerDescription",$computerDescription)
$bag.AddValue('Counter',$_.Location)
$bag.AddValue('Value',$_.CookedValue)
$bag.AddValue('Instance',$ComputerName)
$bag.AddValue('Objekt',$objekt)
$bag

}]]></Script></ScriptBody>
<Parameters>
<Parameter>
<Name>MonitorItem</Name>
<Value>$Config/MonitorItem$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="Script">
<Node ID="Scheduler"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.PropertyBagData</OutputType>
</DataSourceModuleType>