Criando um CRUD com .NET 5, MySQL, Angular 11, Keycloak, Phometheus e Grafana — Parte 4

Alan Luiz Viana
Escrito por Alan Luiz Viana em
Criando um CRUD com .NET 5, MySQL, Angular 11, Keycloak, Phometheus e Grafana — Parte 4

Nesse artigo vamos alterar nossa API para fornecer métricas de uso, configurar o phometheus para coletar essas métricas e configurar um dashboard no grafana para acompanhar tudo isso de forma visual.

Instalando dependências

Primeiro precisamos instalar as dependências do App Metrics, biblioteca que utilizaremos para criar a monitoração, para isso executamos os seguintes comandos na pasta Products.API:

dotnet add package App.Metrics.AspNetCore.All --version 4.2.0
dotnet add package App.Metrics.Formatters.Prometheus --version 4.2.0

Configurando a API para fornecer métricas

Agora vamos ao arquivo Program.cs e configuraremos nosso host para usar métricas, o arquivo deve ficar como a seguir:

using App.Metrics;
using App.Metrics.AspNetCore;
using App.Metrics.Formatters.Prometheus;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace Products.API
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) {

            var hostBuilder = Host.CreateDefaultBuilder(args)
                                  .UseMetrics(options =>
                                      {
                                          options.EndpointOptions = endpointsOptions =>
                                          {
                                              endpointsOptions.MetricsTextEndpointOutputFormatter = new MetricsPrometheusTextOutputFormatter();
                                              endpointsOptions.MetricsEndpointOutputFormatter = new MetricsPrometheusTextOutputFormatter();
                                          };
                                      })
                                  .ConfigureWebHostDefaults(webBuilder =>
                                  {
                                      webBuilder.UseStartup<Startup>();
                                  });
            return hostBuilder;
        }            
    }
}

Para esse arquivo configuramos o método UseMetrics para os formatters do phometheus. Também precisamos adicionar a seguinte instrução dentro do método ConfigureServices do arquivo Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
  [...]
  services.AddMvc().AddMetrics();
}

Precisamos dessa configuração para que o App Metrics consiga capturar métricas de cada rota do nosso sistema.

Configurando o Phometheus

O prometheus será responsável por capturar as métricas na nossa API a cada intervalo de tempo, essa configuração é feita no arquivo prometheus.yml que deve ser criado no seguinte caminho:

docker\prometheus\prometheus.yml

O conteúdo desse arquivo deve ser:

scrape_configs:
- job_name: api
  scrape_interval: 5s
  static_configs:
  - targets:
    - api:80
  metrics_path: metrics-text

Nesse arquivo estamos configurando um job que será executado a cada 5 segundos e buscará informações no servidor API, na porta 80 e no endpoint metrics-text.

Também precisamos configurar nosso docker-compose.yml para subir um servidor Phometheus usando essas configurações:

 [...]
  prometheus:
    image: prom/prometheus:v2.26.0
    container_name: prometheus
    ports:
    - 9090:9090
    volumes:
    - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
    depends_on:
    - api
    restart: always

Configurando o Grafana

Vou mostrar brevemente como realizar a configuração do grafana e depois como podemos automatizar esse processo. Começamos por adicionar ao docker-compose.yml nosso serviço grafana:

  [...]
  grafana:
    image: grafana/grafana:6.7.2
    container_name: grafana
    ports:
      - 3000:3000
    depends_on:
      - prometheus

Podemos também subir nossa infraestrutura com o comando:

docker-compose up --build -d

Ao fim do processo podemos acessar nosso servidor grafana no endereço http://localhost:3000:

Página de Login grafana

O login padrão é admin e a senha padrão também é admin.

Após o login precisamos configurar as fontes de dados que serão utilizadas pelo grafana, podemos fazer isso no menu lateral Configuration > Data Sources:

Caminho para cadastro do Data Source

Podemos clicar no botão Add Data Source e selecionar o Phometheus:

Página de cadastro do Data Source — Phometheus

Precisamos informar a URL do phometheus como http://prometheus:9090.

Depois disso podemos clicar no botão Save & Test.

Importando o dashboard

O Grafana possui um repositório enorme de dashboards prontos para uso, no nosso exemplo vou utilizar um dashboard do App Metrics, ele pode ser encontrado no endereço https://grafana.com/grafana/dashboards/2204/revisions.

Para esse projeto vamos usar a revisão 3 do dashboard, podemos baixar esse arquivo:

Página de revisões do dashboard

Podemos começar a importação do dashboard pelo menu lateral Create > Import:

Caminho para importação do dashboard

Na tela apresentada podemos clicar no botão Upload .json file e selecionar o arquivo app-metrics-web-monitoring-prometheus_rev3.json:

Configuração da fonte de dados do dashboard

Para o campo “Prometheus App Metrics” selecionaremos nosso Data Source Phometheus.

Ao clicar em Import nosso dashboard é aberto:

Dashboard criado

Podemos abrir nosso frontend, fazer o login e cadastrar alguns produtos, e veremos que o relatório vai ser atualizado alguns segundos depois.

Métricas gerais da API

Também podemos acompanhar métricas por endpoint:

Métricas por endpoint

Exportando o dashboard configurado

Precisamos acessar a configuração do nosso dashboard:

Configurações do dashboard

Podemos clicar em JSON Model:

Configurações do dashboard - JSON Model

Podemos copiar esse JSON e criar um arquivo chamado dashboard_01.json.

Automatizando a configuração do Grafana

Nesse ultimo passo vamos criar arquivos para automatizar a criação do Data Source, fazemos isso no arquivo datasource.yml que deve ser criado no caminho:

docker\grafana\provisioning\datasources\datasource.yml

O conteúdo desse arquivo deve ser:

# config file version
apiVersion: 1

# list of datasources that should be deleted from the database
deleteDatasources:
  - name: Prometheus
    orgId: 1

# list of datasources to insert/update depending
# whats available in the database
datasources:
  # <string, required> name of the datasource. Required
- name: Prometheus
  # <string, required> datasource type. Required
  type: prometheus
  # <string, required> access mode. direct or proxy. Required
  access: proxy
  # <int> org id. will default to orgId 1 if not specified
  orgId: 1
  # <string> url
  url: http://prometheus:9090
  # <string> database password, if used
  password:
  # <string> database user, if used
  user:
  # <string> database name, if used
  database:
  # <bool> enable/disable basic auth
  basicAuth: true
  # <string> basic auth username
  basicAuthUser: admin
  # <string> basic auth password
  basicAuthPassword: foobar
  # <bool> enable/disable with credentials headers
  withCredentials:
  # <bool> mark as default datasource. Max one per org
  isDefault:
  # <map> fields that will be converted to json and stored in json_data
  jsonData:
     graphiteVersion: "1.1"
     tlsAuth: false
     tlsAuthWithCACert: false
  # <string> json object of data that will be encrypted.
  secureJsonData:
    tlsCACert: "..."
    tlsClientCert: "..."
    tlsClientKey: "..."
  version: 1
  # <bool> allow users to edit datasources from the UI.
  editable: true

Também criaremos um arquivo para automatizar a importação dos dashboards, esse arquivo se chamara dashboard.yml e deve ser criado no seguinte caminho:

docker\grafana\provisioning\dashboards\dashboard.yml

O conteúdo do arquivo dashboard.yml deve ser:

apiVersion: 1

providers:
- name: 'Prometheus'
  orgId: 1
  folder: ''
  type: file
  disableDeletion: false
  editable: true
  options:
    path: /etc/grafana/provisioning/dashboards

Também precisamos colocar o arquivo dashboard_01.json na pasta dashboards, ficando com o seguinte caminho:

docker\grafana\provisioning\dashboards\dashboard_01.json

O último passo é atualizar nosso service grafana no docker-compose.yml para utilizar esses arquivos:

  [...]
  grafana:
    image: grafana/grafana:6.7.2
    container_name: grafana
    ports:
      - 3000:3000
    volumes:
      - ./docker/grafana/provisioning/:/etc/grafana/provisioning/
    environment:
      GF_INSTALL_PLUGINS: grafana-piechart-panel,grafana-clock-panel,briangann-gauge-panel,natel-plotly-panel,grafana-simple-json-datasource
    depends_on:
      - prometheus

Também configuramos a variável de ambiente com plugins usados pelo nosso dashboard, assim serão instalados automaticamente.

Podemos agora derrubar toda nossa infraestrutura e subir novamente, já com todos os serviços configurados:

docker-compose down
docker-compose up --build -d 

Imagem com todos os serviços criados

Assim finalizamos nossa série, espero que tenha sido útil para entender um pouco de cada ferramenta e a forma como elas interagem!

Gostou? Tem alguma sugestão ou dúvida? Deixa ai nos comentários!

Segue o link do repositório no estado atual do projeto:

Repositório Products Management

Alan Luiz Viana

Alan Luiz Viana

Autor dos artigos desse blog! :D

Comments

comments powered by Disqus