Criando Web APIs modernas, autônomas e rastreáveis com .Net Core utilizando arquitetura de microsserviços – Parte 3. Implementando rastreamento distribuído

Após a conclusão da etapa 2, onde configuramos os nossos projetos para gerar a documentação automaticamente, utilizando o NSwag, a terceira e última etapa desta série de artigos, será a implementação de uma funcionalidade que nos auxiliará a depurar nossas APIs, principalmente, quando ocorrerem falhas durante o processamento de alguma requisição.

Esta funcionalidade é extremamente importante para nos auxiliar a entender o fluxo das requisições, nos dando uma noção geral do funcionamento do sistema. Além de nos auxiliar a identificar ocorrências de erros em qualquer nível da requisição.

Como explicado na parte 1 desta série de artigos, utilizaremos uma implementação do OpenTracing chamada OpenTracing API for .NET. Além da Jaeger UI para gerenciamento da interface gráfica onde analisaremos as requisições.

Para isto, vamos executar os seguintes passos:

1. Instalando o OpenTracing API for .NET, a Jaeger UI e criando o configurador do OpenTracing

  • Acesse o menu Tools ⇒ Nuget Package Manager ⇒ Package Manager Console;
  • Na janela do console, no campo Default Project, selecione o projeto Erp.Shared;
  • Digite o comando Install-Package Jaeger, pressione Enter e aguarde a instalação.
  • Digite o comando Install-Package OpenTracing.Contrib.NetCore, pressione Enter e aguarde a instalação. 

Como o projeto Api.Erp.Shared está referenciado em todos os demais projetos, instalaremos as dependências, apenas neste projeto.

A seguir, criaremos um método de extensão para configurar o OpenTracing. Portanto, crie o seguinte arquivo no diretório Extensions do projeto “Api.Erp.Shared:

…\Api.Erp\Api.Erp.Shared\Extensions\DistributedTracing.cs

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using OpenTracing.Util;
using Jaeger;
using System.Reflection;
using Jaeger.Samplers;
using OpenTracing;

namespace Api.Erp.Shared.Extensions
{
    /// <summary>
    /// Configuração do OpenTracing
    /// </summary>
    public static class DistributedTracing
    {
        /// <summary>
        /// Método de extensão da "IServiceCollection" para configuração do OpenTracing
        /// </summary>
        /// <param name="services"></param>
        public static void ConfigureOpenTracing(this IServiceCollection services)
        {
            services.AddSingleton<ITracer>(serviceProvider =>
            {
                string serviceName = Assembly.GetEntryAssembly().GetName().Name;

                ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();

                ISampler sampler = new ConstSampler(sample: true);

                ITracer tracer = new Tracer.Builder(serviceName)
                    .WithLoggerFactory(loggerFactory)
                    .WithSampler(sampler)
                    .Build();

                GlobalTracer.Register(tracer);

                return tracer;
            });

            services.AddOpenTracing();
        }
    }
}

2. Habilitando o OpenTracing no projeto Api.Erp.Clientes

Acesse o arquivo Startup.cs do projeto Api.Erp.Clientes e faça as seguintes alterações:

…
    public class Startup
    {
…
        public void ConfigureServices(IServiceCollection services)
        {
            // Habilita as ferramentas de instrumentação do OpenTracing
            services.ConfigureOpenTracing();
…
        }
    }

3. Habilitando o OpenTracing no projeto Api.Erp.Comercial

Acesse o arquivo Startup.cs do projeto Api.Erp.Comercial e faça as seguintes alterações:

…
    public class Startup
    {
…
        public void ConfigureServices(IServiceCollection services)
        {
            // Habilita as ferramentas de instrumentação do OpenTracing
            services.ConfigureOpenTracing();
…
        }
    }

4. Habilitando o OpenTracing no projeto Api.Erp.Fiscal

Acesse o arquivo Startup.cs do projeto Api.Erp.Fiscal e faça as seguintes alterações:

…
    public class Startup
    {
…
        public void ConfigureServices(IServiceCollection services)
        {
            // Habilita as ferramentas de instrumentação do OpenTracing
            services.ConfigureOpenTracing();
…
        }
    }

Isto é tudo o que precisamos fazer para gerar os logs de nossas APIs. Porém, diferentemente do Swagger, a interface gráfica para acompanhamento das transações, não é gerada dentro de nosso projeto, mas através do seguinte projeto OpenSource chamado Jaeger UI.

Faça o download dos arquivos binários neste link. Extraia os arquivos para algum local em seu computador.

A pasta extraída conterá os seguintes arquivos:

1

Acesse o caminho do diretório no prompt de comando e digite o comando:

jaeger-all-in-one.exe

Execute o projeto das APIs e depois acesse o seguinte caminho no browser:

http://localhost:16686/

2

Esta é a interface gráfica do Jaeger.

Para termos um exemplo real de rastreamento, acione o endpoit que retorna todas as notas fiscais emitidas:

3

Retorne para a interface gráfica do Jaeger UI. Selecione o valor Api.Erp.Fiscal no campo Service e clique no botão Find Traces.

4

Selecione o primeiro log capturado e veja todo o detalhamento desta requisição:

5

São exibidas informações importantíssimas, como o tempo total da requisição e qual etapa foi executada por cada microsserviço.

Ao expandir um item da árvore, você poderá ver os detalhes de cada requisição:

6

 

Um outro recurso importantíssimo do Jaeger UI é a geração de um diagrama que detalha a arquitetura geral do sistema. Para visualizar este recurso, clique no link System Architecture, e acesse a aba DAG.

Para a requisição que nos retornou os dados de todas as notas fiscais do sistema, podemos conferir através do Jaeger UI, que a Api.Erp.Fiscal fez duas requisições para a Api.Erp.Comercial, que por sua vez fez outras duas requisições para a Api.Erp.Clientes:

7

Com isto concluímos a terceira e última etapa da nossa série de artigos.

Espero que esta série de artigos tenha sido útil para ajudar-lhe a minimizar algumas das dores do processo de adoção da arquitetura de microsserviços.

Comentários serão sempre muito bem vindos. Compartilhe comigo sua experiência na adoção deste padrão arquitetural cada vez mais adotado. 

Obtenha o código completo da solução neste repositório do GitHub.

Links para a série completa:

Silvair Leite Soares

Mais artigos deste autor »

Analista de sistema, apaixonado por tecnologia, larga experiência com sistemas de automação comercial, projetos SPED e NF-e e bancos de dados.


2 Comentários

HUMBERTO SANTANA MELO E SILVA
1

Muito bom material rápido e pratico voltado para o mercado de trabalho. #top Muito Bom Parabéns

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!