Comment détecter des anomalies avec Skyline sur CentOS 7

introduction

Si vous utilisez un système de surveillance (comme Zabbix ou Nagios), vous savez comment fonctionne la surveillance. En résumé, il peut être décrit comme suit: Un système de surveillance reçoit diverses mesures (utilisation de la CPU / de la mémoire, utilisation du réseau, etc.). Dès que la valeur d’une des métriques dépasse les seuils prédéterminés, le déclencheur correspondant est activé et le système de surveillance vous informe que l’une des métriques se situe en dehors des limites normales. Les seuils pour chaque métrique sont généralement définis manuellement, ce qui n’est pas toujours pratique.

Dans ce didacticiel, vous apprendrez à installer et configurer Skyline - un système de détection d’anomalies en temps réel. Il est capable d’analyser un ensemble de métriques en temps réel sans définir ni ajuster les seuils pour chacun. Il est conçu pour être utilisé partout où un grand nombre de séries chronologiques (des centaines de milliers) nécessitent une surveillance constante.

Déclencheurs de seuil

Voyons un exemple de système de surveillance avec des seuils définis manuellement. La figure ci-dessous montre un graphique de la charge du processeur. Les lignes pointillées indiquent les seuils du déclencheur.

image: https: //assets.digitalocean.com/articles/skyline_centos7/pic1.png [Figure 1] + * Figure 1 *

Au point 1 de la figure 1, un processus a démarré et la charge du processeur a considérablement augmenté. Le déclencheur a été activé et l’administrateur le remarque. L’administrateur décide qu’il se situe dans les valeurs normales et modifie les seuils de déclenchement par ceux indiqués par les lignes pointillées supérieures.

Après un certain temps, la gâchette est déclenchée à nouveau au point 2 de la figure 1. L’administrateur découvre qu’un deuxième service effectue régulièrement des sauvegardes et entraîne l’augmentation de la charge. La question se pose alors: augmentez-vous le seuil ou laissez-vous tel quel, mais ignorez simplement les alarmes?

Regardons le point 3. À ce moment, la charge d’événements diminue, mais l’administrateur n’a pas été informé car le seuil n’a pas été dépassé. Le déclencheur n’a pas été activé.

Ce cas simple nous montre qu’il est difficile d’essayer de définir des seuils. Il est difficile d’ajuster les valeurs de seuil pour résoudre les problèmes de performances sans provoquer d’erreurs faussement positives ou faussement négatives.

Pour aider à résoudre ces problèmes, * Skyline * a été créé. Il utilise un ensemble d’algorithmes non paramétriques pour classer les métriques anormales.

Composants d’horizon

Skyline comprend les composants suivants: Horizon Agent, Analyzer Agent et Webapp.

Agent Horizon

Horizon Agent est responsable de la collecte des données. Il a * Listeners *, qui écoutent les données entrantes.

Il accepte les données dans deux formats: pickle (TCP) et MessagePack (UDP). Il lit les métriques entrantes et les met dans une file d’attente partagée à partir de laquelle les * ouvriers * lisent. Les travailleurs encodent les données dans Messagepack et les ajoutent à la base de données Redis. De plus, Horizon Agent ajuste et nettoie régulièrement les anciennes métriques à l’aide de * Roombas *. Si cela n’est pas fait, toute la mémoire disponible sera bientôt épuisée.

Agent d’analyse

L’Agent Analyzer est responsable de l’analyse des données. Il reçoit une liste de métriques de Redis, exécute plusieurs processus et attribue des métriques à chacun d’entre eux. Chaque processus analyse les données en utilisant plusieurs algorithmes. Chaque algorithme rapporte le résultat, que les données soient anormales ou non. Si la majorité des algorithmes signalent une anomalie dans la métrique actuelle, les données sont considérées comme anormales.

Toutes les métriques anormales sont écrites dans un fichier. Sur la base de ce fichier, une image est créée et affichée dans l’application Web.

Analyzer peut également envoyer des notifications: email, HipChat ou PagerDuty. Les notifications par courrier électronique sont configurées plus tard dans cet article.

Webapp

Skyline fournit une petite application Web pour afficher les métriques anormales. C’est une application web simple écrite en Python avec un framework Flask. La partie supérieure montre deux graphiques - la dernière heure et le dernier jour. Sous les graphiques se trouve une liste de toutes les métriques anormales.

Base de données Redis

Redis est une base de données cache et valeur de magasin open source.

Skyline stocke toutes les métriques et les séries temporelles codées dans une base de données Redis. Lorsqu’un point de données arrive, un travailleur Horizon le compresse avec le schéma + [horodatage, valeur] + dans une chaîne binaire codée par MessagePack et l’ajoute à la clé de mesure appropriée.

La figure 2 montre le diagramme des interactions des composants de Skyline.

image: https: //assets.digitalocean.com/articles/skyline_centos7/pic2.png [Figure 2] + * Figure 2 *

Conditions préalables

Avant de pouvoir installer Skyline, vous devez remplir les conditions préalables suivantes:

Étape 1 - Installation de Skyline et Redis

Pour installer Skyline, commencez par installer les applications requises, y compris des outils liés à Python et le serveur Web Apache:

sudo yum install httpd gcc gcc-c++ git pycairo mod_wsgi python-pip python-devel blas-devel lapack-devel libffi-devel

Obtenez les derniers fichiers source pour Skyline à partir de GitHub:

cd /opt
sudo git clone https://github.com/etsy/skyline.git

Installez certains paquets Python requis:

cd /opt/skyline
sudo pip install -U six
sudo pip install -r requirements.txt

Installez les packages Python suivants dans cet ordre spécifié:

sudo pip install numpy
sudo pip install scipy
sudo pip install pandas
sudo pip install patsy
sudo pip install statsmodels
sudo pip install msgpack-python

La plupart d’entre elles sont des bibliothèques Python open source utilisées pour l’informatique scientifique et technique. Le paquetage + msgpack-python + est nécessaire pour la lecture et l’écriture de données MessagePack.

Copiez l’exemple de fichier de paramètres Skyline dans le fichier correct:

sudo cp /opt/skyline/src/settings.py.example /opt/skyline/src/settings.py

Créez les répertoires suivants:

sudo mkdir /var/log/skyline
sudo mkdir /var/run/skyline
sudo mkdir /var/log/redis
sudo mkdir /var/dump/

Comme nous l’avons mentionné ci-dessus, Skyline stocke toutes les métriques dans une base de données Redis. Vous devez donc également l’installer:

sudo yum install redis

Vous pouvez trouver plus d’informations sur Redis dans le tutoriel Comment installer et utiliser Redis.

Démarrez les services Skyline et Redis:

cd /opt/skyline/bin
sudo redis-server redis.conf
sudo ./horizon.d start
sudo ./analyzer.d start
sudo ./webapp.d start

Pour tester l’installation, exécutez le script de test inclus:

python /opt/skyline/utils/seed_data.py

Vous devriez voir la sortie suivante:

Loading data over UDP via Horizon...
Connecting to Redis...
Congratulations! The data made it in. The Horizon pipeline seems to be working.

L’installation et la configuration de base de Skyline sont terminées. Vous devez maintenant y envoyer des données.

Étape 2 - Obtenir des données dans Skyline

Comme mentionné précédemment, Skyline accepte les données dans deux formats: pickle (TCP) et MessagePack (UDP) .

Vous pouvez écrire votre propre script ou module sur votre agent de surveillance préféré et le faire coder les données avec MessagePack pour les envoyer à Skyline pour analyse. Skyline accepte les métriques sous forme de chaînes codées MessagePack sur UDP. MessagePack est une spécification de sérialisation d’objet telle que JSON. Le format est + [<nom de la métrique>, [<horodatage>, <valeur>]] +. MessagePack a une API pour la plupart des langages de programmation. Vous trouverez plus d’informations et des exemples d’API sur le site officiel MessagePack.

Ce tutoriel va vous montrer comment envoyer les données de Graphite et les collecter à Skyline.

Obtenir des données de graphite

Le graphite comprend plusieurs composants, dont le service * carbon-relay *. Carbon-relay transmet les métriques entrantes à une autre instance de Graphite pour la redondance. Vous pouvez ainsi diriger le service de relais carbone vers l’hôte sur lequel Skyline est exécuté.

image: https: //assets.digitalocean.com/articles/skyline_centos7/graphite_skyline.png [Figure 3] + * Figure 3 *

La figure 3 montre un diagramme schématique du flux de données. Données provenant d’agents de surveillance externes (collectd, diamond, statsd, etc.) ou systèmes (Nagios, Icinga, Sensu, etc.) sont transférés dans du graphite. Ensuite, Carbon-Relay transmet les données à Skyline. Carbon-relay, Carbon-cache et Skyline peuvent s’exécuter sur un seul hôte ou sur des hôtes distincts.

Vous devez configurer Graphite, collectd et Skyline pour que ce flux de données fonctionne.

Si vous n’avez pas précédemment copié l’exemple + relay-rules.conf + à l’emplacement approprié pour le fichier de configuration du relais de carbone, vous devez le faire maintenant:

sudo cp /opt/graphite/conf/relay-rules.conf.example /opt/graphite/conf/relay-rules.conf

Ouvrons le fichier de configuration + relay-rules.conf +:

sudo vi /opt/graphite/conf/relay-rules.conf

Ajoutez votre hôte Skyline à la liste des destinations, où se trouve l’adresse IP de votre hôte Skyline:

/opt/graphite/conf/relay-rules.conf

[default]
default = true
destinations = 127.0.0.1:2004, :2024

Toutes les destinations utilisées dans + relay-rules.conf + doivent également être définies dans le fichier de configuration + carbon.conf +.

Ouvrez le fichier de configuration + carbon.conf + pour effectuer cette modification:

sudo vi /opt/graphite/conf/carbon.conf

Puis localisez la section + [relay] + et éditez la ligne + DESTINATIONS +:

/opt/graphite/conf/carbon.conf

[relay]
...
DESTINATIONS = 127.0.0.1:2004, :2024
...

Une fois ces modifications apportées, démarrez le service de relais carbone:

sudo systemctl start carbon-relay

Autoriser Skyline à accéder à Graphite-Web

Dans Comment conserver des journaux historiques efficaces Graphite, Carbon et collectd sur CentOS 7, si vous avez choisi de protéger l’interface Web Graphite par un mot de passe, vous devez autoriser * l’accès * de localhost sans mot de passe pour que Skyline fonctionne.

Pour ce faire, éditez le fichier de configuration Graphite:

sudo vi /etc/httpd/conf.d/graphite.conf

Ajoutez les lignes suivantes en rouge au bloc + <Location> +:

/etc/httpd/conf.d/graphite.conf

<Location "/">
 AuthType Basic
 AuthName "Private Area"
 AuthUserFile /opt/graphite/secure/.passwd
 Require user sammy




</Location>

Puis redémarrez le service Apache:

sudo systemctl restart httpd

Obtenir des données de Collectd

Vous pouvez également configurer collectd pour envoyer des données à Skyline. Ouvrez son fichier de configuration:

sudo vi /etc/collectd.conf

Remplacez le numéro de port dans le bloc + <Plugin write_graphite> + par + 2013 +:

/etc/collectd.conf

<Plugin write_graphite>
   . . .
   Port ""
   . . .

Puis redémarrez collectd:

sudo systemctl restart collectd.service

Pour éviter toute confusion, la figure 4 présente un schéma simplifié avec les bons numéros de port.

image: https: //assets.digitalocean.com/articles/skyline_centos7/graphite_skyline_ports.png [Figure 4] + * Figure 4 *

Les numéros de port corrects sont les suivants:

  1. Carbon-relay écoute les données entrantes au format plaintext sur le port 2013

  2. Carbon-relay envoie les données au format pickle

  3. Carbon-cache écoute les données entrantes au format pickle sur le port 2004

  4. L’agent Horizon écoute les données entrantes au format pickle sur le port 2024

Étape 3 - Configuration de Skyline

Le fichier de configuration de Skyline contient de nombreux paramètres. Ouvrez le fichier pour le modifier:

sudo vi /opt/skyline/src/settings.py

Chaque paramètre de ce fichier est documenté via des commentaires informatifs dans le fichier lui-même. Au minimum, vous devez définir les paramètres suivants, en remplaçant le texte en rouge par vos valeurs:

  • + GRAPHITE_HOST = '' +

  • + HORIZON_IP = '' +

  • + WEBAPP_IP = '' +

Les autres options peuvent être laissées à leurs valeurs par défaut. Ils sont comme suit:

  • + FULL_DURATION + - Cette option spécifie la durée maximale pendant laquelle les données seront stockées dans Redis et analysées. Les durées plus longues prennent plus de temps à analyser, mais elles peuvent aider à réduire le bruit et à fournir une détection plus précise des anomalies. La valeur par défaut est + 86400 + secondes.

  • + CARBON_PORT + - Cette option spécifie le port carbone. La valeur par défaut est + 2003 +.

  • + ANALYZER_PROCESSES + - Cette option spécifie le nombre de processus générés par l’analyseur Skyline. Il est recommandé de définir ce paramètre sur une valeur inférieure de plusieurs fois au nombre total de processeurs de votre hôte. La valeur par défaut est + 5 +.

  • + WORKER_PROCESSES + - Cette option spécifie le nombre de processus de travail à utiliser dans la file d’attente Horizon. La valeur par défaut est + 2 +.

  • + PICKLE_PORT + - Cette option spécifie le port TCP qui écoute les pickles de Graphite. La valeur par défaut est + 2024 +.

  • + UDP_PORT + - Cette option spécifie le port UDP qui écoute les paquets codés par MessagePack. La valeur par défaut est + 2025 +.

  • + WEBAPP_PORT + - Cette option spécifie le port de l’application Web Skyline. La valeur par défaut est + 1500 +.

Après avoir apporté ces modifications, vous devez redémarrer l’application correspondante:

sudo /opt/skyline/bin/horizon.d restart
sudo /opt/skyline/bin/analyzer.d restart
sudo /opt/skyline/bin/webapp.d restart

Ensuite, vous pouvez ouvrir le lien + http: //: 1500 + et voir la page Web Skyline (Figure 5). Il affichera une métrique anormale au fur et à mesure de leur découverte.

image: https: //assets.digitalocean.com/articles/skyline_centos7/skyline_interface.png [Figure 5] + * Figure 5 *

Pour que Skyline fonctionne à sa capacité maximale, vous devez attendre que les secondes + FULL_DURATION + se soient écoulées. Par défaut, + FULL_DURATION + est défini sur 1 jour (+ 86400 + secondes).

Vous devez attendre au moins une heure pour pouvoir détecter les anomalies. Cela donnera à Skyline le temps d’accumuler des informations sur les niveaux de charge normaux. Essayez de ne pas créer de charge supplémentaire sur le système pendant que Skyline établit une base.

Étape 4 - Activation des alertes par courrier électronique

Par défaut, Skyline affiche les anomalies détectées dans son interface Web (+ http: //: 1500 +) telles qu’elles sont détectées et pendant qu’elles se produisent encore. Dès qu’une anomalie disparaît, la métrique correspondante disparaît de cette interface. Par conséquent, vous devez surveiller la page Web pour voir ces anomalies, ce qui n’est pas toujours pratique.

Vous pouvez configurer les alertes par courrier électronique pour ne pas les manquer.

Pour ce faire, ouvrez le fichier de configuration Skyline:

sudo vi /opt/skyline/src/settings.py

Assurez-vous que les alertes sont activées:

/opt/syline/src/settings.py

ENABLE_ALERTS = True

Recherchez ensuite la section ALERTES suivante et ajoutez le schéma suivant en rouge:

/opt/syline/src/settings.py

ALERTS = (
   (^)("collectd", "smtp", 1800)(^),
)

La première valeur du schéma est le processus à surveiller. Dans ce cas, il s’agit de + collectd. + La seconde valeur du schéma est + smtp +, qui correspond aux alertes par e-mail. La dernière valeur de + 1800 + est en secondes. Cela signifie que les alertes ne seront pas déclenchées plus d’une fois dans les 30 minutes (1 800 secondes), même si un déclencheur est détecté. Modifiez cette valeur pour répondre au mieux à vos besoins.

Recherchez également la section suivante et modifiez-la pour les adresses électroniques que vous souhaitez utiliser. Les alertes par e-mail seront envoyées au compte (^) [email protected] (^) par (^) [email protected] (^).

/opt/syline/src/settings.py

SMTP_OPTS = {
   "sender": "(^)[email protected](^)",
   "recipients": {
       "collectd": ["(^)[email protected](^)"],
   },
}

Après avoir apporté toutes ces modifications, vous devez redémarrer le démon analyzer:

sudo /opt/skyline/bin/analyzer.d restart

Étape 5 - Test de Skyline

Pour tester Skyline, nous pouvons créer une pointe de processeur avec une commande bash:

dd if=/dev/zero of=/dev/null

Vous pouvez arrêter la commande à tout moment en appuyant sur CTRL-C. Plusieurs minutes devraient suffire pour créer une anomalie.

Si vous regardez l’interface Web Skyline pendant l’exécution de cette commande, vous verrez les anomalies détectées. Un exemple est présenté à la figure 6.

image: https: //assets.digitalocean.com/articles/skyline_centos7/skyline_anomalies_list.png [Figure 6] + * Figure 6 *

Vous pouvez constater qu’en raison de la charge de processeur élevée, la vitesse des composants de Skyline a diminué. Toutes les mesures anormales détectées sont affichées sous forme de liste au bas de la page Web. Lorsque vous survolez le nom d’une des mesures, vous pouvez voir dans les graphiques supérieurs la série chronologique correspondante pour la dernière heure et le jour. Cliquez sur le nom de la métrique pour ouvrir un graphique plus détaillé, généré par Graphite (voir l’illustration 7 pour un exemple).

image: https: //assets.digitalocean.com/articles/skyline_centos7/detail_graph.png [Figure 7] + * Figure 7 *

La charge du processeur n’a pas atteint une valeur extrêmement élevée dans cet exemple et le seuil n’a pas été dépassé. Dans ce cas, un système de surveillance classique n’a pas pu trouver de déviation. Ce cas a déjà été mentionné (Figure 1, point 3).

Contrairement aux systèmes de surveillance classiques, Skyline peut rapidement détecter les écarts et vous en informer.

Étape 6 - Ajustement des algorithmes (facultatif)

Comme il a été mentionné précédemment, Skyline utilise un ensemble d’algorithmes pour détecter les anomalies. Les algorithmes suivants sont actuellement implémentés:

  • Signifie une déviation absolue

  • Test de Grubbs

  • Moyenne de la première heure

  • Écart type de la moyenne

  • Écart type de la moyenne mobile

  • Moindres carrés

  • Histogrammes

  • Test de Kolmogorov – Smirnov

La plupart d’entre elles sont basées sur les * graphiques de contrôle * (également appelés graphiques de Shewhart) et la * règle de trois sigma *. Ils utilisent les bibliothèques Python SciPy et NumPy dans leurs calculs.

Vous pouvez personnaliser n’importe lequel des algorithmes utilisés. Vous pouvez également modifier, supprimer ou ajouter de nouveaux. Pour ce faire, vous devez éditer le fichier de configuration:

sudo vi /opt/skyline/src/analyzer/algorithms.py

Chacun des algorithmes de ce fichier est fourni avec une petite description. Par exemple, examinons l’algorithme suivant:

/opt/skyline/src/analyzer/algorithms.py

def median_absolute_deviation(timeseries):
   """
   A timeseries is anomalous if the deviation of its latest datapoint with
   respect to the median is X times larger than the median of deviations.
   """

   series = pandas.Series([x[1] for x in timeseries])
   median = series.median()
   demedianed = np.abs(series - median)
   median_deviation = demedianed.median()

   # The test statistic is infinite when the median is zero,
   # so it becomes super sensitive. We play it safe and skip when this happens.
   if median_deviation == 0:
       return False

   test_statistic = demedianed.iget(-1) / median_deviation

   # Completely arbitary...triggers if the median deviation is
   # 6 times bigger than the median
   if test_statistic > :
       return True

En fonction de la nature de vos données, vous devrez peut-être modifier la valeur de seuil de «+ 6 » en autre chose - « 4 », « 5 », « 7 +», etc.

Vous pouvez également régler certains paramètres dans le fichier + settings.py +:

/opt/skyline/src/settings.py

ALGORITHMS = [
   'first_hour_average',
   'mean_subtraction_cumulation',
    'stddev_from_average',
    'stddev_from_moving_average',
    'least_squares',
    'grubbs',
    'histogram_bins',
    'median_absolute_deviation',
    'ks_test',
]

CONSENSUS = 6

L’option + ALGORITHMS + spécifie les algorithmes que l’analyseur exécutera. Vous pouvez commenter n’importe lequel d’entre eux pour les désactiver ou ajouter de nouveaux algorithmes. L’option + CONSENSUS + spécifie le nombre d’algorithmes qui doivent renvoyer + True + avant qu’une métrique soit classée comme anormale. Pour augmenter la sensibilité, vous pouvez réduire cette option, et inversement.

Conclusion

Skyline a fait ses preuves dans des systèmes informatiques complexes en évolution dynamique. Cela peut être utile aux programmeurs qui apportent régulièrement des modifications au système d’exploitation et souhaitent détecter rapidement les anomalies dans les métriques du système après une nouvelle version du logiciel.

Ses principaux avantages incluent:

  • Analyse à grande vitesse de grandes quantités de données

  • Pas besoin de définir des paramètres individuels pour chaque métrique

  • Possibilité d’ajouter vos propres algorithmes pour la détection d’anomalies

Il a aussi quelques inconvénients:

  • Les données de chacune des métriques sont analysées par plusieurs algorithmes nécessitant des ressources système importantes.

  • Toutes les données sont stockées dans la RAM, ce qui permet au système de fonctionner très rapidement. Avec un grand nombre de mesures et une longue période d’analyse, vous aurez besoin d’une grande quantité de RAM.