Некорректная работа мониторов, созданных на основе «SNMP Probe Monitor» и «Timed Script Monitor»
Часто встречаю ситуации, когда вроде бы правильно настроенный монитор периодически генерирует некорректные алерты. И происходит такая ситуация только с некоторыми типами мониторов. Например, с мониторами типа «SNMP Probe Monitor», «Timed Script Monitor».
А дело вот в чем:
Как вы знаете, при настройке таких мониторов необходимо обязательно указать значения параметров, при которых объект будет в здоровом состоянии и в состоянии ошибки. Так вот, если вы используете консоль Operations Manager при создании таких типов мониторов, этим параметрам автоматически присваивается значение типа «String» (строковое значение), и изменить это в консоли Operations Manager нельзя. Это не вызывает проблем, если мы действительно сравниваем строковые значения, однако в случаях, когда нужно сравнить числовые значения, могут возникать ложные алерты.
Покажу на примере.
Допустим, нужно контролировать уровень заряда батареи по SNMP у UPS. Для этого мы создаем монитор типа «SNMP Probe Monitor». В качестве контролируемого параметра указываем определенный OID, в качестве 1-го выражения (Error) указываем /DataItem/SnmpVarBinds/SnmpVarBind[1]/Value Less 50, в качестве 2-го выражения (Good) указываем /DataItem/SnmpVarBinds/SnmpVarBind[1]/Value GreaterEqual 50
Если уровень заряда батареи будет 100%, то при такой настройке монитора будет генерироваться алерт, так как сравниваются строковые значения (100 < 50), что конечно же неправильно с точки зрения нужного нам мониторинга.
Для того, чтобы монитор работал правильно, нужно выполнить следующее:
- Экспортировать пакет управления, в котором сохранен монитор;
- Открыть пакет в любом редакторе и найти монитор, который мы настраивали для мониторинга уровня заряда батареи;
- Изменить тип параметров на «Integer»:
Старая версия:
<Monitors>
<UnitMonitor ID="UIGeneratedMonitor8c0a807d32664af08ed14b10d0160171" Accessibility="Public" Enabled="true" Target="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="SystemNetworkManagementLibrary7095380!System.NetworkManagement.SnmpProbe.2SingleEvent2StateMonitorType" ConfirmDelivery="false">
<Category>Custom</Category>
<AlertSettings AlertMessage="UIGeneratedMonitor8c0a807d32664af08ed14b10d0160171_AlertMessageResourceID">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data/Context/SnmpVarBinds/SnmpVarBind[1]/Value$</AlertParameter1>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="UIGeneratedOpStateId08d764fad20f4260bbc1d6a5b7de3a92" MonitorTypeStateID="SecondEventRaised" HealthState="Success" />
<OperationalState ID="UIGeneratedOpStateId22579aee95124c5da5c9d11d1c72f3c7" MonitorTypeStateID="FirstEventRaised" HealthState="Error" />
</OperationalStates>
<Configuration>
<FirstInterval>60</FirstInterval>
<FirstIP>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPAddress$</FirstIP>
<FirstVersion>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPVersion$</FirstVersion>
<FirstSnmpVarBinds>
<SnmpVarBind>
<OID> .1.3.6.1.4.1.318.1.1.1.2.2.1.0</OID>
<Syntax>0</Syntax>
<Value VariantType="8" />
</SnmpVarBind>
</FirstSnmpVarBinds>
<FirstExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
</ValueExpression>
<Operator>Less</Operator>
<ValueExpression>
<Value Type="String">50</Value>
</ValueExpression>
</SimpleExpression>
</FirstExpression>
<SecondInterval>120</SecondInterval>
<SecondIP>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPAddress$</SecondIP>
<SecondVersion>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPVersion$</SecondVersion>
<SecondSnmpVarBinds>
<SnmpVarBind>
<OID>.1.3.6.1.4.1.318.1.1.1.2.2.1.0</OID>
<Syntax>0</Syntax>
<Value VariantType="8" />
</SnmpVarBind>
</SecondSnmpVarBinds>
<SecondExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
</ValueExpression>
<Operator>GreaterEqual</Operator>
<ValueExpression>
<Value Type="String">50</Value>
</ValueExpression>
</SimpleExpression>
</SecondExpression>
<NoOfRetries>3</NoOfRetries>
<Timeout>500</Timeout>
<Port>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/PortNumber$</Port>
</Configuration>
</UnitMonitor>
Новая версия:
<Monitors>
<UnitMonitor ID="UIGeneratedMonitor8c0a807d32664af08ed14b10d0160171" Accessibility="Public" Enabled="true" Target="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="SystemNetworkManagementLibrary7095380!System.NetworkManagement.SnmpProbe.2SingleEvent2StateMonitorType" ConfirmDelivery="false">
<Category>Custom</Category>
<AlertSettings AlertMessage="UIGeneratedMonitor8c0a807d32664af08ed14b10d0160171_AlertMessageResourceID">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data/Context/SnmpVarBinds/SnmpVarBind[1]/Value$</AlertParameter1>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="UIGeneratedOpStateId08d764fad20f4260bbc1d6a5b7de3a92" MonitorTypeStateID="SecondEventRaised" HealthState="Success" />
<OperationalState ID="UIGeneratedOpStateId22579aee95124c5da5c9d11d1c72f3c7" MonitorTypeStateID="FirstEventRaised" HealthState="Error" />
</OperationalStates>
<Configuration>
<FirstInterval>60</FirstInterval>
<FirstIP>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPAddress$</FirstIP>
<FirstVersion>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPVersion$</FirstVersion>
<FirstSnmpVarBinds>
<SnmpVarBind>
<OID>.1.3.6.1.4.1.318.1.1.1.2.2.1.0</OID>
<Syntax>0</Syntax>
<Value VariantType="8" />
</SnmpVarBind>
</FirstSnmpVarBinds>
<FirstExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
</ValueExpression>
<Operator>Less</Operator>
<ValueExpression>
<Value Type="Integer">50</Value>
</ValueExpression>
</SimpleExpression>
</FirstExpression>
<SecondInterval>120</SecondInterval>
<SecondIP>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPAddress$</SecondIP>
<SecondVersion>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/SNMPVersion$</SecondVersion>
<SecondSnmpVarBinds>
<SnmpVarBind>
<OID>.1.3.6.1.4.1.318.1.1.1.2.2.1.0</OID>
<Syntax>0</Syntax>
<Value VariantType="8" />
</SnmpVarBind>
</SecondSnmpVarBinds>
<SecondExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
</ValueExpression>
<Operator>GreaterEqual</Operator>
<ValueExpression>
<Value Type="Integer">50</Value>
</ValueExpression>
</SimpleExpression>
</SecondExpression>
<NoOfRetries>3</NoOfRetries>
<Timeout>500</Timeout>
<Port>$Target/Property[Type="SystemNetworkManagementLibrary7095380!System.NetworkManagement.Node"]/PortNumber$</Port>
</Configuration>
</UnitMonitor>
4. Установить исправленный пакет управления;
5. Убедиться, что теперь монитор работает исправно.
Похожая ситуация наблюдается и с типом монитора «Timed Script Monitor». Если в выводе скрипта вы хотите сравнить числа, то обязательно после сохранения монитора в консоли Operations Manager внесите изменения в тип переменных, как это было показано на примере выше.
Команда System Center PFE Russia.