Statistiques et suivi des scripts PHP en temps réel. ClickHouse et Grafana vont à Pinba pour obtenir de l'aide

Dans cet article, je vais expliquer comment utiliser pinba avec clickhouse et grafana au lieu de pinba_engine et pinboard.

Sur le projet php, pinba est probablement le seul moyen fiable de comprendre ce qui se passe avec les performances. Mais généralement, les gens commencent à utiliser Pinba uniquement lorsque des problèmes sont déjà observés et qu'il n'est pas clair où chercher.

Souvent, les développeurs n'ont aucune idée du nombre de RPS de chaque script. Ils commencent donc à optimiser à partir de lieux qui semblent avoir des problèmes.

Quelqu'un analyse les journaux nginx, et quelqu'un est lent à interroger la 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 de tirer plus ou moins une sorte de profit de l'utilisation de pinba, il est hautement souhaitable de voir les métriques non seulement dans les dernières minutes, mais également sur une longue période (de jours en mois).

Pour cela, il vous faut:

  • installez l'extension pour php (et vous voudrez peut-être avoir un module pour nginx)
  • compiler des extensions pour mysql
  • installer le panneau d'affichage et configurer cron

Parce que nous avons récemment un peu d'informations sur pinba, beaucoup de gens pensent que cela ne fonctionnait que sur php5 et qu'il était parti, 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 existe jusqu'à php 7.3 inclus et vous n'avez pas besoin de compiler quoi que ce soit.

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.) par udp à 127.0.0.1:370002 au format protobuf .

Nous n'avons pas encore d'application pour intercepter et traiter ces paquets udp, mais cela n'affecte pas vraiment la vitesse ou la stabilité de vos scripts php.

Jusqu'à récemment, seul pinba_engine pouvait intercepter et traiter ces paquets udp. La description d' une installation " simple " décourage toujours plus de la lire. Dans les longues listes de dépendances, il y a des noms de package et des noms de programme et des liens vers d'autres pages avec d'autres dépendances. Personne n'a le temps ni l'envie de faire face à cette merde.

Le processus d'installation de pinba2 n'est pas particulièrement facile .

Peut-être que la fonctionnalité pinba10 peut être installée avec une ou deux commandes et sans lire un tas de trucs pour comprendre comment le faire, mais pour l'instant ce n'est pas comme ça.

L'installation de pinba_engine n'est que la moitié de l'histoire. Après tout, sans tableau d' affichage, vous aurez des données limitées pour les dernières minutes seulement. C'est bien que le panneau d'affichage soit assez simple dans une installation .

Mais 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 peut attraper les paquets udp et les mettre dans une sorte de stockage? Apparemment, les développeurs qui le pensaient ont créé leurs propres applications et dont certains l'ont publié sur le githab.

Vous trouverez ci-dessous un examen de quatre projets open source qui stockent des métriques dans le stockage, à partir desquelles ces données sont facilement obtenues et visualisées par le grafana.

olegfedoseev / pinba-influxdb (novembre 2017)


serveur udp sur golang, qui enregistre les métriques dans OpenTSDB. Peut-être que si vous utilisez déjà OpenTSDB sur votre projet, une telle solution vous conviendrait.

olegfedoseev / pinba-influxdb (juin 2018)


serveur udp sur golang, du même utilisateur github , qui enregistre cette fois des métriques dans InfluxDB. De nombreux projets utilisent déjà InfluxDB pour la surveillance, cette solution peut donc leur être utile.

avantages:

  • Influx permet d'agréger les métriques résultantes et de supprimer l'original après un temps spécifié.

inconvénients:

  • cette solution n'enregistre pas d'informations pour les minuteries.
  • InfluxDB enregistrera les adresses des pages sous forme de balises et si vous avez beaucoup d'adresses uniques de pages, cela augmentera la consommation de RAM. A partir d'un certain point, il " commencera à utiliser beaucoup de mémoire ". ( source )

ClickHouse-Ninja / Proton (janvier 2019)


serveur udp sur golang, qui enregistre les métriques dans ClickHouse. Ceci est la demande de mon ami. Après utilisation, j'ai commencé à travailler sur ma propre application pour pinba avec clickhouse.

avantages:

  • Le clickhouse est idéal pour de telles tâches, il vous permet de compresser les données afin que vous puissiez stocker toutes les données brutes même sans agrégations
  • si vous en avez besoin, vous pouvez facilement agréger les mesures résultantes
  • modèle prêt pour grafana
  • enregistre les informations pour les minuteries

inconvénients:

  • Pas inventé ici
  • il n'y a pas de configuration pour le nom de la base de données et des tables, pour l'adresse et le port du
    serveur.
  • d'autres petites choses qui découlent du premier moins

serveur pinba / serveur pinba (avril 2019)


serveur udp sur php, qui enregistre les métriques dans ClickHouse. Ceci est mon application, qui est le résultat de mon RND de pinba, ClickHouse et protobuf. 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 les gens.

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 pinbasver pour enregistrer des métriques dans différentes tables - cela est utile si vous souhaitez collecter des mesures non seulement à partir de php, mais aussi à partir de nginx.

Inconvénients - "Pas inventé ici" et ces petites choses qui ne vous conviennent pas personnellement, mais ma solution est très simple et ne comprend qu'environ 100 lignes de code, donc tout développeur php peut changer quoi que ce soit en quelques minutes qu'il fait pas comme.

Comment ça marche

Il é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 lot de packages est inséré dans la clickhouse de la table pinba.requests. (tous les paramètres sont configurés dans la configuration )

À propos de 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 stocker des données agrégées pour toujours et des données brutes uniquement pour ces dernières, vous pouvez créer une vue matérialisée avec regroupement et nettoyer périodiquement la table principale pinba.requests, tandis que toutes les données restent dans la vue matérialisée. De plus, vous pouvez spécifier "engine = Null" pour la table pinba.requests, afin que les données brutes ne soient pas du tout enregistrées sur le disque et en même temps, elles seront toujours incluses dans la vue matérialisée. J'utilise ce schéma pour les métriques nginx, car sur nginx j'ai 50 fois plus de requêtes que sur php.

Vous avez parcouru un long chemin, il y aura donc une description détaillée de l'installation et de la configuration de ma solution et de tout ce dont vous avez besoin. 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 différer légèrement.

L'installation


J'ai mis toutes les commandes nécessaires à Dockerfile pour la reproductibilité des instructions. Seuls les problèmes seront décrits ci-dessous.

php pinba

Après l'installation, assurez-vous d'avoir décommenté toutes les options du fichier /etc/php/7.2/fpm/conf.d/20-pinba.ini. Dans certaines distributions (par exemple, les centos), cela peut être commenté.

 extension = pinba.so pinba.enabled = 1 pinba.server = 127.0.0.1:30002 

Clickhouse

Lors 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 à partir de toutes les adresses IP. Donc, si vous n'avez pas de pare-feu sur votre serveur, veuillez définir un mot de passe. Cela peut également être fait après l'installation dans le fichier /etc/clickhouse-server/users.xml.

Notez également que clickhouse utilise plusieurs ports, dont 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 en un autre dans le fichier /etc/clickhouse-server/config.xml.

grafana avec plugin clickhouse

Après avoir installé le grafana, utilisez le nom d'utilisateur "admin" et le mot de passe "admin". Lors de votre première connexion, le grafana vous demandera de définir un nouveau mot de passe.

Ensuite, allez dans le menu "+" -> importer et spécifiez le nombre de tableaux de bord à importer 10011 . J'ai préparé ce tableau de bord afin que vous n'ayez pas besoin de le refaire vous-même.

Grafana prend en charge ClickHouse par des plugins tiers, mais grafana ne prend pas en charge les alertes pour les plugins tiers (le ticket existe déjà depuis plusieurs années).

serveur pinba

L'installation de protobuf et libevent est facultative, mais elle améliore les performances du serveur pinba. Si vous installez un serveur pinba dans un dossier autre que / opt, vous devrez également modifier le fichier de script systemd .

module pinba sous nginx

Pour compiler le module, vous avez besoin du code source 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'assemblage réussira, mais lorsque le module sera connecté, vous aurez une erreur " le module est binaire incompatible. " Les options de compilation peuvent être affichées à l'aide de la commande "nginx -V".

Lifehacks

Tous mes sites fonctionnent uniquement sur https. J'utilise donc le champ "schéma" pour séparer le web / la console.
Dans les scripts web que j'utilise:

 if (ini_get('pinba.enabled')) {    pinba_schema_set('web'); } 

et dans la console (par exemple, cron-scripts):

 if (ini_get ('pinba.enabled')) {    pinba_schema_set('console'); } 

Dans mon tableau de bord dans grafana, il y a un commutateur web / console pour afficher les statistiques séparément.
Vous pouvez également envoyer vos tags à la pinba, par exemple:

 pinba_tag_set('country', $countryCode); 

C'est tout.

Vous pouvez également lire la version russe .

Veuillez répondre aux sondages sous l'article et soutenez-moi sur Reddit .

Source: https://habr.com/ru/post/fr449818/


All Articles