Estadísticas y monitoreo de scripts PHP en tiempo real. ClickHouse y Grafana van a Pinba para obtener ayuda

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

En el proyecto php, pinba es probablemente la única forma confiable de entender lo que está sucediendo con el rendimiento. Pero por lo general, las personas comienzan a usar pinba solo cuando ya se observan problemas y no está claro dónde mirar.

A menudo, los desarrolladores no tienen idea de cuántas RPS tiene cada script. Entonces comienzan a optimizar a partir de lugares que parecen tener problemas.

Alguien está analizando los registros de nginx, y alguien realiza consultas lentas en la 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 beneficio del uso de pinba, es muy conveniente 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 eso necesitas:

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

Debido a que tenemos un poco de información sobre pinba recientemente, muchas personas piensan que solo funcionó en php5 y desapareció, pero como veremos más adelante, no es cierto.

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 existe hasta php 7.3 inclusive y no necesita compilar nada.

Después de ejecutar el comando de instalación, obtenemos inmediatamente una extensión que ya funciona que recopila y envía las métricas de cada script (duración, memoria, etc.) por udp a 127.0.0.1:370002 en el formato protobuf .

Todavía no tenemos una aplicación para capturar y procesar estos paquetes udp, pero esto no afecta gravemente la velocidad o la estabilidad de sus scripts php.

Hasta hace poco, solo pinba_engine podía capturar y procesar estos paquetes udp. La descripción de la instalación " simple " desaconseja volver a leerla. En largas listas de dependencias hay nombres de paquetes y nombres de programas y enlaces a otras páginas con otras dependencias. Nadie tiene el tiempo o el deseo de lidiar con esta basura.

El proceso de instalación de pinba2 no es especialmente fácil .

Tal vez en la función pinba10 se puede instalar con uno o dos comandos y sin leer un montón de cosas para descubrir cómo hacerlo, pero por ahora no es así.

La instalación de pinba_engine es solo la mitad de la historia. Después de todo, sin pinboard tendrás datos limitados solo durante los últimos minutos. Es bueno que pinboard sea bastante simple en una instalación .

Pero todas las métricas de php ya van al puerto udp en el formato protobuf y todo lo que se necesita es escribir una aplicación que pueda capturar paquetes udp y ponerla en algún tipo de almacenamiento. Aparentemente, aquellos desarrolladores que lo pensaron crearon sus propias aplicaciones y algunas de las cuales publicaron su en el githab.

A continuación se muestra una revisión de cuatro proyectos de código abierto que almacenan métricas en el almacenamiento, de los cuales la grafana obtiene y visualiza fácilmente estos datos.

olegfedoseev / pinba-influxdb (noviembre de 2017)


servidor udp en golang, que guarda métricas en OpenTSDB. Quizás si ya usa OpenTSDB en su proyecto, tal solución sería adecuada para usted.

olegfedoseev / pinba-influxdb (junio de 2018)


servidor udp en golang, del mismo usuario de github , que esta vez guarda métricas en InfluxDB. Muchos proyectos ya usan InfluxDB para el monitoreo, por lo que esta solución puede ser buena para ellos.

pros:

  • Influx permite agregar las métricas resultantes y eliminar el original después de un tiempo especificado.

contras:

  • Esta solución no guarda información para temporizadores.
  • InfluxDB guardará las direcciones de las páginas como etiquetas y si tiene muchas direcciones únicas de páginas, aumentará el consumo de RAM. Desde cierto punto, " comenzará a usar mucha memoria ". ( fuente )

ClickHouse-Ninja / Proton (enero de 2019)


servidor udp en golang, que guarda las métricas en ClickHouse. Esta es la aplicación de mi amigo. Después de usar, comencé a trabajar en mi propia aplicación para pinba con clickhouse.

pros:

  • Clickhouse es ideal para tales tareas, le permite comprimir los datos para que pueda almacenar todos los datos sin procesar, incluso sin agregaciones
  • si lo necesita, puede agregar fácilmente las métricas resultantes
  • plantilla lista para grafana
  • guarda información para temporizadores

contras:

  • No inventado aquí
  • no hay configuración para el nombre de la base de datos y las tablas, para la dirección y el puerto del
    servidor
  • otras pequeñas cosas que fluyen desde el primer menos

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


servidor udp en php, que guarda métricas en ClickHouse. Esta es mi aplicación, que es el resultado de mi RND de pinba, ClickHouse y protobuf. Escribí "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 la gente.

Las ventajas son las mismas 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 pinbasver para guardar métricas en diferentes tablas; esto es útil si desea recopilar mediciones no solo de php, sino también de nginx.

Contras: "No inventado aquí" y esas pequeñas cosas que no le convienen personalmente, pero mi solución es muy simple y consta de solo alrededor de 100 líneas de código, por lo que cualquier desarrollador de php puede cambiar cualquier cosa en un par de minutos. no me gusta

Como funciona

Está escuchando udp-port 30002. Todos los paquetes entrantes se decodifican de acuerdo con el esquema protobuf y se agregan. Una vez por minuto, el lote de paquetes se inserta en el clickhouse en la tabla pinba.requests. (todos los ajustes están configurados en la configuración )

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 todo el tiempo, y datos sin procesar solo para este último, puede crear una vista materializada con agrupación y limpiar periódicamente la tabla principal pinba.requests, mientras que todos los datos permanecen en la vista materializada. Además, puede especificar "engine = Null" para la tabla pinba.requests, por lo que los datos sin procesar no se guardarán en el disco y, al mismo tiempo, se incluirán en la vista materializada. Utilizo este esquema para las métricas nginx, porque en nginx tengo 50 veces más solicitudes que en php.

Ha recorrido un largo camino, por lo que habrá una descripción detallada de la instalación y configuración de mi solución y todo lo que necesita. Todo el proceso de instalación se describe para Ubuntu 18.04 LTS y Centos 7, en otras distribuciones y versiones, el proceso puede diferir ligeramente.

Instalación


Puse todos los comandos necesarios en Dockerfile para reproducir las instrucciones. Solo los problemas se describirán a continuación.

php pinba

Después de la instalación, asegúrese de haber descomentado todas las opciones en el archivo /etc/php/7.2/fpm/conf.d/20-pinba.ini. En algunas distribuciones (por ejemplo, centos) se puede comentar.

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

clickhouse

Durante la instalación, clickhouse le pedirá que establezca una contraseña para el usuario predeterminado. Por defecto, este usuario está disponible desde todas las ip. Entonces, si no tiene un firewall en su servidor, configure 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 tenga en cuenta que clickhouse usa varios puertos, incluido 9000. Este puerto también se usa para php-fpm en algunas distribuciones (por ejemplo, centos). Si ya usa este puerto, puede cambiarlo a otro en el archivo /etc/clickhouse-server/config.xml.

grafana con complemento de clickhouse

Después de instalar la grafana, use el nombre de usuario "admin" y la contraseña "admin". Cuando inicie sesión por primera vez, el grafana le pedirá que establezca una nueva contraseña.

A continuación, vaya al menú "+" -> importar y especifique el número de paneles para importar 10011 . He preparado este panel para que no tenga que volver a hacerlo usted mismo.

Grafana admite ClickHouse por complementos de terceros, pero grafana no admite alertas para complementos de terceros (el ticket ya existe varios años).

servidor pinba

Instalar protobuf y libevent es opcional, pero mejora el rendimiento del servidor pinba. Si instala un servidor pinba en una carpeta que no sea / opt, también deberá cambiar el archivo de script systemd .

pinba-module bajo nginx

Para compilar el módulo, necesita el código 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, el ensamblaje será exitoso, pero cuando el módulo esté conectado, se producirá un error " el módulo es binario incompatible ". Las opciones de compilación se pueden ver usando el comando "nginx -V".

Lifehacks

Todos mis sitios funcionan solo en https. Entonces uso el campo "esquema" para separar la web / consola.
En los scripts web que uso:

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

y en la consola (por ejemplo, cron-scripts):

 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 puede enviar sus etiquetas a la pinba, por ejemplo:

 pinba_tag_set('country', $countryCode); 

Eso es todo

También puedes leer la versión rusa .

Responda para las encuestas en virtud del artículo y apóyeme en Reddit .

Source: https://habr.com/ru/post/449818/


All Articles