DEV Community

Eldio Santos Junior
Eldio Santos Junior

Posted on

Monitoramento e rastreamento

Um tempo atrás a firma decidiu deixar de usar a biblioteca do NewRelic para coletar dados de traces distribuídos e métricas de runtime (usados pra rastrear requisições, monitorar memória, processamento, erros e definir alertas) e passaria a utilizar o OpenTelemetry, que é uma especificação de coleta de métricas e dados de trace agnóstico a ferramenta onde você guarda os dados e possui implementação pra várias linguagens (todas as linguagens que eu procurei tinham sua implementação). Na época, programando em Java, você adicionara o Java Agent do OpenTelemetry e já tínhamos uns 70% funcionando, como usava Spring Boot, era só adicionar o Spring Cloud Blá Blá Blá (se não me falha a memória era o Spring Cloud Sleuth, mas não poria a minha mão no fogo) e o trabalho estava feito.

Atualmente, programando em Go, percebi que não tem nada automágico, que algumas bibliotecas não tinham um mecanismo pra coletar essas informações e nem tem muito material sobre, nem em inglês (eu até vi algum material falando sobre trace, mas quase nada sobre métricas de runtime, nem mesmo em inglês)... Então resolvi pegar o assunto pra dar uma olhada e comecei a fazer uma prova de conceito e achei válido ir documentando o que fosse aprendendo sobre o assunto. A ideia é utilizar o máximo possível de soluções da comunidade (principalmente do repositório oficial de Go do OpenTelemetry, o open-telemetry/opentelemetry-go-contrib)...

Daí, pensei em uma organização de micro serviços meio aleatória e saiu o desenho abaixo.

Rascunho de diagrama de micro serviços da prova de conceito

Depois comecei a pesquisar ferramentas de visualização dessas paradas e encontrei duas opções que me pareceram interessantes, o Jaeger, que só tinha suporte a visualização dos traces (mas a visualização dele fica bem legal) e a stack do OpenSearch (OpenSearch e OpenSearch Dashboards), que tem visualização de traces e te da uma estrutura pra criar gráficos com as métricas de runtime (mas a visualização é bem mequetrefe), na dúvida tentei configurar ambos utilizando Docker (e, como todo castigo pra trouxa é pouco, resolvi aproveitar a opção com o Opensearch e subir também uma estrutura pra jogar o stdout do Docker num índice do OpenSearch e permitir visualizar no Dashboards, deu um trabalhinho, mas no final funcionou mais ou menos bem)...

A estrutura com o Jaeger ficou da seguitne forma:

Estrutura de micros serviços + Jaeger

E a estrutura utilizando o OpenSearch ficou assim:

Estrutura de micros serviços + Opensearch Stack

O código do projeto esta em eldius/golang-observability-poc.

Pretendo ir documentando o que for aprendendo no processo.

Top comments (0)