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.
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.
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 )
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
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 funcionaEstá 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 ClickHouseClickhouse 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 pinbaDespué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
clickhouseDurante 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 clickhouseDespué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 pinbaInstalar 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 nginxPara 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".
LifehacksTodos 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 todoTambién puedes leer la
versión rusa .
Responda para las encuestas en virtud del artículo y
apóyeme en Reddit .