Estatísticas e monitoramento de scripts PHP em tempo real. ClickHouse e Grafana vão ajudar Pinba

Neste artigo, mostrarei como usar pinba com clickhouse e grafana em vez de pinba_engine e pinboard.

Em um projeto phba, o pinba é provavelmente a única maneira confiável de entender o que está acontecendo com o desempenho. É verdade que o pinba geralmente é implementado apenas quando os problemas já são observados e não está claro onde cavar.

Muitas vezes, ninguém tem idéia de quantas vezes por segundo / minuto um script específico é chamado e começa a otimizar “por toque”, a partir daqueles lugares que parecem mais lógicos.

Alguém analisa os logs do nginx e alguém atrasa as solicitações em um banco de dados.

É claro que a pinba não seria supérflua, mas há várias razões pelas quais ela não está presente em todos os projetos.



E a primeira razão é a instalação.

Para obter mais ou menos algum tipo de "exaustão" da introdução do pinba, é muito desejável ver métricas não apenas nos últimos minutos, mas também por um longo período de tempo (de dias a meses).

Para fazer isso, você precisa:

  • instalar extensão para php (e talvez você queira um módulo para nginx)
  • extensão de compilação para mysql
  • instalar quadro de recados e configurar cron

Devido à pequena quantidade de informações sobre o pinba, muitos têm a impressão de que funcionou apenas no php5 e existe há muito tempo, mas, como veremos mais adiante, não é assim.

O primeiro passo é o mais fácil, tudo o que você precisa fazer é executar o comando:

apt install php-pinba 

Nos repositórios, esta extensão é compatível com o php 7.3 inclusive e você não precisa compilar nada.

Após executar o comando de instalação, obtemos imediatamente uma extensão que já funciona, que coleta e envia as métricas de cada script (duração, memória etc.) no formato protobuf pelo udp para 127.0.0.1 {0002 .

Ninguém ainda capturou e processou esses pacotes udp, mas isso não afeta a velocidade ou a estabilidade dos seus scripts php.

Até recentemente, apenas pinba_engine era o único aplicativo que podia capturar e processar esses pacotes udp. A descrição da instalação " simples e concisa " desencoraja o desejo de ler e mergulhar nela novamente. Nas listas de dependências de um quilômetro de extensão, existem nomes de pacotes e nomes de programas e links para páginas individuais com sua instalação, e esses possuem links próprios para outras dependências. Para lidar com essa porcaria, ninguém tem nem tempo nem desejo.

O processo de instalação do pinba2 não se tornou muito mais fácil .

Talvez um dia o pinba10 possa ser instalado com um ou dois comandos e não ler um monte de material para entender como fazê-lo, mas até agora não é assim.

Se você ainda instalou o pinba_engine, isso é apenas metade da batalha. Afinal, sem um quadro de recados, você terá que se limitar aos dados apenas nos últimos minutos ou agregar, salvar e visualizar seus dados. É bom que o quadro de recortes seja bastante fácil de instalar .

Parece, por que tanto sofrimento se todas as métricas do php já vão para a porta udp no formato protobuf e tudo o que é necessário é escrever um aplicativo que as capture e armazene em algum tipo de armazenamento? Aparentemente, os desenvolvedores que tiveram essa ideia imediatamente se sentaram para escrever suas motos, algumas das quais caíram no github.

A seguir, é apresentada uma revisão de quatro projetos de código aberto que armazenam métricas em armazenamento, a partir dos quais é fácil obter e visualizar esses dados, por exemplo, usando grafana.

olegfedoseev / pinba-server (novembro de 2017)


servidor udp on go, que armazena métricas no OpenTSDB. Talvez se você já usa o OpenTSDB no projeto, essa solução será adequada para você, caso contrário eu recomendo que passe.

Olegfedoseev / pinba-influxdb (junho de 2018)


servidor udp em movimento, do mesmo habrayuzer que desta vez salva métricas no InfluxDB. Em muitos projetos, o InfluxDB já está sendo usado para monitoramento, portanto esta solução pode ser ótima para eles.

Prós:

  • O InfluxDB permite agregar as métricas recebidas e excluir o original após um tempo especificado.

Contras:


ClickHouse-Ninja / Proton (janeiro de 2019)


servidor udp on go que armazena métricas no ClickHouse. Esta é a decisão do meu amigo. Foi depois de conhecê-lo que decidi que era hora de usar pinbu e clickhouse.

Prós:

  • o clickhouse é ideal para essas tarefas, permite compactar tanto os dados que você pode armazenar todos os dados brutos, mesmo sem agregações
  • se necessário, você pode agregar facilmente as métricas resultantes
  • modelo pronto para grafana
  • salva informações do temporizador

Contras:

  • falha fatal
  • não há nenhuma configuração na qual seria possível configurar o nome do banco de dados e tabelas, o endereço e a porta do servidor.
  • ao salvar dados brutos, uma tabela de dicionário auxiliar é usada para armazenar endereços de páginas e domínios, o que complica as consultas posteriormente
  • outras pequenas coisas que fluem desde o primeiro ponto negativo

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


servidor udp em php que armazena métricas no ClickHouse. Esta é a minha solução resultante do meu conhecimento com pinba, ClickHouse e protobuf. Enquanto lidava com todo esse grupo, escrevi uma "prova de conceito", que inesperadamente para mim não consumiu recursos significativos (30 mb de RAM e menos de 1% de um dos oito núcleos do processador), então decidi compartilhá-lo com o público.

Os profissionais são os mesmos da solução anterior, também usei os nomes usuais do pinba_engine original. Também adicionei uma configuração que permite executar várias instâncias do pinbaserver de uma só vez para salvar métricas em tabelas diferentes - isso é útil se você deseja coletar dados não apenas do php, mas também do nginx.
Contras - uma "falha fatal" e aquelas pequenas coisas com as quais você pessoalmente não se sentirá confortável, mas minha solução é "tão simples quanto chinelos" e consiste em apenas cerca de 100 linhas de código, para que qualquer desenvolvedor de php possa alterar o que não gosta em alguns minutos.

Princípio de funcionamento

A porta udp 30002 é ouvida.Todos os pacotes recebidos são decodificados de acordo com o esquema protobuf e são agregados. A cada minuto, o pacote é inserido na casa de cliques na tabela pinba.requests. (todos os parâmetros estão configurados na configuração )

Um pouco sobre clickhouse

Clickhouse suporta vários mecanismos de armazenamento. O mais usado é o MergeTree.

Se em algum momento você decidir armazenar dados agregados o tempo todo e dados brutos apenas o último, poderá criar uma visualização materializada com um agrupamento e limpar a tabela principal pinba.requests periodicamente, enquanto todos os dados permanecerão na visualização materializada. Além disso, ao criar a tabela pinba.requests, você pode especificar "engine = Null"; os dados brutos não serão salvos no disco e, ao mesmo tempo, ainda serão exibidos na visualização materializada e armazenados agregados. Eu uso esse esquema para métricas nginx, porque no nginx tenho 50 vezes mais solicitações do que no php.

Então, você percorreu um longo caminho e eu não gostaria de deixá-lo no meio do caminho, então haverá uma descrição detalhada da instalação e configuração da minha solução e tudo o que você precisa, além de armadilhas nas quais mais de um navio colidiu. Todo o processo de instalação é descrito para o Ubuntu 18.04 LTS e Centos 7, em outras distribuições e versões o processo pode variar um pouco.

Instalação


Fiz todos os comandos necessários no Dockerfile para facilitar a reprodutibilidade das instruções. Somente armadilhas serão descritas abaixo.

php pinba

Após a instalação, verifique se no arquivo /etc/php/7.2/fpm/conf.d/20-pinba.ini você tem todas as opções descomentadas. Em algumas distribuições (por exemplo, centos), elas podem ser comentadas.

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

clickhouse

Durante a instalação, o clickhouse solicitará que você defina uma senha para o usuário padrão. Por padrão, esse usuário está disponível em todo o IP; portanto, se você não possui um firewall no servidor, defina uma senha para ele. Isso também pode ser feito após a instalação no arquivo /etc/clickhouse-server/users.xml.

Também é importante notar que o clickhouse usa várias portas, incluindo 9000. Essa porta também é usada para php-fpm em algumas distribuições (por exemplo, centos). Se você já possui essa porta em uso, pode alterá-la para outra no arquivo /etc/clickhouse-server/config.xml.

grafana com plugin clickhouse

Após instalar o grafana, use o nome de usuário e a senha de administrador. Na primeira entrada, o graphan solicitará que você defina uma nova senha.

Em seguida, vá para o menu "+" -> importar e especifique o número do painel para a importação 10011 . Eu preparei e preenchi esse painel para que você não tivesse que fazê-lo novamente.

O grafana suporta o trabalho com a clickhouse por meio de um plug-in de terceiros, mas para plug-ins de terceiros, os grafans não possuem alertas (um ticket para isso ocorre há vários anos).

servidor pinba

A instalação de protobuf e libevent é opcional, mas melhora o desempenho do servidor pinba. Se você instalar o pinba-server em uma pasta diferente de / opt, também será necessário corrigir o arquivo de script systemd .

módulo pinba sob nginx

Para compilar o módulo, você precisa das fontes da mesma versão do nginx que já está instalada no servidor e das mesmas opções de compilação; caso contrário, o assembly será bem-sucedido, mas quando o módulo estiver conectado, será gerado um erro indicando que o módulo é binário incompatível. As opções de compilação podem ser visualizadas usando o comando nginx -V

Life hacks

Todos os meus sites funcionam apenas em https. O campo do esquema fica sem sentido, então eu o uso para separar a web / console.

Nos scripts acessíveis pela Web, eu uso:

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

E no console (por exemplo, scripts de coroa):

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

No meu painel em graphan, há uma opção de console / web para visualizar estatísticas separadamente.

Você também pode transferir suas tags para pinbu, por exemplo:

 pinba_tag_set('country', $countryCode); 

Isso é tudo.

Um grande pedido para responder às pesquisas de opinião do artigo.

Tradicionalmente, aviso que não aconselho e não ajudo através de mensagens pessoais da Habr e das redes sociais.

Inicie um ticket no github.

Além disso, apoie a versão em inglês deste artigo no reddit com os gostos .

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


All Articles