Um time de infraestrutura ou times que operam um serviço podem usar o rastreamento distribuído para monitorar ou depurar o comportamento de arquiteturas de microsserviços, ajudando assim os desenvolvedores no debug e otimização do código.
O que vamos precisar?
- 15 minutos
- Java 11 ou superior
- Editor de favorito ou IDE
- Docker
Como usar na prática um framework de opentracing em um microsserviço kotlin?
Existem várias opções para utilizar uma forma de tracing, mas o Uber fez uma implementação do padrão opentracing chamada Jaeger. Claro que é open source e está no GitHub. Vamos utilizar ela com uma aplicação springboot com kotlin e também com feign.
Inicializando o Jaeger com docker
Antigamente nós, developers, demorávamos dias configurando ambiente, mas isso é passado, temos imagem docker pra quase tudo hoje em dia. Esse comando vai baixar a imagem oficial e deixar rodando para gente utilizar.
<p> CODE: https://gist.github.com/eliezer/ee2aa60eedacaa428a32fbdbc202aad7.js</p>
Acesse no seu navegador preferido: “http://I0calh0st:16686”
Pronto, uma instância de Jaeger rodando na porta 5775 udp para receber tracing da aplicação e outra porta 16686 para acesso a interface web.
O nosso serviço de CEP
A Ideia é criar um microsserviço de busca de endereço simples que vai utilizar uma API na internet para exemplificar o uso de jaeger com feign. Um serviço de busca de endereço por CEP que vai usar uma outra API (viacep) para realizar a busca.
Algo assim:
Criando a nossa aplicação com api do Springboot-Initializr
O projeto springboot-initializr pode ser utilizado via web site ou via API. Vamos já utilizar um Script shell que já baixa nosso projeto com as dependências necessárias e já descompacta em um diretório “address”.
<p> CODE: https://gist.github.com/eliezer/ed84f0d56ce01cf04c01015a251052e7.js</p>
Esse projeto utiliza maven e não é necessário fazer a instalação em seu computador, por o próprio spring-initializr já coloca o wrapper do maven como padrão, sendo necessário só dar permissão para executar e compilar a aplicação.
<p> CODE: https://gist.github.com/eliezer/b4bd11922c70a23a531b0c740f1f6a72.js</p>
Tudo certo! Teremos algo assim:
Rodando a aplicação somente para verificar se está tudo em ordem. O Actuator é um sub-projeto do spring boot que te ajuda muito para conseguir métricas e monitoramento de sua aplicação. Ele vai expor automaticamente um endpoint de health-check em /actuator/health e vamos usar ele.
<p> CODE: https://gist.github.com/eliezer/9bad8fdd499256c33e77fa5604051351.js</p>
<p> CODE: https://gist.github.com/eliezer/e8d7311db62a8f2ac9b2a6a2ac22cbdc.js</p>
Agora com um escopo definido de negócio que é a busca de endereço usando um CEP, temos um jaeger rodando em docker e também nossa aplicação spring boot funcionando na porta 8080 com actuator.
Criando nossa interface de serviço para busca de endereço
Vamos criar uma interface de serviço que usa o serviço na internet de forma didática, poderia ser qualquer outro serviço.
O serviço que faz a busca de CEP:
<p> CODE: https://gist.github.com/eliezer/3a3ed23339807d65451fb292e50eb3ac.js</p>
O projeto Feign criado pela Netflix, é um client HTTP feito em java, que vem para facilitar como fazemos nossas integrações com outros serviços. Em resumo, você cria uma interface e usa suas anotações para decorar como será sua requisição. Para quem usa a implementação desta interface fica transparente, é como chamar um método simples, mas será executado uma requisição HTTP.
Vamos criar a interface em kotlin que representa esse serviço.
<p> CODE: https://gist.github.com/eliezer/265a18d1f5e6607e2c98fd1a5fc89b70.js</p>
O Controller em kotlin
Vamos fazer do nosso microserviço usando injeção de dependência do serviço addressService que representa a implementação da nossa interface feign que criamos. É um microsserviço simples que basicamente faz uma delegação para o serviço que faz realmente nossa busca de CEP, lembrando que esse exemplo é didático.
<p> CODE: https://gist.github.com/eliezer/3ec83a5bf104b6aaa5583ea9d8582e82.js</p>
Ao utilizar o as interfaces feign, é necessário adicionar a annotation @EnableFeignClients para funcionar a injeção do client feign no controller.
<p> CODE: https://gist.github.com/eliezer/38df63ace25764c56ea9cc4d8488f7b0.js</p>
Pronto! Agora reinicie nossa aplicação.
<p> CODE: https://gist.github.com/eliezer/9bad8fdd499256c33e77fa5604051351.js</p>
Testando o nosso serviço
<p> CODE: https://gist.github.com/eliezer/6b83c9c8507d8835c04c0ed87d64cff6.js</p>
Simples, né? Spring boot é uma ferramenta sensacional para plataforma java, além de simplificar muita coisa, reduz muito tempo de desenvolvimento. Vamos colocar nosso amigo jaeger e visualizar em sua interface web o tracing da request funcionando.
Adicionando o jaeger ao projeto
Nosso projeto maven veio com muita coisa pronta do setup inicial, mas agora vamos adicionar as dependências do opentracing-spring-jaeger no nosso pom.xml.
<p> CODE: https://gist.github.com/eliezer/e81e5850a8248e207f6f9627ca5199d7.js</p>
Também é necessário adicionar a configuração do jaeger no nosso arquivo de configuração application.properties, com isso a nossa aplicação vai conhecer para qual servidor de Jaeger deve ser enviado as informações de tracing.
<p> CODE: https://gist.github.com/eliezer/8285348c880c2eaf1d886c341788052d.js</p>
Pronto, agora reinicie nossa aplicação novamente com a configuração do Jeager.
<p> CODE: https://gist.github.com/eliezer/9bad8fdd499256c33e77fa5604051351.js</p>
Refaça o request do nosso serviço:
<p> CODE: https://gist.github.com/eliezer/b4e398b57fbb42ee44052f316cadd249.js</p>
Visualizando o resultado no jaeger
Com uma interface simples e bem intuitiva o Jaeger-UI pode ser acessado em http://I0calh0st:16686/ e com isso podemos selecionar o serviço “microservice-address” e depois em “Find Traces”.
Com apenas um tracing na tela, vamos selecionar nosso request findAddres para exibir um detalhamento do que aconteceu nesse processo.
Simples assim!
Todas as informações da transação entre serviço unificado em uma única interface e com rastreabilidade no jaeger. É possível ver informações importantes da requisição, quanto tempo gastou, o que foi chamado de recurso, etc.
A ideia deste artigo foi mostrar o quanto é simples usar springboot + kotlin + feign + jaeger. Claro que tem muito mais para saber sobre opentracing, principalmente no mundo de microsserviços.
Temos o código disponível aqui dessa demo.
Quer saber mais detalhes sobre o assunto? Veja aqui.
Ainda ficou com alguma dúvida? Gostou do conteúdo sobre “Como criar o primeiro microsserviço com opentrace em Kotlin”? Conta pra gente nos comentários!