Odigos (YC W23) – rastreamento distribuído instantâneo para clusters Kubernetes
(github.com/keyval-dev)Olá. Somos Eden e Ari, cofundadores do Odigos (https://github.com/keyval-dev/odigos). O Odigos é um projeto open source que gera rastreamentos distribuídos (distributed traces) instantaneamente para aplicações, permitindo que os usuários os utilizem com facilidade. O Odigos é compatível com ferramentas de monitoramento existentes e não exige alterações no código-fonte.
Nossa experiência com ferramentas de monitoramento antigas foi bastante frustrante. Ao monitorar sistemas distribuídos com vários microsserviços, percebemos que estávamos gastando tempo demais tentando identificar qual microsserviço era a origem do problema. Por exemplo, já passamos horas depurando uma aplicação específica por suspeita de ela estar causando latência, apenas para descobrir depois que a causa real estava em outra aplicação relacionada.
Depois disso, pesquisamos o rastreamento distribuído (distributed tracing) como a abordagem adequada para resolver esse tipo de problema. Diferentemente de métricas ou logs, que capturam dados de um momento específico em uma única aplicação, o rastreamento distribuído marca cada requisição com um ID único para que seja possível acompanhar sua propagação em um ambiente distribuído. Isso permite que os desenvolvedores entendam o contexto (context) de cada requisição e como as aplicações distribuídas se comportam.
No entanto, essa abordagem tem a desvantagem de ser difícil de implementar. Ao contrário de métricas ou logs para uma única aplicação, o rastreamento distribuído precisa ser implementado em várias aplicações. Se houver ao menos uma aplicação que não gere rastreamentos distribuídos, a propagação do contexto é interrompida e o valor desse rastreamento cai bastante.
Pela nossa experiência implementando rastreamento distribuído manualmente para várias empresas, coordenar todas as equipes de desenvolvimento para instrumentar cada aplicação e alcançar rastreamento distribuído completo é extremamente difícil. Quando a implementação era concluída, o valor era alto, pois os problemas em produção podiam ser resolvidos muito mais rápido. Porém, implementações parciais não tinham tanto valor.
Então começamos a automatizar esse processo. Já sabíamos como lidar com a maior parte dele, mas a parte mais complicada era como instrumentar automaticamente programas escritos em linguagens compiladas (como Go). Pensamos que, se conseguíssemos automatizar só essa parte, seria possível automatizar todo o processo de geração de rastreamentos distribuídos. Durante a pesquisa, percebemos que, usando eBPF (uma tecnologia que permite ao kernel Linux carregar programas externos e executá-los dentro do kernel), seria possível fazer instrumentação automática para linguagens compiladas. Essa foi a peça final do quebra-cabeça e, com isso, conseguimos desenvolver o Odigos.
O Odigos primeiro faz uma varredura em todas as aplicações em execução e, usando eBPF e OpenTelemetry, reconhece a linguagem de programação de cada aplicação e a instrumenta automaticamente de acordo com isso. Ele também implanta coletores que fazem buffering, filtragem e encaminhamento dos dados para a ferramenta de monitoramento escolhida, com auto scaling conforme o volume de tráfego. Com essa automação, os desenvolvedores podem começar a usar rastreamento distribuído em apenas alguns minutos, em vez do trabalho manual que poderia levar meses para ser implementado.
A instrumentação automática entre várias linguagens de programação não é uma tarefa simples, especialmente quando se consideram binários estáticos (por exemplo, binários gerados pelo compilador Go). Introduzimos vários mecanismos para inserir com segurança e estabilidade os cabeçalhos necessários e desenvolvemos um sistema para acompanhar funções e structs de bibliotecas open source em diferentes versões. Também desenvolvemos um sistema para gerenciamento de memória em espaço do usuário (userspace) dentro do eBPF. Como resultado, o Odigos se tornou a única solução capaz de gerar automaticamente rastreamentos distribuídos para linguagens compiladas como Go e Rust. Enquanto outras soluções exigem que o usuário seja especialista em OpenTelemetry ou eBPF, a nossa não requer conhecimento prévio em tecnologias de observabilidade (observability).
Nossa solução pode ser instalada em um cluster Kubernetes com um único comando. Depois de instalada, ela detecta a linguagem de programação de todas as aplicações em execução e aplica o instrumentador adequado. Para linguagens JIT (Java e .NET) ou interpretadas (JavaScript e Python), implanta instrumentadores do OpenTelemetry. Para linguagens compiladas (Go, Rust, C), implanta instrumentadores baseados em eBPF. Tudo isso é abstraído para o usuário, então basta: (1) selecionar parte ou a totalidade das aplicações-alvo e (2) escolher o backend para onde enviar os dados de monitoramento.
Em maio de 2022, lançamos nosso primeiro projeto open source: um instrumentador automático para aplicações Go baseado em eBPF. Depois disso, doamos o projeto para a comunidade OpenTelemetry, e ele atualmente é desenvolvido como parte do Go Automatic Instrumentation SIG.
Acreditamos fortemente em padrões abertos, por isso todos os instrumentadores e coletores usados pelo Odigos são baseados em projetos open source desenvolvidos pela comunidade OpenTelemetry. Isso nos permite evitar dependência de fornecedor específico.
Atualmente, estamos focados em desenvolver o projeto open source. Ainda não há preços definidos nem funcionalidades pagas, mas no futuro também planejamos oferecer uma versão gerenciada do Odigos com recursos enterprise.
Mais informações abaixo.
- Documentação: https://docs.odigos.io
- Vídeo (demonstração): https://www.youtube.com/watch?v=9d36AmVtuGU
- Site: https://odigos.io
Queremos muito ouvir e compartilhar as experiências e histórias de vocês sobre rastreamento e monitoramento de aplicações distribuídas!
1 comentários
Olá, é a primeira vez que publico aqui. Gostaríamos de receber feedback da comunidade. Sintam-se à vontade para entrar no canal do Slack.
https://join.slack.com/t/odigos/…
Obrigado!