Dans cet article, je vais expliquer comment utiliser Pinba avec ClickHouse et Grafana au lieu de pinba_engine et pinboard.
Dans un projet PHP, Pinba est probablement le seul moyen fiable de comprendre ce qui se passe avec les performances. En général, Pinba est intégré seulement lorsqu'il y a déjà des problèmes et qu'on ne sait pas « où creuser ».
Souvent, personne n'a la moindre idée du nombre de fois par seconde/minute qu'un script donné est appelé, et ils commencent à optimiser « à l'aveuglette », en commençant par les endroits qui semblent les plus logiques.
Certains analysent les journaux Nginx, tandis que d'autres se concentrent sur les requêtes lentes dans la base de données.
Bien sûr, Pinba ne serait pas superflu, mais il y a plusieurs raisons pour lesquelles elle n'est pas présente sur tous les projets.
La première raison en est l'installation.
Pour obtenir quelque chose de « significatif » de l'intégration de Pinba, il est fortement conseillé de voir les métriques non seulement sur les dernières minutes, mais également sur une période prolongée (de jours à mois).
Pour cela, il faut :
- installer l'extension pour PHP (et éventuellement vous souhaiteriez un module pour Nginx)
- compiler l'extension pour MySQL
- installer Pinboard et configurer Cron
En raison du faible nombre d'informations sur Pinba, beaucoup ont l'impression qu'elle ne fonctionnait que sur PHP5 et qu'elle appartient déjà au passé, mais comme nous le verrons plus loin — ce n'est pas le cas.
La première étape est la plus simple, il suffit d'exécuter la commande :
apt install php-pinbaDans les dépôts, cette extension est disponible jusqu'à PHP 7.3 inclus, et vous n'avez rien à compiler.
Après avoir exécuté la commande d'installation, nous avons immédiatement une extension fonctionnelle qui collecte et envoie les métriques de chaque script (durée d'exécution, mémoire, etc.) au format via UDP vers 127.0.0.1:30002.
Ces paquets UDP ne sont pour l'instant ni captés ni traités, mais cela n'affecte pas la vitesse ou la stabilité de l'exécution de vos scripts PHP.
Jusqu'à récemment, l'application capable de capturer et de traiter ces paquets UDP n'était autre que . Description «» L'installation décourage quiconque d'essayer de le lire et de le comprendre à nouveau. Dans des listes de dépendances kilométriques, il y a à la fois des noms de paquets, des noms de programmes et des liens vers des pages individuelles avec leur installation, et celles-ci ont leurs propres liens vers d'autres dépendances. Personne n'a le temps ni l'envie de s'occuper de cette confusion.
Processus d'installation n'est pas devenu .
Peut-être qu'un jour, pinba10 pourra être installé en une ou deux commandes sans avoir à lire une tonne de matériel pour comprendre comment faire, mais pour l'instant, ce n'est pas le cas.
Si vous avez quand même installé pinba_engine, c'est seulement la moitié du travail. En effet, sans , vous devrez vous contenter de données uniquement pour les dernières minutes ou agréger, stocker et visualiser les données vous-même. Heureusement, pinboard est assez simple à utiliser. .
On pourrait se demander pourquoi tant de difficultés si toutes les métriques de PHP sont déjà envoyées au port UDP au format protobuf et qu'il suffit d'écrire une application qui les capture et les stocke dans une sorte de référentiel ? Manifestement, les développeurs ayant eu cette idée sont immédiatement passés à l'écriture de leurs propres solutions, certaines d'entre elles ayant été publiées sur GitHub.
Voici un aperçu de quatre projets open source qui stockent des métriques dans des référentiels, à partir desquels ces données peuvent être facilement récupérées et visualisées, par exemple, avec Grafana.
(novembre 2017)
un serveur UDP écrit en Go qui stocke des métriques dans OpenTSDB. Si OpenTSDB est déjà utilisé dans votre projet, cette solution pourrait vous convenir, sinon je recommande de passer votre chemin.
(juin 2018)
un serveur UDP écrit en Go, du même auteur habrauser
Avantages :
- InfluxDB aggréger les métriques obtenues, et effacer l'original après un certain temps.
Inconvénients :
- cette solution ne conserve pas d'informations par rapport aux minuteurs.
- InfluxDB va conserver les adresses des pages du site comme des tags et si vous avez beaucoup d'adresses uniques, cela conduira à de la mémoire vive. À un certain moment, il "«. ()
(janvier 2019)
serveur udp en go qui conserve des métriques dans ClickHouse. C'est une solution de mon ami. C'est après m'y être familiarisé que j'ai décidé de me pencher sur pinba et ClickHouse.
Avantages :
- ClickHouse est parfaitement adapté à ce genre de tâches, il permet de compresser les données au point où vous pouvez stocker toutes vos données brutes même sans agrégations.
- si nécessaire, vous pouvez facilement agréger les métriques obtenues.
- modèle prêt à l'emploi pour Grafana.
- conserve les informations sur les minuteries.
Inconvénients :
- il n'y a pas de configuration dans laquelle vous pouvez définir le nom de la base de données et des tables, l'adresse et le port du serveur.
- lors de la conservation des données brutes, une table d'aide est utilisée pour stocker les adresses des pages et des domaines, ce qui complique ensuite les requêtes.
- autres petits détails qui découlent du premier inconvénient.
(avril 2019).
serveur udp en php qui conserve des métriques dans ClickHouse. C'est ma solution, résultat de ma familiarité avec pinba, ClickHouse et protobuf. Pendant que je me familiarisais avec cet ensemble, j'ai écrit un « proof of concept », qui à ma grande surprise ne consommait pas de ressources significatives (30 Mo de mémoire vive et moins de 1 % de l'un des huit cœurs du processeur), donc j'ai décidé de le partager avec le public.
Les avantages sont les mêmes que pour la solution précédente, j'ai aussi utilisé des noms familiers de l'original pinba_engine. J'ai également ajouté une configuration qui permet de lancer plusieurs instances du serveur pinba en même temps pour conserver des métriques dans différentes tables — c'est utile si vous souhaitez recueillir des données non seulement de php mais aussi de nginx.
Les inconvénients : « défaut fatal » et les petites choses qui ne vous conviendront pas personnellement, mais ma solution est « simple comme un chausson » et se compose d'environ 100 lignes de code, donc tout développeur php pourra changer en quelques minutes ce qui ne lui plaît pas.
Principe de fonctionnement
Le port udp 30002 est écouté. Tous les paquets entrants sont décodés selon le schéma protobuf et agrégés. Une fois par minute, un lot est inséré dans ClickHouse dans la table pinba.requests. (tous les paramètres sont configurables dans )
Un peu sur ClickHouse.
ClickHouse prend en charge différents moteurs de stockage de données. Le plus couramment utilisé est MergeTree.
Si à un moment donné, vous décidez de conserver des données agrégées pour toute la durée et des données brutes seulement pour la dernière période, vous pouvez créer une vue matérialisée avec agrégation, tout en nettoyant périodiquement la table principale pinba.requests, toutes les données restant dans la vue matérialisée. De plus, lors de la création de la table pinba.requests, vous pouvez spécifier « engine = Null », ce qui signifie que les données brutes ne seront pas du tout enregistrées sur le disque, tout en étant tout de même incluses dans la vue matérialisée et conservées sous forme agrégée. J'utilise ce schéma pour les métriques nginx, car j'ai environ 50 fois plus de requêtes sur nginx que sur php.
Ainsi, vous avez parcouru un long chemin et je ne voudrais pas vous laisser à mi-chemin, donc ce qui suit est une description détaillée de l'installation et de la configuration de ma solution et de tout ce dont vous aurez besoin, ainsi que des écueils qui ont fait échouer plus d'un navire. L'ensemble du processus d'installation est décrit pour Ubuntu 18.04 LTS et Centos 7, sur d'autres distributions et versions, le processus peut varier légèrement.
Installation
Toutes les commandes nécessaires sont rassemblées dans pour faciliter la reproductibilité des instructions. Seuls les écueils seront décrits ci-dessous.
php-pinba
Après l'installation, assurez-vous que dans le fichier /etc/php/7.2/fpm/conf.d/20-pinba.ini toutes les options sont décommentées. Dans certaines distributions (par exemple, centos), elles peuvent être commentées.
extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002clickhouse
Lors de l'installation, clickhouse vous demandera de définir un mot de passe pour l'utilisateur default. Par défaut, cet utilisateur est accessible depuis toutes les IP, donc si vous n'avez pas de pare-feu sur le serveur, assurez-vous de lui attribuer un mot de passe. Cela peut également être fait après l'installation dans le fichier /etc/clickhouse-server/users.xml.
Il convient également de noter que clickhouse utilise plusieurs ports, y compris le port 9000. Ce port est également utilisé pour php-fpm dans certaines distributions (par exemple, centos). Si vous utilisez déjà ce port, vous pouvez le changer dans le fichier /etc/clickhouse-server/config.xml.
grafana avec le plugin pour clickhouse
Après l'installation de grafana, utilisez le nom d'utilisateur admin et le mot de passe admin. Lors de la première connexion, grafana vous demandera de définir un nouveau mot de passe.
Ensuite, allez dans le menu « + » -> import et indiquez le numéro du tableau de bord à importer . Ce tableau de bord a été préparé et téléchargé pour que vous n'ayez pas à le créer vous-même à nouveau.
Grafana prend en charge ClickHouse via un plugin tiers, mais les alertes ne fonctionnent pas avec des plugins tiers (un ticket à ce sujet attend depuis plusieurs années).
pinba-server
Installer protobuf et libevent n'est pas obligatoire, mais cela améliore les performances de pinba-server. Si vous installez pinba-server dans un dossier différent de /opt, vous devrez également ajuster le fichier.
le module pinba pour nginx
Pour compiler le module, vous avez besoin des sources de la même version de nginx déjà installée sur votre serveur, ainsi que des mêmes options de compilation, sinon la compilation réussira, mais lors de la connexion du module une erreur indiquera que « le module n'est pas compatible ». Les options de compilation peuvent être consultées avec la commande nginx -V
Astuces
Tous mes sites fonctionnent uniquement via https. Le champ schema devient donc inutile, c'est pourquoi je l'utilise pour séparer web/console.
Dans les scripts accessibles depuis le web, j'utilise :
if (ini_get('pinba.enabled')) {
pinba_schema_set('web');
}
Et dans les scripts de console (par exemple, les scripts cron) :
if (ini_get('pinba.enabled')) {
pinba_schema_set('console');
}Mon tableau de bord dans Grafana a un commutateur web/console pour voir les statistiques séparément.
Vous pouvez également transmettre vos propres tags dans pinba, par exemple :
pinba_tag_set('country', $countryCode);C'est tout.
Je vous prie de répondre aux enquêtes sous l'article.
Je rappelle traditionnellement que je ne consulte et n'aide pas via des messages privés sur Habr et les réseaux sociaux.
Ouvrez un ticket sur GitHub.
Je vous demande aussi de soutenir avec des likes de cet article .
Seuls les utilisateurs enregistrés peuvent participer au sondage. , s'il vous plaît.
Quel système d'exploitation utilisez-vous sur le serveur ?
Ubuntu
CentOS
Debian
Gentoo
Red Hat
Fedora
OpenSUSE
SuSE
Unix
Windows
autre
114 utilisateurs ont voté. 11 utilisateurs se sont abstenus.
Quelle version de PHP utilisez-vous sur le serveur ?
7.3
7.2
7.1
7.0
5
autre
105 utilisateurs ont voté. 17 utilisateurs se sont abstenus.
Avez-vous déjà utilisé pinba ?
oui
non, mais j'aimerais
non et je n'en voudrais pas
non et je n'en ai jamais entendu parler
100 utilisateurs ont voté. 14 utilisateurs se sont abstenus.
Quelle version de pinba-server aimeriez-vous essayer ?
pinba_engine (moteur mysql)
pinba2 (moteur mysql)
pinboard (php + mysql)
olegfedoseev/pinba-server (go + OpenTSDB)
olegfedoseev/pinba-influxdb (go + influxdb)
pinba-server/pinba-server (go + clickhouse)
pinba-server/pinba-server (php + clickhouse)
je vais écrire le mien
autre
39 utilisateurs ont voté. 47 utilisateurs se sont abstenus.
Source : habr.com
