SharePoint

SharePoint meets Prometheus: Eigene SharePoint Metriken generieren

Systemmonitoring bezeichnet den kontinuierlichen Prozess der Überwachung und Analyse von IT-Systemen, um deren Leistung, Verfügbarkeit und Sicherheit zu gewährleisten. Dabei werden verschiedene Metriken wie CPU-Auslastung, Arbeitsspeicherverbrauch, Festplattennutzung und Netzwerkauslastung in Echtzeit erfasst.

Was aber, wenn man SharePoint interne Informationen als Metrik bereitstellen möchte, dieses aber seitens Microsofts so nicht vorgesehen ist? Was nicht geht, geht mir PowerShell. Hier eine kurze Übersicht…

Leider bieten die aktuell verfügbaren Exporter keine direkte Möglichkeit, SharePoint interne Informationen zum Farmzustand in Prometheus konformen Metriken bereitzustellen. Für ein Prometheus bzw. Grafana basiertes Systemmonitoring und Alerting wäre dieses aber erforderlich.

Über ein individuelles PowerShell Script kann man dieses erreichen.

Grundsätzlich besteht dieses „Unterfangen“ aus 3 Schritten.

Im ersten Schritt werden die erforderlichen Health- und Zustandsinformationen aus der SharePoint on premise Umgebung abgefragt.

Im zweiten Schritt erfolgt dann eine „Formatierung“ oder besser gesagt Aufbereitung der Daten in ein Promnetheus/Grafana konformes Format, welches dann im dritten und letzten Schritt via Listener für Prometheus bereitgestellt wird.

In diesem Beitrag wird davon ausgegangen, dass die grundlegende Funktionsweise von Prometheus und Grafana bekannt ist und wir direkt in die SharePoint Spezifika einsteigen können.

Metriken / Daten sammeln

Zunächste müssen wir die erforderlichen Informationen, welche an Prometheus übergeben werden sollen, dem SharePoint entlocken.

Dieses erfolgt über die klassischen Administrationsscripte, wie man sie vermutlich eh schon im Einsatz hat.

In diesem Beispiel fragen wir den Zustand der Inhaltsdatenbanken der gesamten Farm ab:

Die Abfrage der einzelnen Metriken, erfolgt in einer eigenen PowerShell Funktion.

function Get-mySharePointMetrics {
$metrics = @()
# 1. Status der Webanwendungen prüfen
$webApps = Get-SPWebApplication
foreach ($webApp in $webApps) {
$webAppName = $webApp.Name
$metrics += @{
name = "sharepoint_webapp_status";
value = if ($webApp.Status -eq "Online") { 1 } else { 0 };
labels = @{
name = $webApp.Name
}
}

}
return $metrics
}

Hier auch schon die erste Abhängigkeit zu Prometheus selbst! Da SharePoint den Status der Inhaltdatenbanken als String liefert (Offline, Online), Prometheus aber darauf ausgelegt ist über seine Zeitreihen „nur“ integerbasierte Werte zu verarbeiten, wird der „Online“ Status in 1, bzw. der „Offline“ Status in 0 übersetzt und in das Array metric geschrieben.

Wichtig: Wachsen die gesammelten Metriken, muss darauf geachtet werden, dass das entsprechende Array ergänzt und nicht überschrieben wird ($metrics += xxxxx).

In unserer 2. Funktion widmen wir uns der Codierung der gesammelten Metriken in ein Prometheus konformes Format:

Metriken aufbereiten

function Convert-ToPrometheusFormat {
param (
[array]$metrics
)
$output = ""
foreach ($metric in $metrics) {
# Prüfen, ob Labels vorhanden sind
if ($metric.labels -and $metric.labels.Count -gt 0) {
$labelList = foreach ($key in $metric.labels.Keys) {
"$key=""$($metric.labels[$key])"""
}
$labels = $labelList -join ","
$output += "$($metric.name){$labels} $($metric.value)n" } else { $output += "$($metric.name) $($metric.value)n"
}
}
return $output
}

Die eigentliche „Kunst“ und der damit im Zusammenhang stehende Aufruf der jeweligen Funktionen, erfolgt im Rahmen der Bereitstellung der Metriken über einen http Listener.

Der http Listener stellt im Grunde die einfachste Möglichkeit dar, die Informationen für den Protheusabruf bereitzustellen. Natürlich kann dieses aber auch über andere PowerShell WebServer Module, wie beispielsweise Universal o. das UniversalDashboard, erfolgen.

HTTP-Server starten

$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://+:8080/metrics/")
$listener.Start()
Write-Host "Prometheus Exporter läuft auf http://localhost:8080/metrics/"

while ($listener.IsListening) {
try {
# HTTP-Anfrage verarbeiten
$context = $listener.GetContext()
$response = $context.Response

# SharePoint-Metriken sammeln
$metrics = Get-mySharePointMetrics
$output = Convert-ToPrometheusFormat -metrics $metrics

# Antwort zurückgeben
$buffer = [System.Text.Encoding]::UTF8.GetBytes($output)
$response.ContentType = "text/plain"
$response.ContentLength64 = $buffer.Length
$response.OutputStream.Write($buffer, 0, $buffer.Length)
$response.OutputStream.Close()
} catch {
Write-Host "Fehler: $_"
}

}

Ergebnis

Die Metriken lassen sich im Grunde beliebig erweitern. Alles was aus dem SharePoint über die Posershell abgefragt und „administriert“ werden kann, lässt sich auf verhältnismässig einfache Art und Weise für Prometheus/Grafana bereitstellen.

Zu bedenken gilt es jedoch, dass in diesem Zusammenhang die selben Abhängigkeiten gelten, wie in der normalen SharePoint Shell.

Beispiel: Direkte Abfrage des Distributed Cache Status/Clusters. Je nachdem, auf welchem Node der „Exporter“ betrieben wird, kann es erforderlich werden, den Status eines DC Clusters via PSRemoteSession in Erfahrung zu bringen. Aber auch das ist kein Hexenwerk

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert