[PYTHON] J'ai joué avec Diamond, un outil de collecte de métriques

introduction

Ceci est un mémo que j'ai essayé en utilisant Diamond, un outil de collecte de métriques. Nous avons utilisé la norme Graphite + Grafana comme plate-forme de stockage et de visualisation pour les données chronologiques.

Stockage et visualisation de données chronologiques

Tout d'abord, je présenterai brièvement Graphite et Grafana. Graphite fournit les services suivants.

Le graphite peut être visualisé par lui-même, mais il est difficile de dire qu'il est sophistiqué, donc Graphite ne fournit que des API, et il semble que d'autres outils soient souvent utilisés pour la partie de visualisation telle que la génération de tableau de bord. En tant qu'outil de visualisation, j'ai utilisé Grafana cette fois.

En utilisant Grafana, vous pouvez facilement créer un tableau de bord élégant comme celui-ci, par exemple.

grafana.png

Pour Graphite et Grafana, les sites suivants seront utiles. Visualisez les résultats de l'exécution de Chef avec Chef Handlers + Graphite Graphite Documentation Notez que j'ai essayé d'utiliser Graphite et Grafana pendant environ une heure Créer un tableau de bord qui affiche les données Graphite à l'aide de Grafana Officiel Grafana

outil de collecte de métriques, Diamond

Qu'est-ce que le diamant

C'est la partie principale de ce temps.

Diamond Le diamant peut être grossièrement divisé en deux composants

Le collecteur est responsable de la collecte des données. La simple collecte n'est pas la même chose que la fourniture des données collectées en dehors de Diamond. Le gestionnaire gère les données collectées. Par exemple, vous pouvez écrire les données obtenues par collector dans un fichier local, les envoyer à Graphite (peut-être devriez-vous l'appeler carbon?), Les enregistrer dans une table MySQL, ignorer une alerte s'il y a quelque chose qui ne va pas, et ainsi de suite.

De plus, Diamond fournit un démon qui exécute le collecteur régulièrement, vous n'avez donc pas à écrire votre propre planificateur.

Les atouts du diamant

Cela dit, que ce soit une force ou non, c'est subtil, mais Diamond a un assez grand nombre de collectionneurs fournis par la communauté. Diamond/Collectors Diverses informations système, des lieux célèbres tels qu'apache, nginx, MySQL, PostgreSQL, Redis, MongoDB, DRBD et des métriques relativement maniaques telles que Openstack Swift sont collectés.

Bougez pour le moment

Installation

En gros, je vais le faire en regardant ici. Même s'il s'agit d'un projet principal python, je le construis en utilisant make. Diamond/Usage

Pour référence, les informations système de la machine installée.

-(risuo@ebi)-(0)-
-[9362]% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.10
DISTRIB_CODENAME=quantal
DISTRIB_DESCRIPTION="Ubuntu 12.10"
-(risuo@ebi)-(0)-
-[9369]% uname -a
Linux ebi 3.5.0-23-generic #35-Ubuntu SMP Thu Jan 24 13:05:29 UTC 2013 i686 athlon i686 GNU/Linux

Modifier le fichier de paramètres

Tout d'abord, éditez diamond.conf. Par défaut, cela ressemble à ceci Diamond / conf / diamond.conf.example Si vous l'installez normalement, /etc/diamond/diamond.conf.example sera créé, alors faites une copie avec le nom diamond.conf dans le même répertoire.

Si vous souhaitez envoyer des données à Graphite, définissez d'abord ici

[[GraphiteHandler]]
### Options for GraphiteHandler

# Graphite server host
host = graphite

# Port to send metrics to
port = 2003

# Socket timeout (seconds)
timeout = 15

# Batch size for metrics
batch = 1

Dans la partie hôte, écrivez l'hôte du serveur Graphite. Définissez le numéro de port selon vos besoins. Le graphite doit être spécifié dans les gestionnaires de la section [serveur], mais c'est la valeur par défaut, vous n'avez donc pas besoin d'en être conscient pour le moment.

Comme mentionné ci-dessus, cela fonctionne pour le moment.

sudo /etc/init.d/diamond start
sudo service diamond start

Démarrez le démon avec.

Attendez un moment, puis regardez le tableau de bord de Grafana. Il réussit si vous pouvez sélectionner des métriques qui semblent contenir des informations système. L'image ci-dessous montre les métriques liées au processeur, à l'espace disque, à la mémoire, à l'iostat, à la moyenne de charge.

grafana_2.png

C'est une bonne idée de résoudre les problèmes en consultant /var/log/diamond/diamong.log.

tips

Je souhaite définir l'intervalle de temps d'acquisition des métriques

Commencez par spécifier la valeur d'intervalle de conf de divers collecteurs. Vous pouvez également définir des valeurs par défaut globales dans diamond.conf. Vous pouvez en fait l'intégrer dans le code source. Vous pouvez voir comment l'écrire en lisant la méthode get_default_config. La page suivante est détaillée. Diamond/Configuration

Écrivez comme ça (l'unité est en secondes)

interval = 60

Je veux configurer un enregistreur

Vous pouvez spécifier le format de sortie du journal, le format et la destination de sortie. Vous pouvez vous faire une idée générale en lisant Diamond / Configuration.

Je veux définir un gestionnaire

Spécifiez les gestionnaires que vous souhaitez activer dans les gestionnaires de la section [serveur]. Par défaut, GraphiteHandler et ArchiveHandler sont activés, mais ils sont spécifiés comme ceci.

handlers = diamond.handler.graphite.GraphiteHandler, diamond.handler.archive.ArchiveHandler

Par exemple, si vous voulez pickle et envoyer, vous devez définir GraphitePickleHandler dans la section [server]. Si vous souhaitez enregistrer les données acquises dans MySQL, spécifiez MySQLHandler.

La communauté fournit également un InfluxdbHandler, un gestionnaire qui stocke dans Influxdb. Grafana peut également être tiré d'Influxdb, alors choisissez celui que vous aimez.

Les paramètres de chaque gestionnaire sont décrits dans la section [gestionnaires].

Je souhaite développer un collecteur personnalisé

Vous pouvez développer un collecteur personnalisé en étendant diamond.collector.Collector (ou une classe dérivée si vous le faites normalement). Parmi les méthodes de diamond.collector.Collector, la "publication" associée est l'interface entre le collecteur et le gestionnaire. De plus, diamond.collector.Collector a une méthode "collect" non implémentée qui permet aux développeurs d'implémenter la collecte dans des classes dérivées. La page suivante sera utile. Diamond/CustomCollectors

Cependant, comme la quantité d'informations est faible avec cela seul, je pense que vous devriez lire l'implémentation de la classe Collector si vous développez un collecteur personnalisé. collector.py

Par exemple, la méthode de publication a un argument appelé precision, qui spécifie le nombre de chiffres valides dans les métriques. C'est 0 par défaut, c'est-à-dire qu'il ne peut gérer que des entiers. Il existe de nombreuses situations dans lesquelles vous souhaitez gérer des métriques avec float, mais il semble que vous ne puissiez pas trouver de solution sans lire le code source.

Solution similaire

sensu et fluentd sont des images qui peuvent faire quelque chose de similaire. sensu fluentd

Il semble que sensu puisse faire diverses choses autres que la collecte de métriques. C'est cool de pouvoir créer un tableau de bord qui génère des informations sur chaque nœud contenant le client sensu à l'aide de l'API sensu. Il semble que cela ne puisse pas être imité avec Diamond. Les sites suivants seront utiles. À propos de Graphite et Sensu Comment créer un système de surveillance hautement flexible à l'aide de Sensu Utilisez Fluentd pour afficher les métriques CloudWatch dans Graphite J'ai essayé une combinaison d'InfluxDB et fluentd

Résumé / impression

C'est facile, mais j'ai écrit sur Diamond. Il est important de garder les données visibles, donc je pense que c'est une bonne idée de conserver ces outils à l'avenir.

Recommended Posts

J'ai joué avec Diamond, un outil de collecte de métriques
J'ai joué avec wordcloud!
J'ai créé un outil de collecte de configuration de routeur Config Collecor
J'ai fait une loterie avec Python.
J'ai joué avec PyQt5 et Python3
J'ai joué avec Mecab (analyse morphologique)!
J'ai créé un démon avec Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
J'ai essayé un outil qui imite le modèle de Goch avec l'IA
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[Introduction à StyleGAN] J'ai joué avec "Une femme se transforme en Mayuyu" ♬
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai joué avec DragonRuby GTK (Game Toolkit)
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai fait un compteur de caractères avec Python
J'ai dessiné une carte thermique avec Seaborn [Python]
[Scikit-learn] J'ai joué avec la courbe ROC
J'ai essayé un langage fonctionnel avec Python
[Introduction à Pytorch] J'ai joué avec sinGAN ♬
Ce que j'ai fait avec les tableaux Python
J'ai fait une carte hexadécimale avec Python
J'ai créé un outil pour convertir Jupyter py en ipynb avec VS Code
J'ai fait un jeu de vie avec Numpy
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'ai fait un générateur Hanko avec GAN
J'ai créé un outil d'estampage automatique du navigateur.
J'ai créé un outil de mot de passe en Python.
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
J'ai créé un outil pour corriger les données GPS avec l'API Map Matching de Mapbox (Mapbox Map Matching API)
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
[Python] J'ai joué avec le traitement du langage naturel ~ transformers ~
J'ai joué avec Floydhub pour le moment
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'obtiens une UnicodeDecodeError lors de l'exécution avec mod_wsgi
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé un Bot LINE avec Serverless Framework!
J'ai créé un outil pour compiler nativement Hy
J'ai créé un outil pour obtenir de nouveaux articles
J'ai essayé d'exécuter alembic, un outil de migration pour Python
J'ai fait un graphique de nombres aléatoires avec Numpy
Je veux écrire dans un fichier avec Python
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
Créez un outil de traduction avec Translate Toolkit
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai écrit un outil CLI en langue Go pour afficher le flux de balises de Qiita dans CLI
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai créé un bot de livre de compte de ménage avec LINE Bot