Mein Unternehmen bietet vielen seiner Kunden Managed Services an. Unsere Kunden verwenden normalerweise die folgenden Überwachungstools, um ihre Server / Webanwendungen zu überwachen:
- OpsView
- Nagios
- Pingdom
- Benutzerdefinierte Shell-Skripte
Immer wenn ein Problem gefunden wird, geht eine Benachrichtigungsmail an unser Ops-Team, damit es das Problem beheben kann.
Da wir Tausende von Servern verwalten, wird der Posteingang unserer Ops-Teams ständig mit E-Mail-Benachrichtigungen überflutet. Selbst ein einzelnes Problem, das einen Kaskadeneffekt hat, kann 20 bis 30 E-Mails auslösen.
Jetzt möchte ich ein System implementieren, das in der Lage ist, wichtige Funktionen aus einer Warn-E-Mail zu extrahieren - wie Server-IP-Adresse, Art des Problems, Schweregrad des Problems usw. - und die E-Mails auch in die richtige Kategorie zu klassifizieren, wie z CPU-Load-Customer1-Server2, MySQL-Replication-Customer2-DBServer3
usw. Wir haben dann eine vordefinierte Reihe von Debugging-Schritten für jede Kategorie, um dem Ops-Team zu helfen, das Problem schneller zu beheben. Außerdem stellt der Feature-Extraktor dem Team Eingabedaten für ein Problem zur Verfügung.
Bisher war ich in der Lage, NaiveBayesClassifier mit überwachten Lerntechniken, dh gekennzeichneten Trainingsdaten ( Clusterdaten ), zu trainieren und neue unsichtbare E-Mails in den richtigen Cluster / die richtige Kategorie zu klassifizieren. Da die E-Mails auf bestimmten Vorlagen basieren, ist die Genauigkeit des Klassifikators sehr hoch. Wir erhalten aber auch Benachrichtigungs-E-Mails von benutzerdefinierten Skripten, die möglicherweise nicht den Vorlagen entsprechen. Anstatt also überwachtes Lernen zu betreiben, möchte ich unbeaufsichtigtes Lernen ausprobieren. Ich beschäftige mich mit KMeans Clustering . Das Problem ist jedoch, dass wir die Anzahl der Cluster nicht im Voraus kennen. Welcher Algorithmus ist für diesen Anwendungsfall am besten geeignet? Im Moment verwende ich Pythons TextBlob-Bibliothek zur Klassifizierung.
Zum Extrahieren von Funktionen aus einer Warn-E-Mail schaue ich in die NLTK- Bibliothek ( http://www.nltk.org/book/ch07.html ). Ich habe es ausprobiert, aber es scheint gut mit richtigen englischen Absätzen / Texten zu funktionieren. Für Benachrichtigungs-E-Mails wurden jedoch viele unnötige Funktionen extrahiert. Gibt es dafür bereits eine Lösung? Wenn nicht, wie lässt sich das am besten umsetzen? Welche Bibliothek, welcher Algorithmus?
PS: Ich bin kein Data Scientist.
Beispiel-E-Mails:
PROBLEM: CRITICAL - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 - CPU Load Avg Service: CPU Load Avg Host: Customer1_PROD_SLAVE_DB_01 Alias: Customer1_PROD_SLAVE_DB_01 Address: 10.10.0.100 Host Group Hierarchy: Opsview > Customer1 - BIG C > Customer1_PROD State: CRITICAL Date & Time: Sat Oct 4 07:02:06 UTC 2014 Additional Information: CRITICAL - load average: 41.46, 40.69, 37.91
RECOVERY: OK - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 - CPU Load Avg Service: CPU Load Avg Host: Customer1_PROD_SLAVE_DB_01 Alias: Customer1_PROD_SLAVE_DB_01 Address: 10.1.1.100 Host Group Hierarchy: Opsview > Customer1 - BIG C > Customer1_PROD State: OK Date & Time: Sat Oct 4 07:52:05 UTC 2014 Additional Information: OK - load average: 0.36, 0.23, 4.83
PROBLEM: CRITICAL - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 - CPU Load Avg Service: CPU Load Avg Host: Customer1_PROD_SLAVE_DB_01 Alias: Customer1_PROD_SLAVE_DB_01 Address: 10.100.10.10 Host Group Hierarchy: Opsview > Customer1 - BIG C > Customer1_PROD State: CRITICAL Date & Time: Sat Oct 4 09:29:05 UTC 2014 Additional Information: CRITICAL - load average: 29.59, 26.50, 18.49
Klassifikatorcode: (Format von csv - email, <disk / cpu / memory / mysql>)
from textblob import TextBlob
from textblob.classifiers import NaiveBayesClassifier
import csv
train = []
with open('cpu.txt', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
tup = unicode(row[0], "ISO-8859-1"), row[1]
train.append(tup)
// this can be done in a loop, but for the time being let it be
with open('memory.txt', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
tup = unicode(row[0], "ISO-8859-1"), row[1]
train.append(tup)
with open('disk.txt', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
tup = unicode(row[0], "ISO-8859-1"), row[1]
train.append(tup)
with open('mysql.txt', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
tup = unicode(row[0], "ISO-8859-1"), row[1]
train.append(tup)
cl = NaiveBayesClassifier(train)
cl.classify(email)
Feature-Extraktor-Code entnommen aus: https://gist.github.com/shlomibabluki/5539628
Bitte lassen Sie mich wissen, wenn hier weitere Informationen erforderlich sind.
Danke im Voraus.