S2D Faults WMI Fault Events Data Source

Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.FaultWmiEventDataSource (DataSourceModuleType)

Faults WMI fault events data source.

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.PropertyBagData

Member Modules:

ID Module Type TypeId RunAs 
WmiEventProviderDS DataSource Microsoft.Windows.WmiEventProvider Default
PA ProbeAction Microsoft.Windows.PowerShellPropertyBagProbe Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
PollIntervalint$Config/PollInterval$Polling Interval (sec)WMI event query polling interval.
TimeoutSecondsint$Config/TimeoutSeconds$Timeout (sec)

Source Code:

<DataSourceModuleType ID="Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.FaultWmiEventDataSource" Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TargetInstanceUniqueID" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TargetInstanceObjectID" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ComputerName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="PollInterval" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="WQLQuery" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TargetId" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="PollInterval" Selector="$Config/PollInterval$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="WmiEventProviderDS" TypeID="Windows!Microsoft.Windows.WmiEventProvider">
<NameSpace>\\$Config/ComputerName$\root\Microsoft\Windows\Storage</NameSpace>
<Query>$Config/WQLQuery$</Query>
<PollInterval>$Config/PollInterval$</PollInterval>
</DataSource>
<ProbeAction ID="PA" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
<ScriptName>StorageFaultEventProbe.ps1</ScriptName>
<ScriptBody><Script>

Param($TargetInstanceObjectID,$SourceUniqueId, $SourceObjectId, $FaultId, $Reason, $FaultingObjectDescription, $RecommendedActions, $PerceivedSeverity, $TargetId,$FaultingObjectLocation)
$SCRIPT_NAME = "StorageFaultEventProbeScript.ps1"



#general variables
#-----------------
$errorActionPreference = 'Stop'

$errEvent = [System.Diagnostics.EventLogEntryType]::Error;
$infoEvent = [System.Diagnostics.EventLogEntryType]::Information;
$GenericInformationEvent = 8671;
$GenericFailureEvent = 8672;
$script:traceMsg = "";
$msft_namespace = "root\microsoft\windows\storage"
$cluster_namespace = "root\mscluster"
$momAPI = New-Object -comObject 'MOM.ScriptAPI'

Function AddTraceMessage
{
param($message)

$errorActionPreference = 'SilentlyContinue'
$timeStamp = (get-date -format "HH:mm:ss:fff");
$script:traceMsg = $script:traceMsg + "`n[" + $timeStamp + "] " + $message;
}

AddTraceMessage -message "Start on Node: $env:COMPUTERNAME"

#Param($TargetInstanceObjectID,$SourceUniqueId, $SourceObjectId, $FaultId, $Reason, $FaultingObjectDescription, $RecommendedActions, $PerceivedSeverity, $TargetId,$FaultingObjectLocation)

try
{
AddTraceMessage -message "Storage monitoring script $SCRIPT_NAME started."
AddTraceMessage -message "FaultId=$FaultId"
AddTraceMessage -message "SourceUniqueId=$SourceUniqueId"
AddTraceMessage -message "SourceObjectId=$SourceObjectId"
AddTraceMessage -message "Reason=$Reason"
AddTraceMessage -message "FaultingObjectDescription=$FaultingObjectDescription"
AddTraceMessage -message "RecommendedActions=$RecommendedActions"
AddTraceMessage -message "PerceivedSeverity=$PerceivedSeverity"
AddTraceMessage -message "FaultingObjectLocation=$FaultingObjectLocation"
AddTraceMessage -message "TargetInstanceObjectID=$TargetInstanceObjectID"

if ($SourceObjectId -ne $TargetInstanceObjectID)
{
exit
}

$bag = $momAPI.CreatePropertyBag()

$bag.AddValue("SourceUniqueId", $SourceUniqueId)
$bag.AddValue("SourceObjectId", $SourceObjectId)
$bag.AddValue("FaultId", $FaultId)
$bag.AddValue("Reason", $Reason)
$bag.AddValue("FaultingObjectDescription", $FaultingObjectDescription)
$bag.AddValue("RecommendedActions", $RecommendedActions)
$bag.AddValue("PerceivedSeverity", $PerceivedSeverity);
$bag.AddValue("FaultingObjectLocation", $FaultingObjectLocation)

#OM Alert severity
$alertSeverity = 1; # Default for OM would be warning
if($PerceivedSeverity -eq 2)
{
$alertSeverity = 0 #Information
}
elseif(($PerceivedSeverity -eq 3) -or ($PerceivedSeverity -eq 4))
{
$alertSeverity = 1
}
elseif(($PerceivedSeverity -ge 5))
{
$alertSeverity = 2
}

$bag.AddValue("OM Alert Severity", $alertSeverity);
$bag.AddValue("TargetId", $TargetId);

#$bag.AddValue("CompositeAlertId", $FaultId + ":" + $SourceUniqueId);
$bag.AddValue("CompositeAlertId", $FaultId + ":" + $SourceObjectId);
$bag.AddValue("IsError", "False");
AddTraceMessage -message "Storage fault recieved:`nfault id = $FaultId`nReason = $Reason"
$bag
}
catch
{
AddTraceMessage -message $_.Exception.Message
}
finally
{
if ($error -ne $null -and $error.Count -gt 0 -and $error[0] -ne $null)
{
$momAPI.LogScriptEvent($SCRIPT_NAME, $GenericFailureEvent, 1, $error[0].ToString());
}

if ($script:traceMsg -ne $null)
{
$momAPI.LogScriptEvent($SCRIPT_NAME, $GenericInformationEvent, 0, $script:traceMsg);
}
}

</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>TargetInstanceObjectID</Name>
<Value>$Config/TargetInstanceObjectID$</Value>
</Parameter>
<Parameter>
<Name>SourceUniqueId</Name>
<Value>$Data/Property[@Name='SourceUniqueId']$</Value>
</Parameter>
<Parameter>
<Name>SourceObjectId</Name>
<Value>$Data/Property[@Name='SourceObjectId']$</Value>
</Parameter>
<Parameter>
<Name>FaultId</Name>
<Value>$Data/Property[@Name='FaultId']$</Value>
</Parameter>
<Parameter>
<Name>Reason</Name>
<Value>$Data/Property[@Name='Reason']$</Value>
</Parameter>
<Parameter>
<Name>FaultingObjectDescription</Name>
<Value>$Data/Property[@Name='FaultingObjectDescription']$</Value>
</Parameter>
<Parameter>
<Name>RecommendedActions</Name>
<Value>$Data/Property[@Name='RecommendedActions']$</Value>
</Parameter>
<Parameter>
<Name>PerceivedSeverity</Name>
<Value>$Data/Property[@Name='PerceivedSeverity']$</Value>
</Parameter>
<Parameter>
<Name>TargetId</Name>
<Value>$Config/TargetId$</Value>
</Parameter>
<Parameter>
<Name>FaultingObjectLocation</Name>
<Value>$Data/Property[@Name='FaultingObjectLocation']$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>true</StrictErrorHandling>
</ProbeAction>
<!--<ConditionDetection ID="CD" TypeID="System!System.ExpressionFilter">
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='SourceObjectId']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>$Config/TargetInstanceObjectID$</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</ConditionDetection>-->
</MemberModules>
<Composition>
<!--<Node ID="CD">-->
<Node ID="PA">
<Node ID="WmiEventProviderDS"/>
</Node>
<!--</Node>-->
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.PropertyBagData</OutputType>
</DataSourceModuleType>