PRTG mit Office 365

Achtung:
Dieses Skript funktioniert nicht mehr. Microsoft hat im den September 2019 die alte "Office Discovery Service API" API abgeschaltet. Auch die zwischenzeitlich bereitgestellte Office 365 Management API wird durch Graph abgelöst. Siehe dazu auch Office 365 Status

Auf der Seite O365 Status beschreibe ich, wie ein Office 365 Administrator über verschiedene APIs den Status seines Office 365 Tenants abrufen kann. Natürlich liefert Microsoft auch entsprechende Module für die eigene System Center Familie mit.

Mittlerweile gibt es auch von PRTG entsprechende Sensoren:

Status im Portal

Zuerst habe ich mir noch mal die Statusanzeige im Dashboard "online" angeschaut. Hier sind schön die verschiedenen Produkte zu sehen.

Leider ist es nicht ganz so einfach, genau so eine Liste zu generieren, da die Office 365 API einmal die Produkte als Liste (ohne Status) liefert und ein zweiter Aufruf die verschiedenen Events meldet. Allerdings kann es pro Produkt durchaus mehrere Events geben und es werden auch bereits beendete Störungen noch eine Zeit lang mitgeführt.

PRTG-Planung

Ich habe mir daher gedacht, dass ich per PowerShell einfach ab und an beide Listen einsammle und die Ergebnisse dann vereinfacht generieren. Ich wollte schon die komplette Liste der Produkte haben, aber nicht die ganzen Teilprodukte. So gibt es z.B. "Exchange" als Service Endpoint.

Hinweis: Die Variablen sind erst belegt, wenn Sie vorher auch durch den entsprechenden Code gesetzt wurden. Der Code ist auf O365 Status beschrieben.

$Serviceenpoints

FeatureNames                            ServiceName
------------                            -----------
{Sign-in, E-Mail and calendar access... Exchange Online
{Sign-In, Administration}               Identity Service
{Portal, Administration, Purchase an... Office 365 Portal
{Audio and Video, Federation, Manage... Skype for Business
{Provisioning, SharePoint Features, ... SharePoint Online
{Yammer Components}                     Yammer Enterprise
{Mobile Device Management}              Mobile Device Management
{Planner}                               Planner
{Sway}                                  Sway

Aber Exchange selbst hat selbst noch einige Unter-Features

$Serviceenpoints[0].FeatureNames
Sign-in
E-Mail and calendar access
E-Mail timely delivery
Management and Provisioning
Voice mail

Da PRTG primär "Nummern" anzeigen kann, habe ich mir überlegt, dass ich einfach pro ServiceEndpoint die Anzahl der offenen Meldungen aufaddiere. Das ganze wurde in ein PowerShell-Skript gepresst, welches natürlich die Anmeldedaten eines "globalen Administrators benötigt.

PRTG Custom Sensor

Das Skript ist so ausgelegt, dass Sie es auch einfach interaktiv starten und die Ausgabe bewundern können. Ich halte mich an meine PRTG-Erfahrung, dass die Probe die Rückgabe bis auf das erste "<"-Zeichen ignoriert.

PS C:\> .\prtg-o365status.1.0.ps1 -password supergeheim
PRTG-O365Status:Start
PRTG-O365Status: Generate JSON Request
PRTG-O365Status: Requesting Session Cookie
PRTG-O365Status: Retrieving Service Endpoints
PRTG-O365Status: Retrieving Status
PRTG-O365Status: Parsing Status Result
PRTG-O365Status: Generating Result
PRTG-O365Status: Sending PRTGRESULT to STDOUT
<?xml version="1.0" encoding="Windows-1252" ?>
<prtg>
    <result>
        <channel>Yammer Enterprise</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>SharePoint Online</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>Office 365 Portal</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>Mobile Device Management</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>Skype for Business</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>Identity Service</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>Exchange Online</channel>
        <value>1</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>Planner</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
    <result>
        <channel>Sway</channel>
        <value>0</value>
        <float>0</float>
        <mode>Difference</mode>    </result>
</prtg>

In dem Beispiel gibt es nur bei Exchange eine "offene" Meldung. Vielleicht schaffe ich es später ja auch die "Severity" mit einzubinden. Als erste Version soll mir dies aber reichen.

Sensor einbinden

Die Installation und Konfiguration des PRTG-Sensors ist relativ schnell und einfach gemacht. Laden Sie sich das PowerShell-Skript herunter und kopieren Sie es auf die Probe ihrer Wahl in das Verzeichnis "C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML"

prtg-o365status.1.1.ps1

Die Version 1.1 nutzt nicht mehr einen Benutzername und die abgeschaltete AdminAPI sondern eine Application Permission und Microsoft Graph. Sie müssen daher erst über portal.azure.com eine Application mit Berechtigungen anlegen

Die zur App passende ApplicationID (= ClientID) und das ClientSecret muss dann im Skript hinterlegt oder als Parameter übergeben werden

param (
    $clientid = 'pass or enter',
    $ClientSecret = 'pass or enter'
)

Addieren Sie dann einen Custom-Sensor.

Sie müssen die Anmeldedaten eines Office 365 Administrators entweder im Skript oder per Parameter übergeben. Um das Kennwort besser zu schützen, können Sie die Daten auch mit Get-Credential erfassen und in eine "sichere Datei" ablegen. Allerdings ist der Import im Skript noch nicht umgesetzt.

Aufgrund der Belastung durch PowerShell sollte das Skript vielleicht nicht alle 30 Sekunden laufen. Bei mir hat das Skript eine Laufzeit von ca. 4 Sekunden ohne merkliche CPU-Last. Je nach Anzahl der Meldungen kann es aber auch schon mal 100kybte herunterladen.

Ausgabe in PRTG

Die Ausgabe der XML liefert an PRTG einen eigenen Wert pro "Service Endpoint". Wenn es keine Fehler gibt, dann stehen hier alle auf "0". Sollte aber ein Event noch kein "Enddatum" haben, dann wird er dem jeweiligen Service Endpoint zugeschlagen.

Über eine längere Zeit, z.B. 30 Tage sind die Daten schon interessant.

Ich habe als Default hinterlegt, dass ab einem Event der Bereich auf "Warnung" geht. Auch auf der Mobile App ist der Status über die Zeit gut zu sehen:

Weitere Links