DEV Community

Eldio Santos Junior
Eldio Santos Junior

Posted on

1 1 1 1 1

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.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay