O blog da AWS

NET com Amazon CloudWatch e AWS X-Ray: Parte 3 – Rastreamento distribuído

Por Ulili Nhaga

 

Criar uma aplicação .NET bem arquitetado vai além de apenas codificar e implantar. Você deve monitorar o desempenho, rastrear transações, coletar logs, coletar métricas e disparar alarmes quando as métricas violarem limites. Para conseguir isso, você pode projetar e implementar telemetria para habilitar recursos de observabilidade.No primeiro post da série, abordei a implementação de  métricas, e no segundo post, abordei a implementação de logs. Este post, o terceiro e último da série, explora a implementação do rastreamento distribuído em aplicações .NET usando o Amazon CloudWatch e  o AWS X-Ray.O rastreamento distribuído é um recurso chave de observabilidade. Ele permite coletar e registrar rastreamentos à medida que as solicitações se propagam pelo sistema. Em seguida, você pode usar o CloudWatch e o AWS X-Ray para usar esses rastreamentos para gerar mapas que mostram como as transações fluem em todos os serviços na carga de trabalho, ajudando você a obter informações sobre as relações entre componentes upstream e downstream e identificar ou analisar problemas quase em tempo real.

Visão geral da solução

Um sistema ou plataforma em um cenário de produção real pode ter dezenas, centenas ou até milhares de microsserviços, mas para fins de demonstração, estou usando uma aplicação de exemplo menor. É uma carga de trabalho .NET conteinerizada em execução no Amazon Elastic Container Service (Amazon ECS) com o AWS Fargate (Figura 1). Ele compreende três microsserviços .NET: uma API Web do ASP.NET Core, dois Serviços de Trabalho, além dos recursos de nuvem que eles usam. Devido à natureza distribuída desse tipo de sistema distribuído, em um cenário de falha, pode ser desafiador descobrir onde concentrar sua investigação ou determinar a relação e a dependência das solicitações com falha.

Para obter informações detalhadas sobre uma carga de trabalho .NET conteinerizada como esta ou mais complexa, você pode instrumentar cada aplicação para coletar e registrar rastreamentos distribuídos. Por exemplo, o primeiro aplicativo que recebe uma solicitação do cliente deve gerar o ID de rastreamento do AWS X-Ray. Neste exemplo, a API da Web gera o ID de rastreamento, adiciona metadados e propaga esse mesmo ID de rastreamento por meio de outros dois microsserviços através de Tópicos do SNS. Cada um deles também adicionará seus próprios metadados e passará o mesmo ID de rastreamento para os componentes de nuvem com os quais interagem. Como eles estão usando  o AWS SDK para . NET para se comunicar com esses componentes de nuvem, o AWS SDK adiciona automaticamente o mesmo ID de rastreamento a metadados e logs. Como resultado, o CloudWatch e o X-Ray podem usar esses rastreamentos para agregar todos os eventos relacionados ao ID de rastreamento e gerar exibições, mapas e cronogramas enriquecidos da transação para ajudar a acelerar a solução de problemas e a visualização dos relacionamentos, dependências e integridade do aplicativo.

Architecture Diagram

Figura 1: Solução de microsserviço .NET

Pré-requisitos

Para este exemplo, você pode usar o repositório do GitHub “microservices-dotnet-aws-cdk“, que contém o código de exemplo para todos os três microsserviços. Ele usa o AWS Cloud Development Kit (CDK) para definir e provisionar a infraestrutura como código usando a linguagem de programação C#.

Os seguintes pré-requisitos são necessários em seu sistema para testar e implantar esta solução:

Você pode clonar o repositório a partir da linha de comando com o seguinte comando:

git clone https://github.com/aws-samples/microservices-dotnet-aws-cdk.git

Abra a solução em um IDE, como o Visual Studio Code, para explorar a implementação.

Implementar o rastreamento com o AWS X-Ray em uma aplicação .NET

Adicionei o pacote NuGet AWSXRayRecorder aos projetos .NET para implementar o rastreamento distribuído com o AWS X-Ray. No arquivo Program.cs para cada projeto, inicializei e registrei o AWS X-Ray. O processo de inicialização é ligeiramente diferente dependendo do tipo de projeto. Esses exemplos de código ilustram como inicializar o AWS X-Ray para a API da Web e projetos do Worker Service.

Este exemplo de código demonstra o registro e a inicialização de aplicativos Web:

...
const string MY_SERVICE_NAME = "demo-web-api";
...
//Register X-Ray
AWSSDKHandler.RegisterXRayForAllServices();
...
var app = builder.Build();
//Initialize X-Ray
app.UseXRay(MY_SERVICE_NAME);
..
app.Run();

Este exemplo demonstra o registro para Worker Services:

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {//Initialize & Register X-Ray
        AWSXRayRecorder.InitializeInstance(hostContext.Configuration);
        AWSSDKHandler.RegisterXRayForAllServices();})
    .Build();

await host.RunAsync();

Provisionar o daemon do AWS X-Ray

Para transmitir todos os rastreamentos para a API do AWS X-Ray, você precisa implantar o daemon AWS X-Ray, um aplicativo de software que escuta o tráfego na porta UDP 2000, coleta dados brutos do segmento e os retransmite para o serviço AWS X-Ray. O daemon deve estar sendo executado continuamente para que os dados enviados pelos componentes do aplicativo possam chegar ao serviço de X-Ray. A instalação pode variar dependendo dos serviços da AWS que você está usando para sua aplicação .NET.

No exemplo de código a seguir, estou provisionando o sidecar do daemon X-Ray usando C# com AWS CDK. O AWS CDK permite que você crie aplicações na nuvem como código, com o benefício do poder expressivo das linguagens de programação, como o C#, que estou usando aqui. O daemon é executado junto com os contêineres de aplicativos no Amazon ECS com o AWS Fargate.

public static TaskDefinition AddXRayDaemon(this TaskDefinition taskDefinition, XRayDaemonProps xRayDaemonProps)
{
    taskDefinition.AddContainer("x-ray-daemon", new ContainerDefinitionOptions
    {
        ...
        PortMappings = new PortMapping[]{
            new PortMapping{
                ContainerPort = 2000,
                Protocol = Protocol.UDP
            }},
        Image = ContainerImage.FromRegistry("public.ecr.aws/xray/aws-xray-daemon:latest"),
        ...
    });

     //Grant permission to write X-Ray segments
    taskDefinition.TaskRole
        .AddManagedPolicy(ManagedPolicy.FromAwsManagedPolicyName("AWSXRayDaemonWriteAccess"));

    return taskDefinition;
}

Implantar a solução de exemplo

O repositório GitHub microservices-dotnet-aws-cdk contém a implementação completa dessa solução, permitindo que você faça uma solicitação HTTP à API Web de exemplo para testá-la. Para implantar, execute um dos seguintes scripts de implantação em seu ambiente usando bash (Linux ou Mac) ou PowerShell para implantar a solução.

Usando bash:

./deploy.sh

Usando o PowerShell:

.\deploy.ps1

Após a implantação, copie a URL impressa pelo script de implantação. Tem o seguinte formato: http://WebAp-demos-XXXXXXXX-99999999.us-west-2.elb.amazonaws.com/api/Books. Xse 9s serão caracteres alfanuméricos que representam o ID exclusivo da sua implantação. Em seguida, usando um cliente de API REST (como o Thunder Client para VS Code), teste a solução enviando uma solicitação HTTP POST para a URL com a seguinte carga JSON. Ao enviar o HTTP POST, você deve receber uma resposta de status 200 e o resultado do TraceId. Copie o valor TraceId para uso posterior.

{
    "Year" : 2022,
    "Title": "Demo book payload",
    "ISBN": 12345612,
    "Authors": ["Author1", "Author2"],
    "CoverPage": "picture1.jpg"
}

A Figura 2 ilustra a chamada de API de exemplo.

Example API call

Figura 2: Exemplo de chamada de API

Visualize os resultados

Depois de fazer uma solicitação de teste para a API, você pode navegar até o Amazon CloudWatch para revisar o mapa gerado do sistema com todos os microsserviços e componentes de nuvem.

  1. No console da AWS, navegue até o Amazon CloudWatch.
  2. No painel de navegação, escolha X-Ray Trace, Traces.
  3. Deixe o campo Filtrar por Grupo X-Ray em branco, insira o ID de rastreamento que você copiou no campo seguinte e escolha Executar consulta.

O console apresentará uma página semelhante à Figura 3 e  à Figura 4.  O CloudWatch agregará todos os dados para o ID de rastreamento fornecido e exibirá um mapa de rastreamento distribuído mostrando:

  • Todos os três microsserviços
  • Os componentes de nuvem com os quais cada um interagiu durante a solicitação
  • Métricas por segmentos
  • A linha do tempo da solicitação, incluindo o status, o código de resposta e a duração de cada comunicação com componentes downstream

Distributed Trace Map

Figura 3: Mapa de rastreamento distribuído

Trace Logs

Figuraa 4: Logs de rastreamento

Limpeza

Você deve limpar os recursos criados ao executar essa demonstração para evitar cobranças inesperadas. Para fazer isso, execute o script na pasta raiz onde você clonou o repositório do GitHub

Usando bash:

./clean.sh

Usando o PowerShell:

.\clean.sh

Conclusão

Neste último post da série de blog sobre a implementação de observabilidade para suas aplicações .NET na AWS,  demonstrei como implementar o rastreamento distribuído usando o AWS X-Ray em uma carga de trabalho .NET para coletar, registrar e transmitir eventos de rastreamento para o AWS X-Ray. Também demonstrei como o Amazon CloudWatch usa esses rastros gerados pela sua aplicação para mostrar o mapa, relacionamento e dependências de todos os microsserviços do sistema

Para saber mais sobre implementações de métricas ou logs, confira as outras duas partes desta série:”.NET – observabilidade com Amazon CloudWatch e AWS X-Ray: Parte 1 — Métricas”  e “Observabilidade do .NET com o Amazon CloudWatch e o AWS X-Ray: Parte 2 — Registro em log

A observabilidade vai além de instrumentar sua aplicação .NET para gerar rastreamentos, logs e métricas. Você pode aproveitar os recursos do CloudWatch para monitoramento, alarmes, detecção de anomalias e muito mais. Consulte a página Recursos do Amazon CloudWatch  para  saber mais e, para experiência prática, confira o One Observability Workshop.

 

Este artigo foi traduzido do Blog da AWS em Inglês.


Sobre o autor

Ulili Nhaga é Cloud Application Architect na Amazon Web Services em San Diego, Califórnia. Ele ajuda os clientes a migrar, modernizar, arquitetar e criar aplicativos nativos de nuvem altamente escaláveis ​​na AWS. Fora do trabalho, Ulili adora jogar futebol, correr, andar de bicicleta, churrasco brasileiro e aproveitar o tempo na praia.

 

 

 

 

Revisores

Kevin Lira é um arquiteto de soluções sênior na AWS, trabalhando na indústria de FSI. Sua experiência profissional anterior inclui desenvolvimento de software, liderança técnica e arquitetura em outras indústrias. Bacharel em Sistemas de Informação e Especialista em Computação Flexível e Tecnologias Microsoft.

Me siga no LinkedIn: https://www.linkedin.com/in/kevinlira/

 

 

 

 

Leonardo Bonato Bizaro é consultor de Professional Services no time de ProServe LATAM. Presente desde 2022, vem abraçando a grande oportunidade recebida através da constante busca de experiência e aprendizado na AWS para crescimento e desenvolvimento profissional.