私の会社は多くのクライアントにマネージドサービスを提供しています。お客様は通常、次の監視ツールを使用してサーバー/ウェブアプリを監視します。
- OpsView
- ナギオス
- Pingdom
- カスタムシェルスクリプト
問題が見つかると、Opsチームにアラートメールが送信され、問題を修正するためのアクションが行われます。
何千ものサーバーを管理しているため、運用チームの受信トレイは常に電子メールアラートで溢れています。カスケード効果がある単一の問題でも、20〜30通の電子メールをトリガーできます。
今、私がやりたいのは、サーバーのIPアドレス、問題のタイプ、問題の重大度などのアラート電子メールから重要な機能を抽出し、電子メールを適切なカテゴリに分類できるシステムを実装することです。CPU-Load-Customer1-Server2, MySQL-Replication-Customer2-DBServer3
その後、運用チームが問題をより迅速に修正できるように、各カテゴリに対して事前に定義された一連のデバッグ手順を用意します。また、機能エクストラクタは、問題の入力データをチームに提供します。
これまでのところ、教師付き学習手法、つまりラベル付きトレーニングデータ(クラスターデータ)で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の形式-電子メール、<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
ここにさらに情報が必要な場合はお知らせください。
前もって感謝します。