我的公司为许多客户提供托管服务。我们的客户通常使用以下监控工具来监控他们的服务器/网络应用程序:
- 操作视图
- 纳吉奥斯
- 王国
- 自定义 shell 脚本
每当发现任何问题时,我们的运营团队都会收到一封警报邮件,以便他们采取行动纠正问题。
当我们管理着数千台服务器时,我们的 Ops 团队的收件箱总是充斥着电子邮件警报。即使是一个具有级联效应的问题,也可以触发 20-30 封电子邮件。
现在,我想做的是实现一个系统,该系统能够从警报电子邮件中提取重要特征 - 例如服务器 IP 地址、问题类型、问题严重性等,并将电子邮件分类为适当的类别,例如CPU-Load-Customer1-Server2, MySQL-Replication-Customer2-DBServer3
等等。然后,我们将为每个类别预先定义一组调试步骤,以帮助 Ops 团队更快地纠正问题。此外,特征提取器将为团队提供输入数据以解决问题。
到目前为止,我已经能够使用监督学习技术(即标记的训练数据(集群数据))训练NaiveBayesClassifier,并且能够将新的看不见的电子邮件分类到适当的集群/类别中。由于电子邮件基于某些模板,因此分类器的准确性非常高。但我们也会收到来自自定义脚本的警报电子邮件,这些脚本可能不遵循模板。因此,我不想进行监督学习,而是想尝试无监督学习。我正在研究KMeans 聚类。但同样的问题是,我们不会事先知道集群的数量。那么,哪种算法最适合这个用例呢?现在我正在使用 Python 的 TextBlob 库进行分类。
此外,为了从警报电子邮件中提取特征,我正在研究 NLTK ( http://www.nltk.org/book/ch07.html ) 库。我试过了,但它似乎可以很好地处理正确的英文段落/文本,但是,对于警报电子邮件,它提取了很多不必要的功能。是否已经有任何现有的解决方案?如果没有,实现相同的最佳方法是什么?哪个库,哪个算法?
PS:我不是数据科学家。
示例电子邮件:
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
分类代码:(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)
特征提取器代码取自: https ://gist.github.com/shlomibabluki/5539628
如果这里需要更多信息,请告诉我。
提前致谢。