Statistiques et suivi des scripts PHP en temps réel. ClickHouse et Grafana viennent en aide à Pinba

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

Sur un projet PHP, pinba est peut-être le seul moyen fiable de comprendre ce qui se passe avec les performances. Certes, le pinba n'est généralement mis en œuvre 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 tel ou tel script est appelé et ils commencent à optimiser « au toucher », en commençant par les endroits qui semblent les plus logiques.

Certains analysent les journaux nginx, tandis que d'autres analysent les requêtes de base de données lentes.

Bien sûr, le pinba ne serait pas superflu, mais il y a plusieurs raisons pour lesquelles tous les projets ne l'ont pas.

Statistiques et suivi des scripts PHP en temps réel. ClickHouse et Grafana viennent en aide à Pinba

Et la première raison est l’installation.

Afin d'obtenir plus ou moins une sorte d'« épuisement » de la mise en œuvre de Pinba, il est très souhaitable de voir les métriques non seulement pour les dernières minutes, mais aussi sur une longue période (de quelques jours à plusieurs mois).

Pour ce faire:

  • installez l'extension pour php (et vous voudrez peut-être un module pour nginx)
  • compiler l'extension pour mysql
  • installer Pinboard et configurer cron

En raison du peu d’informations sur Pinba, beaucoup de gens ont l’impression que cela ne fonctionne que sur PHP5 et appartient depuis longtemps au passé, mais comme nous le verrons plus tard, ce n’est pas le cas.

La première étape est la plus simple, il suffit d'exécuter la commande :

apt install php-pinba

Cette extension est disponible dans les référentiels jusqu'à php 7.3 inclus et vous n'avez rien à compiler.

Après avoir exécuté la commande d'installation, nous recevons immédiatement une extension fonctionnelle qui collecte et envoie des métriques pour chaque script (durée d'exécution, mémoire, etc.) au format protobuf via udp vers 127.0.0.1:30002.

Jusqu'à présent, personne n'a détecté ou traité ces paquets UDP, mais cela n'affecte en rien la vitesse ou la stabilité de vos scripts PHP.

Jusqu'à récemment, la seule application capable de capturer et de traiter ces paquets UDP était pinba_engine. Description "simple et concis" L'installation décourage l'envie de le lire et de s'y plonger à nouveau. Les listes de dépendances d'un kilomètre de long contiennent à la fois les noms de packages et les noms de programmes ainsi que 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 merde.

Processus d'installation pinba2 n'a pas particulièrement plus facile.

Peut-être qu'un jour il sera possible d'installer pinba10 avec une ou deux commandes et de ne pas avoir à lire un tas de documents pour comprendre comment le faire, mais pour l'instant ce n'est pas le cas.

Si vous installez pinba_engine, ce n'est que la moitié de la bataille. Après tout, sans tableau d'affichage vous devrez vous limiter aux données des dernières minutes seulement, ou vous devrez agréger, stocker et visualiser les données vous-même. C'est bien que le tableau d'affichage soit assez simple à utiliser installation.

Il semblerait, pourquoi une telle souffrance si toutes les métriques de php sont déjà envoyées au port udp au format protobuf et que tout ce dont vous avez besoin est d'écrire une application qui les capturera et les placera dans une sorte de stockage ? Apparemment, les développeurs qui ont eu cette idée se sont immédiatement mis à écrire leurs propres idées, dont certaines ont fini sur GitHub.

Ce qui suit est un aperçu de quatre projets open source qui enregistrent des métriques dans un stockage, à partir desquels ces données peuvent être facilement récupérées et visualisées, par exemple à l'aide de grafana.

olegfedoseev/serveur pinba (novembre 2017)

Serveur udp en cours qui enregistre les métriques dans OpenTSDB. Peut-être que si vous utilisez déjà OpenTSDB dans votre projet, alors cette solution vous conviendra, sinon je vous recommande de la laisser de côté.

olegfedoseev/pinba-influxdb (juin 2018)

serveur udp en déplacement, à partir du même navigateur, qui stocke cette fois les métriques dans InfluxDB. De nombreux projets utilisent déjà InfluxDB pour la surveillance, cette solution peut donc être parfaite pour eux.

Avantages:

  • InfluxDB il permet regrouper les métriques reçues et supprimer l’original après une heure spécifiée.

Inconvénients:

ClickHouse-Ninja/Proton (janvier 2019)

serveur udp en déplacement, qui enregistre les métriques dans ClickHouse. C'est la solution de mon ami. C'est après en avoir pris connaissance que j'ai décidé qu'il était temps d'affronter Pinbu et Clickhouse.

Avantages:

  • Clickhouse est idéal pour de telles tâches ; il vous permet de compresser tellement les données que vous pouvez stocker toutes les données brutes même sans agrégations.
  • si nécessaire, vous pouvez facilement regrouper les métriques résultantes
  • modèle prêt à l'emploi pour grafana
  • enregistre les informations sur les minuteries

Inconvénients:

  • erreur fatale
  • il n'y a pas de configuration dans laquelle vous pouvez configurer le nom de la base de données et des tables, l'adresse et le port du serveur.
  • lors du stockage des données brutes, une table de dictionnaire auxiliaire est utilisée pour stocker les adresses de page et de domaine, ce qui complique les requêtes ultérieures
  • d'autres petites choses qui découlent du premier moins

serveur pinba/serveur pinba (avril 2019)

serveur udp en php, qui enregistre les métriques dans ClickHouse. C'est ma solution, qui est le résultat de la connaissance de pinba, ClickHouse et protobuf. Pendant que je triais tout ça, j'ai écrit une « preuve de concept », qui, contre toute attente pour moi, n'a pas consommé de ressources importantes (30 Mo de RAM et moins de 1 % d'un des huit cœurs de processeur), j'ai donc a décidé de le partager avec le public.

Les avantages sont les mêmes que 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 de lancer plusieurs instances de serveur Pinbase à la fois afin d'enregistrer les métriques dans différentes tables - ceci est utile si vous souhaitez collecter des données non seulement à partir de php, mais également à partir de nginx.
Inconvénients - "défaut fatal" et ces petites choses qui ne vous conviendront pas personnellement, mais ma solution est "aussi simple qu'une pantoufle" et ne comprend qu'environ 100 lignes de code, donc n'importe quel développeur PHP peut changer ce qu'il n'aime pas dans quelques minutes.

Comment ça marche?

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

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 stocker des données agrégées pour toujours et des données brutes uniquement pour la dernière, vous pouvez alors créer une vue matérialisée avec regroupement et nettoyer périodiquement la table principale pinba.requests, tandis que toutes les données resteront dans le vue matérialisée. De plus, lors de la création de la table pinba.requests, vous pouvez spécifier "engine = Null", alors les données brutes ne seront pas du tout enregistrées sur le disque, et en même temps elles finiront toujours dans la vue matérialisée et seront enregistré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.

Alors, vous avez parcouru un long chemin et je ne voudrais pas vous laisser à mi-chemin, alors 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 avez besoin, ainsi que des pièges qui ont causé plus d'un navire. s'écraser. L'ensemble du processus d'installation est décrit pour Ubuntu 18.04 LTS et Centos 7 ; le processus peut différer légèrement sur d'autres distributions et versions.

Installation

J'ai mis toutes les commandes nécessaires Dockerfile pour faciliter la reproductibilité des instructions. Seuls les pièges 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 vous avez décommenté toutes les options. Sur certaines distributions (par exemple centos), ils peuvent être commentés.

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

click house

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

A noter é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 remplacer par un autre dans le fichier /etc/clickhouse-server/config.xml.

grafana avec le plugin Clickhouse

Après avoir installé Grafana, utilisez le login admin et le mot de passe admin. Lorsque vous vous connectez pour la première fois, Grafana vous demandera de définir un nouveau mot de passe.

Ensuite, allez dans le menu « + » -> importer et indiquez le numéro du tableau de bord à importer 10011. J'ai préparé et mis en ligne ce tableau de bord afin que vous n'ayez plus à le faire vous-même.

Grafana prend en charge le travail avec Clickhouse via un plugin tiers, mais Grafana n'a pas d'alertes pour les plugins tiers (il existe un ticket pour cela depuis plusieurs années).

serveur pinba

L'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 script système fichier.

module pinba pour nginx

Pour compiler un module, vous avez besoin des codes 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 construction réussira, mais lors de la connexion du module, une erreur sera générée. "le module n'est pas compatible binaire." Les options de compilation peuvent être visualisées à l'aide de la commande nginx -V

Astuces pour la vie de tous les jours

Tous mes sites fonctionnent uniquement en https. Le champ schéma n'a plus de sens, je l'utilise donc 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 les scripts de console (par exemple, les scripts cron) :

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

Dans mon tableau de bord dans Grafana, il existe un commutateur Web/console pour afficher les statistiques séparément.

Vous pouvez également envoyer vos tags à Pinba, par exemple :

pinba_tag_set('country', $countryCode);

Voilà tout.

Veuillez répondre aux sondages sous l’article.

Comme d'habitude, je vous préviens que je ne conseille ni n'aide via des messages personnels sur Habr et les réseaux sociaux.

Créez un ticket sur Github.

S'il vous plaît également soutenir avec des likes version anglaise cet article sur Reddit.

Seuls les utilisateurs enregistrés peuvent participer à l'enquête. se connecters'il te plait.

Quel OS 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 utilises-tu 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é du pinba ?

  • oui

  • non, mais j'aimerais

  • non et je ne voudrais pas

  • non et je n'ai pas entendu parler d'elle

100 utilisateurs ont voté. 14 utilisateurs se sont abstenus.

Quelle version du serveur Pinba souhaiteriez-vous essayer ?

  • pinba_engine (moteur MySQL)

  • pinba2 (moteur mysql)

  • tableau d'affichage (php + mysql)

  • olegfedoseev/pinba-server (aller + OpenTSDB)

  • olegfedoseev/pinba-influxdb (aller + influxdb)

  • serveur pinba/serveur pinba (go + clickhouse)

  • serveur pinba/serveur pinba (php + clickhouse)

  • j'écrirai le mien moi-même

  • autre

39 utilisateurs ont voté. 47 utilisateurs se sont abstenus.

Source: habr.com

Ajouter un commentaire