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.
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-pinbaNos 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 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 . 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.pinba2
não foi fácil. b .
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 , 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 .
À 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.
(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.
(junho de 2018)
servidor UDP em Go, do mesmo , 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 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 de memória. A partir de um certo ponto, ele "começará a consumir memória descontroladamente".«. ()
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:
- 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.
(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 )
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 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:30002clickhouse
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 . 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 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 este artigo .
Apenas usuários registrados podem participar da pesquisa. , 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
