Estatísticas e seguimento de scripts PHP en tempo real. ClickHouse e Grafana veñen en auxilio de Pinba

Neste artigo vouche dicir como usar pinba con clickhouse e grafana en lugar de pinba_engine e pinboard.

Nun proxecto PHP, pinba é quizais a única forma fiable de entender o que está a suceder co rendemento. É certo que pinba adoita implementarse só cando xa se observan problemas e non está claro "onde cavar".

Moitas veces ninguén ten idea de cantas veces por segundo/minuto se chama este ou aquel guión e comezan a optimizarse “ao tacto”, partindo daqueles lugares que parecen máis lóxicos.

Algúns analizan os rexistros de nginx, mentres que outros analizan consultas lentas de bases de datos.

Por suposto, pinba non sería superfluo, pero hai varias razóns polas que non todos os proxectos o teñen.

Estatísticas e seguimento de scripts PHP en tempo real. ClickHouse e Grafana veñen en auxilio de Pinba

E a primeira razón é a instalación.

Para obter máis ou menos algún tipo de "esgotamento" da implementación de Pinba, é moi desexable ver métricas non só dos últimos minutos, senón tamén durante un longo período de tempo (de días a meses).

Para iso necesitas:

  • instalar a extensión para php (e pode querer un módulo para nginx)
  • extensión de compilación para mysql
  • instalar pinboard e configurar cron

Debido á pouca cantidade de información sobre Pinba, moitas persoas teñen a impresión de que só funcionaba en PHP5 e hai moito tempo que é cousa do pasado, pero como veremos máis adiante, non é así.

O primeiro paso é o máis sinxelo, todo o que tes que facer é executar o comando:

apt install php-pinba

Esta extensión está dispoñible nos repositorios ata php 7.3 incluído e non precisa compilar nada.

Despois de executar o comando de instalación, recibimos inmediatamente unha extensión de traballo que recolle e envía métricas para cada script (tempo de execución, memoria, etc.) no formato protobuf vía udp ata 127.0.0.1:30002.

Ata agora ninguén capturou nin procesou estes paquetes UDP, pero isto non afecta de ningún xeito negativamente á velocidade nin á estabilidade dos teus scripts PHP.

Ata hai pouco, a única aplicación que podía capturar e procesar estes paquetes UDP era motor_pinba. Descrición "sinxelo e conciso"A instalación desalienta o desexo de ler e afondar nela de novo. As listas de dependencias de quilómetros de lonxitude conteñen tanto os nomes de paquetes como os nomes de programas e ligazóns a páxinas individuais coa súa instalación, e estas teñen as súas propias ligazóns a outras dependencias. Ninguén ten tempo nin ganas de tratar con esta merda.

Proceso de instalación pinba2 non especialmente máis doado.

Quizais algún día sexa posible instalar pinba10 con un ou dous comandos e non ter que ler un montón de material para entender como facelo, pero de momento non é así.

Se instalas pinba_engine, esta é só a metade da batalla. Despois de todo, sen taboleiro de anuncios terás que limitarte aos datos dos últimos minutos, ou terás que agregalos, almacenalos e visualizalos ti mesmo. É bo que o pinboard é bastante sinxelo de usar instalación.

Parece que, por que sufrir tanto se todas as métricas de php xa están enviadas ao porto udp en formato protobuf e o único que necesitas é escribir unha aplicación que as capte e as poña nalgún tipo de almacenamento? Ao parecer, aqueles desenvolvedores aos que se lles ocorreu esta idea sentáronse inmediatamente para escribir as súas propias ideas, algunhas das cales acabaron en GitHub.

O seguinte é unha visión xeral de catro proxectos de código aberto que gardan métricas no almacenamento, dos que estes datos se poden recuperar e visualizar facilmente, por exemplo, usando grafana.

olegfedoseev/pinba-server (novembro 2017)

Servidor udp en marcha que garda métricas en OpenTSDB. Quizais se xa estás a usar OpenTSDB no teu proxecto, esta solución che convén, se non, recoméndoche pasar por alí.

olegfedoseev/pinba-influxdb (xuño 2018)

servidor udp en marcha, dende o mesmo navegador, que esta vez almacena as métricas en InfluxDB. Moitos proxectos xa están usando InfluxDB para o seguimento, polo que esta solución pode ser perfecta para eles.

Pros:

  • InfluxDB permite agregar as métricas recibidas e eliminar a orixinal despois dun tempo especificado.

Contras:

ClickHouse-Ninja/Proton (xaneiro 2019)

udp server on go, que garda métricas en ClickHouse. Esta é a solución do meu amigo. Foi despois de familiarizarme con el que decidín que era o momento de enfrontarme a Pinbu e Clickhouse.

Pros:

  • Clickhouse é ideal para tales tarefas; permítelle comprimir os datos tanto que pode almacenar todos os datos en bruto incluso sen agregacións.
  • se é necesario, pode agregar facilmente as métricas resultantes
  • modelo listo para grafana
  • garda información sobre temporizadores

Contras:

  • falla fatal
  • non hai ningunha configuración na que poida configurar o nome da base de datos e as táboas, o enderezo e o porto do servidor.
  • ao almacenar datos en bruto, utilízase unha táboa de dicionario auxiliar para almacenar enderezos de páxinas e dominios, o que complica as consultas posteriores
  • outras pequenas cousas que seguen do primeiro menos

servidor-pinba/servidor-pinba (abril 2019)

servidor udp en php, que garda métricas en ClickHouse. Esta é a miña solución, que é o resultado de coñecer pinba, ClickHouse e protobuf. Mentres resolvía todo este grupo, escribín unha "proba de concepto", que, inesperadamente para min, non consumía recursos significativos (30 MB de RAM e menos do 1% dun dos oito núcleos do procesador), así que decidiu compartilo co público.

As vantaxes son as mesmas que a solución anterior, tamén usei os nomes habituais do pinba_engine orixinal. Tamén engadín unha configuración que che permite lanzar varias instancias do servidor pinbase á vez para gardar métricas en diferentes táboas; isto é útil se queres recoller datos non só de php, senón tamén de nginx.
Desvantaxes - "fallo fatal" e esas pequenas cousas que non che convén persoalmente, pero a miña solución é "tan simple como unha zapatilla" e consta só dunhas 100 liñas de código, polo que calquera desenvolvedor de PHP pode cambiar o que non lle gusta. nun par de minutos.

Principio de funcionamento

Escóitase o porto UDP 30002. Todos os paquetes entrantes son decodificados segundo o esquema protobuf e agréganse. Unha vez por minuto, insírese un paquete no clickhouse na táboa pinba.requests. (todos os parámetros están configurados en config)

Un pouco sobre clickhouse

Clickhouse admite diferentes motores de almacenamento de datos. O máis usado é MergeTree.

Se nalgún momento decides almacenar datos agregados para todos os tempos e os datos en bruto só por última vez, entón podes crear unha vista materializada con agrupación e limpar periodicamente a táboa principal de pinba.requests, mentres que todos os datos permanecerán no vista materializada. Ademais, ao crear a táboa pinba.requests, pode especificar "engine = Null", entón os datos en bruto non se gardarán en absoluto no disco e, ao mesmo tempo, aínda acabarán na vista materializada e gardaranse agregados. . Eu uso este esquema para as métricas de nginx, porque en nginx teño 50 veces máis solicitudes que en php.

Entón, percorreches moito e non me gustaría deixarte a metade, polo que o que segue é unha descrición detallada da instalación e configuración da miña solución e de todo o que necesitas, así como as trampas que causaron máis dun barco. chocar. Descríbese todo o proceso de instalación para Ubuntu 18.04 LTS e Centos 7; o proceso pode diferir lixeiramente noutras distribucións e versións.

Instalación

Puxen todos os comandos necesarios dockerfile para facilitar a reproducibilidade das instrucións. A continuación, só se describirán as trampas.

php-pinba

Despois da instalación, asegúrate de que no ficheiro /etc/php/7.2/fpm/conf.d/20-pinba.ini non comentaches todas as opcións. Nalgunhas distribucións (por exemplo, centos) poden estar comentadas.

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

clickhouse

Durante a instalación, clickhouse pediralle que estableza un contrasinal para o usuario predeterminado. Por defecto, este usuario é accesible desde todas as IP, polo que se non tes un firewall no teu servidor, asegúrate de establecer un contrasinal para el. Isto tamén se pode facer despois da instalación no ficheiro /etc/clickhouse-server/users.xml.

Tamén vale a pena sinalar que clickhouse usa varios portos, incluído o 9000. Este porto tamén se usa para php-fpm nalgunhas distribucións (por exemplo, centos). Se xa usas este porto, podes cambialo por outro no ficheiro /etc/clickhouse-server/config.xml.

grafana con plugin clickhouse

Despois de instalar Grafana, use o administrador de inicio de sesión e o administrador de contrasinal. Cando inicie sesión por primeira vez, Grafana pediralle que estableza un novo contrasinal.

A continuación, vai ao menú "+" -> importar e indica o número do panel de control para importar 10011. Preparei e carguei este panel para que non teñas que facelo de novo.

Grafana admite traballar con clickhouse a través dun complemento de terceiros, pero Grafana non ten alertas para complementos de terceiros (hai varios anos que hai un ticket para iso).

servidor pinba

A instalación de protobuf e libevent é opcional, pero mellora o rendemento do servidor pinba. Se instalas pinba-server noutro cartafol que non sexa /opt, tamén terás que corrixir script systemd arquivo.

módulo pinba para nginx

Para compilar un módulo, necesitas códigos fonte da mesma versión de nginx que xa está instalada no teu servidor, así como as mesmas opcións de compilación, se non, a compilación terá éxito, pero ao conectar o módulo, producirase un erro que indica que "O módulo non é compatible con binario". As opcións de compilación pódense ver usando o comando nginx -V

Hacks vitais

Todos os meus sitios funcionan só en https. O campo do esquema non ten sentido, polo que o uso para separar web/consola.

En scripts accesibles desde a web uso:

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

E nos scripts de consola (por exemplo, scripts cron):

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

No meu panel de Grafana hai un interruptor web/consola para ver as estatísticas por separado.

Tamén podes enviar as túas etiquetas a Pinba, por exemplo:

pinba_tag_set('country', $countryCode);

Isto é todo.

Por favor, responde ás enquisas debaixo do artigo.

Como é habitual, aviso de que non aconsello nin axudo a través de mensaxes persoais en Habr e redes sociais.

Crea un ticket en Github.

Tamén apoia con me gusta Versión inglesa Este artigo en reddit.

Só os usuarios rexistrados poden participar na enquisa. Rexístrate, por favor.

Que sistema operativo estás a usar no servidor?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • ENSEÑO

  • Unix

  • Windows

  • outro

Votaron 114 usuarios. 11 usuarios abstivéronse.

Que versión de php estás a usar no servidor?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • outro

Votaron 105 usuarios. 17 usuarios abstivéronse.

Usaches algunha vez pinba?

  • si

  • non, pero gustaríame

  • non e non me gustaría

  • non e non oín falar dela

Votaron 100 usuarios. 14 usuarios abstivéronse.

Que versión do servidor Pinba che gustaría probar?

  • pinba_engine (motor mysql)

  • pinba2 (motor mysql)

  • pizarra (php + mysql)

  • olegfedoseev/pinba-server (ir + OpenTSDB)

  • olegfedoseev/pinba-influxdb (ir + influxdb)

  • servidor pinba/servidor pinba (ir + clickhouse)

  • pinba-server/pinba-server (php + clickhouse)

  • Vou escribir eu mesmo

  • outro

Votaron 39 usuarios. 47 usuarios abstivéronse.

Fonte: www.habr.com

Engadir un comentario