Estatística e monitoramento de scripts PHP em tempo real. ClickHouse e Grafana vêm ajudar ao Pinba.

Neste artigo, vou explicar como usar o pinba em conjunto com o clickhouse e grafana, em vez do pinba_engine e do pinboard.

No projeto em php, o pinba é provavelmente a única maneira confiável de entender o que está acontecendo com o desempenho. Na verdade, o pinba geralmente é implementado apenas quando já existem problemas e não se sabe "onde mexer".

Muitas vezes, ninguém tem ideia de quantas vezes por segundo/minuto um determinado script é chamado e começa a otimizar "no escuro", começando pelos lugares que parecem mais lógicos.

Algumas pessoas analisam os logs do nginx, enquanto outras verificam as consultas lentas no banco de dados.

Claro que o pinba não seria desnecessário, mas há algumas razões pelas quais ele não está presente em todos os projetos.

Estatística e monitoramento de scripts PHP em tempo real. ClickHouse e Grafana vêm ajudar ao Pinba.

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

Para obter algum "retorno" ao implementar o pinba, é desejável ver métricas não apenas nos últimos minutos, mas em um longo espaço de tempo (de dias a meses).

Para isso, é necessário:

  • instalar a extensão para php (e talvez você queira o módulo para nginx)
  • compilar a extensão para mysql
  • instalar o pinboard e configurar o cron

Devido à quantidade limitada de informações sobre o pinba, muitos têm a impressão de que ele funcionou apenas no php5 e ficou para trás, mas como veremos a seguir — isso não é verdade.

O primeiro passo — o mais simples, é só executar o seguinte comando:

apt install php-pinba

Nos repositórios, esta extensão está disponível até a versão php 7.3, e você não precisa compilar nada.

Após executar o comando de instalação, já obtemos uma extensão funcional que coleta e envia métricas de cada script (duração da execução, memória, etc.) no formato protobuf via udp em 127.0.0.1:30002.

Esses pacotes udp ainda não estão sendo capturados ou processados por ninguém, mas isso não afeta negativamente a velocidade ou a estabilidade do funcionamento dos seus scripts em php.

Até recentemente, o único aplicativo que poderia capturar e processar esses pacotes udp era o pinba_engine. A descrição de uma "instalação simples e concisa" desencoraja qualquer desejo de ler e entender isso novamente. Nas longas listas de dependências, há tanto nomes de pacotes quanto nomes de programas e links para páginas específicas com suas instalações, e esses têm seus próprios links para outras dependências. Ninguém tem tempo ou desejo para lidar com esse tipo de confusão.O processo de instalação depinba2

não foi fácil. V b especialmente mais fácil.

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

Se você realmente instalou o pinba_engine, isso é apenas metade do trabalho. Afinal, sem pinboard , você terá que se limitar a dados apenas dos últimos minutos ou agregar, armazenar e visualizar os dados manualmente. Felizmente, o pinboard é bastante simples de instalação.

À primeira vista, pode parecer desnecessário passar por esses desafios, já que todas as métricas do PHP já vão para uma porta UDP no formato protobuf, e tudo o que é preciso é escrever um aplicativo que as capture e as armazene em algum repositório? Provavelmente, os desenvolvedores que tiveram essa ideia logo começaram a escrever suas próprias versões, algumas das quais acabaram no GitHub.

A seguir, uma visão geral de quatro projetos de código aberto que armazenam métricas em repositórios, de onde esses dados podem ser facilmente recuperados e visualizados, por exemplo, com o Grafana.

olegfedoseev/pinba-server (novembro de 2017)

servidor UDP em Go, que armazena métricas no OpenTSDB. Se o OpenTSDB já está sendo usado no seu projeto, essa solução pode ser adequada, caso contrário, recomendo passar longe.

olegfedoseev/pinba-influxdb (junho de 2018)

servidor UDP em Go, do mesmo usuário do Habr, que desta vez armazena métricas no InfluxDB. Em muitos projetos, o InfluxDB já está sendo utilizado para monitoramento, então essa solução pode funcionar muito bem para eles.

Acesso direto aos sistemas de cabos transpacíficos. Ping mínimo para a China, Japão, Austrália e costa oeste dos EUA.

  • InfluxDB permite agregar as métricas obtidas e deletar o original após um determinado período.

Pontos negativos:

  • essa solução não armazena informações sobre temporizadores.
  • O InfluxDB armazenará os endereços das páginas do site como tags, e se você tiver muitos endereços únicos, isso levará a um aumento do consumo de memória. A partir de um certo ponto, ele "começará a consumir memória descontroladamente".ClickHouse-Ninja/Proton«. (fonte)

(janeiro de 2019) servidor UDP em Go, que armazena métricas no ClickHouse. Essa solução é do meu amigo. Foi depois de me familiarizar com ela que decidi que era hora de trabalhar com pinba e ClickHouse.

ClickHouse é perfeito para essas tarefas, ele permite compactar os dados tanto que você pode armazenar todos os dados brutos mesmo sem agregações.

Acesso direto aos sistemas de cabos transpacíficos. Ping mínimo para a China, Japão, Austrália e costa oeste dos EUA.

  • se necessário, você pode agregar facilmente as métricas obtidas.
  • modelo pronto para o Grafana
  • armazena informações sobre temporizadores
  • um defeito fatal

Pontos negativos:

  • fatal
  • não há uma configuração que permita o ajuste do nome do banco de dados e das tabelas, do endereço e da porta do servidor.
  • ao salvar dados brutos, uma tabela de dicionário auxiliar é utilizada para armazenar endereços de páginas e domínios, o que posteriormente complica as consultas.
  • outras pequenas nuances que derivam do 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, resultado do meu contato com pinba, ClickHouse e protobuf. Enquanto eu me familiarizei com toda essa tecnologia, escrevi um 'proof of concept', que inesperadamente não consumiu recursos significativos (30 MB de memória RAM e menos de 1% de um dos oito núcleos do processador), então decidi compartilhá-lo com o público.

As vantagens são as mesmas da solução anterior, também usei nomes familiares da pinba_engine original. Além disso, adicionei uma configuração que permite iniciar várias instâncias do servidor pinba, para armazenar métricas em diferentes tabelas — isso é útil se você quiser coletar dados não apenas do PHP, mas também do Nginx.
Desvantagens — um 'defeito fatal' e algumas pequenas questões que podem não agradar você pessoalmente, mas minha solução é 'simples como um chinelo' e consiste em cerca de 100 linhas de código, então qualquer desenvolvedor PHP pode facilmente alterar o que não gostar em poucos minutos.

Princípio de funcionamento

O porto UDP 30002 está sendo escutado. Todos os pacotes recebidos são decodificados de acordo com o esquema protobuf e agregados. Uma vez por minuto, um lote é inserido no ClickHouse na tabela pinba.requests. (todos os parâmetros podem ser configurados em configuração)

Um pouco sobre o ClickHouse

O ClickHouse suporta diferentes motores de armazenamento de dados. O mais frequentemente utilizado é o MergeTree.

Se em algum momento você decidir armazenar dados agregados ao longo do tempo e dados brutos apenas dos últimos, você pode criar uma view materializada com agrupamento, e limpar periodicamente a tabela principal pinba.requests, fazendo com que todos os dados permaneçam na view materializada. Além disso, ao criar a tabela pinba.requests, você pode especificar 'engine = Null', fazendo com que os dados brutos não sejam salvos no disco, mas ainda assim sejam retornados para a view materializada e armazenados de forma agregada. Eu uso esse esquema para métricas do Nginx, pois no Nginx recebo 50 vezes mais requisições do que no PHP.

Então, você percorreu um longo caminho e eu não gostaria de deixá-lo pela metade, por isso a seguir estará uma descrição detalhada da instalação e configuração da minha solução e tudo o que você precisará, bem como as armadilhas em que muitos já tropeçaram. Todo o processo de instalação é descrito para Ubuntu 18.04 LTS e CentOS 7, em outras distribuições e versões o processo pode ser ligeiramente diferente.

Instalação

Todos os comandos necessários estão listados em Dockerfile para facilitar a reprodutibilidade das instruções. Abaixo serão descritas apenas as armadilhas.

php-pinba

Após a instalação, certifique-se de que no arquivo /etc/php/7.2/fpm/conf.d/20-pinba.ini todas as opções estão descomentadas. Em algumas distribuições (por exemplo, CentOS), elas podem estar 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 default. Por padrão, este usuário está disponível de todos os IPs, portanto, se você não tiver um firewall no servidor, certifique-se de definir uma senha. Isso também pode ser feito já após a instalação no arquivo /etc/clickhouse-server/users.xml.

Vale ressaltar que o ClickHouse utiliza várias portas, incluindo a 9000. Esta porta também é utilizada pelo php-fpm em algumas distribuições (por exemplo, CentOS). Se essa porta já estiver em uso, você poderá alterá-la para outra no arquivo /etc/clickhouse-server/config.xml.

grafana com plugin para clickhouse

Após a instalação do Grafana, use o login admin e a senha admin. No primeiro acesso, o Grafana solicitará que você defina uma nova senha.

Em seguida, acesse o menu “+” -> import e indique o número do dashboard para importação 10011. Este dashboard eu preparei e enviei para você não precisar recriá-lo.

O Grafana suporta o uso do ClickHouse através de um plugin de terceiros, mas para plugins de terceiros, os alertas do Grafana não funcionam (há um ticket sobre isso que já está pendente há vários anos).

pinba-server

A instalação do protobuf e libevent não é obrigatória, mas melhora o desempenho do pinba-server. Se você instalar o pinba-server em uma pasta diferente de /opt, você também precisará ajustar o script systemd do arquivo.

módulo pinba para nginx

Para compilar o módulo, são necessários os fontes da mesma versão do nginx que já está instalada no seu servidor, assim como as mesmas opções de compilação; caso contrário, a construção será bem-sucedida, mas ao conectar o módulo ocorrerá um erro informando que "o módulo é binariamente incompatível". As opções de compilação podem ser visualizadas com o comando nginx -V

Dicas

Todos os meus sites funcionam apenas com https. O campo schema se torna sem sentido, por isso o utilizo para separar web/console.

Nos scripts que estão disponíveis na web, eu uso:

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

E nos scripts de console (por exemplo, scripts cron):

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

No meu painel do Grafana, há um interruptor web/console para visualizar as estatísticas separadamente.

Além disso, é possível passar suas próprias tags para o Pinba, por exemplo:

pinba_tag_set('country', $countryCode);

Isso é tudo.

Por favor, responda às pesquisas sob o artigo.

Tradicionalmente, aviso que não consulto nem ajudo através de mensagens pessoais do Habr e redes sociais.

Abra um ticket no GitHub.

Além disso, por favor, apoie com curtidas na versão em inglês este artigo no Reddit.

Apenas usuários registrados podem participar da pesquisa. Entre, por favor.

Qual sistema operacional você usa no servidor?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SuSE

  • Unix

  • Windows

  • outro

114 usuários votaram. 11 usuários se abstiveram.

Qual versão do PHP você utiliza no servidor?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • outro

105 usuários votaram. 17 usuários se abstiveram.

Você já usou o Pinba?

  • sim

  • não, mas gostaria

  • não e não gostaria

  • não e nunca ouvi falar dele

100 usuários votaram. 14 usuários se abstiveram.

Qual versão do servidor Pinba você gostaria de experimentar?

  • pinba_engine (motor mysql)

  • pinba2 (motor mysql)

  • pinboard (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

  • pinba-server/pinba-server (go + clickhouse)

  • pinba-server/pinba-server (php + clickhouse)

  • escreverei o meu próprio

  • outro

39 usuários votaram. 47 usuários se abstiveram.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster