Python 用于监控服务器的机器学习

Python 用于监控服务器的机器学习,python,go,machine-learning,neural-network,monitor,Python,Go,Machine Learning,Neural Network,Monitor,我正在研究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

我正在研究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个警报可以是
向上
向下
n
x
都是可变的

如果服务器A1的报警1和2为
停机
,则我们可以说该服务器上的服务a停机,这是问题的原因

如果所有服务器上的警报1都已关闭,那么我们可以说是服务a导致的

原因可能有多种选择,因此直接分类似乎不合适

我还想把后来的数据来源与网络联系起来。例如,只需ping一些外部服务的脚本

由于串行服务检查,可能不会立即触发所有适当的警报,因此它可以在一台服务器停机时启动,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更好。

对于变量输入,有许多选项,但有两个相对简单的选项:

1) 不存在的输入编码为0.5,而存在的输入编码为0或1 2) 此外,您可以将输入分成两部分,一部分表示“当前”与“不当前”,另一部分表示“活动”与“静默”。然后,网络将必须使用两者之间的交互来了解第二列仅在第一列为1时才重要,而不是在第一列为0时才重要。但如果有足够的培训案例,它可能可以做到这一点


当然,这些方法可以结合使用。

这实际上是一个具有挑战性的问题

标签的表示 很难代表你学习的目标标签。正如你所指出的

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.  
一些高级读物
这个问题与几个主题有关,例如,,。

也许一个朴素的贝叶斯网络最合适?它肯定更简单。作为一个用户,而不是软件宣布结论,我宁愿让它在电子邮件中列出可能指向我的事实摘要。例如,“A1服务器上的4个服务(80%)报告失败”或“跨越12个系统的报警类型99(100%)”。选择要显示的事实仍然是一个有趣的问题,这与打包一样重要。如果这是幼稚的话,很抱歉,但重构输入可能更容易。您说“有n个服务器,x个报警可以向上或向下。n和x都是可变的。。如果表示为“存在一个特定类型的、来自特定服务器的、处于向上或向下状态的警报”,这会更好吗?这似乎使任何随后传递给任何ML算法的数据树都不太可能随着报警类型或服务器的添加而发生更改。如果这根本不相关,很抱歉!我对ML不太了解,但我已经处理了一些数据结构。我建议选择2。上面描述的第一个备选方案可能会受到影响从缺火开始