O blog da AWS
.NET – observabilidade com Amazon CloudWatch e AWS X-Ray: Parte 1 — Métricas
Visão geral da solução
Imagine um trabalho .NET em contêiner como o mostrado na Figura 1, que é executado no Amazon Elastic Container Service (Amazon ECS) com o AWS Fargate. Ele é composto por três microsserviços .NET: uma API da web ASP.NET Core, dois Serviços de Trabalhador e os recursos em nuvem que eles usam. Se algo der errado com esse trabalho, você pode ver aumento nas taxas de erro, desempenho degradado ou inconsistência de dados. Como você solucionaria a causa raiz do problema, como quais componentes estão falhando ou com desempenho insatisfatório?
Nesse exemplo, os Serviços de Trabalhador não possuem interface do usuário ou API para interação do usuário final, então eles podem falhar silenciosamente. Para evitar esses cenários, você pode implementar a observabilidade usando métricas, logs e rastreamentos distribuídos para fornecer visibilidade sobre a saúde e o desempenho de cada componente. Usando essa arquitetura como exemplo, mostrarei como usar o Amazon CloudWatch e o AWS X-Ray para implementar métricas nesta aplicação .NET.
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 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:
.NET 6.0 Software Development Kit (SDK)
Interface de Linha de Comando da AWS (AWS CLI)
Visual Studio Code (ou seu IDE preferido)
Credenciais da AWS para sua conta da AWS configuradas localmente
Você pode clonar o repositório usando a linha de comando com o seguinte comando:
Abra a solução em um IDE como o Visual Studio Code para explorar a implementação.
Implementando métricas com Métricas CloudWatch em aplicações .NET
Você pode implementar diferentes métricas em suas aplicações .NET usando o Amazon CloudWatch. Você pode coletar métricas específicas do negócio que incluem: medições no nível da aplicação, métricas de aplicação web .NET para mensurar solicitações HTTP, ou métricas de infraestrutura para fornecer dados de utilização de recursos da AWS.
Considere coletar métricas específicas do negócio e métricas de aplicação web .NET no código da aplicação. Além disso, você pode coletar métricas de infraestrutura usando a integração do Amazon CloudWatch com os serviços de computação da AWS onde você escolher hospedar a aplicação .NET, como o CloudWatch Container Insights para aplicações baseadas em contêineres.
Para implementar estas métricas, você pode usar a chamada de API PutMetricData do CloudWatch usando o AWS SDK para .NET ou o CloudWatch Embedded Metric Format (EMF). Para este exemplo, estou focando no uso do CloudWatch EMF para mostrar como ele permite a ingestão de dados de aplicação complexos e de alta cardinalidade como logs para gerar métricas acionáveis. O EMF permite que a aplicação incorpore métricas personalizadas nos dados detalhados do evento de log, usando um contêiner auxiliar para processar, analisar e transmitir as métricas para o CloudWatch. Além disso, um processo auxiliar evita a contenção de utilização de recursos na aplicação, ajudando a evitar impacto no desempenho e na taxa de transferência.
Para a implementação do CloudWatch EMF, estou usando o pacote NuGet Amazon.CloudWatch.EMF em todos os três projetos de aplicação. Também uso o pacote NuGet (Amazon.CloudWatch.EMF.Web) no projeto de aplicação web, que permite a instrumentação automática para métricas de todas as solicitações e respostas HTTP. O exemplo de código a seguir ilustra a configuração do CloudWatch EMF no arquivo Program.cs para gerar métricas para a aplicação web. Consulte um dos arquivos Program.cs do Serviço de Trabalhador para aprender como implementá-lo para esse tipo de aplicação.
Para a implementação de métricas específicas do negócio, utilizo injeção de dependência para fornecer uma instância de um objeto que implementa a interface IMetricsLogger em cada controlador ou classe de serviço e emito as métricas específicas do negócio. O exemplo de código a seguir ilustra a implementação.
Injeção da instância IMetricsLogger:
Emissão de métricas específicas do negócio no código da aplicação:
Provisionando o agente CloudWatch para transmitir as métricas
Você deve instalar e configurar o agente CloudWatch para ingestão, análise e transmissão de logs EMF para o Amazon CloudWatch. A configuração do agente CloudWatch varia dependendo de como você hospeda sua aplicação .NET na AWS. Para obter informações sobre as diferentes opções de hospedagem e configuração do agente CloudWatch, leia o artigo Using the CloudWatch agent to send embedded metric format logs. Estou usando o Amazon ECS e o AWS Fargate para esta aplicação de exemplo. O exemplo de código a seguir mostra a implementação de um contêiner auxiliar do agente CloudWatch para um serviço do Amazon ECS usando o AWS Cloud Development Kit (AWS CDK) para implantar a infraestrutura como código. O AWS CDK permite que você construa aplicativos na nuvem, com o benefício do poder expressivo de linguagens de programação, como C#, usada aqui.
Implantar a solução de exemplo
O repositório contém a implementação completa desta solução, permitindo que você faça uma solicitação HTTP para a amostra da Web API 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:
Usando PowerShell:
Após a implantação, copie a URL impressa pelo script de implantação. Ela tem o seguinte formato: http://WebAp-demos-XXXXXXXX-99999999.us-west-2.elb.amazonaws.com/api/Books. O X e o 9 devem ser caracteres alfanuméricos que representam o ID exclusivo de sua implantação. Em seguida, usando um cliente de API REST (como o Thunder Client para o VS Code), teste a solução enviando uma solicitação HTTP POST para a URL com a seguinte carga JSON. Quando você enviar o HTTP POST, deverá receber o status 200 e uma resposta indicando o resultado do TraceId.
A Figura 2 ilustra a chamada de API de exemplo.
Figure 2: Example API call
Visualizando os resultados
Após fazer uma solicitação de teste para a API, você pode navegar até o Amazon CloudWatch para revisar as métricas geradas.
- No console da AWS, navegue até o Amazon CloudWatch.
- No painel de navegação, escolha Métricas, Todas as métricas.
- Na guia Browse, o console exibe três tipos de métricas na seção Custom Namespaces (Figura 3).
Figura 3: Métricas do espaço de nomes personalizado
Os três tipos de métricas coletadas nesta solução são:
- ECS/ContainerInsights: Captura as métricas de infraestrutura de nuvem, que são métricas relacionadas a contêineres do Amazon ECS. Elas estão disponíveis porque eu habilitei o CloudWatch Container Insights.
- aws-embedded-metrics: Captura as métricas “específicas do negócio”, que são as métricas personalizadas implementadas no código da aplicação .NET para emitir dados relacionados à lógica do negócio.
- demo-web-api: Captura as métricas da aplicação web .NET Core. Elas são automaticamente instrumentadas para todas as solicitações e respostas HTTP dos microsserviços da API web.
ECS/ContainerInsights: Métricas de infraestrutura de nuvem do CloudWatch Container Insights
Essas são métricas de desempenho e saúde para a infraestrutura, exibindo informações como utilização de CPU, utilização de memória, rede e outros indicadores-chave de desempenho para a carga de trabalho do Amazon ECS. Você pode usá-las para gerar gráficos, painéis, alarmes ou solucionar problemas. Por exemplo, se a utilização de CPU ou memória aumentar repentinamente, isso pode indicar uma anomalia. Você pode definir limites para acionar alarmes em tais circunstâncias. O Amazon CloudWatch fornece um painel de desempenho pronto para uso para as métricas do Container Insights. Para visualizar este painel, como o mostrado na Figura 4, siga estas etapas:
- No console da AWS, navegue até o Amazon CloudWatch.
- No painel de navegação, escolha Container Insights em Insights.
- Altere a opção de Resources para Performance monitoring na lista suspensa na página.
Figura 4: Exemplo de painel do Container Insights
aws-embedded-metrics: Métricas específicas do negócio
A Figura 5 é um exemplo de visualização de métricas “específicas do negócio”. Por exemplo, nos microsserviços do Serviço de Trabalhador, a aplicação rastreia métricas personalizadas definidas como “ProcessingTime”, que capturam o tempo de processamento de uma parte da lógica de negócio. O CloudWatch permite que você use métricas personalizadas para gerar gráficos, painéis ou alarmes. Você também pode usar as métricas para solucionar problemas do tempo que cada Serviço de Trabalhador levou para concluir o processamento. Para visualizar essa métrica no exemplo de aplicação, siga estas etapas:
- No console da AWS, navegue até o Amazon CloudWatch.
- No painel de navegação, escolha All metrics em Metrics.
- Na guia Browse, selecione aws-embedded-metrics e escolha a dimensão. O console deve listar as instâncias WorkerId e o Metric name.
- Escolha duas instâncias WorkerId diferentes para o mesmo “ProcessingTime”.
- Altere a lista suspensa no topo da página para Linha.
- Escolha as Opções. Na faixa do medidor, defina valores para Mínimo e Máximo.
- Defina os valores para porcentagens como Mínimo 0 e Máximo
- Painel de métricas aws-embedded
Figura 5: Painel de métricas aws-embedded
demo-web-api: Métricas de aplicação web .NET automaticamente instrumentadas
O Amazon CloudWatch também permite as mesmas capacidades para métricas relacionadas ao framework. Neste exemplo, o CloudWatch agrupa as métricas automaticamente instrumentadas para a API web ASP.NET 6.0 no namespace “demo-web-API”. Você pode usar as métricas relacionadas a solicitações/respostas HTTP para criar gráficos, painéis e alarmes ou solucionar problemas de tempo de resposta de cada ação do controlador de endpoint.
Para visualizar um gráfico de métricas como o mostrado na Figura 6, siga estas etapas:
- No console da AWS, navegue até o Amazon CloudWatch.
- No painel de navegação, escolha Todas as métricas em Métricas.
- Na guia Explorar, selecione demo-web-api e escolha a dimensão “Action, Controller, StatusCode”.
- Escolha as duas opções da lista para o mesmo nome de métrica “Time”.
- Altere a lista suspensa de Linha para Número no topo da página.
Figura 6: Métodos automaticamente instrumentados pelo ASP.NET
Limpeza
Para evitar cobranças inesperadas, você deve limpar os recursos criados ao executar esta demonstração. Para fazer isso, execute o script da pasta raiz onde você clonou o repositório do GitHub.
Usando bash:
Usando PowerShell:
Conclusão
Na primeira parte desta série de postagens no blog sobre a implementação de observabilidade em suas aplicações .NET na AWS, eu abordei como instrumentar suas aplicações .NET modernas para gerar pontos de dados no formato CloudWatch Embedded Metric (EMF). Também mostrei como o CloudWatch usa esses pontos de dados da sua aplicação para simplificar a solução de problemas ou visualizar a saúde da sua aplicação. Para saber mais sobre implementações de Logs ou Rastreamento Distribuído, leia as outras duas partes desta série, “Observabilidade do .NET com o Amazon CloudWatch e o AWS X-Ray: Parte 2 — Registro em log” e “NET com Amazon CloudWatch e AWS X-Ray: Parte 3 – Rastreamento distribuído“.
Observabilidade vai além de instrumentar sua aplicação .NET para gerar rastreamentos, logs e métricas. Você pode usar as capacidades do Amazon CloudWatch para monitoramento, alarmes ou detecção de anomalias. Consulte a página de Recursos do Amazon CloudWatch para saber mais. Para uma experiência mais prática, confira o Workshop de Observabilidade.
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.