Dans cet article, je vais vous montrer comment utiliser pinba avec clickhouse et grafana au lieu de pinba_engine et pinboard.
Sur un projet phba, pinba est probablement le seul moyen fiable de comprendre ce qui se passe avec les performances. Certes, pinba n'est généralement implémenté que lorsque des problèmes sont déjà observés et qu'il n'est pas clair où creuser.
Souvent, personne n'a la moindre idée du nombre de fois par seconde / minute qu'un script particulier est appelé et commence à optimiser «au toucher», à partir des endroits qui semblent plus logiques.
Quelqu'un analyse les journaux nginx et quelqu'un ralentit les demandes dans une base de données.
Bien sûr, la pinba ne serait pas superflue, mais il y a plusieurs raisons pour lesquelles elle n'est pas sur tous les projets.

Et la première raison est l'installation.
Afin d'obtenir plus ou moins une sorte «d'échappement» de l'introduction de la pinba, il est très souhaitable de voir les métriques non seulement dans les dernières minutes, mais également sur une longue période de temps (de quelques jours à plusieurs mois).
Pour ce faire, vous avez besoin de:
- installer l'extension pour php (et peut-être que vous voulez un module pour nginx)
- compiler l'extension pour mysql
- installer le panneau d'affichage et configurer cron
En raison de la petite quantité d'informations sur pinba, beaucoup ont l'impression que cela ne fonctionnait que sur php5 et a longtemps été dans le passé, mais comme nous le verrons plus tard, ce n'est pas le cas.
La première étape est la plus simple, il vous suffit d'exécuter la commande:
apt install php-pinba
Dans les référentiels, cette extension est jusqu'à php 7.3 inclus et vous n'avez rien besoin de compiler.
Après avoir exécuté la commande d'installation, nous obtenons immédiatement une extension déjà fonctionnelle qui collecte et envoie les métriques de chaque script (durée, mémoire, etc.) au format
protobuf par udp à 127.0.0.1
{0002 .
Personne n'a encore capturé et traité ces packages udp, mais cela n'affecte pas la vitesse ou la stabilité de vos scripts php.
Jusqu'à récemment, seule
pinba_engine était la seule application qui pouvait intercepter et traiter ces paquets udp. La description de l'installation "
simple et concise " décourage l'envie de la lire et de la plonger à nouveau. Dans les listes de dépendances longues d'un kilomètre, il y a à la fois des noms de package et des noms de programme et des liens vers des pages individuelles avec leur installation, et ceux-ci ont leurs propres liens vers d'autres dépendances. Pour faire face à cette merde, personne n'a ni le temps ni l'envie.
Le processus d'installation de
pinba2 n'est pas devenu
beaucoup plus facile .
Peut-être qu'un jour, pinba10 peut être installé avec une ou deux commandes et ne pas lire un tas de matériel pour comprendre comment faire cela, mais jusqu'à présent, ce n'est pas le cas.
Si vous avez toujours installé pinba_engine, cela ne représente que la moitié de la bataille. Après tout, sans
tableau d'affichage, vous devrez vous limiter aux données uniquement au cours des dernières minutes ou agréger, enregistrer et visualiser vos données vous-même. C'est bien que le panneau d'affichage soit assez facile à
installer .
Il semblerait, pourquoi une telle souffrance si toutes les métriques de php vont déjà au port udp au format protobuf et tout ce qui est nécessaire est d'écrire une application qui les capturera et les stockera dans une sorte de stockage? Apparemment, les développeurs qui ont eu cette idée se sont immédiatement assis pour écrire leurs vélos, dont certains sont tombés sur le github.
Ce qui suit est un examen de quatre projets open source qui stockent des métriques dans le stockage, à partir desquelles ces données sont faciles à obtenir et à visualiser, par exemple, en utilisant grafana.
serveur udp en déplacement, qui stocke les métriques dans OpenTSDB. Peut-être que si vous utilisez déjà OpenTSDB sur le projet, alors une telle solution vous conviendra sinon je vous recommande de passer.
serveur udp en marche, à partir du même
habrayuzer qui enregistre cette fois des métriques dans InfluxDB. Sur de nombreux projets, InfluxDB est déjà utilisé pour la surveillance, cette solution peut donc être idéale pour eux.
Avantages:
- InfluxDB vous permet d' agréger les métriques reçues et de supprimer l'original après un délai spécifié.
Inconvénients:
serveur udp en déplacement qui stocke les métriques dans ClickHouse. Ceci est la décision de mon ami. C'est après l'avoir rencontré que j'ai décidé qu'il était temps de s'attaquer au pinbu et au clickhouse.
Avantages:
- le clickhouse est idéal pour de telles tâches, il vous permet de compresser tellement de données que vous pouvez stocker toutes les données brutes même sans agrégations
- si nécessaire, vous pouvez facilement agréger les mesures résultantes
- modèle prêt à l'emploi pour grafana
- enregistre les informations de la minuterie
Inconvénients:
défaut fatal- il n'y a pas de configuration dans laquelle il serait possible de configurer le nom de la base de données et des tables, l'adresse et le port du serveur.
- lors de l'enregistrement des données brutes, une table de dictionnaire auxiliaire est utilisée pour stocker les adresses de page et de domaine, ce qui complique ensuite les requêtes
- d'autres petites choses qui découlent du premier moins
serveur udp en php qui stocke les métriques dans ClickHouse. Ceci est ma solution résultant de ma connaissance de pinba, ClickHouse et protobuf. Pendant que je traitais tout ce tas, j'ai écrit une «preuve de concept» qui, de façon inattendue pour moi, n'a pas consommé de ressources importantes (30 Mo de RAM et moins de 1% de l'un des huit cœurs de processeur), j'ai donc décidé de la partager avec le public.
Les avantages sont les mêmes que dans la solution précédente, j'ai également utilisé les noms habituels du pinba_engine d'origine. J'ai également ajouté une configuration qui vous permet d'exécuter plusieurs instances de pinbaserver à la fois pour enregistrer des métriques dans différentes tables - cela est utile si vous souhaitez collecter des données non seulement à partir de php, mais également à partir de nginx.
Inconvénients - une "faille fatale" et ces petites choses avec lesquelles vous ne serez pas à l'aise personnellement, mais ma solution est "aussi simple que des pantoufles" et ne comprend qu'environ 100 lignes de code, de sorte que tout développeur php peut changer ce qu'il n'aime pas en quelques minutes.
Principe de fonctionnementOn écoute le port udp 30002. Tous les paquets entrants sont décodés selon le schéma protobuf et sont agrégés. Une fois par minute, le paquet est inséré dans la clickhouse de la table pinba.requests. (tous les paramètres sont configurés dans la
config )
Un peu sur ClickhouseClickhouse prend en charge divers moteurs de stockage. Le plus couramment utilisé est MergeTree.
Si, à un moment donné, vous décidez de stocker des données agrégées pour tout le temps et des données brutes uniquement pour le dernier, vous pouvez créer une vue matérialisée avec un regroupement et nettoyer périodiquement la table principale pinba.requests, tandis que toutes les données resteront dans la vue matérialisée. De plus, lors de la création de la table pinba.requests, vous pouvez spécifier "engine = Null", puis les données brutes ne seront pas du tout enregistrées sur le disque et en même temps, elles entreront toujours dans la vue matérialisée et stockées agrégées. J'utilise ce schéma pour les métriques nginx, car sur nginx j'ai 50 fois plus de requêtes que sur php.
Donc, vous avez parcouru un long chemin et je ne voudrais pas vous laisser à mi-chemin, donc il y aura une description détaillée de l'installation et de la configuration de ma solution et de tout ce dont vous avez besoin, ainsi que des pièges dans lesquels plus d'un navire s'est écrasé. 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.
L'installation
J'ai fait toutes les commandes nécessaires dans le
Dockerfile pour faciliter la reproductibilité des instructions. Seuls les pièges seront décrits ci-dessous.
php pinbaAprès l'installation, assurez-vous que dans le fichier /etc/php/7.2/fpm/conf.d/20-pinba.ini, toutes les options ne sont pas commentées. Dans certaines distributions (par exemple, les centos), elles peuvent être commentées.
extension=pinba.so pinba.enabled=1 pinba.server=127.0.0.1:30002
ClickhouseLors de l'installation, clickhouse vous demandera de définir un mot de passe pour l'utilisateur par défaut. Par défaut, cet utilisateur est disponible sur toutes les adresses 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, dont 9000. Ce port est également utilisé pour php-fpm dans certaines distributions (par exemple, centos). Si ce port est déjà utilisé, vous pouvez le remplacer par un autre dans le fichier /etc/clickhouse-server/config.xml.
grafana avec plugin clickhouseAprès avoir installé grafana, utilisez le nom d'utilisateur administrateur et le mot de passe administrateur. À la première entrée, le graphon vous demandera de définir un nouveau mot de passe.
Ensuite, allez dans le menu "+" -> importation et spécifiez le numéro de tableau de bord pour l'importation
10011 . J'ai préparé et rempli ce tableau de bord pour que vous n'ayez pas à le refaire vous-même.
Le grafana prend en charge le travail avec le clickhouse via un plug-in tiers, mais pour les plug-ins tiers, grafana ne fonctionne pas d'alertes (un ticket pour cela existe depuis plusieurs années).
serveur pinbaL'installation de protobuf et libevent est facultative, mais améliore les performances du serveur pinba. Si vous installez pinba-server dans un dossier autre que / opt, vous devrez également corriger le fichier de
script systemd .
module pinba sous nginxPour compiler le module, vous avez besoin des sources de la même version de nginx qui est déjà installée sur votre serveur, ainsi que des mêmes options de compilation, sinon l'assembly réussira, mais lorsque le module est connecté, une erreur sera générée que le module est incompatible binaire. Les options de compilation peuvent être affichées à l'aide de la commande nginx -V
Astuces de vieTous mes sites fonctionnent uniquement sur https. Le champ du schéma devient vide de sens, donc je l'utilise pour séparer le web / la console.
Dans les scripts accessibles depuis le Web, j'utilise:
if (ini_get('pinba.enabled')) { pinba_schema_set('web'); }
Et dans la console (par exemple, les scripts de couronne):
if (ini_get('pinba.enabled')) { pinba_schema_set('console'); }
Dans mon tableau de bord dans graphan, il y a un commutateur web / console pour afficher les statistiques séparément.
Vous pouvez également transférer vos tags vers pinbu, par exemple:
pinba_tag_set('country', $countryCode);
C’est tout.Une grosse demande pour répondre aux sondages sous l'article.
Traditionnellement, je préviens que je ne conseille pas et n'aide pas à travers des messages personnels de Habr et des réseaux sociaux.
Commencez un ticket sur github.
En outre, veuillez prendre en charge la
version anglaise de cet article
sur reddit avec les goûts .