Back-End

14 jan, 2019

ASP.NET Core: monitoramento de performance em tempo real

Publicidade

Hoje em dia temos APIs para todos os lados, e em algum ponto precisamos começar a monitorar nossa API em tempo real.

E através deste artigo demonstrarei como faremos isso com .NET Core + InfluxDB e Grafana. Usaremos o InfluxDB e o Grafana através do Docker.

Criando a API

Criar a API é bem simples. Basta criar um novo projeto no Visual Studio e selecionar a opção .NET Core > ASP.NET Core Web Application:

Instalando o Grafana

Para fazer o setup do Grafana através do Docker é muito simples, basta executar a seguinte linha de comando:

docker run -d — name=grafana -p 3000:3000 grafana/grafana

Mais informações podem ser conferidas no site do Grafana.

Instalando o InfluxDB

O procedimento é igual ao do Grafana – basta executar a seguinte linha de comando:

docker run -p 8086:8086 -d -v influxdb:/var/lib/influxdb influxdb

Como podem observar, o Grafana ficou na porta 3000 e o Influx na porta 8086.

Configurando a API

Agora precisamos ir na API e configurar para gravar as métricas no InfluxDB. Portanto, vamos modificar alguns arquivos e instalar pacotes Nuget.

Install-Package App.Metrics.Extensions.Mvc
Install-Package App.Metrics.Formatters.Json
Install-Package App.Metrics.Extensions.Reporting.InfluxDB

Modifique seu arquivo Startup.cs conforme o exemplo abaixo:

public void ConfigureServices(IServiceCollection services)
{
    var database = "appmetricsdemo";
    var uri = new Uri("http://127.0.0.1:8086");

    services.AddMetrics(options =>
        {
            options.WithGlobalTags((globalTags, info) =>
            {
                globalTags.Add("app", info.EntryAssemblyName);
                globalTags.Add("env", "stage");
            });
        })
        .AddHealthChecks()
        .AddReporting(
            factory =>
            {
                factory.AddInfluxDb(
                    new InfluxDBReporterSettings
                    {
                        InfluxDbSettings = new InfluxDBSettings(database, uri),
                        ReportInterval = TimeSpan.FromSeconds(5)
                    });
            })
        .AddMetricsMiddleware(options => options.IgnoredHttpStatusCodes = new[] { 404 });

    services.AddMvc(options => options.AddMetricsResourceFilter());
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    app.UseMetrics();
    app.UseMetricsReporting(lifetime);
    app.UseMvc();
}

Observe que adicionamos linhas pertinentes à configuração do InfluxDB como, por exemplo:

var database = “appmetricsdemo”;
var uri = new Uri(“http://127.0.0.1:8086");

Portanto, use da forma que configurou.

Configurando o Grafana

Agora vamos acessar o Grafana, http://localhost:3000, usuário e senha padrão é admin/admin, respectivamente.

Agora você precisará configurar um DataSource, onde no nosso caso será o Influx. Abaixo segue um exemplo de configuração:

Note que na URL eu inseri o IP do container Docker onde está rodando o InfluxDB, pois o Grafana também está sendo executado no Docker e os dois estão sendo executados dentro do mesmo network.

Clique em Save & Test e você deverá ver esse resultado:

Agora importaremos o Dashboard para o Grafana:

Aqui nesse site você pode encontrar o arquivo Json para importar para o seu dashboard. Porém, deixarei também a cópia do que utilizei na demo:

Agora vamos executar nossa aplicação. Fique à vontade para adicionar novos Controllers.

Resultado

Endpoints:

Overview:

Detalhe de requisições dos EndPoints

Configurações de filtros do Grafana:

Bom, deu pra ter uma ideia do quão poderosa é essa ferramenta, certo? A ideia é demonstrar como subir esse ambiente e rapidamente configurar sua API.

O projeto utilizado no GitHub encontra-se no link a seguir:

Até a próxima!