Некорректная работа мониторов, созданных на основе «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), что конечно же неправильно с точки зрения нужного нам мониторинга.

Для того, чтобы монитор работал правильно, нужно выполнить следующее:

  1. Экспортировать пакет управления, в котором сохранен монитор;
  2. Открыть пакет в любом редакторе и найти монитор, который мы настраивали для мониторинга уровня заряда батареи;
  3. Изменить тип параметров на «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.