Estadístiques i seguiment dels scripts PHP en temps real. ClickHouse i Grafana ajuden a Pinba

En aquest article us explicaré com utilitzar pinba amb clickhouse i grafana en comptes de pinba_engine i pinboard.

En un projecte PHP, pinba és potser l'única manera fiable d'entendre què passa amb el rendiment. És cert que pinba sol implementar-se només quan ja s'observen problemes i no està clar "on excavar".

Sovint ningú no té ni idea de quantes vegades per segon/minut es diu aquest o aquell script i comencen a optimitzar “al tacte”, partint d'aquells llocs que semblen més lògics.

Alguns analitzen els registres de nginx, mentre que altres analitzen consultes de bases de dades lentes.

Per descomptat, pinba no seria superflu, però hi ha diverses raons per les quals no tots els projectes en tenen.

Estadístiques i seguiment dels scripts PHP en temps real. ClickHouse i Grafana ajuden a Pinba

I el primer motiu és la instal·lació.

Per obtenir més o menys algun tipus d'"esgotament" de la implementació de Pinba, és molt desitjable veure mètriques no només dels últims minuts, sinó també durant un llarg període de temps (des de dies fins a mesos).

Per a això, necessiteu:

  • instal·leu l'extensió per a php (i potser voldreu un mòdul per a nginx)
  • extensió de compilació per a mysql
  • instal·leu el pinboard i configureu cron

A causa de la poca informació sobre Pinba, molta gent té la impressió que només funcionava amb PHP5 i fa temps que és cosa del passat, però com veurem més endavant, no és així.

El primer pas és el més senzill, tot el que heu de fer és executar l'ordre:

apt install php-pinba

Aquesta extensió està disponible als repositoris fins a php 7.3 inclòs i no cal que compileu res.

Després d'executar l'ordre d'instal·lació, rebem immediatament una extensió de treball que recull i envia mètriques per a cada script (temps d'execució, memòria, etc.) en el format protobuf mitjançant udp a 127.0.0.1:30002.

Fins ara ningú ha capturat ni processat aquests paquets UDP, però això no afecta de cap manera negativament la velocitat o l'estabilitat dels vostres scripts PHP.

Fins fa poc, l'única aplicació que podia capturar i processar aquests paquets UDP era motor_pinba. Descripció "simple i concisa"La instal·lació descoratja el desig de llegir-hi i aprofundir-hi de nou. Les llistes de dependències d'uns quilòmetres de llargada contenen tant els noms dels paquets com els noms dels programes i enllaços a pàgines individuals amb la seva instal·lació, i aquestes tenen els seus propis enllaços a altres dependències. Ningú té el temps ni les ganes de fer front a aquesta merda.

Procés d'instal·lació pinba2 no ho va fer sobretot més fàcil.

Potser algun dia serà possible instal·lar pinba10 amb una o dues ordres i no haver de llegir un munt de material per entendre com fer-ho, però de moment no és així.

Si instal·leu pinba_engine, això és només la meitat de la batalla. Després de tot, sense pissarra haureu de limitar-vos a les dades dels últims minuts, o haureu d'agregar, emmagatzemar i visualitzar les dades vosaltres mateixos. És bo que la pissarra sigui bastant senzilla d'utilitzar instal·lació.

Sembla, per què patir tant si totes les mètriques de php ja s'envien al port udp en format protobuf i tot el que necessiteu és escriure una aplicació que les atrapi i les posi en algun tipus d'emmagatzematge? Pel que sembla, aquells desenvolupadors que van tenir aquesta idea immediatament es van asseure a escriure les seves pròpies idees, algunes de les quals van acabar a GitHub.

A continuació es mostra una visió general de quatre projectes de codi obert que guarden mètriques a l'emmagatzematge, des dels quals aquestes dades es poden recuperar i visualitzar fàcilment, per exemple, utilitzant grafana.

olegfedoseev/pinba-server (novembre 2017)

Servidor udp en marxa que desa mètriques a OpenTSDB. Potser si ja esteu utilitzant OpenTSDB al vostre projecte, aquesta solució us convé, en cas contrari, us recomano passar-la.

olegfedoseev/pinba-influxdb (juny de 2018)

servidor udp en marxa, des del mateix navegador, que aquesta vegada emmagatzema les mètriques a InfluxDB. Molts projectes ja utilitzen InfluxDB per al seguiment, de manera que aquesta solució pot ser perfecta per a ells.

Pros:

  • InfluxDB permet agregar les mètriques rebudes i suprimir l'original després d'un temps especificat.

Contres:

  • Aquesta solució no desa informació sobre els temporitzadors.
  • InfluxDB emmagatzemarà les adreces de les pàgines del lloc com a etiquetes i si teniu moltes adreces de pàgines úniques, això comportarà augment del consum memòria d'accés aleatori. Des d'un moment determinat ell "començarà a menjar-se el record com un boig". (font)

ClickHouse-Ninja/Proton (gener 2019)

servidor udp en marxa, que desa mètriques a ClickHouse. Aquesta és la solució del meu amic. Va ser després de familiaritzar-me amb ell que vaig decidir que era hora d'enfrontar-me a Pinbu i Clickhouse.

Pros:

  • Clickhouse és ideal per a aquestes tasques; us permet comprimir les dades tant que podeu emmagatzemar totes les dades en brut fins i tot sense agregacions.
  • si cal, podeu agregar fàcilment les mètriques resultants
  • plantilla preparada per a grafana
  • desa informació sobre els temporitzadors

Contres:

  • defecte fatal
  • no hi ha cap configuració en què es pugui configurar el nom de la base de dades i les taules, l'adreça i el port del servidor.
  • quan s'emmagatzemen dades en brut, s'utilitza una taula de diccionari auxiliar per emmagatzemar adreces de pàgines i dominis, cosa que complica les consultes posteriors.
  • altres petites coses que segueixen del primer menys

servidor-pinba/servidor-pinba (abril de 2019)

servidor udp a php, que desa mètriques a ClickHouse. Aquesta és la meva solució, que és el resultat de conèixer pinba, ClickHouse i protobuf. Mentre ordenava tot aquest grup, vaig escriure una "prova de concepte", que, inesperadament per a mi, no consumia recursos significatius (30 MB de RAM i menys de l'1% d'un dels vuit nuclis de processador), així que vaig va decidir compartir-ho amb el públic.

Els avantatges són els mateixos que la solució anterior, també vaig utilitzar els noms habituals del pinba_engine original. També he afegit una configuració que us permet llançar diverses instàncies del servidor pinbase alhora per desar mètriques en diferents taules; això és útil si voleu recollir dades no només de php, sinó també de nginx.
Desavantatges: "defecte fatal" i aquelles petites coses que no us convindran personalment, però la meva solució és "tan simple com una sabatilla" i consta només d'unes 100 línies de codi, de manera que qualsevol desenvolupador de PHP pot canviar allò que no li agrada. en un parell de minuts.

Com funciona?

S'escolta el port UDP 30002. Tots els paquets entrants es descodifiquen segons l'esquema protobuf i s'agreguen. Una vegada per minut, s'insereix un paquet a la casa de clics a la taula pinba.requests. (tots els paràmetres estan configurats a config)

Una mica sobre Clickhouse

Clickhouse admet diferents motors d'emmagatzematge de dades. El més utilitzat és MergeTree.

Si en algun moment decidiu emmagatzemar dades agregades per a tot el temps, i dades en brut només per a l'últim, podeu crear una vista materialitzada amb agrupació i netejar periòdicament la taula principal de pinba.requests, mentre que totes les dades romandran a la visió materialitzada. A més, en crear la taula pinba.requests, podeu especificar "motor = Null", aleshores les dades en brut no es desaran en absolut al disc i, al mateix temps, encara acabaran a la vista materialitzada i es desaran agregades. . Utilitzo aquest esquema per a mètriques nginx, perquè a nginx tinc 50 vegades més sol·licituds que a php.

Així doncs, heu recorregut un llarg camí i no m'agradaria deixar-vos a mig camí, així que el següent és una descripció detallada de la instal·lació i configuració de la meva solució i tot el que necessiteu, així com els inconvenients que han provocat més d'un vaixell. xocar. Es descriu tot el procés d'instal·lació per a Ubuntu 18.04 LTS i Centos 7; el procés pot diferir lleugerament en altres distribucions i versions.

Instal · lació

He posat totes les ordres necessàries Dockerfile per facilitar la reproductibilitat de les instruccions. A continuació només es descriuran les trampes.

php-pinba

Després de la instal·lació, assegureu-vos que al fitxer /etc/php/7.2/fpm/conf.d/20-pinba.ini heu descomentat totes les opcions. En algunes distribucions (per exemple, centos) es poden comentar.

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

casa de clics

Durant la instal·lació, clickhouse us demanarà que establiu una contrasenya per a l'usuari predeterminat. Per defecte, aquest usuari és accessible des de totes les IP, de manera que si no teniu cap tallafoc al vostre servidor, assegureu-vos d'establir-hi una contrasenya. Això també es pot fer després de la instal·lació al fitxer /etc/clickhouse-server/users.xml.

També val la pena assenyalar que clickhouse utilitza diversos ports, inclòs el 9000. Aquest port també s'utilitza per a php-fpm en algunes distribucions (per exemple, centos). Si ja feu servir aquest port, podeu canviar-lo per un altre al fitxer /etc/clickhouse-server/config.xml.

grafana amb el connector Clickhouse

Després d'instal·lar Grafana, utilitzeu l'administrador d'inici de sessió i l'administrador de la contrasenya. Quan inicieu sessió per primera vegada, Grafana us demanarà que establiu una nova contrasenya.

A continuació, aneu al menú "+" -> importació i indiqueu el número del tauler per a la importació 10011. He preparat i pujat aquest tauler perquè no ho hagis de tornar a fer tu mateix.

Grafana admet treballar amb clickhouse mitjançant un connector de tercers, però Grafana no té alertes per a connectors de tercers (fa anys que hi ha un bitllet per a això).

servidor pinba

La instal·lació de protobuf i libevent és opcional, però millora el rendiment del servidor pinba. Si instal·leu pinba-server en una carpeta diferent de /opt, també haureu de corregir script systemd dossier.

mòdul pinba per a nginx

Per compilar un mòdul, necessiteu codis font de la mateixa versió de nginx que ja està instal·lada al vostre servidor, així com les mateixes opcions de compilació, en cas contrari, la compilació tindrà èxit, però en connectar el mòdul, es generarà un error. "el mòdul no és compatible binari". Les opcions de compilació es poden veure mitjançant l'ordre nginx -V

Pirates de la vida

Tots els meus llocs només funcionen a https. El camp de l'esquema no té sentit, així que l'utilitzo per separar web/consola.

En els scripts accessibles des del web faig servir:

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

I als scripts de consola (per exemple, scripts cron):

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

Al meu tauler de control de Grafana hi ha un interruptor web/consola per veure les estadístiques per separat.

També podeu enviar les vostres etiquetes a Pinba, per exemple:

pinba_tag_set('country', $countryCode);

Això és tot.

Si us plau, respon les enquestes a sota de l'article.

Com és habitual, us adverteixo que no assessoro ni ajudo a través de missatges personals a Habr i xarxes socials.

Crea un bitllet a Github.

També si us plau, doneu suport amb likes versió en anglès aquest article a reddit.

Només els usuaris registrats poden participar en l'enquesta. Inicia sessiósi us plau.

Quin sistema operatiu feu servir al servidor?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SUSE

  • Unix

  • Windows

  • un altre

Han votat 114 usuaris. 11 usuaris es van abstenir.

Quina versió de php fas servir al servidor?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • un altre

Han votat 105 usuaris. 17 usuaris es van abstenir.

Has fet servir mai pinba?

  • no, però m'agradaria

  • no i no voldria

  • no i no he sentit a parlar d'ella

Han votat 100 usuaris. 14 usuaris es van abstenir.

Quina versió del servidor Pinba t'agradaria provar?

  • pinba_engine (motor mysql)

  • pinba2 (motor mysql)

  • pissarra (php + mysql)

  • olegfedoseev/pinba-server (anar + OpenTSDB)

  • olegfedoseev/pinba-influxdb (anar + influxdb)

  • servidor pinba/servidor pinba (anar + clickhouse)

  • servidor pinba/servidor pinba (php + clickhouse)

  • Jo mateix escriuré el meu

  • un altre

Han votat 39 usuaris. 47 usuaris es van abstenir.

Font: www.habr.com

Afegeix comentari