Pular para o conteúdo principal
A integração AppSignal for Elixir depende de uma NIF que chama uma biblioteca para fazer o trabalho pesado, escrita em Rust. Seu trabalho é receber dados da aplicação Elixir, normalizá-los e gravá-los em um processo agent separado por um socket Unix. O agent então envia os dados para o AppSignal.com periodicamente para processamento adicional. Veja nossa página como o AppSignal opera para mais informações sobre como nosso agent funciona. Embora usar uma NIF tenha riscos inerentes, usá-la neste caso tem várias vantagens:
  1. O overhead é muito baixo. As funções na NIF não fazem nada além de receber dados e enviá-los a uma thread worker, para que a função C possa retornar imediatamente. Ela foi projetada para ser o mais rápida possível, com pouquíssimo impacto na thread chamadora, e gerar carga mínima de garbage collection.
  2. Ela permite usar a mesma biblioteca e agent usados pelo AppSignal for Ruby, que roda em milhares de servidores de produção pelo mundo. É uma tecnologia testada em campo, processando, em conjunto, 1 bilhão de requisições por dia (novembro de 2016).
  3. A biblioteca e o agent são escritos em Rust, e suas principais considerações de design eram (e continuam sendo) robustez e desempenho.
Internamente, a NIF do AppSignal funciona assim: ela faz fork/exec de um processo agent separado, para o qual uma thread worker na NIF envia seus dados por um socket Unix. Toda I/O e processamento na NIF é assíncrono, então chamadas às suas funções nunca vão segurar o scheduler. No caso muito improvável de algo na extensão entrar em pânico, a extensão se desabilita sem derrubar o processo host. Embora fazer protobufs nativos em Elixir para se comunicar diretamente com o agent faça mais sentido do ponto de vista da BEAM, usar uma NIF permite usar uma única biblioteca. Isso diminui possíveis problemas devido ao volume de testes e ajustes finos que já aconteceram. Ao focar em uma única base de código, o AppSignal pode garantir a mais alta qualidade para todos os seus clientes em todas as linguagens suportadas.