Análise de Soluções de Rastreamento Open Source No Contexto de Aplicações Baseadas em Microsserviços
Análise de Soluções de Rastreamento Open Source No Contexto de Aplicações Baseadas em Microsserviços
Análise de Soluções de Rastreamento Open Source No Contexto de Aplicações Baseadas em Microsserviços
Centro de Informática
Trabalho de Graduação
Recife
2022
Universidade Federal de Pernambuco
Centro de Informática
Recife
2022
Este trabalho é dedicado aos meus familiares,
amigos e professores.
2
AGRADECIMENTOS
Primeiramente agradeço a Deus pelos dons que me deu nesta existência que
serviram na realização deste projeto.
Agradeço aos meus pais por todo o esforço investido na minha educação.
Agradeço à minha namorada que sempre esteve ao meu lado durante o meu
percurso acadêmico.
Aos meus colegas de turma, por compartilharem comigo tantos momentos de
descobertas e aprendizado e por todo o companheirismo ao longo deste
percurso.
Sou grato pela confiança depositada na minha proposta de projeto pelo meu
professor Vinícius Garcia, orientador do meu trabalho. Obrigado por me
manter motivado durante todo o processo.
Por último, quero agradecer também à Universidade Federal de Pernambuco
e a todo o seu corpo docente.
3
RESUMO
4
ABSTRACT
Due to the rise of the internet and the high growth in the number of users, software
engineering was forced to look for more resilient architectures. One of the solutions
found was to create small, independent systems with a well-defined context that
communicate over the network, an architectural pattern we know as microservices.
However, this architectural pattern brings with it a greater difficulty in relation to the
observability of the system. Among the difficulties, we can mention the tracing,
finding the path that a given request did through the system, because in this
approach there are several systems interacting with each other. Therefore, the
objective of this project is to facilitate the choice of tracing tools through a
comparison of the two main open source products available for the JVM platform. In
addition, make available a repository with an example project so that it serves as a
reference for developers to consult the configuration and compare the benefits of
each tool, thus making the best choice for their context.
5
LISTA DE FIGURAS
6
LISTA DE SIGLAS
7
SUMÁRIO
1. INTRODUÇÃO 9
1.1 CONTEXTO 9
1.2 OBJETIVOS 10
1.3 ORGANIZAÇÃO DO TRABALHO 11
2. CONCEITOS 12
2.1 HISTÓRIA DA ARQUITETURA DE SOFTWARE 12
2.2 ARQUITETURA DE MICROSSERVIÇOS 14
2.3 OBSERVABILIDADE 17
2.4 SÍNTESE DO CAPÍTULO 21
4. DISCUSSÃO COMPARATIVA 36
4.1 ARQUITETURA 36
4.2 FUNCIONALIDADES 38
4.3 COMUNIDADE E SUPORTE 41
4.4 SÍNTESE DO CAPÍTULO 42
6. REFERÊNCIAS 46
8
1. INTRODUÇÃO
1.1 CONTEXTO
9
Além disso, o rastreamento também nos ajuda a identificar componentes do
sistema com mau funcionamento. Podemos descobrir, por exemplo, que uma
lentidão na resposta está associada a uma busca muito demorada na base de
dados. Dito isto, ter tal informação é de extrema importância para fins de otimização.
1.2 OBJETIVOS
10
● Suporte e comunidade, como é a aceitação na comunidade open
source.
11
2. CONCEITOS
12
● Client-server
● Service-oriented
13
Figura 1: Exemplo de aplicação monolítica
14
Na Figura abaixo podemos ver como uma aplicação com a arquitetura de
microsserviços funciona. O uso de um API gateway, que serve como uma porta de
entrada única para toda aplicação é uma característica comum, mas não obrigatória.
Ademais, cada serviço tem sua própria função dentro da aplicação, e quando
necessário, cada serviço também tem seu próprio meio de armazenamento de
dados, evitando assim um ponto único de falha [11].
15
também independente das outras aplicações. Isso faz com que tenhamos
uma redução de custos e tempo na resolução de problemas.
16
● Rastreamento distribuído: Encontrar os pontos de falha e gargalos é
difícil, caro e demorado com microsserviços. Além disso, na maioria
dos casos, os dados de falha não são propagados de maneira clara
dentro dos microsserviços. E este ponto é o principal aspecto de
estudo deste trabalho.
2.2 OBSERVABILIDADE
17
estruturada, como no formato JSON, para que os sistemas de visualização
de log possam indexar automaticamente e tornar os logs fácil de recuperar
[15].
● Métricas: São contagens ou medições que são agregadas ao longo de um
período de tempo. As métricas informarão, por exemplo, a quantidade de
memória usada por um método ou quantas solicitações um serviço processa
por segundo e etc [15].
● Traces: Para uma transação ou solicitação individual, um único rastreamento
exibe a operação conforme ela se move de um nó para outro em um sistema
distribuído [15].
18
RASTREAMENTO DISTRIBUÍDO
19
Figura 3: Exemplo de rastreamento
Cada passo do percurso gera traces, que são nada mais do que logs
automatizados com a informações do passo atual. Esses traces, por sua vez, são
agregados por alguma ferramenta de rastreamento e disponibilizados através de
uma interface gráfica para visualização e análise [17].
20
● Melhora a colaboração e a produtividade - Em arquiteturas de
microsserviços, equipes diferentes podem possuir os serviços envolvidos na
conclusão de uma solicitação. O rastreamento distribuído deixa claro onde
ocorreu um erro e qual equipe é responsável por corrigi-lo.
21
3. FERRAMENTAS E CONFIGURAÇÃO DO PROJETO
DOCKER
22
rastreamento: Jaeger e Zipkin. Assim, conseguimos simular um ambiente de
execução local completo para testes.
SPRING BOOT
OPENTELEMETRY
23
caso de rastreamento esse provedor pode ser: Jaeger ou Zipkin [23]. No projeto
utilizaremos esta ferramenta com o agente injetado na JVM para que os traces
coletados sejam enviados para o Jaeger ou Zipkin.
Zipkin é uma versão open source do Dapper do Google que foi desenvolvida
pelo Twitter. Em sua essência, o Zipkin é uma aplicação escrita em Java que
fornece o serviço de armazenamento e visualização de traces. Como opções de
armazenamento para manter os dados registrados, há integração com banco de
dados em memória, MySQL, Cassandra e Elasticsearch [24].
Já o Jaeger foi criado pela Uber e foi escrito em Go. Além do conjunto de
recursos do Zipkin, o Jaeger também fornece alguns recursos adicionais como:
amostragem dinâmica, que é uma forma mais inteligente de colher os traces; uma
API REST, que serve para fazer consulta aos dados dos seus traces de forma
programática; e suporte para armazenamento em memória Cassandra e
Elasticsearch [24].
24
3.3 IMPLEMENTAÇÃO
Nesta seção vamos ver o passo a passo para a criação do projeto exemplo
utilizando todas as ferramentas e conceitos discutidos até o presente momento. O
projeto a ser desenvolvido aqui é um dos objetivos deste trabalho e permitirá que
desenvolvedores tenham uma fonte de conhecimento para comparação e consulta
durante a escolha da ferramenta de rastreamento mais adequada ao seu projeto.
25
docker a partir do nosso código. O código base usado está disponível neste
repositório: https://bit.ly/3BmtmBC.
26
Figura 4: Exemplo de Dockerfile com configurações pro Jaeger
27
Para fazer isso, vamos criar um arquivo de configuração do docker-compose.
Dito isso, precisamos definir os três micro serviços e o rastreador desejado.
Devemos definir cada um deles para que sejam criados isoladamente, na definição
de cada serviço podemos passar alguns parâmetros: o nome da imagem, política de
reinicialização do container, variáveis de ambiente e expor portas quando
necessário. Há muitos outros parâmetros disponíveis mas iremos utilizar apenas os
citados.
28
Figura 7: Exemplo de docker-compose com configurações pro Zipkin
29
Primeiramente, o arquivo de script mostrado nas imagens abaixo entra na
pasta de cada micro serviço, cria o arquivo .jar da aplicação e cria a imagem a partir
do Dockerfile passando como parâmetro.
30
Figura 9: Script com comandos direcionados ao Zipkin
Neste momento, finalmente, temos tudo pronto para rodar a aplicação com o
rastreador que quisermos. Podemos, inclusive, subir as duas para comparar ao
mesmo tempo, entretanto devemos colocar configurações de portas diferentes para
o name-generator-service.
31
Para rodar compilar e rodar a aplicação com o Zipkin basta digitar o seguinte
comando: sudo bash docker-setup-with-zipkin.sh, já para rodar com o Jaeger,
devemos escrever: sudo bash docker-setup-with-jaeger.sh.
Após termos feito alguns testes na aplicação, podemos ver como está o
rastreamento das requisições. Primeiramente, vamos ver como o Jaeger nos mostra
as informações de rastreamento, e para isso vamos acessar:
http://localhost:16686/search.
32
Figura 11: Tela inicial do Jaeger
33
3.4 MÉTRICAS DE COMPARAÇÃO
34
projeto base, desde a escolha das ferramentas até a visualização dos traces nas
ferramentas de rastreamento. Por último, também foi importante analisarmos as
métricas de comparação a serem utilizadas na discussão.
35
4. DISCUSSÃO COMPARATIVA
4.1 ARQUITETURA
36
O Jaeger, contudo, possui uma arquitetura um pouco diferente e mais flexível. Esta
ferramenta foi pensada para ser disponibilizada de duas formas, com todos os
componentes em um único processo, ou de forma distribuída. Vamos estudar
primeiro a forma centralizada.
37
alguns mecanismos como: escalabilidade, armazenamento permanente, alta
disponibilidade, entre outros [25].
Quando se trata de empresas não tão grandes, com sistemas menos críticos,
tanto Zipkin quanto Jaeger podem ser utilizados com a arquitetura centralizada, isto
é, o deploy pode ser feito usando a imagem docker que contém todos os serviços
em um só. Cabe ao time analisar o seu cenário e escolher a melhor solução.
4.2 FUNCIONALIDADES
Um fator que contribui muito para a escolha de uma ferramenta são as suas
funcionalidades e os detalhes podem fazer a diferença a favor de uma ferramenta
em comparação a outra.
38
As duas ferramentas apresentadas têm a funcionalidade de busca de traces
nas suas telas iniciais (figuras 9 e 10). Ambas apresentam filtros por serviço,
duração, tags, horário e etc. Podemos notar que as funcionalidades são muito
parecidas, porém o Jaeger apresenta um gráfico com a duração das requisições ao
longo do tempo, o que ajuda a identificar de forma rápida e visual um possível
gargalo no sistema.
39
Figura 17: Gráfico de dependências do Zipkin
40
Figura 17: Comparação de traces
41
ferramenta, podemos ver que o Jaeger leva uma certa vantagem contra o Zipkin, 18
a 3 [29, 30].
Já o Jaeger, apesar de ser uma ferramenta mais nova, também tem uma
comunidade ativa. Outro ponto importante é que o Jaeger tem suporte da Cloud
Native Computing Foundation (CNCF), que é uma organização voltada a ajudar
projetos open source que contribuam para aplicações implantadas na cloud [24].
Jaeger Zipkin
Busca de traces X X
Gráfico de dependencias X X
Comparação de traces X
Filtros de traces X X
Tabela 4.1. Funcionalidades de cada ferramenta
42
Jaeger Zipkin
Forks 2k 3k
43
5. CONCLUSÃO E TRABALHOS FUTUROS
Este capítulo apresenta a conclusão deste trabalho, algumas limitações
encontradas no projeto e perspectivas de trabalhos futuros. Primeiro veremos as
considerações finais sobre o projeto aqui apresentado, depois abordaremos as
limitações presentes e posteriormente os possíveis trabalhos futuros que podem vir
a ser realizados.
5.1 CONCLUSÃO
Para auxiliar nesta tarefa, existem ferramentas open source no mercado tão
efetivas quanto outros softwares pagos, que são inacessíveis para pequenas
empresas e desenvolvedores independentes. Depois de um estudo sobre quais
ferramentas são mais relevantes para serem comparadas, as escolhidas foram
Jaeger e Zipkin devido a grande aceitação de ambas pela comunidade Java.
O Zipkin é uma ferramenta mais antiga, mas ainda assim muito usada,
estável e com um bom leque de funcionalidades. O Jaeger é uma ferramenta mais
recente e traz consigo uma personalização maior e funcionalidades inovadoras. As
duas ferramentas escolhidas entregam bem o prometido.
44
exemplo para consulta. O código criado e utilizado neste trabalho está disponível
em https://bit.ly/3qpPIf2.
5.2 LIMITAÇÕES
45
REFERÊNCIAS
[4] KOWALL, Jonah. How microservices broke monitoring (and how to fix
it). Tech Beacon, 2022 . Disponível em:
<https://techbeacon.com/app-dev-testing/how-microservices-broke-monitoring-how
-fix-it>. Acesso em: 18. fev. 2022.
46
https://www.oreilly.com/radar/microservices-adoption-in-2020. Acesso em: 23. ago.
2022.
[18] sem autor. Use containers to Build, Share and Run your applications.
docker, 2022. Disponível em: https://www.docker.com/resources/what-container.
Acesso em: 23. ago. 2022.
[20] sem autor. Spring Boot: Tudo que você precisa saber!. geekhunter,
2022. Disponível em:
https://blog.geekhunter.com.br/tudo-o-que-voce-precisa-saber-sobre-o-spring-boot
/. Acesso em: 4. set. 2022.
47
[21] sem autor. Spring Boot. spring, 2022. Disponível em:
https://spring.io/projects/spring-boot. Acesso em: 4. set. 2022.
[24] ÖZAL, Serkan. Jaeger vs. Zipkin: Battle of the Open Source Tracing
Tools. splunk, 2022. Disponível em:
https://thenewstack.io/jaeger-vs-zipkin-battle-of-the-open-source-tracing-tools/.
Acesso em: 4. set. 2022.
[27] sem autor. [Lista de artigos sobre o Jaeger]. dev.to, 2022. Disponível em:
https://dev.to/t/jaeger. Acesso em: 13. set. 2022.
[28] sem autor. [Lista de artigos sobre o Zipkin]. dev.to, 2022. Disponível em:
https://dev.to/t/zipkin. Acesso em: 13. set. 2022.
[29] sem autor. [Repositório oficial do Jaeger]. github, 2022. Disponível em:
https://github.com/jaegertracing/jaeger. Acesso em: 13. set. 2022.
[30] sem autor. [Repositório oficial do Zipkin]. github, 2022. Disponível em:
https://github.com/openzipkin/zipkin. Acesso em: 13. set. 2022.
[31] CROUCH, Steve. Choosing the right open-source software for your
project. software.ac, 2022. Disponível em:
https://www.software.ac.uk/choosing-right-open-source-software-your-project.
Acesso em: 28. set. 2022.
[32] sem autor. Tips To Choose the right open source tool. eclature, 2022.
Disponível em: https://eclature.com/open-source-tool/. Acesso em: 28. set. 2022.
48
[34] GRAÇA, Herberto. Monolithic Architecture. herbertograca.com, 2022.
Disponível em: https://herbertograca.com/2017/07/31/monolithic-architecture/.
Acesso em: 30. set. 2022.
[35] LIVENS, Jay. What is observability? Not just logs, metrics and traces.
dynatrace.com, 2021. Disponível em:
https://www.dynatrace.com/news/blog/what-is-observability-2/. Acesso em: 3. out.
2022.
[38] sem autor. [Repositório oficial do Uptrace]. github, 2022. Disponível em:
https://github.com/uptrace/uptrace. Acesso em: 6. out. 2022.
[39] sem autor. [Repositório oficial do Grafana Tempo]. github, 2022. Disponível
em: https://github.com/grafana/tempo. Acesso em: 13. set. 2022.
[40] sem autor. [Repositório oficial do Signoz]. github, 2022. Disponível em:
https://github.com/SigNoz/signoz. Acesso em: 13. set. 2022.
[41] sem autor. Free and Open Source Distributed Tracing Tools.
uptrace.dev, 2021. Disponível em:
https://uptrace.dev/get/compare/distributed-tracing-tools.html#uptrace. Acesso em:
6. out. 2022.
49