Benachrichtigungen in Sensu Go akkurat steuern und unnötige Meldungen unterbinden. Es gibt viele Möglichkeiten die Monitoringevents präzise zu filtern. Wie das funktioniert zeige ich in diesem kurzen Artikel.
Mithilfe von Filtern in Sensu Go die Benachrichtigungsflut eliminieren
Die Event Pipeline von Sensu Go besteht aus den drei Elementen Filter, Mutatoren und Handler. Für jede Art von Event kann eine spezielle Pipeline definiert werden. Ein Event ist die Konsequenz eines aktiven Checks oder der Annahme eines Events von Drittlösungen über die RESTful API oder den lokalen StatsD Listener des Agenten. Im JSON-Format enthält das Event neben dem Status und der Ausgabe des Plugins, sowie allen Informationen der jeweiligen Entity (des überwachten Systems) auch viele Meta-Informationen, wie Zeitstempel, eine Historie der letzten 21 Status und benutzerdefinierte hinterlegte Labels. Filter können auf jedes Element des Events zugreifen. So können Benachrichtigungen gezielt gesteuert werden.
Out of the box existieren bereits fest implementierte Filter in Sensu Go, wie z. B. ‘has_metrics’, ‘is_incident’ oder ‘not_silenced’. Darüber hinaus können benutzerdefinierte Filterausdrücke als “allow” oder “deny” Regeln angelegt werden. In dem folgenden Beispiel sehen wir einen Filter, der entweder Events erlaubt, die aus einer erfolgreichen Prüfung resultieren, oder nicht erfolgreich sind und mindestens drei Mal hintereinander aufgetreten sind:
---
type: EventFilterapi_version: core/v2metadata: name: failing-filter namespace: defaultspec: action: allow expressions: - event.check.status == 0 - event.check.occurrences >= 3 && event.check.status != 0
Fortgeschrittene Filter durch Nutzung von JavaScript-Filterausdrücken
Filterausdrücke in Sensu Go sind ECMAScript-5-Ausdrücke aus JavaScript, die einen booleschen Wert zurückgeben. Sie werden vom Sensu-Backend in einer ‘Golang Javascript VM’ für jedes Ereignis ausgeführt. Diese Skriptausführungen in Go sind sehr performant. Sensu gibt an, mit diesem Ansatz Tausende Filterprozesse pro Sekunde auf einem moderat ausgestatteten Server verarbeiten zu können. Sensu-Filterausdrücke können beliebige JavaScript-Ausdrücke sein – solange das Ergebnis der Ausführung des Codes ein boolescher Wert von (‘true’ oder ‘false’) ist.
Zur Verdeutlichung der unbegrenzten Möglichkeiten, hier ein etwas komplizierteres Beispiel eines Filters, der Events zulässt, wenn mindestens 50 % der letzten Ausführungen fehlschlugen (Status nicht 0):
---
type: EventFilterapi_version: core/v2metadata: name: avg-filter namespace: defaultspec: action: allow expressions: - | (function () { var countFailure = function (count, check) { if (check.status != 0) { return count + 1; } return count; }; var history = event.check.history; var avgFailure = history.reduce(countFailure, 0) / history.length; return avgFailure >= 0.5; }());
‘countFailure’ ist ein sogenannter Callback, der die Anzahl der Checks, die einen Status ungleich 0 haben, zählt. ‘avgFailure’ gibt die Prozentzahl der fehlgeschlagenen Events aus der Event Historie aus.
Sicherlich ist das Pflegen von Javascript-Code innerhalb eines YAML oder JSON Dokuments nicht gerade einfach und erstrebenswert. Aus diesem Grund lässt sich der Filter auch als Asset auslagern. Die Event Pipeline liest alle in dem lib-Verzeichnis eines Assets befindlichen .js Dateien ein, wodurch sich alle darin enthaltenen Funktionen innerhalb Sensu Go benutzen lassen.
Das Asset sieht dann wie folgt aus und sollte als $dateiname.js im lib-Ordner des Asset-Pakets liegen:
---
function averageFailure (event, threshold) { // countFailure is a callback that counts the number of checks that have // non-zero status. var countFailure = function (count, check) { if (check.status != 0) { return count + 1; } return count; }; var history = event.check.history; // avgFailure is the percentage of failures in the event's history var avgFailure = history.reduce(countFailure, 0) / history.length; return avgFailure >= threshold;}
Die Asset-Definition sieht anschließend so aus:
---
type: Assetapi_version: core/v2metadata: name: average-failure namespace: defaultspec: sha512: e0fa3243d url: https://example.com/average-failure.tar
Und zum Schluss eine Filter-Definition, die die ausgelagerten Filter-Funktionen verwendet:
---
type: EventFilterapi_version: core/v2metadata: name: avg-filter namespace: defaultspec: action: allow runtime_assets: - average-failure expressions: - averageFailure(event, 0.5)
Mit Filtern in Sensu Go lässt sich sehr genau steuern, welche Events verarbeitet werden sollen. Bei fortgeschritteneren Filtermustern gibt es nahezu keine Limitierungen. Es erfordert jedoch etwas Scripting-Know-How.
Bilder und Code-Beispiele Copyright by Sensu Inc.
Webinar: Sensu Go | Die neue Monitoring Event Pipeline. Von der Architektur über Funktionen bis hin zu ersten einfachen Anwendungsbeispielen.
blog
Ähnliche Blogartikel
Fachartikel – Monitoring mit Sensu Go
Fachartikel: Automatisierte Systemüberwachung und...
Netzwerkmonitoring in 10 Minuten mit Sensu Go und Ansible
In diesem kurzen Artikel zeige ich wie einfach es ist, in...
Recap: 1. Sensu Go Meetup Deutschland
Am vergangenen Donnerstag (27.06.2019) lud die becon GmbH...
Kontakt
Kontaktieren Sie uns!
Wir freuen uns von Ihnen zu hören.
Sie haben Fragen oder stehen vor einer besonderen Herausforderung? Unser engagiertes Team steht Ihnen für eine unverbindliche Beratung gerne zur Verfügung.