Squzy - sistema de monitoramento self-host de código aberto gratuito com incidentes e notificações

Numa noite quente de inverno, tivemos a ideia de escrever uma aplicação para verificação do Sitemap da empresa para a qual trabalhamos, com a capacidade de avisar quando ocorrer um erro.



Aos poucos, essa ideia mudou para a implementação, houve pensamentos de melhoria, surgiu o monitoramento de hosts, depois o monitoramento de aplicativos e, como a cereja do bolo, incidentes com notificação.



Como resultado, obtivemos um sistema de monitoramento completo, que é uma solução self-host totalmente de código aberto que não possui comunicações externas, com incidentes totalmente definidos pelo usuário.



E neste post queremos apresentar o produto resultante.



Detalhes técnicos



Uma arquitetura de microsserviço foi escolhida para o desenvolvimento. O back-end foi desenvolvido em GoLang como uma linguagem rápida e conveniente para o desenvolvimento de microsserviços. Usamos gRPC para comunicação entre serviços. Além do fato de que o gRPC funciona em HTTP / 2 com tudo o que ele implica, a descrição das interfaces de serviço por meio de proto permitirá que você, como usuário, crie suas próprias implementações de partes individuais do sistema, se necessário.



O projeto usa Mongo como banco de dados de acesso rápido e Postgres para armazenar estatísticas coletadas.



O Bazel foi usado para montagem e implantação. O Bazel permite que você descreva de forma declarativa as dependências e relacionamentos entre os pacotes no Golang. Além disso, começamos a testar o Bazel com um cache remoto, o que tem um efeito positivo na velocidade do sistema. O Bazel também coleta todos os aplicativos no Docker e organiza os testes de unidade. Tudo isso está integrado às ações do Github.



O painel do sistema é escrito em Angular 9.



Tentamos manter a barra nos testes unitários, no momento em que todas as entidades são percorridas. Em um futuro próximo, está prevista a implementação de testes de integração e E2E para o suporte mais completo do sistema



Descrição do sistema



Conforme mencionado acima, Squzy é um conjunto de microsserviços interagindo entre si, cada um dos quais lida com uma tarefa separada.



Lista de serviços:



  • Agent Client — , . , . Agent Server.
  • Agent Server — , . Mongo, Storage.
  • Application Monitoiring — , / Squzy , . GoLang NodeJS, — PHP & Java .
  • Monitoring — external/internal .
  • Storage — . Postgres, ClickHouse.
  • Incident Manager- . ( ). Mongo, Storage.
  • Notification Manager — . Webhook & Slack.
  • API — API Gateway


O esquema de interação do serviço é o seguinte:







Para demonstrar os recursos do Squzy, foi desenvolvida uma demonstração que monitora seu próprio servidor e permite monitorar o sistema no painel: https://demo.squzy.app/ .



Alguns recursos, como adicionar / remover novas entidades, estão desabilitados na demonstração, mas permitem que você veja e sinta todas as partes do sistema. A seguir, nos deteremos em mais detalhes sobre cada um dos tipos de monitoramento.



Esta parte do sistema é responsável por verificações externas / internas. No momento, ele permite que você envie solicitações e espere respostas para os seguintes tipos de endpoints:



  1. Tcp - verificação de porta aberta;
  2. gRPC - verificação de protocolo ;
  3. Http - verifica a conformidade com o código de status;
  4. SiteMap - verificando se todos os URLs do Sitemap respondem com 200 OK ;
  5. JsonValue - coleção de valores específicos da resposta JSON.


O Squzy permite que você adicione cabeçalhos personalizados a todos os tipos de verificações de HTTP.



A interface para adicionar uma verificação por meio do painel do Squzy se parece com esta:







Aqui, intervalo é o intervalo entre as verificações em segundos e tempo limite é o tempo após o qual a verificação é considerada malsucedida.



Após a criação, o usuário tem acesso à configuração do verificador:







Para cada tipo de verificação, você pode escrever uma regra de incidente. Mais detalhes sobre os incidentes serão descritos a seguir, mas aqui daremos apenas um exemplo:







Neste caso, medimos o valor da cotação do dólar do site, e se for superior a 80 criaremos um incidente.



Link para a demonstração.



Incidentes podem ser criados em:



  • Duração da verificação (hora de recebimento da resposta do servidor);
  • Status (código de status retornado);
  • Valor (informação transmitida no verificador).


Agente Squzy



O Agente Squzy instalado no servidor é usado para monitorar hosts no sistema. Atualmente, está coletando as seguintes estatísticas:



  • CPU - carga do processador;
  • Memória - usada / livre / total / compartilhada;
  • Disco - Usado / Livre / Total para cada um dos discos;
  • Rede - para cada interface de rede.


Linha do tempo do agente:



  1. O agente se registra no Agent Server e recebe um ID (durante o registro é possível especificar o intervalo de monitoramento e o nome do agente);
  2. O agente envia estatísticas ao servidor em um determinado intervalo;
  3. O agente notifica o servidor sobre o desligamento.


Se não houver conexão com o servidor, o agente continuará a coletar estatísticas e elas serão enviadas quando a conexão for restaurada.



A versão demo do agente pode ser visualizada aqui: https://demo.squzy.app/agents/5f142b6141a1c6518723483a/live O



agente também pode ter um conjunto de regras para verificação de incidentes:





Monitoramento de aplicativo Squzy



Para aplicativos de monitoramento, foram desenvolvidas integrações com estruturas populares para Go / NodeJs (mais adiante, como dizem os profissionais de marketing). As integrações definem o tipo de transação ( Http / Router / gRPC / WebSocket / etc) e analisa as respostas dos motores / solicitações.



O Squzy também oferece suporte para rastreamento de transações, que permite monitorar transações relacionadas de vários servidores / serviços. Um exemplo de monitoramento de tais transações no Dashboard: https://demo.squzy.app/transactions/om8l8LP96PRsvx67UxkES .



Bibliotecas para integração em Go e Node Js.





Em sua essência, as bibliotecas são middleware que cronometram o tempo antes de enviar uma transação e o tempo após o processamento, e analisa a resposta. Também escrevemos um exemplo de aplicativo de monitoramento GO: https://github.com/squzy/test_tracing.



Você pode criar suas próprias transações e medir seus tempos de execução, status e erros. Para isso, use o pacote Core. Para facilitar o suporte ao produto, todos os idiomas usarão o mesmo nome para os pacotes que definem o comportamento.



Você pode criar incidentes por transação com base nos seguintes dados:



  • A duração da transação;
  • Status da transação;
  • Erros recebidos;
  • Tipo de transação.


Squzy Incident Manager + Notification Manager



Os incidentes no Squzy são baseados em regras. Ao adicionar uma nova entidade ao Storage, a regra descrita é verificada e, se for o caso, é criado um incidente (se ainda não tiver sido criado).



As regras são uma versão estendida de expr , à qual são adicionadas regras específicas, levando em consideração a especificação do sistema, como Último (leva os últimos n registros do Armazenamento), Uso (usa um filtro específico para isso), e assim por diante. Uma descrição detalhada de todas as regras pode ser encontrada em https://squzy.app/usage/squzy-incident/incident-rules , aqui vamos nos concentrar em um exemplo ilustrativo.



Digamos que você tenha um servidor com 1.792 processadores, 256 GB de RAM e 16 TB de espaço em disco rígido. E você realmente deseja verificar se o seu devops não está executando o Doom no monitor de carga da CPU. Você sabe que manter um site de uma página que atende seu servidor nunca carrega 100 por cento mais do que 8 processadores por mais de um minuto. Além disso, a RAM está mais da metade livre. Enquanto o disco rígido tem um TB inteiro de espaço livre reservado (se você não armazenar arquivos conhecidos em casa, sua esposa verá). Nesse caso, sabendo que as métricas são coletadas a cada 10 segundos, você pode definir a seguinte regra para verificar se o seu servidor está funcionando corretamente:



any(Last(7, UseType(All)), 
    {all(.CpuInfo.Cpus, {.Load > 80}) &&
    .MemoryInfo.Mem.UsedPercent < 50 &&
    .DiskInfo.Disks["System"].Free > 1000000000000}
)


Da mesma forma, o Squzy permite que você descreva vários padrões de comportamento indesejado do sistema.



Após a verificação da regra ser bem-sucedida (ou melhor, malsucedida), um incidente é criado e o usuário é notificado, se configurado.



Um incidente ativo, ou seja, um incidente que ainda não foi verificado pelo usuário, pode ser encerrado automaticamente, ou seja, se não tiver passado na verificação em algum ponto, caso seja selecionada a opção adequada.



Para cada entidade marcada, seja ela um aplicativo / verificador / agente, você pode criar suas próprias notificações sobre incidentes.



Conclusão



Estamos agora no processo de coleta de feedback e comentários da comunidade de TI.



Já temos uma série de planos para o desenvolvimento de produtos:



  1. adicionar integrações Java / PHP;
  2. verificadores de banco de dados;
  3. migração de Postgres para ClickHouse;
  4. mais métodos de notificação;
  5. integração com kubernetes;
  6. melhoria da documentação;
  7. API GQL;
  8. Testes de integração e E2E;
  9. monitoramento de aplicativos móveis.
  10. Preenchimento automático para regras de incidentes na IU


Teremos o maior prazer em receber seus comentários ou sugestões.



Links





PS:

Obrigado pelo artigo Vonotirax



Try in 1 click



All Articles