SCOM: výpis vybraných pravidel pro potřeby dokumentace, verze 0.1

Zadání je jednoduché:

Vypsat seznam pravidel, která vyvolávají alert s konkrétním obsahem v některém poli Custom Field 1 – 10 nebo obsahují ve výrazu podmínky určité číslo události nebo zdroje události.

Realizace je složitější, nejprve jsem se zaměřil na Command Shell / PowerShell, ale

  • Get-Rule nevypisuje definice navázaného alertu
  • Get-Alert vypisuje pouze vyvolané alerty

A co se podívat přímo do databáze OperationsManager, jakým způsobem jsou zde pravidla a definice alertů uložené?

Zajímají nás dva pohledy: RuleView a RuleModule, tyto tabulky si spojíme prostřednictvím sloupců RuleId. Po chvíli experimentování v SQL Server Management Studio s nástrojem Query Designer jsem dospěl k (neoptimalizovanému) dotazu:

SELECT
    DISTINCT  RuleView.DisplayName
  , RuleModule.RuleModuleConfiguration AS AlertConfig
  , RuleCont.RuleModuleConfiguration AS AlertExpression
FROM   
  RuleView INNER JOIN
      RuleModule ON RuleView.Id = RuleModule.RuleId INNER JOIN
           RuleModule AS RuleCont ON RuleView.Id = RuleModule.RuleId                  
WHERE 
  (RuleModule.RuleModuleConfiguration LIKE '%HLEDANÝVÝRAZ%')
  AND RuleModule.RuleId = RuleCont.RuleId
  AND RuleModule.RuleModuleConfiguration <> RuleCont.RuleModuleConfiguration

Tento dotaz už lze zadat v Report Builderu 2.0 a začít tvořit textovou zprávu. Pro použití v dokumentaci mi ještě vadí způsob uložení údajů ve sloupci RuleModuleConfiguration, takže jsem pro zvýšení přehlednosti výstupu doplnil interní funkci v jazyce Visual Basic:

Function parseXML(readXML As String) As String
Dim strXML, strText
strXML =  readXML
strText = ""
' cyklus zpracování
Dim i, strZnak, nPocet, bNazev
bNazev = False
nPocet = Len(strXML)
For i = 1 To nPocet
strZnak = Mid(strXML,i,1)
' zahoď <
If strZnak = ">" Then
   bNazev = False
   strZnak = ": "
End If
If (strZnak <> "<") Then
   If strZnak = "/" And bNazev Then
     ' ukončit řádku
     If  Mid(strXML,i+1,1) = ">" Then
       strZnak = vbCrLf
       i = i + 1
       bNazev = False
     End If
   End If
   If strZnak = "/"  Then
     If bNazev Then
      Do Until strZnak = ">"
        strZnak = Mid(strXML,i,1)
        i = i + 1
      Loop
      strZnak = vbCrLf
     End If
   End If 
   strText = strText & strZnak
  Else
   bNazev = True
End If
Next
parseXML = strText
End Function

Výstup pravidla a definice alertu pak může vypadat takto:

image

Nakonec jsem se ještě podíval na možnosti čtení záznamů z těchto výše uvedených tabulek pomocí Shellu. Dospěl jsem k podobnému výstupu, ale zatím nemám zpracovanou proceduru parseXML pro PowerShell. Takže někdy příště?

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *