Um meine OpenStreetMap Serverdienste für Osmose zu überwachen verwende ich Zabbix. Mit einem Zabbix Trigger erkenne ich extreme Abweichungen oder Ausreißer.
Osmose Backend
Auf meinem Server berechne ich für die OpenStreetMap Qualitätssicherung die Backend-Dienste für Osmose in Asien. Um zu erkennen ob bei der Automatisierung alles wie geplant läuft oder ob es bei der Verarbeitung zu Fehlern kommt überwache ich die Dienste mittels Zabbix. Dabei lasse ich für jedes Land das analysiert wird einen Status und die Verarbeitungsdauer erfassen.
Zabbix Trigger
Die Werte alleine lassen sich schon mal hübsch grafisch aufbereiten. So erkennt man als Mensch gleich wenn etwas nicht stimmt. Noch schöner wäre es aber wenn mich Zabbix da gleich darauf hinweisen würde. Das geht, erfordert aber etwas mehr Maßnahmen.
Der theoretische Hintergrund
Zuerst mal etwas zum theoretischen Hintergrund. Nehmen wir mal an wir haben folgende Messwerte aus der Überwachung:
35, 27, 34, 42, 34, 31, 28, 22, 25, 30, 50
Man könnte schon vermuten, dass der letzte Messwert (die 50) etwas aus der Reihe tanzt. aber wie lässt sich das mathematisch formulieren?
Zunächst einmal brauche ich einen Referenzwert. Ich lasse dabei den aktuellsten Messwert unberücksichtigt und schaue mir die zurückliegenden Werte an. Hier im Beispiel dann die letzten zehn Werte.
Ich bestimme dann jeweils eine obere und eine untere Schranke. Dafür bestimme ich zuerst einmal das obere Quartil. Das ist die Zahl bei der 75% aller Messwerte kleiner sind. An meinem Beispiel würde die Zahlen aufsteigend sortieren. 75% wäre dann die siebeneinhalbte Zahl. Da ich nicht interpoliere, dann die nächste größere. Die achte Zahl ist hier die „34“. Das ist dann das obere Quartil. Analog dazu bestimme ich das untere Quartil (25% der Werte kleiner) mit 27.
Die Differenz zwischen diesen beiden Werten nennt man auch Interquartilsabstand. Wenn ein Wert nun mehr als das 1,5-fache des Interquartilsabstands über dem oberen Quartil liegt, dann sehe ich das als Ausreißer. Für das untere Quartil gilt es entsprechend.
Ich habe es mal in einem Diagramm veranschaulicht.
Wie schon vermutet handelt es sich bei dem Wert 50 aus meinem Beispiel um einen Extremwert außerhalb der Schranken.
Der Trigger in Zabbix
In Zabbix lässt sich damit nun ein Trigger formulieren. Das ganze funktioniert nicht nur bei normalen Triggern, sondern auch bei Trigger Prototypes aus der Low-Level-Discovery (LLD). Hier der fertige Trigger:
1 2 3 |
{Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].last()} > {Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].percentile(10d,36h,75.0)}+({Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].percentile(10d,36h,75.0)}-{Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].percentile(10d,36h,25.0)})*1.5 or {Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].last()} < {Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].percentile(10d,36h,25.0)}-({Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].percentile(10d,36h,75.0)}-{Template App Osmose Backend:osmose.duration[{#OSMOSECOUNTRY}].percentile(10d,36h,25.0)})*1.5 |