Site icon Frankys Web

Exchange Server Dashboards: Grafana, InfluxDB, PowerShell, PRTG und Telegraf

Jan Kappen hat zum Thema Grafana, InfluxDB und PowerShell ein super HowTo geschrieben. Jan beschreibt die Installation, Konfiguration und Nutzung von Grafana und InfluxDB auf seinem Blog:

Für Neulinge (wie Mich) in Sachen Grafana und InfluxDB ist dies das perfekte HowTo.

An dieser Stelle vielen Dank an Jan! Er hat mich mit seinem HowTo auf ein sehr spannendes Thema aufmerksam gemacht.

Ich habe Jan’s Umgebung nachgebaut. Die Testumgebung ist in wenigen Minuten installiert und kann direkt mit Daten gefüttert werden.

Basierend auf Jan’s Howto habe ich dann angefangen die Influx Datenbank mit Daten aus Exchange Server und Sophos UTM zu füttern. Dazu konnte ich sogar die Scripte aus meinem letzten Howto weiterverwenden und musste diese nur ein klein wenig anpassen.

Nach kurzer Einarbeitung und stöbern im System, bin ich dann darauf aufmerksam geworden, dass auch bestehende Monitoring Systeme wie zum Beispiel PRTG in Grafana integriert werden können. Ab hier wurde es dann für mich sehr spannend, dies ist mal ein erster Entwurf von mir für ein Dashboard:

Das Dashboard greift auf PRTG und die InfluxDB zu. Die folgenden Anzeigen kommen aus der Influx DB:

Um diese Daten in die InfluxDB zu schreiben, habe ich das Beispiel Script von Jan verwendet und entsprechend angepasst. Für die Exchange Werte habe ich folgendes Script verwendet:

while ($true){
$InfluxDBHost = "http://INFLUXDBSERVER:8086"
$IfluxDBName = "InfluxDBName"
$username = "influxusername"
$password = "password" | ConvertTo-SecureString -asPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential($username,$password)

$ExchangeServer = "Exchange"

#Exchange Snapin
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn;

$SendMailsPerHour = (Get-MessageTrackingLog -Server $ExchangeServer -EventId RECEIVE -Start (get-date).addhours(-1) | Where {$_.Source -eq "STOREDRIVER"} | select timestamp | measure).count
$ReceivedPerHour = (Get-MessageTrackingLog -Server $ExchangeServer -EventId DELIVER -Start (get-date).addhours(-1) | select timestamp | measure).count
$MailsInQueues = (Get-Queue -Server $ExchangeServer | where {$_.DeliveryType -ne "ShadowRedundancy"} | select messagecount | measure messagecount -Sum).sum

$metrics = @{
    "Send per Hour" = $SendMailsPerHour
    "Received per Hour" = $ReceivedPerHour
    "Mails In Queues" = $MailsInQueues
}

$metrics

Write-Influx -Measure Exchange -Tags @{Server=$env:COMPUTERNAME} -Metrics $metrics -Database $IfluxDBName -Server $InfluxDBHost -Credential $Cred -Verbose
start-sleep 600
}

Die Daten der UTM werden mit folgendem Script in die InfluxDB geschrieben:

while ($true){
$InfluxDBHost = "http://INFLUXDBSERVER:8086"
$IfluxDBName = "InfluxDBName"
$username = "influxusername"
$password = "password" | ConvertTo-SecureString -asPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential($username,$password)

$UTMHostNameorIP = "UTMDNSNAMEORIP"
$Loginuser = "loginuser"
$LoginUserPassword = "password"

$LoginUserPasswordSec = ConvertTo-SecureString $LoginUserPassword -AsPlainText -Force
$LoginCreds = New-Object System.Management.Automation.PSCredential($Loginuser,$LoginUserPasswordSec)
#Connect SSH Session
try {
 $ConnectSSHSession = New-SSHSession -ComputerName $UTMHostNameorIP -Credential $LoginCreds -AcceptKey:$true
}
catch {
 write-host "Can't connect to UTM"
}
#Query Quarantine
try {
  $StrQuarantine = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/quarantine -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Quarantine = [convert]::ToInt32($StrQuarantine, 10)
 }
catch {
 write-host "Can't query Quarantine mails"
}
if ($Quarantine -eq 1 -or $Quarantine -eq 0) {
 $Quarantine = 0
} else {
 $Quarantine = ($Quarantine -1)/2
}
#Query Output Queue (Spool)
try {
  $StrOutput = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/output -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Output = [convert]::ToInt32($StrOutput, 10)
}
catch {
  write-host "Can't query Output (spool) mails"
}
if ($Output -eq 1 -or $Output -eq 0) {
 $Output = 0
} else {
 $Output = ($Output -1)/2
}
#Query corrupt  Queue
try {
  $StrCorrupt  = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/corrupt  -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Corrupt  = [convert]::ToInt32($StrCorrupt , 10)
}
catch {
  write-host "Can't query corrupt mails"
}
if ($Corrupt  -eq 1 -or $Corrupt -eq 0) {
 $Corrupt = 0
} else {
 $Corrupt = ($Corrupt -1)/2
}
#Disconnect SSH Session
$DisconnectSSHSession = Remove-SSHSession -Index $ConnectSSHSession.SessionId

$metrics = @{
    "Quarantine" = $Quarantine
    "Spool" = $Output
    "Corrupt" = $Corrupt
}

$metrics

Write-Influx -Measure UTM -Tags @{Server=$UTMHostNameorIP} -Metrics $metrics -Database $IfluxDBName -Server $InfluxDBHost -Credential $Cred -Verbose
start-sleep 600
}

Für den Testbetrieb laufen die beiden Scripte noch als Schleife, später werde ich die Script wohl einfach zyklisch per Taskplaner ausführen.

Die restlichen Grafen stammen direkt aus PRTG. Dazu musste PRTG nur als Datenquelle angebunden werden, dies ist im folgendem beschrieben.

Ich werde jetzt erst mal noch weiter mit Grafana und InfluxDB rumspielen. Mir fallen da noch unzählige Anwendungsmöglichkeiten ein…

Es macht sich zumindest schon mal sehr gut im Büro. Sehr angenehm, dass beim Refresh der Daten kein Reload der Seite erfolgt, es kommt also zu keinem “Zucken” der Darstellung:

Einbindung von PRTG in Grafana

Damit PRTG von Grafana als Datenquelle benutzt werden kann, muss zunächst der folgende Registry Key auf dem PRTG Server hinzugefügt werden

Danach muss der PRTG Core Server Dienst einmal neu gestartet werden. Jetzt kann ein PRTG Benutzer für Grafana angelegt werden:

Nachdem der Benutzer angelegt wurde, muss der Hash des Kennworts kopiert werden, der Passhash wird für die Einrichtung der Datenquelle in Grafana verwendet:

Am besten meldet man sich jetzt mit dem neuen Benutzer an PRTG an und prüft ob der Benutzer Lesezugriff auf die Geräte und Sensoren hat, danach kann das PRTG Plugin für Grafana auf dem Grafana Server installiert werden, auch hier muss Grafana zunächst neu gestartet werden:

grafana-cli plugins install jasonlashua-prtg-datasource
service grafana-server restart

Nun kann die Verbindung zu PRTG konfiguriert werden:

Für die Datenquelle sind nun die entsprechenden Einstellungen nötig:

Nach einen Klick auf “Save & Test” wird die entsprechende PRTG API Version angezeigt. Damit nun auch Daten aus PRTG angezeigt werden können, muss Grafana noch einmal neu gestartet werden:

service grafana-server restart

Jetzt lassen sich auch Grafen aus den Sensordaten aus PRTG erstellen.Auch die Windows Leistungsdaten (CPU, RAM, Netzwerk, Disk) lassen sich mit wenig Aufwand in InfluxDB speichern.

Windows Leistungsdaten in InfluxDB speichern (Telegraf)

Das Tool “Telegraf” kann Daten von Windows, Linux und MacOS Systemen an die InfluxDB senden. Für Windows Systeme sind hier besonders die Performance Counter interessant.

Damit die gängigsten Leistungsdaten von Windows Systemen an InfluxDB gesendet werden können, muss zunächst das Telegraf runtergeladen werden:

Die beiden Dateien aus dem ZIP-Archiv können nun unter C:\Programme\Telegraf auf dem Windows System gespeichert werden, welches seine Leistungsdaten an InfluxDB schicken soll:

Danach kann die Telegraf.conf Datei bearbeitet werden, ich habe dazu eine entsprechende Beispielkonfiguration gefunden, welche es hier zum Download gibt. In der folgenden .Conf Datei müssen nur die Zeilen 93, 115 und 116 angepasst werden:

Die Beispielkonfiguration gibt es hier zum Download:

Danach kann Telegraf als Windows Dienst angelegt werden:

telegraf.exe --service install -config "c:\program files\telegraf\telegraf.conf"

Jetzt kann der Dienst gestartet werden:

Telegraf speichert die Leistungsdaten nun in der Influx Datenbank “WinPerfStats” (siehe oben, blauer Kasten). Ich fand es etwas übersichtlicher eine neue Datenbank für die Leistungsdaten zu erstellen. Wer dies nicht möchte, kann auch eine vorhandene Datenbank verwenden (die neue Datenbank muss nicht extra erzeugt werden, dies erledigt Telegraf).

Die neue Influx Datenbank kann jetzt ebenfalls als Datenquelle hinzugefügt werden:

Sobald die neue Datenbank eingebunden ist, lasen sich daraus auch wieder schicke Dashboards bauen:

Aufräumen in der InfluxDB

Nach einigen Tests landet auch mal einiger Datenmüll in der InfluxDB, dieser lässt sich aber einfach bereinigen, hier mal ein paar einfache Kommandos zum Aufräumen.

Datenbanken anzeigen:

Datenbank auswählen:

Datenbank löschen:

Measurements anzeigen:

Measurements löschen:

Hier gibt es eine gute Übersicht der wichtigsten Befehle und Aktionen:

Database management using InfluxQL

Exit mobile version