Estadísticas y seguimiento de scripts PHP en tiempo real. ClickHouse y Grafana acuden en ayuda de Pinba

En este artículo te diré cómo usar pinba con clickhouse y grafana en lugar de pinba_engine y pinboard.

En un proyecto PHP, pinba es quizás la única forma confiable de comprender lo que sucede con el rendimiento. Es cierto que pinba generalmente se implementa sólo cuando ya se observan problemas y no está claro “dónde excavar”.

A menudo nadie tiene idea de cuántas veces por segundo/minuto se llama tal o cual script y comienzan a optimizar "al tacto", partiendo de aquellos lugares que parecen más lógicos.

Algunos analizan registros de nginx, mientras que otros analizan consultas lentas de bases de datos.

Por supuesto, pinba no sería superfluo, pero hay varias razones por las que no todos los proyectos lo tienen.

Estadísticas y seguimiento de scripts PHP en tiempo real. ClickHouse y Grafana acuden en ayuda de Pinba

Y la primera razón es la instalación.

Para obtener más o menos algún tipo de "agotamiento" de la implementación de Pinba, es muy recomendable ver métricas no solo de los últimos minutos, sino también de un largo período de tiempo (desde días hasta meses).

Para esto necesitas:

  • instale la extensión para php (y es posible que desee un módulo para nginx)
  • compilar extensión para mysql
  • instalar pinboard y configurar cron

Debido a la poca información sobre Pinba, muchas personas tienen la impresión de que solo funcionaba en PHP5 y hace tiempo que es cosa del pasado, pero como veremos más adelante, este no es el caso.

El primer paso es el más sencillo, todo lo que necesitas hacer es ejecutar el comando:

apt install php-pinba

Esta extensión está disponible en los repositorios hasta php 7.3 inclusive y no es necesario compilar nada.

Después de ejecutar el comando de instalación, recibimos inmediatamente una extensión funcional que recopila y envía métricas para cada script (tiempo de ejecución, memoria, etc.) en el formato Protobuf vía udp a 127.0.0.1:30002.

Hasta ahora nadie ha capturado ni procesado estos paquetes UDP, pero esto no afecta de ninguna manera negativamente la velocidad o la estabilidad de sus scripts PHP.

Hasta hace poco, la única aplicación que podía capturar y procesar estos paquetes UDP era pinba_motor. Descripción "simple y conciso"La instalación desalienta las ganas de volver a leerlo y profundizar en él. Las listas de dependencias de un kilómetro de largo contienen tanto los nombres de los paquetes como los nombres de los programas y enlaces a páginas individuales con su instalación, y éstas tienen sus propios enlaces a otras dependencias. Nadie tiene el tiempo ni las ganas de lidiar con esta basura.

Proceso de instalación pinba2 no lo hizo especialmente más fácil.

Quizás algún día sea posible instalar pinba10 con uno o dos comandos y no tener que leer mucho material para entender cómo hacerlo, pero por ahora no es el caso.

Si instalas pinba_engine, entonces esto es solo la mitad de la batalla. Después de todo, sin tablón de anuncios Tendrá que limitarse a los datos de los últimos minutos o tendrá que agregar, almacenar y visualizar los datos usted mismo. Es bueno que el tablero de anuncios sea bastante sencillo de usar. instalación.

Parecería, ¿por qué tanto sufrimiento si todas las métricas de PHP ya están enviadas al puerto udp en formato protobuf y todo lo que necesita es escribir una aplicación que las capture y las guarde en algún tipo de almacenamiento? Aparentemente, los desarrolladores a los que se les ocurrió esta idea inmediatamente se sentaron a escribir sus propias ideas, algunas de las cuales terminaron en GitHub.

La siguiente es una descripción general de cuatro proyectos de código abierto que guardan métricas en el almacenamiento, desde donde estos datos se pueden recuperar y visualizar fácilmente, por ejemplo, usando grafana.

olegfedoseev/pinba-servidor (noviembre de 2017)

Servidor udp on go que guarda métricas en OpenTSDB. Quizás si ya está utilizando OpenTSDB en su proyecto, esta solución le convenga; de lo contrario, le recomiendo que la pase por alto.

olegfedoseev/pinba-influxdb (junio de 2018)

servidor udp en marcha, desde el mismo navegador, que esta vez almacena las métricas en InfluxDB. Muchos proyectos ya utilizan InfluxDB para el seguimiento, por lo que esta solución puede ser perfecta para ellos.

Pros:

  • Influjo DB permite agregar las métricas recibidas y eliminar el original después de un tiempo específico.

Contras:

  • Esta solución no guarda información sobre los temporizadores.
  • InfluxDB almacenará las direcciones de las páginas del sitio como etiquetas y, si tiene muchas direcciones de páginas únicas, esto generará aumento del consumo memoria de acceso aleatorio. A partir de cierto momento él "Comenzará a comerse el recuerdo como loco.". (fuente)

ClickHouse-Ninja/Proton (enero 2019)

Servidor udp on go, que guarda métricas en ClickHouse. Esta es la solución de mi amigo. Fue después de familiarizarme con él que decidí que era hora de enfrentarme a Pinbu y Clickhouse.

Pros:

  • Clickhouse es ideal para este tipo de tareas; le permite comprimir tanto los datos que puede almacenar todos los datos sin procesar incluso sin agregaciones.
  • si es necesario, puede agregar fácilmente las métricas resultantes
  • plantilla preparada para grafana
  • guarda información sobre los temporizadores

Contras:

  • error fatal
  • no hay ninguna configuración en la que pueda configurar el nombre de la base de datos y las tablas, la dirección y el puerto del servidor.
  • al almacenar datos sin procesar, se utiliza una tabla de diccionario auxiliar para almacenar direcciones de página y dominio, lo que complica las consultas posteriores
  • otras pequeñas cosas que siguen del primer menos

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

Servidor udp en php, que guarda métricas en ClickHouse. Esta es mi solución, que es el resultado de conocer pinba, ClickHouse y protobuf. Mientras resolvía todo este montón, escribí una "prueba de concepto" que, inesperadamente para mí, no consumió recursos significativos (30 MB de RAM y menos del 1% de uno de los ocho núcleos del procesador), así que decidió compartirlo con el público.

Las ventajas son las mismas que la solución anterior, también utilicé los nombres habituales del pinba_engine original. También agregué una configuración que le permite iniciar varias instancias del servidor Pinbase a la vez para guardar métricas en diferentes tablas; esto es útil si desea recopilar datos no solo de PHP, sino también de nginx.
Desventajas: "defecto fatal" y esas pequeñas cosas que no le convienen personalmente, pero mi solución es "tan simple como una zapatilla" y consta de solo unas 100 líneas de código, por lo que cualquier desarrollador de PHP puede cambiar lo que no le gusta. En un par de minutos.

¿Cómo funciona?

Se escucha el puerto UDP 30002. Todos los paquetes entrantes se decodifican según el esquema protobuf y se agregan. Una vez por minuto, se inserta un paquete en la casa de clics en la tabla pinba.requests. (todos los parámetros están configurados en configuración)

Un poco sobre clickhouse

Clickhouse admite diferentes motores de almacenamiento de datos. El más utilizado es MergeTree.

Si en algún momento decide almacenar datos agregados para todos los tiempos y datos sin procesar solo para el último, entonces puede crear una vista materializada con agrupación y limpiar periódicamente la tabla principal pinba.requests, mientras que todos los datos permanecerán en el visión materializada. Además, al crear la tabla pinba.requests, puede especificar "motor = Null", entonces los datos sin procesar no se guardarán en el disco en absoluto y, al mismo tiempo, terminarán en la vista materializada y se guardarán agregados. . Utilizo este esquema para las métricas de nginx, porque en nginx tengo 50 veces más solicitudes que en php.

Entonces, has recorrido un largo camino y no me gustaría dejarte a mitad de camino, por eso lo que sigue es una descripción detallada de la instalación y configuración de mi solución y todo lo que necesitas, así como los escollos que han causado a más de un barco. chocar. Todo el proceso de instalación se describe para Ubuntu 18.04 LTS y Centos 7; el proceso puede diferir ligeramente en otras distribuciones y versiones.

Instalación

Puse todos los comandos necesarios en Dockerfile para facilitar la reproducibilidad de las instrucciones. A continuación sólo se describirán los peligros.

php-pinba

Después de la instalación, asegúrese de que en el archivo /etc/php/7.2/fpm/conf.d/20-pinba.ini haya descomentado todas las opciones. En algunas distribuciones (por ejemplo, centos) es posible que estén comentados.

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

casa de clics

Durante la instalación, clickhouse le pedirá que establezca una contraseña para el usuario predeterminado. De forma predeterminada, se puede acceder a este usuario desde todas las IP, por lo que si no tiene un firewall en su servidor, asegúrese de establecer una contraseña. Esto también se puede hacer después de la instalación en el archivo /etc/clickhouse-server/users.xml.

También vale la pena señalar que Clickhouse usa varios puertos, incluido el 9000. Este puerto también se usa para php-fpm en algunas distribuciones (por ejemplo, centos). Si ya utiliza este puerto, puede cambiarlo por otro en el archivo /etc/clickhouse-server/config.xml.

grafana con complemento clickhouse

Después de instalar Grafana, utilice el administrador de inicio de sesión y la contraseña de administrador. Cuando inicie sesión por primera vez, Grafana le pedirá que establezca una nueva contraseña.

A continuación, vaya al menú “+” -> importar e indique el número del panel para importar 10011. Preparé y subí este panel para que no tengas que volver a hacerlo tú mismo.

Grafana admite trabajar con clickhouse a través de un complemento de terceros, pero Grafana no tiene alertas para complementos de terceros (ha habido un ticket para esto durante varios años).

servidor pinba

La instalación de protobuf y libevent es opcional, pero mejora el rendimiento del servidor pinba. Si instala pinba-server en una carpeta que no sea /opt, también deberá corregir secuencia de comandos del sistema expediente.

módulo pinba para nginx

Para compilar un módulo, necesita códigos fuente de la misma versión de nginx que ya está instalada en su servidor, así como las mismas opciones de compilación; de lo contrario, la compilación será exitosa, pero al conectar el módulo, se generará un error que "El módulo no es compatible con binarios". Las opciones de compilación se pueden ver usando el comando nginx -V

Trucos de la vida

Todos mis sitios funcionan solo en https. El campo esquema deja de tener sentido, así que lo uso para separar web/consola.

En los scripts a los que se puede acceder desde la web utilizo:

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

Y en los scripts de la consola (por ejemplo, scripts cron):

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

En mi panel de control en Grafana hay un conmutador web/consola para ver las estadísticas por separado.

También puedes enviar tus etiquetas a Pinba, por ejemplo:

pinba_tag_set('country', $countryCode);

Eso es todo.

Por favor responda las encuestas debajo del artículo.

Como siempre os advierto que no aconsejo ni ayudo a través de mensajes personales en Habr y redes sociales.

Crea un ticket en Github.

También por favor apoyen con me gusta. versión inglesa este artículo en reddit.

Solo los usuarios registrados pueden participar en la encuesta. Registrarsepor favor

¿Qué sistema operativo estás usando en el servidor?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SUSE

  • Unix

  • Windows

  • otro

114 usuarios votaron. 11 usuarios se abstuvieron.

¿Qué versión de php estás usando en el servidor?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • otro

105 usuarios votaron. 17 usuarios se abstuvieron.

¿Alguna vez has usado pinba?

  • No, pero me gustaría

  • no y no quisiera

  • no y no he oído hablar de ella

100 usuarios votaron. 14 usuarios se abstuvieron.

¿Qué versión del servidor Pinba te gustaría probar?

  • pinba_engine (motor mysql)

  • pinba2 (motor mysql)

  • tablero de anuncios (php + mysql)

  • olegfedoseev/pinba-server (ir + OpenTSDB)

  • olegfedoseev/pinba-influxdb (ir + influxdb)

  • servidor-pinba/servidor-pinba (ir + clickhouse)

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

  • Yo mismo escribiré el mío.

  • otro

39 usuarios votaron. 47 usuarios se abstuvieron.

Fuente: habr.com

Añadir un comentario