Instrumentação VS Coleta
A instrumentação é o processo de gerar os dados de telemetria no seu código. É como "instalar sensores" na sua aplicação que vão criar os traces, métricas e logs.
Existem dois tipos principais de instrumentação:
-
Automática: Usando bibliotecas que já instrumentam automaticamente frameworks e bibliotecas comuns. O OTel vem crescendo e ganhando essa automatação para as linguagem gradativamente. Hoje só temos diponíveis para as linguagens: .NET, Go, Java, JavaScript, PHP, Python. Veja https://opentelemetry.io/pt/docs/getting-started/ops/ caso queira iniciar rápido se a linguagem do seu projeto já está automatizada.
-
Manual: Quando você adiciona código específico para gerar telemetria em partes importantes da sua aplicação. Nesse caso temos várias bibliotecas disponíveis para várias linguagens. Consulte https://opentelemetry.io/pt/docs/getting-started/dev/ para mais informações.
A coleta é o processo de capturar esses dados gerados e enviá-los para um destino. É realizada pelo OpenTelemetry Collector que receberá dados de telemetria das aplicações instrumentadas, processa esses dados (pode filtrar, transformar, agregar) e exporta para sistemas de observabilidade (como Jaeger, Prometheus, etc).
O Collector funciona como um intermediário central (um Hub) que recebe dados de múltiplas fontes, padroniza o formato e encaminha para um ou mais destinos
A Instrumentação GERA os dados (é onde os dados nascem) e a Coleta PROCESSA e ENCAMINHA esses dados (é como os dados viajam).
o Collector é um componente separado da aplicação. Pode ser um binário independente, um container que funciona como um sidecar, um service no sistema operacional, etc. O Collector foi projetado para ser um componente independente e funcionar como um serviço centralizado que pode receber dados de múltiplas aplicações no mesmo SO.
Se você precisa de algo mais leve e integrado à aplicação, o OTEL oferece o conceito de "exporter" que pode enviar dados diretamente para seu sistema de observabilidade. O Exporter não é tão poderoso quando o collector e muito mais limitado. O ideal é smepre apontar para um collector, mas em alguns casos específicos de arquitetura o uso do exporter pode fazer sentido.
Collector como Sidecar vs Collector Centralizado
É bom explicar isso pois provavelmente você deve estar pensando que deve ter uma collector enorme esperando todo mundo mandar para ele os sinais.
Sidecar Pattern
Vamos essa arquitetura quando precisamos de alta performance, segurança estrita, cada aplicação tem necessidades específicas de processamento e os recursos do cluster não são uma limitação.
Pod
├── Container da Aplicação
└── Container do Collector (sidecar)
Vantagens do Sidecar
- Isolamento
- Cada aplicação tem seu próprio collector
- Falhas não afetam outras aplicações
- Mais fácil de debugar problemas
- Performance
- Comunicação local (dentro do mesmo pod)
- Menor latência
- Menos tráfego de rede
- Segurança
- Dados não trafegam pela rede antes de serem processados
- Mais fácil de controlar acesso
Collector Centralizado
Partimos para essa arquiteturas quando precisamos:
- Economizar recursos
- Aplicações similares
- Configuração padronizada
- Simplicidade de manutenção e atualização
Cluster Kubernetes
├── Pod Crítico (com sidecar)
├── Pod Normal (sem sidecar)
└── Collector Central
As mudanças afetam todas as aplicações de uma vez.
Nada impede de utilizarmos as duas coisas e formar um híbrido. Um collector por node? Por namespace? Não existe um certoe errado, depende de muitos fatores. Mas se eu pudesse te dar uma dica, sidecar não tem erro!