PRTG – ADM Events überwachen
Im einem der letzten Beiträge habe ich ein Powershell Modul vorgestellt, mit welchem man Daten vom Citrix ADM abgreifen kann.
Basierend auf diesem Modul habe ich bei uns einen PRTG Custom Sensor erstellt, welcher die Events aus dem ADM ausliest:
Dazu müssen erst einmal die Parameter von PRTG sowie das Modul selbst eingelesen und eine Verbindung zur Appliance hergestellt werden:
# Get parameter from PRTG
param (
[string]$server,
[string]$domain,
[string]$username,
[string]$password
)
# Import ADM PS module
$CustomSensors="C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\"
Import-Module $CustomSensors\PRTGCustomCitrixADM.psm1
# Create the ADM session
$ADMHost = "https://"+$server
$ADMSession = Connect-ADM -ADMHost $ADMHost -CredUser $username -CredPW $password
Damit dies funktioniert, muss der entsprechende Benutzer von PRTG auf dem ADM Leserechte haben. Weiter gehe ich nicht auf jede Zeile ein, dies kann im Script selbst nachgelesen werden. Hier beschreibe ich vor allem die wichtigsten Punkte, wie das auslesen der Events:
# Get the events from the ADM
$ActiveEvents = Invoke-ADMNitro -ADMSession $ADMSession -OperationMethod GET -ResourceType active_event
# Create the variable only with the active events content
$ActiveEvents2 = $ActiveEvents | Select-Object active_event
Es sollen im PRTG nicht alle ADM Meldungen gleich einen Alarm auslösen, daher habe ich div. Arrays für Ausschlüsse vorbereitet, welche bei Bedarf genutzt werden können:
# Prepare a device_entity_name exlusion list for PRTG outputs
# Add each device in quota with a comma (except the last line)
$DeviceExcludeList = $null
$DeviceExcludeList = @(
"entity1",
"entity.domain.pit"
)
# Prepare a failureobj exlusion list for PRTG outputs
# Add each failure object in quota with a comma (except the last line)
$FailureObjectExcludeList = $null
$FailureObjectExcludeList = @(
"object1",
"object2"
)
# Prepare a message exlusion list for PRTG outputs
# Add each message in quota with a comma (except the last line)
$MessageExcludeList = $null
$MessageExcludeList = @(
"192.168.99.99"
)
Da auch vServer und Services vom ADC welche wieder hochkommen einen „Critical Event“ darstellen, habe ich diese beim Aufbereiten ausgeklammert:
If ($Event.severity -eq "Critical"){
# Filter out 'entityup' messages from critical state
If ($Event.category -ne "entityup"){
$RetState = $returnStateCritical
$Events += [PSCustomObject]@{Severity=$Event.severity;SourceIP=$Event.source;SourceHost=$Event.hostname;Category=$Event.category;Entity=$Event.device_entity_name;State=[Int64]$RetState}
$RetCritical = $RetCritical + 1
}
}
Innerhalb der „Major Events“ werden im ersten Schritt die vorher definierten Ausschlüsse gegengeprüft und mittels Variable $DeviceAlarm die weitere Verarbeitung bestätigt oder gestoppt:
# Filter out known entities, failure objects etc. from major state
# Set variable $DeviceAlarm, if the device isn't filtered
$DeviceAlarm = $null
ForEach ($ExcludedDevice in $DeviceExcludeList) {
$Entity = $Event.device_entity_name
If ($DeviceAlarm -or ($DeviceAlarm -eq $null)) {
If ($Entity -notlike "*$ExcludedDevice*") {
$DeviceAlarm = $true
}
Else{
$DeviceAlarm = $false
}
}
}
If ($DeviceAlarm){
ForEach ($ExcludedFO in $FailureObjectExcludeList) {
$Entity = $Event.failureobj
If ($DeviceAlarm -or ($DeviceAlarm -eq $null)) {
If ($Entity -notlike "*$ExcludedFO*") {
$DeviceAlarm = $true
}
Else{
$DeviceAlarm = $false
}
}
}
}
If ($DeviceAlarm){
ForEach ($ExcludedMessage in $MessageExcludeList) {
$Entity = $Event.message
If ($DeviceAlarm -or ($DeviceAlarm -eq $null)) {
If ($Entity -notlike "*$ExcludedMessage*") {
$DeviceAlarm = $true
}
Else{
$DeviceAlarm = $false
}
}
}
}
Falls ein „Major Event“ nicht durch einen Ausschluss gefiltert wurde, wird die Eventliste entsprechend aufbereitet. In diesem Schritt werden Meldungen von Services („svc“ im Namen) oder Service Groups („svg“ im Namen) zu einer Warnung herunter gestuft. Dies weil definiert wurde, dass im PRTG erst ein Alarm erscheint, wenn der komplette vServer und nicht ’nur‘ ein Service DOWN ist:
# If device isn't excluded, add to monitoring array
# Services (svc) or service groups (svg) returns a warning instead an alarm
If ($DeviceAlarm){
If (($Event.device_entity_name -like "*svc*") -or ($Event.device_entity_name -like "*svg*")) {
$RetState = $returnStateWarning
$Events += [PSCustomObject]@{Severity=$Event.severity;SourceIP=$Event.source;SourceHost=$Event.hostname;Category=$Event.category;Entity=$Event.device_entity_name;State=[Int64]$RetState}
$RetWarning = $RetWarning + 1
}
Else {
$RetState = $returnStateCritical
$Events += [PSCustomObject]@{Severity=$Event.severity;SourceIP=$Event.source;SourceHost=$Event.hostname;Category=$Event.category;Entity=$Event.device_entity_name;State=[Int64]$RetState}
$RetMajor = $RetMajor + 1
}
}
Im restlichen Skript wurden die einzelnen Daten mit einem vorgegebenen Wert gegen geprüft und die entsprechenden PRTG Ausgaben definiert.
Das Script muss nun in den Custom Sensors Ordner von PRTG gelegt werden und der Sensor kann entsprechend eingerichtet werden:
Das Resultat sieht dann wie folgt aus:
Viel Spass beim Nachbauen :-)