Công ty của tôi cung cấp dịch vụ được quản lý cho rất nhiều khách hàng của mình. Khách hàng của chúng tôi thường sử dụng các công cụ giám sát sau để giám sát máy chủ / ứng dụng web của họ:
- OpsView
- Nagios
- Bình thường
- Kịch bản shell tùy chỉnh
Bất cứ khi nào có bất kỳ vấn đề nào được tìm thấy, một thư cảnh báo sẽ đến nhóm Ops của chúng tôi để họ hành động khi khắc phục vấn đề.
Khi chúng tôi quản lý hàng ngàn máy chủ, hộp thư đến của các nhóm Ops của chúng tôi luôn tràn ngập các thông báo qua email. Ngay cả một vấn đề duy nhất có hiệu ứng xếp tầng, có thể kích hoạt 20-30 email.
Bây giờ, điều tôi muốn làm là triển khai một hệ thống có thể trích xuất các tính năng quan trọng ra khỏi email cảnh báo - như địa chỉ IP của máy chủ, loại sự cố, mức độ nghiêm trọng của sự cố, v.v. và cũng phân loại các email thành danh mục phù hợp, như CPU-Load-Customer1-Server2, MySQL-Replication-Customer2-DBServer3
v.v. Sau đó, chúng tôi sẽ có một bộ các bước gỡ lỗi được xác định trước cho từng danh mục, để giúp nhóm Ops khắc phục sự cố nhanh hơn. Ngoài ra, trình trích xuất tính năng sẽ cung cấp dữ liệu đầu vào cho nhóm cho một vấn đề.
Cho đến nay tôi đã có thể đào tạo NaiveBayesClassifier với các kỹ thuật học tập có giám sát, tức là dữ liệu đào tạo được gắn nhãn (dữ liệu cụm) và có thể phân loại các email chưa xem mới vào cụm / danh mục phù hợp. Vì các email dựa trên các mẫu nhất định, độ chính xác của trình phân loại là rất cao. Nhưng chúng tôi cũng nhận được email cảnh báo từ các tập lệnh tùy chỉnh, có thể không tuân theo các mẫu. Vì vậy, thay vì học có giám sát, tôi muốn thử học không giám sát cho cùng. Tôi đang nhìn vào cụm KMeans . Nhưng một lần nữa vấn đề là, chúng ta sẽ không biết trước số lượng cụm. Vì vậy, thuật toán nào sẽ là tốt nhất cho trường hợp sử dụng này? Ngay bây giờ tôi đang sử dụng thư viện TextBlob của Python để phân loại.
Ngoài ra, để trích xuất tính năng từ một email cảnh báo, tôi đang xem xét thư viện NLTK ( http://www.nltk.org/book/ch07.html ). Tôi đã thử nó, nhưng nó dường như hoạt động tốt trên các đoạn văn bản / văn bản tiếng Anh thích hợp, tuy nhiên, đối với các email cảnh báo, nó đã trích xuất rất nhiều tính năng không cần thiết. Đã có bất kỳ giải pháp hiện có cho cùng? Nếu không, cách tốt nhất để thực hiện là gì? Thư viện nào, thuật toán nào?
PS: Tôi không phải là nhà khoa học dữ liệu.
Email mẫu:
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
Mã phân loại: (định dạng của csv - email, <đĩa / 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)
Mã trích xuất tính năng được lấy từ: https://gist.github.com/shlomibabluki/5539428
Xin vui lòng cho tôi biết nếu có thêm thông tin được yêu cầu ở đây.
Cảm ơn trước.