python - 机器学习监控服务器

我正在查看Pybrain,它可以获取服务器监视器警报并确定问题的根本原因。我很乐意使用有监督的学习和管理培训数据集来培训IT。数据的结构如下:

 * Server Type **A** #1
  * Alarm type 1
  * Alarm type 2
 * Server Type **A** #2
  * Alarm type 1
  * Alarm type 2
 * Server Type **B** #1
  * Alarm type **99**
  * Alarm type 2

所以有n个服务器,其中x个警报可以是UPDOWNnx都是可变的。
如果服务器A1的报警1和2为“CC”,那么我们可以说该服务器上的服务A已关闭,是问题的原因。
如果所有服务器上的警报1都关闭,那么我们可以说是服务A造成的。
原因可能有多种选择,因此直接分类似乎不合适。
我还想把以后的数据源与网络联系起来。例如只对一些外部服务执行ping操作的脚本。
由于串行服务检查,可能不会立即触发所有适当的警报,因此可以在一台服务器关闭后5分钟启动,然后在另一台服务器关闭后5分钟启动。
我刚开始试着做一些基本的事情:
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer


INPUTS = 2
OUTPUTS = 1

# Build network

# 2 inputs, 3 hidden, 1 output neurons
net = buildNetwork(INPUTS, 3, OUTPUTS)


# Build dataset

# Dataset with 2 inputs and 1 output
ds = SupervisedDataSet(INPUTS, OUTPUTS)


# Add one sample, iterable of inputs and iterable of outputs
ds.addSample((0, 0), (0,))



# Train the network with the dataset
trainer = BackpropTrainer(net, ds)

# Train 1000 epochs
for x in xrange(10):
    trainer.train()

# Train infinite epochs until the error rate is low
trainer.trainUntilConvergence()


# Run an input over the network
result = net.activate([2, 1])

但是,我很难将警报的可变数量映射到输入的静态数量。例如,如果我们向服务器添加一个警报,或者添加一个服务器,那么整个网络需要重建。如果这是需要做的事情,我可以做,但想知道是否有更好的方法。
我正在考虑的另一个选择是,为每种类型的服务器使用不同的网络,但是我不知道如何得出一个环境范围的结论,因为它只对单个主机进行评估,而不是同时对所有主机进行评估。
我应该使用哪种类型的算法,以及如何映射数据集,以通过变量输入得出整个环境的结论?
我对任何可行的算法都非常开放。Go比python更好。


最佳答案:

这实际上是一个具有挑战性的问题。
标签表示法
很难代表你的学习目标。正如你所指出的,

If Server A1 has alarm 1 & 2 as DOWN, then we can say that service a is down on that server and is the cause of the problem.
If alarm 1 is down on all servers, then we can say that service a is the cause.
There can potentially be multiple options for the cause ...

我想您需要列出所有可能的选项,否则我们不能期望ML算法通用化。为了简单起见,假设您只有两个可能的问题原因:
1. Service problem 
2. Server problem  

基于站点的二进制分类器
假设在第一个ML模型中,以上是唯一的两个原因。然后,您现在正在研究一个基于站点的二进制分类器。可能逻辑回归更好地让你开始,因为它很容易解释。
要找出问题出在哪个服务器上,或者问题出在哪个服务上,这可能是您的第二步。为了解决第二步,根据您的示例,
如果这是一个服务问题,我认为可以手动派生一些决策规则,以便确定服务名称。您应该看到大量触发相同警报的服务器,对吧?另请参阅末尾的高级读数,查看更多选项。
如果是服务器问题,您可以构造第二个二进制分类器(单个服务器端分类器),它只使用来自该服务器的功能在每个服务器上运行,并回答问题:“如果我有问题”。
基于站点的二进制分类器的功能
我认为所有这些警报都是您功能的最佳来源。我想使用一些汇总统计数据作为特性可以为这里的站点分类器提供更多帮助。例如,
接收到警报A的服务器百分比已关闭
所有警报B关闭的服务器的平均时间长度
在警报B已关闭的所有服务器中,警报A已关闭的服务器的百分比是多少。

服务器端二进制分类器的功能
您应该明确地使用所有报警信号作为服务器端分类器的特性。但是,在培训时,您应该从所有服务器获取所有数据。标签只是“有问题”或“没有问题”。培训数据如下:
  alarm A On, alarm B On, alarm C on, ..., alarm Z on, has-problem
    YES,        YES,       NO,               YES,      YES
    NO,         YES,       NO,               NO,       NO
    ?,          NO,        YES,              NO,       NO

注意我用了“?”要指示某些可能的警报,您可能缺少数据(未知状态),可以使用这些数据描述以下情况:
All the appropriate alarms may not be triggered at once, 
due to serial service checks,  so it can start with one server down and 
then another server down 5 minutes later.  

一些高级读物
这个问题与一些主题有关,例如,alarm correlationevent correlationfault diagnosis