APIs e Microsserviços

13 jun, 2018

Monitorando APIs com Application Insights – Parte 02

Publicidade

E ai, pessoal! Todos bem?

Vimos na primeira parte deste artigo, sobre monitoração de APIs com o Application Insights, os conceitos sobre as principais funcionalidades e visualizações de informações para monitoração de APIs que estão disponíveis nele. Caso tenha perdido a parte um, pode encontrá-la neste link.

Agora vamos para uma pegada mais prática, onde iremos configurar um App Service no Azure, já com uma instância de Application Insights conectada a este App Service. Na sequência, vamos realizar o deploy de uma API feita em ASP.NET Core, utilizando o conector do Application Insights para monitorar mais detalhes de nossa aplicação, como informações dos requests, mapa da aplicação, dados utilizados nos requests, e ainda gerar métricas customizadas no Application Insights.

Nossa Web API irá retornar um NCM baseado em seu código. NCM significa Nomenclatura Comum do Mercosul, um código com uma descrição padrão para produtos no Mercosul.

O código fonte da API encontra-se disponível em meu Github.

Vamos lá!

Configurando seu App Service no Azure

Criando um Web App

Ao logar no portal do Azure, vamos no menu a esquerda e clicamos na opção “Create Resource”. Após isso, escolhemos a opção “Web App”.

Após isto, vamos dar um nome/endereço ao nosso Web App. Não precisa seguir o mesmo nome que estou utilizando, pode utilizar um que achar adequado, respeitando o uso de letras, números e hífen (-).

Nesta mesma janela, dê um nome para o Resource Group, que é um agrupamento onde seu Web App ficará organizado e escolha a opção “Windows” para seu Web App.

E para finalizar, escolha a opção Sim/Yes para o Application Insights. Isso garantirá que o Application Insights já esteja conectado a infraestrutura deste Web App, monitorando processador, memória, requisições, etc, sem a necessidade de configurações manuais nele. A região pode ser deixada como East US mesmo.

Configurações para criação de um Web App já com o Application Insights

Com isso, clicamos no botão “Create” e aguardamos alguns instantes para que a criação de nosso Web App seja concluída.

Após isto, podemos navegar para a tela de Resource Groups, acessar o que criamos agora, e dentro dele podemos visualizar as instâncias de Web App e Application Insights criadas.

Localizando nosso Resource Group do Web App
O Resource Group, contendo as instâncias do Application Insights, Web App e o Service Plan utilizado.

Vamos clicar em nossa instância do Application Insights para abrir sua tela de detalhes.

O Application Insights criado, ainda sem informações

Nesta tela, podemos observar que ainda não temos informações sendo registradas, já que ainda não realizamos deploy de nossa API. Antes de prosseguir para o desenvolvimento da mesma, precisamos anotar uma configuração do Application Insights, a Instrumentation Key, que é a chave para indicar onde iremos registrar as métricas de nossa aplicação.

Para obter essa informação, nesta mesma tela acesse o item “Properties” (basta rolar o menu para baixo) e copiar o valor do campo “Instrumentation Key”. Anote esse valor, pois iremos utilizar ele mais tarde.

Obtendo a Instrumentation Key do Application Insights

Agora, com nosso ambiente configurado e de posse da chave para registrar métricas no Application Insights, vamos ao desenvolvimento de nossa Web API. Esta será simples, para fins de demonstração.

Configurando a Web API

Vamos clonar o repositório que mencionei no início do artigo: Repositório.

Nossa aplicação irá trazer estas informações de um banco de dados. Iremos utilizar o SQLite. No repositório da aplicação já temos um arquivo chamado database.sqlite com as informações que precisamos.

Na estrutura de nossa aplicação temos um Repository, um Service e um Controller, responsáveis por retornar o NCM de acordo com o código que for informado na API.

Estrutura do projeto da Web API

Nosso Repository utiliza o Dapper para fazer as consultas ao arquivo do SQLite. Segue aqui o código para analisarmos:

Código utilizado no Repository da Web API

Podemos observar alguns detalhes:

  • Temos duas consultas; uma para listagem de NCMs e outra para localizar um NCM pelo código dele.
    • Em ambas, utilizamos a classe SqliteConnection para fazer a conexão com o arquivo do SQLite.
    • No caso da busca por código, como utilizamos o método QuerySingleAsync, em caso de não encontrar nenhum NCM, irá retornar a exceção InvalidOperationException.
  • A classe Service, apenas foi criada para respeitar a camada, pois serve como Proxy para o repository:
Código utilizado no Service da Web API

Já no controller, temos alguns pontos interessantes:

Código utilizado no Controller da Web API, com uma chamada para métricas customizadas do App. Insights
  • A listagem apenas retorna a lista, nada de diferente do padrão.
  • Já na busca por código, estamos utilizando o TelemetryClient, que nos permite registrar métricas customizadas no Application Insights. No nosso caso, se encontrarmos o NCM, registramos um evento no Application Insights, com o conteúdo retornado, e se não encontrarmos, registramos uma Métrica com uma chave NOT_FOUND, onde podemos montar um gráfico para acompanhar, por exemplo.

E a parte mais importante para usar o Application Insights em nossa aplicação, no Startup.cs, onde adicionamos a injeção do Application Insights em nossa aplicação, de forma que ele monitore nossas requisições, acessos ao banco de dados, etc, sem a necessidade de codificar isso em cada parte da aplicação. Veja como ficou:

Código da classe Startup, onde configuramos o Application Insights para ser injetado e monitorar a Web API

Podemos observar no método ConfigureServices, que além de configurar a injeção do Repository e do Service, chamamos o método AddApplicationInsightsTelemetry, onde passamos como parâmetro o objeto Configuration, para que ele possa obter a chave de telemetria através do arquivo appsettings.json. Com isso, nossa aplicação já terá todo o monitoramento básico de requisições, banco de dados, etc, sem que precisemos codificar mais nada. Simples assim.

Vamos acessar o arquivo appsettings.json e, na propriedade InstrumentatioKey, preenchida com alguns “x”, vamos colocar a nossa chave de instrumentação, que copiamos do Application Insights no Azure.

Arquivo de configurações do projeto, com a Instrumentation Key

Feito tudo isso, fazemos um commit e push para nosso repositório, para fazermos o deployment de nossa aplicação.

Deployment da Web API

Agora que temos nossa API pronta e no repositório, vamos configurar o deployment automático, para que caso façamos alguma alteração, seja feito automaticamente um novo deployment. Estamos configurando um deployment automático simples, não existe validação de testes antes, apenas para fins de disponibilizar a API e ver o Application Insights funcionando.

Em um cenário real, teríamos um fluxo de integração contínua e entrega contínua, configurado no Visual Studio Team Services, por exemplo, com testes, validação dos mesmos, validação de ambiente, etc.

Vamos acessar nossa aplicação no Azure através do menu “Grupo de Recursos”, onde clicamos nosso grupo, e em seguida na aplicação.

Resource
Localizando o Web App, para configurar o deployment

Em seguida, vamos acessar o menu “Deployment Options”:

Acessando as configurações de deployment do Web App

Nesta nova tela, clique na opção “Choose Source”, e escolha “GitHub”:

Configurando para realizar o deployment diretamente do GitHub

Em seguida, clicamos na opção “Authorization”, e na nova tela, no botão “Authorize”. Um pop up irá abrir (desbloqueie em seu browser, caso necessário), solicitando que você faça login em seu GitHub e autorize o portal do Azure a acessar seus repositórios.

Configurando a autorização do Azure em sua conta do GitHub

Feito isso, aguarde alguns segundos para que ele valide a autorização do GitHub e clique em “Ok” quando concluído.

Em seguida, confirme se a sua organização é a que você utiliza (caso tenha mais de uma, caso contrário deixe a padrão), clique em “Choose Project”, e na tela que irá abrir, escolha o repositório de nosso projeto. A Branch pode ser deixada como master (valor padrão), mas caso esteja utilizando outra branch, clique e selecione a branch que está utilizando, da mesma forma que foi feita para o projeto.

Selecionando o projeto e branch para deployment

Em seguida, clicamos em “Ok” e aguardamos o Azure configurar nosso deployment. Pode demorar de alguns segundos a poucos minutos.

Após o Azure finalizar a configuração, se acessarmos o menu “Deployment Options” de nossa Web App novamente, veremos que o deployment estará em progresso ou já concluído. No meu caso, estava em progresso quando capturei este screenshot:

Acompanhando o progresso do deployment, onde o build e publish serão executados.

Após o deployment ser concluído, podemos acessar nossa WebAPI fazendo alguns testes de requisições, através do endereço:

Temos os valores 1234, 2234, 3234 e 4234. Tente acessar também códigos de NCM não existentes, ou mesmo sem o código, para ter a listagem dos 4 NCMs de teste cadastrados.

Faça algumas requisições diversas, assim iremos alimentar o Application Insights com dados. Aguarde um minuto ou dois após finalizar.

Após isso, vamos novamente no menu “Resource Groups”, nosso grupo de recursos, e desta vez, vamos clicar no Application Insights:

Localizando e acessando a instância do Application Insights

Na tela do Application Insights, podemos verificar que já temos informações sendo registradas, como requisições, tempo destas, acesso a bancos de dados, etc. Podemos navegar no detalhe de cada informação, como mostramos na primeira parte do artigo. Não vou estender muito aqui, pois cada monitor foi detalhado na primeira parte e pode ser usado como base para visualizarmos as informações de nossa API.

Agora que nossa Web API teve acessos, temos métricas já sendo registradas no Application Insights

Explore, altere a API com novos endpoints e novas métricas. O Application Insights possui uma quantidade enorme de funcionalidades e possibilidades para monitorar suas aplicações.

Fechando

Vimos como fazer o deployment de uma Web API simples no Azure e integrá-la ao Application Insights registrando métricas da mesma, de forma simples, e sem a necessidade de gerar uma grande quantidade de código por isso.

O Application insights possui uma quantidade grande de recursos para garantir a monitoração da saúde de sua aplicação, e garantir que seus usuários não tenham uma má experiência utilizando ela.

Quem tiver dúvidas, entre em contato comigo através das redes sociais – procuro responder o mais rápido possível.

Ficamos por aqui. Um abraço a todos e até a próxima!