Estatísticas e monitoramento de scripts PHP em tempo real. ClickHouse e Grafana ajudam Pinba

Neste artigo vou te contar como usar pinba com clickhouse e grafana em vez de pinba_engine e pinboard.

Em um projeto PHP, pinba talvez seja 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 ideia de quantas vezes por segundo/minuto este ou aquele script é chamado e começam a otimizar “por toque”, começando por aqueles lugares que parecem mais lógicos.

Alguns analisam logs nginx, enquanto outros analisam consultas lentas ao banco de dados.

É claro que o pinba não seria supérfluo, mas há vários motivos pelos quais nem todos os projetos o possuem.

Estatísticas e monitoramento de scripts PHP em tempo real. ClickHouse e Grafana ajudam Pinba

E o primeiro motivo é a instalação.

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

Para fazer isso:

  • instale a extensão para php (e você pode querer um módulo para nginx)
  • extensão de compilação para mysql
  • instale o pinboard e configure o cron

Devido à pouca informação sobre o Pinba, muitas pessoas têm a impressão de que ele só funcionava no PHP5 e já é coisa do passado, mas como veremos mais adiante, não é o caso.

O primeiro passo é o mais simples, basta executar o comando:

apt install php-pinba

Esta extensão está disponível nos repositórios até php 7.3 inclusive e você não precisa compilar nada.

Após executar o comando de instalação, recebemos imediatamente uma extensão funcional que coleta e envia métricas para cada script (tempo de execução, memória, etc.) no formato protobuf via udp para 127.0.0.1:30002.

Até agora ninguém capturou ou processou esses pacotes UDP, mas isso não afeta negativamente a velocidade ou estabilidade de seus scripts PHP.

Até recentemente, a única aplicação que conseguia capturar e processar esses pacotes UDP era pinba_engine. Descrição "simples e conciso"A instalação desencoraja o desejo de ler e aprofundar novamente. As listas de dependências com quilômetros de extensão contêm nomes de pacotes e nomes de programas e links para páginas individuais com sua instalação, e essas têm seus próprios links para outras dependências. Ninguém tem tempo ou vontade de lidar com essa porcaria.

Processo de instalação pinba2 não especialmente mais fácil.

Talvez algum dia seja possível instalar o pinba10 com um ou dois comandos e não ter que ler muito material para entender como fazer, mas por enquanto não é o caso.

Se você instalar o pinba_engine, isso será apenas metade da batalha. Afinal, sem quadro de anúncios você terá que se limitar aos dados dos últimos minutos ou terá que agregar, armazenar e visualizar os dados você mesmo. É bom que o quadro de avisos seja bastante simples de usar instalar.

Ao que parece, por que tanto sofrimento se todas as métricas do php já foram enviadas para a porta udp no formato protobuf e tudo que você precisa é escrever um aplicativo que irá capturá-las e colocá-las em algum tipo de armazenamento? Aparentemente, os desenvolvedores que tiveram essa ideia imediatamente se sentaram para escrever suas próprias ideias, algumas das quais acabaram no GitHub.

A seguir está uma visão geral de quatro projetos de código aberto que salvam métricas no armazenamento, dos quais esses dados podem ser facilmente recuperados e visualizados, por exemplo, usando grafana.

olegfedoseev/pinba-servidor (novembro de 2017)

servidor udp em movimento que salva métricas no OpenTSDB. Talvez se você já estiver usando OpenTSDB em seu projeto, esta solução será adequada para você, caso contrário, recomendo ignorá-la.

olegfedoseev/pinba-influxdb (junho de 2018)

servidor udp em movimento, do mesmo navegador, que desta vez armazena as métricas no InfluxDB. Muitos projetos já usam o InfluxDB para monitoramento, então esta solução pode ser perfeita para eles.

Prós:

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

Contras:

ClickHouse-Ninja/Proton (janeiro de 2019)

servidor udp on go, que salva métricas no ClickHouse. Esta é a solução do meu amigo. Foi depois de conhecê-lo que decidi que era hora de enfrentar o Pinbu e o Clickhouse.

Prós:

  • 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 em temporizadores

Contras:

  • falha fatal
  • não existe uma configuração na qual você possa configurar o nome do banco de dados e tabelas, o endereço e a porta do servidor.
  • ao armazenar dados brutos, uma tabela de dicionário auxiliar é usada para armazenar endereços de páginas e domínios, o que complica as consultas subsequentes
  • outras pequenas coisas que se seguem desde o primeiro menos

servidor pinba/servidor pinba (abril de 2019)

servidor udp em php, que salva métricas no ClickHouse. Esta é a minha solução, que é o resultado de conhecer pinba, ClickHouse e protobuf. Enquanto resolvia todo esse monte, 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 eu decidiu compartilhá-lo com o público.

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 iniciar várias instâncias do servidor pinbase 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.
Desvantagens - “falha fatal” e aquelas pequenas coisas que não combinam com você pessoalmente, mas minha solução é “tão simples quanto um chinelo” e consiste em apenas cerca de 100 linhas de código, então qualquer desenvolvedor PHP pode mudar o que não gosta daqui a alguns minutos.

Como funciona

É escutada a porta UDP 30002. Todos os pacotes recebidos são decodificados de acordo com o esquema protobuf e agregados. Uma vez por minuto, um pacote é inserido no clickhouse na tabela pinba.requests. (todos os parâmetros são configurados em configuração)

Um pouco sobre clickhouse

Clickhouse oferece suporte a diferentes mecanismos de armazenamento de dados. O mais comumente usado é o MergeTree.

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

Então, você percorreu um longo caminho e não gostaria de deixá-lo no meio do caminho, então o que se segue é uma descrição detalhada da instalação e configuração da minha solução e tudo que você precisa, bem como as armadilhas que causaram mais de um navio travar. Todo o processo de instalação é descrito para Ubuntu 18.04 LTS e Centos 7; o processo pode ser ligeiramente diferente em outras distribuições e versões.

Instalação

Coloquei todos os comandos necessários dockerfile para facilitar a reprodutibilidade das instruções. Apenas as armadilhas serão descritas abaixo.

php-pinba

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

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

clique

Durante a instalação, clickhouse solicitará que você defina uma senha para o usuário padrão. Por padrão, este usuário é acessível a partir de todos os IPs, portanto, se você não possui um firewall em seu servidor, defina uma senha para ele. Isso também pode ser feito após a instalação no arquivo /etc/clickhouse-server/users.xml.

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

grafana com plugin clickhouse

Após instalar o Grafana, use o login admin e a senha admin. Ao fazer login pela primeira vez, o Grafana solicitará que você defina uma nova senha.

A seguir, vá ao menu “+” -> importar e indique o número do painel para importação 10011. Preparei e carreguei este painel para que você não precise fazer isso novamente.

O Grafana oferece suporte para trabalhar com clickhouse por meio de um plugin de terceiros, mas o Grafana não possui alertas para plugins de terceiros (há um ticket para isso há vários anos).

servidor pinba

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

módulo pinba para nginx

Para compilar o módulo, você precisa de códigos-fonte da mesma versão do nginx que já está instalado em seu servidor, bem como das mesmas opções de compilação, caso contrário a compilação será bem-sucedida, mas ao conectar o módulo será gerado um erro que “o módulo não é compatível com binário.” 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 esquema perde o sentido, então eu o uso para separar web/console.

Em scripts acessíveis na web eu uso:

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

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

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

No meu painel no Grafana há uma opção web/console para visualizar estatísticas separadamente.

Você também pode enviar suas tags para o Pinba, por exemplo:

pinba_tag_set('country', $countryCode);

Isso é tudo.

Por favor, responda às enquetes abaixo do artigo.

Como de costume, aviso que não aconselho nem ajudo através de mensagens pessoais no Habr e nas redes sociais.

Crie um ticket no Github.

Também por favor apoie com curtidas versão em inglês este artigo no reddit.

Apenas usuários registrados podem participar da pesquisa. Entrarpor favor

Qual sistema operacional você está usando no servidor?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SUÍÇA

  • Unix

  • Windows

  • outro

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

Qual versão do php você está usando no servidor?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • outro

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

Você já usou pinba?

  • sim

  • não, mas eu gostaria

  • não e eu não gostaria

  • não e nunca ouvi falar dela

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

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

  • pinba_engine (mecanismo mysql)

  • pinba2 (mecanismo mysql)

  • quadro de avisos (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

  • servidor pinba/servidor pinba (go + clickhouse)

  • servidor pinba/servidor pinba (php + clickhouse)

  • Eu mesmo escreverei o meu

  • outro

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

Fonte: habr.com

Adicionar um comentário