Métricas para api e exemplo prático .net core

Fabiano Santana
Tableless
Published in
7 min readFeb 26, 2020

--

Olá pessoal, já faz um tempo que não escrevo nada e decidi compartilhar algo muito bacana que estamos utilizando na empresa, métricas para API.

Se você possui uma api e quer torná-la escalável, monitorável e de fácil correção e prevenção de erros, as métricas são excelentes para te ajudar. Logo abaixo irei debater sobre como funciona e porque é importante ter métricas na sua api também.

Como funciona as métricas para api?

As métricas funcionam baseadas em coletadores de dados, existem diversas formas e fontes de coletar dados, existem métricas de performance, métricas de satisfação, e outras, neste artigo falaremos sobre as métricas de satisfação, que seriam as métricas responsáveis por registrar response time, response history, no Grafana temos as seguintes métricas registradas pelo middleware:

Active requests : lista as requests que foram registradas na api em determinado período.

Apdex : é usado para monitorar a satisfação do usuário com base no desempenho geral do aplicativo. O Apdex é um padrão aberto da indústria que mede a satisfação do usuário com base no tempo de resposta do aplicativo.

Errors: Agrupa os erros gerados pelo status code, há formas de ignorar status code que você não deseja métricas, por exemplo 404(not found), quando a pessoa solicita um endpoint que não existe, talvez não seja interessante para você guardar esses dados.

Response times : tempo levado pela request em certo endpoint.

O que são métricas para api?

Pelo nome você já deve ter inferido sobre o que são métricas para api, mas se não inferiu, vou explicar.

Métricas para api são dados obtidos através de coletores que servem para te dar uma visão geral de como andam as requests nos seus serviços, logs de erros, throughput (quantidade de dados trafegados), quantidade de requests sendo feitas por minutos, enfim, métricas para api são de principal importância se você deseja ter uma api saudável.

Posso criar meu próprio middleware para coletar dados?

Claro, no desenvolvimento, você é o dono do seu código, você pode criar do zero um middleware com certo trabalho ou então, pode utilizar um que tive o prazer de conhecer a pouco tempo, o Grafana.

O Grafana é uma ferramenta para montagem de dashboard baseado em métricas de satisfação ou métricas personalizáveis, ele por si só já possui diversos dashboards prontos para uso em sua store, caso você precise criar um dashboard do zero, pode levar algum tempo, porém não é impossível.

Vamos na prática ver como funciona essas métricas

Para este tutorial vou precisar que vocês precisarão de:

Após instalado todos os pré-requisitos, abra um terminal e utilize o comando dotnet –version e docker — version, aparecerá uma mensagem do tipo

docker — version

Caso não tenha visto essa mensagem, refaça a instalação do dotnet core ou docker e tente novamente.

Se você nunca utilizou docker, alegre-se porque iremos precisar neste tutorial.

Iniciando o tutorial — Configurando os pré-requisitos

Primeiro abra o terminal e utilize o comando

docker network create dotnetmetrics
docker run -d --restart=always -v $PWD:/var/lib/grafana --network dotnetmetrics --name grafana -p 3000:3000 grafana/grafana

Após rodado o comando o docker verificará se existe a imagem do grafana na sua máquina e caso não exista ele próprio se encarregara de baixar ela localmente, após isso ele exibirá um id personalizado com a instância iniciada do container, para testar se deu certo, abra seu navegador e vá até o endereço http://localhost:3000

Página de login do Grafana

Para acessar utilize a as credenciais admin:admin, como será seu primeiro acesso você precisará de fornecer uma nova senha, crie uma senha que você não esquecerá para entrar novamente depois, pode usar a senha padrão Admin que não haverá problemas.

Após entrar você se deparará com um a tela inicial do Grafana, que é a seguinte

Dashboard vazio Grafana

Após iniciarmos o Grafana iremos iniciar nosso banco de dados que será responsável por manter o Grafana populado. No site do Grafana temos acesso a todos os banco de dados compatíveis, para o tutorial decidi usar o InfluxDB porque é muito fácil de iniciar uma instância. Para começar utilize o comando abaixo, para a instância também usaremos o docker (sim, o docker é maravilhoso).

docker run -p 8086:8086 --restart=always -d \
--name influx \
--network dotnetmetrics \
-v $PWD:/var/lib/influxdb \
influxdb

Note que para iniciar o influx eu passei vários argumentos, irei detalhar o que faz cada um para ficar mais fácil para você.

  • -v (volume) $PWD:/var/lib/influxdb: Este argumento recebe um par de valores onde o primeiro é o diretório na sua máquina onde o docker irá criar uma pasta e o segundo argumento é o endereço que a imagem utilizará. Não altere o segundo argumento.
  • — name: é o nome que colocamos no nosso container para poder referencialo sem precisar usar o id.
  • -p: é a porta padrão que iremos expor nosso container externamente e internamente no docker.

Após iniciado nosso banco, vamos criar o database que será usado para a aplicação, para o database podemos usar o próprio shell do influx pelo docker, basta executar o comando abaixo:

docker exec -it influx influx -execute 'CREATE DATABASE dotnetmetrics'

Pronto, após o comando docker exec criamos nosso database no influx e com o curl abaixo você pode conferir o resultado.

curl -G "http://localhost:8086/query?pretty=true" --data-urlencode "q=show databases"

Agora iremos adicionar este banco de dados ao grafana, para fazer isso vá na pagina inicial e escolha a segunda opção

Escolha Add data source

Os principais pontos de configuração são:
Url: http://influx:8086
Database:
dotnetmetrics

Você deve estar se perguntando o porque de estarmos usando somente o nome “influx” ao invés de usar o endereço localhost, quando inserimos os dois containers na mesma network, o nome ( — name) que demos ao nosso container se torna nosso hostname, então como estão na mesma network, podemos referência-los internamente somente pelo nome, muito massa né??

Construindo a api com métricas

Abra o terminal e digite o comando

dotnet new webapi -o DotnetMetrics -f netcoreapp2.2

Abra a pasta utilizando o vscode e vá no arquivo startup.

Pasta do projeto

Agora abra o terminal utilizando o atalho CNTRL + ‘ ou então selecione Terminal -> New Terminal, adicione as packages abaixo

dotnet add package App.Metrics.Extensions.Mvc
dotnet add package App.Metrics.Formatters.Json
dotnet add package App.Metrics.Extensions.Reporting.InfluxDB
dotnet add package App.Metrics.AspNetCore
Nosso startup ficará desta forma

Após alterar o startup para esta forma, inicie a api e vá até o seu dashboard, e importe o json que será o responsável por montar suas queries

Vamos testar a api

Após salvar o json disponível no link https://grafana.com/grafana/dashboards/2125 vá até sua página inicial e faça algumas requests na sua api para ver o funcionamento do dashboard

Utilize o curl abaixo para facilitar seu teste

curl -k https://localhost:5001/api/values

Thcharaaam, sua api agora está com métricas, todo novo endpoint que você adicionar, ou novas controllers, eles serão automaticamente mapeados para o Grafana. Faça um teste e adicione uma nova controller para você ver o funcionamento maravilhoso das métricas.

Referências

https://www.app-metrics.io/getting-started/

Conclusão do autor

Conforme vai aumentando a complexidade da sua api, ter uma forma de monitorar sua api, e é sensacional você ter uma UI que você pode personalizar da forma que achar melhor para as suas necessidades. Você pode gastar um tempo para aprender como montar as queries para seu Dashboard, é claro, você não precisa ficar fluente em Grafana para montar seu dash, tem diversos templates pronto, no próprio site do Grafana você pode escolher um Dashboard. Caso queira dar uma conferida no repositório utilizado, basta acessar o link https://github.com/fabianosanttana/dotnetmetrics.

Sobre o autor da publicação

Sou Fabiano Santana, tenho 23 anos. Arquiteto de Sistemas com foco em .NET e Analista de Experiência do Usuário, conhecido como o famoso desenvolvedor Full Stack e UI Design. Amo de coração criação de UI e como ela aproxima as pessoas.

Seguem meus contatos caso queiram tirar alguma dúvida ou fazer sugestões para melhoria.

--

--

Fabiano Santana
Tableless

Arquiteto de Software .NET / Full Stack .NET Developer / Flutter Developer & UI Designer