En este artículo, le mostraré cómo usar pinba con clickhouse y grafana en lugar de pinba_engine y pinboard.
En un proyecto phba, pinba es probablemente la única forma confiable de comprender lo que está sucediendo con el rendimiento. Es cierto que pinba generalmente se implementa solo 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 un script en particular y comienza a optimizar "al tacto", comenzando desde aquellos lugares que parecen más lógicos.
Alguien analiza los registros nginx, y alguien ralentiza las solicitudes en una base de datos.
Por supuesto, pinba no sería superfluo, pero hay varias razones por las que no está en todos los proyectos.

Y la primera razón es la instalación.
Para obtener más o menos algún tipo de "escape" de la introducción de pinba, es muy deseable ver las métricas no solo en los últimos minutos, sino también durante un largo período de tiempo (de días a meses).
Para hacer esto, necesitas:
- instale la extensión para php (y tal vez desee un módulo para nginx)
- compilar extensión para mysql
- instalar pinboard y configurar cron
Debido a la pequeña cantidad de información sobre pinba, muchos tienen la impresión de que funcionó solo en php5 y que ha estado en el pasado, pero como veremos más adelante, esto no es así.
El primer paso es el más fácil, todo lo que necesita hacer es ejecutar el comando:
apt install php-pinba
En los repositorios, esta extensión es hasta php 7.3 inclusive y no necesita compilar nada.
Después de ejecutar el comando de instalación, obtenemos de inmediato una extensión que funciona y que recopila y envía las métricas de cada script (duración, memoria, etc.) en formato
protobuf por udp a 127.0.0.1
{0002 .
Nadie ha detectado o procesado aún estos paquetes de udp, pero no afecta la velocidad o la estabilidad de sus scripts php.
Hasta hace poco, solo
pinba_engine era la única aplicación que podía capturar y procesar estos paquetes udp. La descripción de la instalación "
simple y concisa " desalienta el deseo de leerla y profundizar en ella nuevamente. En las listas de dependencias de un kilómetro hay nombres de paquetes y nombres de programas y enlaces a páginas individuales con su instalación, y esos tienen sus propios enlaces a otras dependencias. Para lidiar con esta basura, nadie tiene ni el tiempo ni el deseo.
El proceso de instalación de
pinba2 no se
ha vuelto
mucho más fácil .
Quizás algún día pinba10 se pueda instalar con uno o dos comandos y no leer un montón de material para entender cómo hacerlo, pero hasta ahora no es así.
Si aún instaló pinba_engine, esta es solo la mitad de la batalla. Después de todo, sin un
tablón de anuncios, tendrá que limitarse a los datos solo en los últimos minutos o agregar, guardar y visualizar sus datos usted mismo. Es bueno que el pinboard sea bastante fácil de
instalar .
Parecería, ¿por qué tanto sufrimiento si todas las métricas de php ya van al puerto udp en formato protobuf y todo lo que se necesita es escribir una aplicación que las capture y almacene en algún tipo de almacenamiento? Aparentemente, aquellos desarrolladores a quienes se les ocurrió esta idea inmediatamente se sentaron a escribir sus bicicletas, algunas de las cuales cayeron en el github.
La siguiente es una revisión de cuatro proyectos de código abierto que almacenan métricas en el almacenamiento, de las cuales estos datos son fáciles de obtener y visualizar, por ejemplo, utilizando grafana.
udp server on go, que almacena métricas en OpenTSDB. Quizás si ya usa OpenTSDB en el proyecto, tal solución le conviene, de lo contrario, le recomiendo pasar.
servidor udp en
marcha , del mismo
habrayuzer que esta vez guarda métricas en InfluxDB. En muchos proyectos, InfluxDB ya se está utilizando para el monitoreo, por lo que esta solución puede ser excelente para ellos.
Pros:
- InfluxDB le permite agregar las métricas recibidas y eliminar el original después de un tiempo especificado.
Contras:
udp server on go que almacena métricas en ClickHouse. Esta es la decisión de mi amigo. Fue después de conocerlo que decidí que era hora de enfrentarnos a pinbu y clickhouse.
Pros:
- Clickhouse es ideal para tales 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 confeccionada para grafana
- guarda la información del temporizador
Contras:
falla fatal- no existe una configuración en la que sea posible configurar el nombre de la base de datos y las tablas, la dirección y el puerto del servidor.
- Al guardar datos sin procesar, se utiliza una tabla auxiliar de diccionario para almacenar direcciones de páginas y dominios, lo que posteriormente complica las consultas.
- otras pequeñas cosas que fluyen desde el primer menos
servidor udp en php que almacena métricas en ClickHouse. Esta es mi solución resultante de mi conocimiento de pinba, ClickHouse y protobuf. Mientras estaba lidiando con todo este grupo, 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 de procesador), así que decidí compartirlo con el público.
Los pros son los mismos que en la solución anterior, también utilicé los nombres habituales del pinba_engine original. También agregué una configuración que le permite ejecutar varias instancias de pinbaserver a la vez para guardar las métricas en diferentes tablas; esto es útil si desea recopilar datos no solo de php, sino también de nginx.
Contras: un "defecto fatal" y esas pequeñas cosas con las que personalmente no se sentirá cómodo, pero mi solución es "tan simple como las zapatillas" y consta de solo alrededor de 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.
Principio de funcionamientoSe escucha el puerto udp 30002. Todos los paquetes entrantes se decodifican de acuerdo con el esquema protobuf y se agregan. Una vez por minuto, el paquete se inserta en el clickhouse en la tabla pinba.requests. (todos los parámetros están configurados en la
configuración )
Un poco sobre clickhouseClickhouse admite varios motores de almacenamiento. El más utilizado es MergeTree.
Si en algún momento decide almacenar datos agregados todo el tiempo, y datos sin procesar solo para el último, puede crear una vista materializada con una agrupación y limpiar la tabla principal pinba.requests periódicamente, mientras que todos los datos permanecerán en la vista materializada. Además, al crear la tabla pinba.requests, puede especificar "engine = Null", entonces los datos en bruto no se guardarán en el disco y, al mismo tiempo, seguirán en la vista materializada y se almacenarán agregados. Utilizo este esquema para las métricas nginx, porque en nginx tengo 50 veces más solicitudes que en php.
Entonces, has recorrido un largo camino y no quisiera dejarte a mitad de camino, así que habrá una descripción detallada de la instalación y configuración de mi solución y todo lo que necesitas, así como las trampas en las que se estrelló más de un barco. Todo el proceso de instalación se describe para Ubuntu 18.04 LTS y Centos 7, en otras distribuciones y versiones, el proceso puede variar ligeramente.
Instalación
Realicé todos los comandos necesarios en el
Dockerfile para facilitar la reproducibilidad de las instrucciones. Solo las dificultades se describirán a continuación.
php pinbaDespués de la instalación, asegúrese de que en el archivo /etc/php/7.2/fpm/conf.d/20-pinba.ini tenga todas las opciones sin comentar. En algunas distribuciones (por ejemplo, centos) se pueden comentar.
extension=pinba.so pinba.enabled=1 pinba.server=127.0.0.1:30002
clickhouseDurante la instalación, clickhouse le pedirá que establezca una contraseña para el usuario predeterminado. De manera predeterminada, este usuario está disponible desde todas las direcciones IP, por lo que si no tiene un firewall en el servidor, asegúrese de establecer una contraseña para él. 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 tiene este puerto en uso, puede cambiarlo por otro en el archivo /etc/clickhouse-server/config.xml.
grafana con complemento de clickhouseDespués de instalar grafana, use el nombre de usuario y la contraseña de administrador. En la primera entrada, el graphan le pedirá que establezca una nueva contraseña.
A continuación, vaya al menú "+" -> importar y especifique el número del tablero para importar
10011 . Preparé y llené este tablero para que no tenga que volver a hacerlo usted mismo.
Grafana admite trabajar con Clickhouse a través de un complemento de terceros, pero para los complementos de terceros, grafana no funciona alertas (un boleto para esto ha estado sucediendo durante varios años).
servidor pinbaInstalar 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 necesitará corregir el archivo de
script systemd .
módulo pinba bajo nginxPara compilar el módulo, necesita las fuentes 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, el ensamblado tendrá éxito, pero cuando se conecte el módulo, se generará un error de que el módulo es incompatible binario. Las opciones de compilación se pueden ver con el comando nginx -V
Trucos de la vidaTodos mis sitios funcionan solo en https. El campo de esquema deja de tener sentido, así que lo uso para separar la web / consola.
En los scripts accesibles desde la web que uso:
if (ini_get('pinba.enabled')) { pinba_schema_set('web'); }
Y en la consola (por ejemplo, guiones de corona):
if (ini_get('pinba.enabled')) { pinba_schema_set('console'); }
En mi tablero en graphan hay un interruptor web / consola para ver las estadísticas por separado.
También puede transferir sus etiquetas a pinbu, por ejemplo:
pinba_tag_set('country', $countryCode);
Eso es todoUna gran solicitud para responder las encuestas bajo el artículo.
Tradicionalmente, advierto que no aconsejo ni ayudo a través de mensajes personales de Habr y las redes sociales.
Comience un boleto en github.
Además, apoye la
versión en inglés de este artículo
en reddit con los me gusta .