Spring Cloud Sleuth

Leonardo Ferreira
Dev Cave
Published in
2 min readFeb 6, 2018

Sleuth implementa uma solução para rastreamento, na maioria dos casos ele deve ser invisível aos seus usuários e todas as iterações com sistemas externos devem ser instrumentadas automaticamente.

Span é a base de trabalho do sleuth. Os Span são identificados por uma identificação única de 64 bits para o span e outra ID de 64 bits para o trace. Os spans também possuem outros dados, como descrições, anotações de chave-valor, identificação do período que os causou e ID do processo (normalmente endereço IP). Um conjunto de span forma um trace com uma estrutura de árvore.

Funcionalidades:

Quando adicionado a um projeto Spring Boot, sleuth automaticamente irá gerar dados de rastreio

@RestController
@SpringBootApplication
public class Application {
private static Logger log = LoggerFactory.getLogger(Application.class); @RequestMapping("/")
public String home() {
log.info("Handling home");
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

Ao acessar “/” o log gerado será parecido com:

2018-02-06 11:25:36.328  INFO [{nome da aplicação},{traceID},{spanID},{logPropagado}] 9579 --- [nio-7070-exec-1] b.c.l.pocsleuthfeign.Application         : Handling home
  • O nome da aplicação pode ser definido no application.properties spring.application.name.
  • spanID é gerado pelo próprio sleuth.
  • traceID é gerado pelo sleuth e propagado pelas aplicações no caso de chamadas externas.
  • logPropagado é um identificador para mostrar se o log deve ou não ser propagado as outras aplicações.

Idealmente nem todos os logs devem ser propagados. É possivel definir os criterios de propagação com base em probabilidade definindo a propriedade spring.sleuth.sampler.probability o valor é definido como porcentagem, por padrão ele é 0.1 (10% das requisições terão os logs propagados). O segundo modelo é definindo um Bean:

@Bean
public Sampler defaultSampler() {
return Sampler.ALWAYS_SAMPLE;
}

Existe também a opção de ser definido como Sampler.NEVER_SAMPLE e criar sua própria lógica sobre propagação:

@Bean
public Sampler defaultSampler() {
return new Sampler() {
@Override
public boolean isSampled(long traceId) {
return false;
}
}
}

Dessa forma quando o sistema realizar uma requisição externa ele colocara como cabeçalho o traceID de forma que quando a outra aplicação receber ela também faça o log desse traceID e fique mais fácil de rastrear fluxos entre vários serviços.

Para mais detalhes de implementação veja um Projeto exemplo

--

--