Je regarde pybrain pour prendre les alarmes du moniteur de serveur et déterminer la cause première d'un problème. Je suis heureux de le former à l'aide d'un apprentissage supervisé et de gérer les ensembles de données de formation. Les données sont structurées quelque chose comme ceci:
- Type de serveur A # 1
- Type d'alarme 1
- Type d'alarme 2
- Type de serveur A # 2
- Type d'alarme 1
- Type d'alarme 2
- Type de serveur B # 1
- Type d'alarme 99
- Type d'alarme 2
Il y a donc n serveurs, avec x alarmes qui peuvent être UP
ou DOWN
. Les deux n
et x
sont variables.
Si le serveur A1 a alarme 1 et 2 comme DOWN
, nous pouvons dire que le service un est en panne sur ce serveur et est la cause du problème.
Si l' alarme 1 est en panne sur tous les serveurs, nous pouvons dire que le service a en est la cause.
Il peut y avoir plusieurs options pour la cause, donc une classification simple ne semble pas appropriée.
Je voudrais également associer des sources de données ultérieures au réseau. Tels que des scripts qui exécutent un ping sur un service externe.
Toutes les alarmes appropriées peuvent ne pas être déclenchées à la fois, en raison de vérifications de service série, de sorte qu'il peut démarrer avec un serveur arrêté puis un autre serveur arrêté 5 minutes plus tard.
J'essaie de faire des trucs de base au début:
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])
Mais j'ai du mal à mapper des nombres variables d'alarmes à des nombres statiques d'entrées. Par exemple, si nous ajoutons une alarme à un serveur, ou ajoutons un serveur, le réseau entier doit être reconstruit. Si c'est quelque chose qui doit être fait, je peux le faire, mais je veux savoir s'il y a une meilleure façon.
Une autre option à laquelle j'essaie de penser est d'avoir un réseau différent pour chaque type de serveur, mais je ne vois pas comment tirer une conclusion à l'échelle de l'environnement, car il ne fera que des évaluations sur un seul hôte, au lieu de tous les hôtes à la fois.
Quel type d'algorithme dois-je utiliser et comment mapper l'ensemble de données pour tirer des conclusions à l'échelle de l'environnement dans son ensemble avec des entrées variables?