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

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

No projeto php, o pinba é provavelmente a única maneira confiável de entender o que está acontecendo com o desempenho. Mas geralmente as pessoas começam a usar pinba apenas quando os problemas já são observados e não está claro para onde procurar.

Muitas vezes, os desenvolvedores não têm idéia de quantos RPS cada script possui. Então, eles começam a otimizar a partir de lugares que parecem ter problemas.

Alguém está analisando os logs do nginx e alguém está com consultas lentas no 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 lucro com o uso da pinba, é altamente desejável ver as métricas não apenas nos últimos minutos, mas também por um longo período de tempo (de dias a meses).

Para isso você precisa:

  • instale a extensão para php (e você pode querer ter um módulo para nginx)
  • compilar extensões para mysql
  • instalar quadro de recados e configurar cron

Como temos poucas informações sobre o pinba recentemente, muitas pessoas pensam que ele só funcionou no php5 e se foi, mas como veremos mais adiante, não é verdade.

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 existe até 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.) pelo udp em 127.0.0.1:370002 no formato protobuf .

Ainda não temos um aplicativo para capturar e processar esses pacotes udp, mas isso não afeta muito a velocidade ou a estabilidade de seus scripts php.

Até recentemente, apenas pinba_engine podia capturar e processar esses pacotes udp. A descrição da instalação " simples " desencoraja novamente a leitura. Em longas listas de dependências, existem nomes de pacotes e nomes de programas e links para outras páginas com outras dependências. Ninguém tem tempo ou vontade de lidar com essa porcaria.

O processo de instalação do pinba2 não é especialmente fácil .

Talvez no recurso o pinba10 possa ser instalado com um ou dois comandos e sem ler muitas coisas para descobrir como fazê-lo, mas por enquanto não é assim.

A instalação do pinba_engine é apenas metade da história. Afinal, sem o quadro de anúncios, você terá dados limitados apenas nos últimos minutos. É bom que o quadro de anúncios seja bastante simples em uma instalação .

Mas 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 possa capturar pacotes udp e colocá-lo em algum tipo de armazenamento? Aparentemente, os desenvolvedores que pensaram assim criaram aplicativos próprios e alguns deles publicaram no githab.

Abaixo está uma revisão de quatro projetos de código aberto que armazenam métricas em armazenamento, a partir dos quais esses dados são facilmente obtidos e visualizados pela grafana.

olegfedoseev / pinba-influxdb (novembro de 2017)


servidor udp em golang, que salva métricas no OpenTSDB. Talvez se você já usa o OpenTSDB em seu projeto, essa solução seria adequada para você.

olegfedoseev / pinba-influxdb (junho de 2018)


servidor udp em golang, do mesmo usuário do github , que desta vez salva métricas no InfluxDB. Muitos projetos já usam o InfluxDB para monitoramento, portanto esta solução pode ser uma boa solução para eles.

profissionais:

  • O influxo permite agregar as métricas resultantes e remover o original após um tempo especificado.

contras:

  • Esta solução não salva informações para temporizadores.
  • O InfluxDB salvará os endereços das páginas como tags e, se você tiver muitos endereços exclusivos, aumentará o consumo de RAM. A partir de um certo ponto, " começará a usar muita memória ". ( fonte )

ClickHouse-Ninja / Proton (janeiro de 2019)


servidor udp em golang, que salva métricas no ClickHouse. Esta é a aplicação do meu amigo. Após o uso, comecei a trabalhar no meu próprio aplicativo para pinba com clickhouse.

profissionais:

  • O clickhouse é ideal para essas tarefas, permite compactar os dados para que você possa 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 para temporizadores

contras:

  • Não inventado aqui
  • não há configuração para o nome do banco de dados e tabelas, para o endereço e porta do
    servidor.
  • outras pequenas coisas que fluem desde o primeiro ponto negativo

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


servidor udp em php, que salva métricas no ClickHouse. Esta é a minha aplicação, que é o resultado do meu RND de pinba, ClickHouse e protobuf. Eu escrevi “prova de conceito”, que inesperadamente para mim não consumia recursos significativos (30 MB de RAM e menos de 1% de um dos oito núcleos do processador), então decidi compartilhá-lo com as pessoas.

As vantagens são as mesmas 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 pinbasver para salvar métricas em tabelas diferentes - isso é útil se você deseja coletar medidas não apenas do php, mas também do nginx.

Contras - "Não inventado aqui" e aquelas pequenas coisas que não lhe convêm pessoalmente, mas minha solução é muito simples e consiste em apenas cerca de 100 linhas de código, para que qualquer desenvolvedor de php possa mudar tudo em alguns minutos. não gosto.

Como funciona

Está escutando a porta udp 30002. Todos os pacotes recebidos são decodificados de acordo com o esquema protobuf e são agregados. A cada minuto, o lote de pacotes é inserido na casa de cliques na tabela pinba.requests. (todas as configurações são definidas na configuração )

Sobre a ClickHouse

Clickhouse suporta diferentes mecanismos de armazenamento de dados. O mais usado é o MergeTree.

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

Você percorreu um longo caminho; portanto, haverá uma descrição detalhada da instalação e configuração da minha solução e tudo o que você precisa. 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 ser um pouco diferente.

Instalação


Eu coloquei todos os comandos necessários no Dockerfile para a reprodutibilidade das instruções. Somente os problemas serão descritos abaixo.

php pinba

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

 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, este usuário está disponível em todos os ip. Portanto, se você não possui um firewall no seu servidor, defina uma senha. Isso também pode ser feito após a instalação no arquivo /etc/clickhouse-server/users.xml.

Observe também 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á usa essa porta, 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 "admin" e a senha "admin". Quando você faz login pela primeira vez, o grafana solicita que você defina uma nova senha.

Em seguida, acesse o menu "+" -> importar e especifique o número de painéis para importar 10011 . Eu preparei este painel para que você não precise fazer isso novamente.

O Grafana suporta o ClickHouse por plugins de terceiros, mas o grafana não suporta alertas para plugins de terceiros (o ticket já existe há vários anos).

servidor pinba

A instalação de protobuf e libevent é opcional, mas melhora o desempenho do servidor pinba. Se você instalar um servidor pinba em uma pasta diferente de / opt, também precisará alterar o arquivo de script systemd .

pinba-module sob nginx

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

Lifehacks

Todos os meus sites funcionam apenas em https. Então, eu uso o campo "esquema" para separar a web / console.
Nos scripts da web eu uso:

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

e no console (por exemplo, cron-scripts):

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

No meu painel na grafana, há um switch web / console para visualizar estatísticas separadamente.
Você também pode enviar suas tags para a pinba, por exemplo:

 pinba_tag_set('country', $countryCode); 

Só isso.

Você também pode ler a versão russa .

Por favor, responda às pesquisas do artigo e me apoie no Reddit .

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


All Articles