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: EventFilter
api_version: core/v2
metadata:
  name: failing-filter
  namespace: default
spec:
  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: EventFilter
api_version: core/v2
metadata:
  name: avg-filter
  namespace: default
spec:
  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: Asset
api_version: core/v2
metadata:
  name: average-failure
  namespace: default
spec:
  sha512: e0fa3243d
  url: https://example.com/average-failure.tar

 

Und zum Schluss eine Filter-Definition, die die ausgelagerten Filter-Funktionen verwendet:

---
type: EventFilter
api_version: core/v2
metadata:
  name: avg-filter
  namespace: default
spec:
  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.

 

Mehr zu Sensu Go finden Sie hier.

 

Unser Webinar Sensu Go