O objetivo deste artigo é demonstrar como o Application Insights (serviço que integra o Microsoft Azure) pode ser utilizado no monitoramento de serviços REST baseados na tecnologia ASP.NET Web API.

Introdução

Questões como escalabilidade, alta disponibilidade e performance são preocupações centrais em aplicações Web atualmente. Muitas destas soluções fazem uso do modelo REST (Representational State Transfer), com a implementação de APIs voltadas às mais variadas necessidades de negócio. Esta tendência contribuiu inclusive para o surgimento de novas propostas para o desenvolvimento de projetos de software, com destaque para a arquitetura de microserviços.

A opção por APIs REST na construção de aplicações deve levar em conta diversos aspectos, como modelagem, estratégias de deployment, segurança e monitoramento dos serviços envolvidos. Considerando especificamente o processo de monitoração, este tipo de atividade busca:
  • Garantir a operação do sistema;
  • Detectar falhas;
  • Permitir um acompanhamento eficiente da performance de um ou mais serviços REST;
  • Determinar o uso intensivo de funcionalidades.
Uma alternativa eficaz e bastante simples para monitoramento de APIs REST é o Application Insights. Integrando o Microsoft Azure, este serviço possui compatibilidade com as principais plataformas de desenvolvimento. Projetos em .NET, Node.js, Java, Ruby, Python e PHP podem utilizar o Application Insights, empregando para isto SDKs fornecidos pela própria Microsoft.

O número de requisições HTTP recebidas por uma API ao longo de um intervalo de tempo, os tempos de resposta e eventuais falhas estão entre as informações disponibilizadas pelo Application Insights sob a forma de dashboards (conjuntos de gráficos). Acessos a dependências externas como bancos de dados relacionais e serviços REST também são logados por meio deste serviço, característica esta bastante importante para determinar problemas de performance.

A intenção deste artigo é demonstrar o uso do Application Insights no monitoramento de APIs REST, com isto acontecendo através da implementação de um projeto ASP.NET Web API apresentado em detalhes nas próximas seções.

Exemplo de utilização

Para implementar o projeto apresentado neste artigo foram utilizados como recursos:
  • O Microsoft Visual Studio Community 2015 Update 3 como IDE de desenvolvimento;
  • A versão 4.6.1 do .NET Framework;
  • O ASP.NET Web API 2.2;
  • Uma conta de acesso ao Microsoft Azure;
  • O Application Insights como serviço de monitoramento.
Como primeiro passo criar um projeto do tipo ASP.NET Web Application (.NET Framework) chamado TesteWebAPIAppInsights:



Certificar-se ainda de que a opção Add Application Insights to Project foi marcada, fornecendo também uma conta de acesso ao Microsoft Azure e definido em Send Telemetry to os valores (Project Name) e (New resource):



Selecionar na sequência o template Web API em ASP.NET 4.6.1 Templates:



Observando a estrutura do projeto na janela Solution Explorer será possível notar a presença de diversas referências de bibliotecas do Application Insights:



Um arquivo com configurações chamado ApplicationInsights.config também será criado (este documento XML contém a Instrumentation Key, chave que serve de base para a utilização de um recurso do Application Insights na nuvem):



O serviço REST apresentado neste artigo retornará as cotações atualizadas de moedas estrangeiras. No caso do dólar norte-americano, isto acontecerá através do envio de uma solicitação HTTP a uma API que devolverá tal dado. Para a obtenção do valor do euro será acessado um banco de dados SQL Server.

Inicialmente serão implementadas duas classes (CotacaoDolar e CotacaoEuro), as quais servirão de base para a manipulação de informações sobre cotações:

namespace TesteWebAPIAppInsights
{
    public class CotacaoDolar
    {
        public string Sigla { get; set; }
        public string UltimoHorario { get; set; }
        public double ValorComercial { get; set; }
        public double ValorTurismo { get; set; }
    }
 
    public class CotacaoEuro
    {
        public string Sigla { get; set; }
        public string UltimoHorario { get; set; }
        public double ValorCotacao { get; set; }
    }
}

Na listagem a seguir é possível observar a implementação do tipo estático CotacaoDolarProxy, com o mesmo fazendo uso da classe HttpClient (namespace System.Net.Http) para comunicação com o serviço que retornará o valor mais atual do dólar norte-americano:

using System.Configuration;
using System.Net.Http;
using System.Net.Http.Headers;
 
namespace TesteWebAPIAppInsights
{
    public static class CotacaoDolarProxy
    {
        public static CotacaoDolar ObterCotacao()
        {
            CotacaoDolar cotacao;
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));
 
                HttpResponseMessage response = client.GetAsync(
                    ConfigurationManager.AppSettings["UrlCotacaoDolar"]).Result;
                response.EnsureSuccessStatusCode();
 
                cotacao = response.Content.ReadAsAsync<CotacaoDolar>().Result;
            }
 
            return cotacao;
        }
    }
}

Já a classe CotacaoEuroDAO permitirá a obtenção da cotação mais recente do euro, fazendo uso de recursos do ADO.NET para se conectar a uma base de dados no SQL Server:

using System;
using System.Configuration;
using System.Data.SqlClient;
 
namespace TesteWebAPIAppInsights
{
    public static class CotacaoEuroDAO
    {
        public static CotacaoEuro ObterCotacao()
        {
            CotacaoEuro cotacao = null;
 
            using (SqlConnection conexao = new SqlConnection(
                ConfigurationManager
                    .ConnectionStrings["BancoCotacoes"]
                        .ConnectionString))
            {
                conexao.Open();
                SqlCommand cmd = conexao.CreateCommand();
                cmd.CommandText =
                    "SELECT Sigla, UltimaCotacao, ValorCotacao " +
                    "FROM dbo.Cotacoes";
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    cotacao = new CotacaoEuro();
                    cotacao.Sigla = reader["Sigla"].ToString();
                    cotacao.UltimoHorario =
                        ((DateTime)reader["UltimaCotacao"])
                            .ToString("yyyy-MM-dd HH:mm");
                    cotacao.ValorCotacao = Convert.ToDouble(
                        reader["ValorCotacao"]);
                }
                conexao.Close();
            }
 
            return cotacao;
        }
    }
}

Por fim, a próxima listagem traz a implementação da classe CotacoesController. Este Controller receberá requisições HTTP do tipo GET e, a partir das classes CotacaoDolarProxy e CotacaoEuroDAO, devolverá as cotações mais atuais do dólar e do euro:

using System.Net;
using System.Net.Http;
using System.Web.Http;
 
namespace TesteWebAPIAppInsights.Controllers
{
    public class CotacoesController : ApiController
    {
        public dynamic Get(string id)
        {
            if (id == "USD")
                return CotacaoDolarProxy.ObterCotacao();
            else if (id == "EUR")
                return CotacaoEuroDAO.ObterCotacao();
            else
            {
                var resp = new HttpResponseMessage(HttpStatusCode.BadRequest)
                {
                    Content = new StringContent(
                        "Identificador de cotação inválido"),
                    ReasonPhrase =
                        "Símbolo de cotação de moeda não identificado."
                };
 
                throw new HttpResponseException(resp);
            }
        }
    }
}

Testes

Ao acessar a opção Todos os recursos no portal do Microsoft Azure aparecerá o recurso registrado para monitoramento da API de cotações:



Após acionar este item será exibido um painel com um resumo relativo à utilização da aplicação:



Um clique na seção SERVER REQUESTS do gráfico trará um resumo com as diferentes requisições que tiveram sucesso ou não durante o seu processamento, bem como dependências remotas acessadas (APIs REST e bancos de dados relacionais):



Acessando a dependência que aponta para http://cotacaodolar.azurewebsites.net aparecerá um resumo envolvendo o uso desta API REST:



Já na próxima imagem estão detalhes do acesso ao banco de dados do SQL Server:

Conclusão

Contando com inúmeras métricas de verificação o Application Insights é uma alternativa bastante completa e prática para o monitoramento de APIs REST. O resultado direto disto é um esforço quase nulo em termos de codificação, bem como a obtenção de análises simplificadas medindo aspectos como desempenho, disponibilidade e ocorrência de falhas.

Outro ponto favorável a respeito deste serviço está na sua compatibilidade com diversas tecnologias. Além de projetos ASP.NET e WCF, o uso do Application Insights está disponível também para aplicações e APIs construídas em plataformas como Java, Node.js e Ruby.

Referências

Application Insights
https://www.visualstudio.com/products/application-insights-vs

Application Insights: Guia de Sobrevivência
http://social.technet.microsoft.com/wiki/pt-br/contents/articles/34859.application-insights-guia-de-sobrevivencia.aspx

Utilizando o Application Insights
https://channel9.msdn.com/Blogs/Comunidade-Tecnica-Microsoft/Como-gerenciar-e-monitorar-suas-aplicaes-com-Application-Insights