Erkennen von Anomalien mit Skyline unter CentOS 7

Einführung

Wenn Sie ein Überwachungssystem (wie Zabbix oder Nagios) verwenden, wissen Sie, wie die Überwachung funktioniert. Auf den Punkt gebracht kann dies wie folgt beschrieben werden: Ein Überwachungssystem empfängt verschiedene Metriken (CPU- / Speicherauslastung, Netzwerkauslastung und mehr). Sobald der Wert einer der Metriken die festgelegten Schwellenwerte überschreitet, wird der entsprechende Trigger aktiviert, und das Überwachungssystem informiert Sie, dass eine der Metriken außerhalb der normalen Grenzen liegt. Schwellenwerte für jede Metrik werden normalerweise manuell festgelegt, was nicht immer praktisch ist.

In diesem Tutorial erfahren Sie, wie Sie Skyline - ein Echtzeitsystem zur Erkennung von Anomalien - installieren und konfigurieren. Es ist in der Lage, eine Reihe von Metriken in Echtzeit zu analysieren, ohne die Schwellenwerte für jede einzelne festzulegen oder anzupassen. Es wurde entwickelt, um überall dort eingesetzt zu werden, wo eine große Anzahl von Zeitreihen (Hunderttausende) ständig überwacht werden müssen.

Schwellenwertauslöser

Betrachten wir ein Beispiel für ein Überwachungssystem mit manuell festgelegten Schwellenwerten. Die folgende Abbildung zeigt ein Diagramm für die CPU-Auslastung. Gestrichelte Linien geben die Schwellenwerte des Triggers an.

Bei Punkt 1 in Abbildung 1 wurde ein Prozess gestartet, und die CPU-Auslastung hat erheblich zugenommen. Der Trigger wurde aktiviert und der Administrator bemerkt es. Der Administrator entscheidet, dass es sich um normale Werte handelt, und ändert die Auslöseschwellenwerte in die in den oberen gestrichelten Linien angezeigten.

Nach einiger Zeit wird der Abzug bei Punkt 2 in Abbildung 1 erneut ausgelöst. Der Administrator stellt fest, dass ein zweiter Dienst regelmäßig Sicherungen erstellt und die Auslastung erhöht. Dann stellt sich die Frage: Erhöhen Sie die Schwelle oder lassen Sie sie unverändert, ignorieren Sie aber einfach die Alarme?

Werfen wir einen Blick auf Punkt 3. In diesem Moment sinkt die Ereignislast, der Administrator wurde jedoch nicht informiert, da der Schwellenwert nicht überschritten wurde. Der Auslöser wurde nicht aktiviert.

Dieser einfache Fall zeigt uns, dass es beim Versuch, Schwellenwerte festzulegen, einige Schwierigkeiten gibt. Es ist schwierig, die Schwellenwerte anzupassen, um Leistungsprobleme zu erkennen, ohne falsch positive oder falsch negative Fehler auszulösen.

Um diese Probleme zu lösen, wurde * Skyline * erstellt. Es werden eine Reihe nichtparametrischer Algorithmen verwendet, um anomale Metriken zu klassifizieren.

Skyline-Komponenten

Skyline besteht aus den folgenden Komponenten: Horizon Agent, Analyzer Agent und Webapp.

Horizon Agent

Der Horizon Agent ist für das Sammeln von Daten verantwortlich. Es hat * Listener *, die auf eingehende Daten lauschen.

Es akzeptiert die Daten in zwei Formaten: pickle (TCP) und MessagePack (UDP). Eingehende Metriken werden gelesen und in eine gemeinsame Warteschlange gestellt, aus der die * Worker * lesen. Mitarbeiter codieren die Daten in Messagepack und hängen sie an die Redis-Datenbank an. Der Horizon Agent schneidet und bereinigt außerdem regelmäßig alte Metriken mit * Roombas *. Wenn dies nicht getan wird, wird der gesamte freie Speicher bald erschöpft sein.

Analyzer Agent

Der Analyzer Agent ist für die Analyse der Daten verantwortlich. Es empfängt eine Liste von Metriken von Redis, führt mehrere Prozesse aus und weist diesen Metriken zu. Jeder Prozess analysiert die Daten mit verschiedenen Algorithmen. Jeder Algorithmus meldet das Ergebnis - ob die Daten abnormal sind oder nicht. Wenn die Mehrheit der Algorithmen meldet, dass die aktuelle Metrik eine Abnormalität aufweist, werden die Daten als anomal betrachtet.

Alle abnormalen Metriken werden in eine Datei geschrieben. Auf der Grundlage dieser Datei wird ein Bild erstellt und in der Webanwendung angezeigt.

Analyzer kann auch Benachrichtigungen senden: E-Mail, HipChat oder PagerDuty. E-Mail-Benachrichtigungen werden später in diesem Artikel konfiguriert.

Web-App

Skyline bietet eine kleine Webanwendung zum Anzeigen der abnormalen Messdaten. Es ist eine einfache Web-App, die in Python mit einem Flask-Framework geschrieben wurde. Der obere Teil zeigt zwei Diagramme - die letzte Stunde und den letzten Tag. Unterhalb der Grafiken befindet sich eine Liste aller anormalen Metriken.

Redis-Datenbank

Redis ist eine Open-Source-Datenbank für Schlüsselwerte.

Skyline speichert alle Metriken und kodierten Zeitreihen in einer Redis-Datenbank. Wenn ein Datenpunkt eingeht, packt ein Horizon-Mitarbeiter den Datenpunkt mit dem Schema "+ [Zeitstempel, Wert] +" in eine MessagePack-codierte Binärzeichenfolge und hängt diese Zeichenfolge an den entsprechenden Metrikschlüssel an.

Abbildung 2 zeigt das Diagramm der Interaktionen der Skyline-Komponenten.

Voraussetzungen

Bevor Sie Skyline installieren können, müssen Sie die folgenden Voraussetzungen erfüllen:

Schritt 1 - Installieren von Skyline und Redis

Installieren Sie zur Installation von Skyline zunächst die erforderlichen Anwendungen, einschließlich einiger Python-Tools und des Apache-Webservers:

sudo yum install httpd gcc gcc-c++ git pycairo mod_wsgi python-pip python-devel blas-devel lapack-devel libffi-devel

Holen Sie sich die neuesten Quelldateien für Skyline von GitHub:

cd /opt
sudo git clone https://github.com/etsy/skyline.git

Installieren Sie einige erforderliche Python-Pakete:

cd /opt/skyline
sudo pip install -U six
sudo pip install -r requirements.txt

Installieren Sie die folgenden Python-Pakete in der angegebenen Reihenfolge:

sudo pip install numpy
sudo pip install scipy
sudo pip install pandas
sudo pip install patsy
sudo pip install statsmodels
sudo pip install msgpack-python

Die meisten von ihnen sind Open-Source-Python-Bibliotheken, die für wissenschaftliches und technisches Computing verwendet werden. Das Paket + msgpack-python + ist erforderlich, um MessagePack Daten zu lesen und zu schreiben.

Kopieren Sie die Beispiel-Skyline-Einstellungsdatei an den richtigen Speicherort:

sudo cp /opt/skyline/src/settings.py.example /opt/skyline/src/settings.py

Erstellen Sie die folgenden Verzeichnisse:

sudo mkdir /var/log/skyline
sudo mkdir /var/run/skyline
sudo mkdir /var/log/redis
sudo mkdir /var/dump/

Wie bereits erwähnt, speichert Skyline alle Messdaten in einer Redis-Datenbank. Daher müssen Sie diese auch installieren:

sudo yum install redis

Weitere Informationen zu Redis finden Sie im Tutorial How To Install and Use Redis.

Starten Sie die Dienste Skyline und Redis:

cd /opt/skyline/bin
sudo redis-server redis.conf
sudo ./horizon.d start
sudo ./analyzer.d start
sudo ./webapp.d start

Führen Sie das mitgelieferte Testskript aus, um die Installation zu testen:

python /opt/skyline/utils/seed_data.py

Sie sollten die folgende Ausgabe sehen:

Loading data over UDP via Horizon...
Connecting to Redis...
Congratulations! The data made it in. The Horizon pipeline seems to be working.

Die Installation und Grundkonfiguration von Skyline ist abgeschlossen. Jetzt müssen Sie Daten hinein senden.

Schritt 2 - Daten in Skyline einbinden

Wie bereits erwähnt, akzeptiert der Skyline Daten in zwei Formaten: pickle (TCP) und MessagePack (UDP). .

Sie können Ihr eigenes Skript oder Modul an Ihren bevorzugten Überwachungsagenten schreiben und die Daten mit MessagePack verschlüsseln lassen, um sie zur Analyse an Skyline zu senden. Skyline akzeptiert Metriken in Form von MessagePack-codierten Zeichenfolgen über UDP. MessagePack ist eine Objekt-Serialisierungsspezifikation wie JSON. Das Format ist "+ [<metrischer Name>, [<Zeitstempel>, <Wert>]] +". MessagePack verfügt über eine API für die meisten Programmiersprachen. Weitere Informationen und API-Beispiele finden Sie auf der offiziellen Website MessagePack.

In diesem Tutorial erfahren Sie, wie Sie die Daten von Graphite an Skyline senden und dort sammeln.

Daten aus Graphit abrufen

Graphit besteht aus mehreren Komponenten, von denen eine der * Carbon-Relay * -Dienst ist. Carbon-Relay leitet eingehende Metriken zur Redundanz an eine andere Graphite-Instanz weiter. So können Sie den Carbon-Relay-Dienst auf den Host verweisen, auf dem Skyline ausgeführt wird.

Abbildung 3 zeigt eine schematische Darstellung des Datenflusses. Daten von externen Überwachungsagenten (collectd, diamond, statsd usw.) oder Systeme (Nagios, Icinga, Sensu usw.) werden in Graphite übertragen. Als nächstes leitet Carbon-Relay die Daten an Skyline weiter. Carbon-Relay, Carbon-Cache und Skyline können entweder auf einem einzelnen Host oder auf separaten Hosts ausgeführt werden.

Sie müssen Graphite, collectd und Skyline konfigurieren, damit dieser Datenfluss funktioniert.

Wenn Sie das Beispiel "+ relay-rules.conf +" zuvor nicht an den richtigen Speicherort für die Carbon-Relay-Konfigurationsdatei kopiert haben, müssen Sie es jetzt tun:

sudo cp /opt/graphite/conf/relay-rules.conf.example /opt/graphite/conf/relay-rules.conf

Öffnen wir die Konfigurationsdatei "+ relay-rules.conf +" zum Bearbeiten:

sudo vi /opt/graphite/conf/relay-rules.conf

Fügen Sie Ihren Skyline-Host zur Liste der Ziele hinzu. Dabei handelt es sich um die IP-Adresse Ihres Skyline-Hosts:

/opt/graphite/conf/relay-rules.conf

[default]
default = true
destinations = 127.0.0.1:2004, :2024

Alle in "+ relay-rules.conf " verwendeten Ziele müssen auch in der Konfigurationsdatei " carbon.conf +" definiert werden.

Öffnen Sie die Konfigurationsdatei "+ carbon.conf +", um diese Änderung vorzunehmen:

sudo vi /opt/graphite/conf/carbon.conf

Suchen Sie dann den Abschnitt + [relay] + und bearbeiten Sie die Zeile + DESTINATIONS +:

/opt/graphite/conf/carbon.conf

[relay]
...
DESTINATIONS = 127.0.0.1:2004, :2024
...

Nachdem Sie diese Änderungen vorgenommen haben, starten Sie den Carbon-Relay-Dienst:

sudo systemctl start carbon-relay

Ermöglichen des Skyline-Zugriffs auf Graphite-Web

In How To Keep Effective Historical Logs with Graphite, Carbon und Collected unter CentOS 7. Wenn Sie sich für den Kennwortschutz der Graphite-Weboberfläche entschieden haben, müssen Sie den Zugriff von localhost ohne Kennwort zulassen, damit Skyline funktioniert.

Bearbeiten Sie dazu die Graphite-Konfigurationsdatei:

sudo vi /etc/httpd/conf.d/graphite.conf

Fügen Sie dem + <Ort> + Block die folgenden roten Zeilen hinzu:

/etc/httpd/conf.d/graphite.conf

<Location "/">
 AuthType Basic
 AuthName "Private Area"
 AuthUserFile /opt/graphite/secure/.passwd
 Require user sammy




</Location>

Starten Sie dann den Apache-Dienst neu:

sudo systemctl restart httpd

Abrufen von Daten aus Collectd

Sie können collectd auch so konfigurieren, dass Daten an Skyline gesendet werden. Öffnen Sie die Konfigurationsdatei:

sudo vi /etc/collectd.conf

Ändern Sie die Portnummer im + <Plugin write_graphite> + -Block in + 2013 +:

/etc/collectd.conf

<Plugin write_graphite>
   . . .
   Port ""
   . . .

Dann starte collectd neu:

sudo systemctl restart collectd.service

Um Verwechslungen zu vermeiden, zeigt Abbildung 4 ein vereinfachtes Schema mit den richtigen Portnummern.

Die richtigen Portnummern lauten wie folgt:

  1. Carbon-Relay wartet auf eingehende Daten im Plaintext-Format an Port 2013

  2. Carbon-Relay sendet die Daten im Pickle-Format

  3. Carbon-Cache wartet auf eingehende Daten im pickle-Format an Port 2004

  4. Der Horizon Agent wartet auf eingehende Daten im Pickle-Format an Port 2024.

Schritt 3 - Skyline einrichten

Die Skyline-Konfigurationsdatei enthält viele Einstellungen. Öffnen Sie die Datei zum Bearbeiten:

sudo vi /opt/skyline/src/settings.py

Jede Einstellung in dieser Datei wird durch informative Kommentare in der Datei selbst dokumentiert. Sie müssen mindestens die folgenden Parameter festlegen und den roten Text durch Ihre Werte ersetzen:

  • + GRAPHITE_HOST = '' +

  • + HORIZON_IP = '' +

  • + WEBAPP_IP = '' +

Die anderen Optionen können auf ihren Standardwerten belassen werden. Sie sind wie folgt:

  • + FULL_DURATION + - Diese Option gibt an, wie lange die Daten maximal in Redis gespeichert und analysiert werden. Die Analyse dauert länger, kann jedoch das Rauschen reduzieren und eine genauere Erkennung von Anomalien ermöglichen. Der Standardwert ist "+ 86400 +" Sekunden.

  • + CARBON_PORT + - Diese Option gibt den Carbon-Port an. Der Standardwert ist "+ 2003 +".

  • + ANALYZER_PROCESSES + - Diese Option gibt die Anzahl der Prozesse an, die der Skyline Analyzer erzeugt. Es wird empfohlen, diesen Parameter auf einige weniger als die Gesamtzahl der CPUs auf Ihrem Host festzulegen. Der Standardwert ist "+ 5 +".

  • + WORKER_PROCESSES + - Diese Option gibt die Anzahl der Arbeitsprozesse an, die aus der Horizon-Warteschlange verbraucht werden. Der Standardwert ist "+ 2 +".

  • + PICKLE_PORT + - Diese Option gibt den TCP-Port an, der auf Graphite-Pickles wartet. Der Standardwert ist "+ 2024 +".

  • + UDP_PORT + - Diese Option gibt den UDP-Port an, der auf MessagePack-codierte Pakete wartet. Der Standardwert ist "+ 2025 +".

  • + WEBAPP_PORT + - Diese Option gibt den Port für die Skyline-Webanwendung an. Der Standardwert ist "+ 1500 +".

Nachdem Sie diese Änderungen vorgenommen haben, müssen Sie die entsprechende App neu starten:

sudo /opt/skyline/bin/horizon.d restart
sudo /opt/skyline/bin/analyzer.d restart
sudo /opt/skyline/bin/webapp.d restart

Dann können Sie den Link "+ http: //: 1500 +" öffnen und die Skyline-Webseite aufrufen (Abbildung 5). Es wird eine anomale Metrik angezeigt, sobald sie gefunden wurde.

Damit Skyline voll ausgelastet ist, müssen Sie warten, bis die Sekunden "+ FULL_DURATION " abgelaufen sind. Standardmäßig ist " FULL_DURATION " auf 1 Tag (" 86400 +" Sekunden) eingestellt.

Sie sollten mindestens eine Stunde warten, um mit dem Aufspüren von Anomalien zu beginnen. Dies gibt Skyline Zeit, um Informationen über die normalen Lastniveaus zu sammeln. Versuchen Sie, das System nicht zusätzlich zu belasten, während Skyline eine Baseline erstellt.

Schritt 4 - Aktivieren von E-Mail-Benachrichtigungen

Standardmäßig zeigt Skyline erkannte Anomalien in der Weboberfläche an (+ http: //: 1500 +), sobald sie gefunden werden und noch auftreten. Sobald eine Anomalie verschwindet, verschwindet die entsprechende Metrik von dieser Schnittstelle. Daher müssen Sie die Webseite überwachen, um diese Anomalien zu erkennen, was nicht immer praktisch ist.

Sie können E-Mail-Benachrichtigungen so konfigurieren, dass Sie sie nicht verpassen.

Öffnen Sie dazu die Skyline-Konfigurationsdatei:

sudo vi /opt/skyline/src/settings.py

Stellen Sie sicher, dass Warnungen aktiviert sind:

/opt/syline/src/settings.py

ENABLE_ALERTS = True

Suchen Sie dann den folgenden Abschnitt ALERTS und fügen Sie das folgende Schema in Rot hinzu:

/opt/syline/src/settings.py

ALERTS = (
   (^)("collectd", "smtp", 1800)(^),
)

Der erste Wert im Schema ist der zu überwachende Prozess. In diesem Fall ist es "+ collectd. ". Der zweite Wert des Schemas ist " smtp ", was für E-Mail-Warnungen steht. Der letzte Wert von ` 1800 +` ist in Sekunden. Dies bedeutet, dass Warnungen nicht mehr als einmal innerhalb von 30 Minuten (1800 Sekunden) ausgelöst werden, selbst wenn ein Auslöser erkannt wird. Ändern Sie diesen Wert so, dass er Ihren Anforderungen am besten entspricht.

Suchen Sie auch den folgenden Abschnitt und ändern Sie ihn für die E-Mail-Adressen, die Sie verwenden möchten. E-Mail-Benachrichtigungen werden von (^) [email protected] (^) an das Konto (^) [email protected] (^) gesendet.

/opt/syline/src/settings.py

SMTP_OPTS = {
   "sender": "(^)[email protected](^)",
   "recipients": {
       "collectd": ["(^)[email protected](^)"],
   },
}

Nachdem Sie alle diese Änderungen vorgenommen haben, müssen Sie den Analyzer-Daemon neu starten:

sudo /opt/skyline/bin/analyzer.d restart

Schritt 5 - Skyline testen

Um Skyline zu testen, können wir einen CPU-Spike mit einem Bash-Befehl erstellen:

dd if=/dev/zero of=/dev/null

Sie können den Befehl jederzeit stoppen, indem Sie STRG-C drücken. Einige Minuten sollten ausreichen, um eine Anomalie zu erzeugen.

Wenn Sie sich die Skyline-Weboberfläche ansehen, während Sie diesen Befehl ausführen, werden die erkannten Anomalien angezeigt. Ein Beispiel ist in Abbildung 6 dargestellt.

Sie sehen, dass sich die Geschwindigkeit der Skyline-Komponenten infolge der hohen CPU-Auslastung verringert hat. Alle erkannten abnormalen Metriken werden als Liste am unteren Rand der Webseite angezeigt. Wenn Sie mit der Maus über den Namen einer der Metriken fahren, sehen Sie in den oberen Diagrammen die entsprechenden Zeitreihen für die letzte Stunde und den Tag. Klicken Sie auf den Namen der Metrik, um ein detaillierteres Diagramm zu öffnen, das von Graphite erstellt wurde (ein Beispiel finden Sie in Abbildung 7).

Die CPU-Auslastung hat in diesem Beispiel keinen extrem hohen Wert erreicht und der Schwellenwert wurde nicht überschritten. In diesem Fall konnte ein klassisches Überwachungssystem keine Abweichung feststellen. Ein solcher Fall wurde bereits erwähnt (Abbildung 1, Punkt 3).

Im Gegensatz zu klassischen Überwachungssystemen kann Skyline Abweichungen schnell erkennen und Sie darüber benachrichtigen.

Schritt 6 - Anpassen der Algorithmen (optional)

Wie bereits erwähnt, verwendet Skyline eine Reihe von Algorithmen, um Anomalien zu erkennen. Folgende Algorithmen sind aktuell implementiert:

  • Mittlere absolute Abweichung

  • Grubbs-Test

  • Durchschnitt der ersten Stunde

  • Standardabweichung vom Durchschnitt

  • Standardabweichung vom gleitenden Durchschnitt

  • Kleinsten Quadrate

  • Histogrammfächer

  • Kolmogorov-Smirnov-Test

Die meisten von ihnen basieren auf den * Kontrolldiagrammen * (auch als Shewhart-Diagramme bekannt) und der * Drei-Sigma-Regel *. Sie verwenden für ihre Berechnungen die Python-Bibliotheken SciPy und NumPy.

Sie können jeden der verwendeten Algorithmen anpassen. Sie können auch neue ändern, löschen oder hinzufügen. Dazu müssen Sie die Konfigurationsdatei bearbeiten:

sudo vi /opt/skyline/src/analyzer/algorithms.py

Jeder der Algorithmen in dieser Datei enthält eine kurze Beschreibung. Betrachten wir zum Beispiel den folgenden Algorithmus:

/opt/skyline/src/analyzer/algorithms.py

def median_absolute_deviation(timeseries):
   """
   A timeseries is anomalous if the deviation of its latest datapoint with
   respect to the median is X times larger than the median of deviations.
   """

   series = pandas.Series([x[1] for x in timeseries])
   median = series.median()
   demedianed = np.abs(series - median)
   median_deviation = demedianed.median()

   # The test statistic is infinite when the median is zero,
   # so it becomes super sensitive. We play it safe and skip when this happens.
   if median_deviation == 0:
       return False

   test_statistic = demedianed.iget(-1) / median_deviation

   # Completely arbitary...triggers if the median deviation is
   # 6 times bigger than the median
   if test_statistic > :
       return True

Abhängig von der Art Ihrer Daten müssen Sie möglicherweise den Schwellenwert von "+ 6 " in einen anderen Wert ändern - " 4 ", " 5 ", " 7 +" usw.

Sie können auch einige Einstellungen in der Datei + settings.py + anpassen:

/opt/skyline/src/settings.py

ALGORITHMS = [
   'first_hour_average',
   'mean_subtraction_cumulation',
    'stddev_from_average',
    'stddev_from_moving_average',
    'least_squares',
    'grubbs',
    'histogram_bins',
    'median_absolute_deviation',
    'ks_test',
]

CONSENSUS = 6

Die Option "+ ALGORITHMS " gibt die Algorithmen an, die der Analyzer ausführen soll. Sie können sie auskommentieren, um sie zu deaktivieren oder neue Algorithmen hinzuzufügen. Die Option " CONSENSUS " gibt die Anzahl der Algorithmen an, die " True +" zurückgeben müssen, bevor eine Metrik als anomal klassifiziert wird. Um die Empfindlichkeit zu erhöhen, können Sie diese Option verringern und umgekehrt.

Fazit

Skyline hat sich in komplexen, sich dynamisch verändernden IT-Systemen bewährt. Dies kann für Programmierer nützlich sein, die regelmäßig Änderungen am Betriebssystem vornehmen und nach einer neuen Softwareversion schnell Anomalien in den Systemmetriken erkennen möchten.

Die Hauptvorteile sind:

  • Hochgeschwindigkeitsanalyse großer Datenmengen

  • Es müssen keine individuellen Parameter für jede Metrik festgelegt werden

  • Möglichkeit, eigene Algorithmen zur Erkennung von Anomalien hinzuzufügen

Es hat auch einige Nachteile:

  • Die Daten jeder Metrik werden von mehreren Algorithmen analysiert, die erhebliche Ressourcen des Computersystems erfordern.

  • Alle Daten werden im RAM gespeichert, wodurch das System sehr schnell arbeiten kann. Bei einer großen Anzahl von Metriken und einem langen Analysezeitraum benötigen Sie eine große Menge an RAM.