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.
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.
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:
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
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 funcionamentoA 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 clickhouseClickhouse 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 pinbaApó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
clickhouseDurante 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 clickhouseApó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 pinbaA 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 nginxPara 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 hacksTodos 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 .