End2End-PHP

Es reicht nicht, den Weg zu einem Webserver zu messen sondern auch die Verarbeitungsgeschwindigkeit der Anforderungen. SharePoint liefert solche Daten schon von Hause aus als HTTP-Header X-SharePointHealthScore mit. Eigene PHP-Seiten könnten auch die Zeit der Verarbeitung messen oder ggfls. sogar die CPU-Last des Servers. Eine Hochlastsituation einer Impfterminseite (Impftermin) hat mir aber gezeigt, dass allein die Erreichbarkeitsprüfung und Durchsatz nicht ausreichen.

Wie messen?

Wie bei anderen Tools aus dem Bereich Ende zu Ende Monitoring geht es auch hier darum, den Webserver eine kleine "Rechenaufgabe" erledigen zu lassen, die ihn nicht über Gebühr belastet aber deren Laufzeit auf Probleme hinweisen kann. Wenn der Host selbst "Busy" ist, dann werden auch die Text-Skripte einfach länger laufen und geben damit den Hinweis, dass das Gesamtsystem eventuell ein Problem hat. Das Ziel ist ja nicht die CPU auf 100% zu jagen sondern eher 1% oder weniger Ressourcen für das Monitoring zu verbrauchen.

In der ersten Version wäre das ein kleiner CPU-Test aber wenn sie genauer wissen, was ihre Webseite so macht, könnte das PHP-Skript auch eine Datei lesen (Disk-IO) oder Datenbankabfragen testen.

Optimal wäre natürlich, wenn die Entwickler der Webseite selbst entsprechende "Laufzeiten" ihres Codes erfassen und einer Monitoring-Schnittstelle zur Verfügung stellen würden.

PHP Laufzeit

Der einfachste Ansatz ist eine Laufzeitmessung von Code, indem man die Zeit des Hosts mit dem Befehl "microtime" liest, welcher die UNIX-Systemzeit in Mikrosekunden ermittelt.

Also messe ich die Zeit vor und nach des zu messenden Codeteils, und subtrahiere die Werte. Das Beispielcode hier addiert 10.000 mal eine 1 zu einer bestehenden Variable

<?php 
$start_time = microtime(true); 
$a=1; 
for($count = 1; $count <=10000; $count++) { 
   $a++; 
} 
$end_time = microtime(true); 
$duration = ($end_time - $start_time); 
echo sprintf('%f', $duration);
?>

Diese Datei kann ich auf jedem Webserver ablegen, der PHP unterstützt und einfach per Browser oder auch PowerShell abrufen.

PS C:\> Invoke-WebRequest https://webserver/end2end-php.php

StatusCode        : 200
StatusDescription : OK
Content           : 0.000055
RawContent        : HTTP/1.1 200 OK
                    Date: Mon, 04 Jan 2021 22:12:56 GMT
                    Connection: keep-alive
                    Server: Apache
                    X-Frame-Options: SAMEORIGIN
                    Cache-Control: max-age=500
                    Content-Security-Policy: default-src 'self' ; sty…
Headers           : {[Date, System.String[]], [Connection, System.String[]], [Server, System.String[]],
                    [X-Frame-Options, System.String[]]…}
Images            : {}
InputFields       : {}
Links             : {}
RawContentLength  : 8
RelationLink      : {}

In dem Fall hat die Ausführung im Rahmen der möglichen Genauigkeit ca. 0,056ms benötigt. Dies ist auch nur die Ausführungszeit auf dem Webserver. Die zusätzlichen Zeiten von DNS-Auflösung, TCP-Verbindung, TLS-Handshake, Zeit zum Starten des PHP-Prozesses, kompilieren/interpretieren des Code etc. ist alles nicht vorhanden.

Integration ins Monitoring

Natürlich können Sie den PHP-Code so anpassen, dass die Rückgabe direkt vom Monitoring-System "verstanden" wird. Ich nutze aber lieber einen anderen Weg, mit dem ich die verschiedenen Zeiten auch gleich mit ermitteln. Ein PowerShell-Script für meinen PRTG-Server kann zum einen die Dauer des Requests als auch die Antwort des Requests ermitteln. So sehe ich dann die Gesamtlaufzeit. Hier ein Ausschnitt des PowerShell-Code:

$duration = measure-command { `
               $runtime = (Invoke-WebRequest $url).content`
            }
Write-host " Success result  :$($runtime) "
Write-Host " Duration Total  :$([long]$duration.TotalMilliseconds) ms"
Write-Host " Duration Web    :$([math]::round(([float]$runtime)*1000000)) microseconds"

Die Ausgaben können Sie natürlich nach Belieben für ihr Monitoring anpassen.

Denken Sie aber immer daran, dass die Messwerte mehr als "Trends" und nicht als absolute Werte zu bewerten sind.

Weiterentwicklung

Bislang habe ich nur eine Basisfunktion umgesetzt, die auch mein SharedHosting nutzen kann. Ein PHP-Skript kann, mit den notwendigen Rechten versehen, auch weitere Details des Systems erfassen, z.B. CPU-Last, Festplattenstatus etc. Man könnte auch eine SQL-Verbindung und eine Abfrage durchführen, Dateien schreiben, lesen, kopieren und die Zeit dafür messen. Immer mit dem Ziel das System nur minimal zu belasten aber dennoch zu merken, wenn etwas anderes ihr System belastet.

Insofern muss ich mal schauen, wann ich den Code entsprechend erweitern kann. Aktuell ist aber die MSXFAQ zumindest "statisch" und schreibt keine Dateien, macht keine SQL-Anfragen o.ä., und damit ziemlich robust gegen Angriffe und Lastspitzen. Wobei jedes System irgendwann an seine Grenzen kommt.

Weitere Links