O blog da AWS

Visualização de métricas personalizadas de statsd com o Amazon Managed Service for Prometheus e o Amazon Managed Grafana

Por Nagesh Subrahmanyam

 

Monitorar aplicativos com base em métricas personalizadas é importante para um sistema resiliente. Um dos mecanismos para gerar métricas personalizadas a partir de aplicativos é o statsd — um processo do NodeJS para coletar métricas personalizadas de desempenho de aplicativos periodicamente. No entanto, o statsd não fornece armazenamento de longo prazo, consultas avançadas, visualização ou uma solução de alerta. O Amazon Managed Service for Prometheus e o Amazon Managed Grafana fornecem um serviço gerenciado para soluções de armazenamento, consulta, visualização e alerta de longo prazo em escala para as métricas coletadas.

Esta publicação descreve como parceiros e clientes da AWS podem visualizar métricas de uma instância em execução do statsd, em uma instância do Amazon Elastic Compute Cloud (Amazon EC2) baseada em Linux ou Windows, com o Amazon Managed Service for Prometheus e o Amazon Managed Grafana. Esta postagem descreve os dois cenários de Repeater e Relay aplicados à extração de estatísticas de statsd. A visualização de métricas do statsd com o Amazon Managed Service for Prometheus e o Amazon Managed Grafana pode ajudar os clientes a migrar para soluções de monitoramento com serviços nativos da AWS, ao mesmo tempo em que aproveita a combinação do Prometheus e do Grafana.

 

Tempo para ler 6 minutos
Tempo para concluir 15 minutos
Custo de conclusão (estimado) 10 USD (no momento da publicação)
Nível de conhecimento Intermediário (200)
Serviços usados

Amazon EC2

Amazon Managed Service for Prometheus

Amazon Managed Service for Grafana

Visão geral da solução

Na figura a seguir, é mostrada um deploy de uma solução de monitoramento de desempenho de aplicativos com statsd. Nessa implantação, uma aplicação é instrumentada com clientes statsd e grava suas métricas personalizadas no processo statsd configurado em um ou mais back-ends.

Figure 1 Application custom metrics with statsd

A figura a seguir mostra um deploy de uma solução de monitoramento de aplicação com statsd, no Amazon EC2.

Figure 2 Illustrative deployment of application monitoring with statsd

Para integrar com o servidor Prometheus, o statsd_exporter — exportador oficial do Prometheus para statsd — é usado. Há duas maneiras de utilizar o exportador: Repeater e Relay. O caso de uso do Repeater pode ser usado quando o processo statsd pode ser configurado. A aplicação não precisa ser alterada. O caso de uso do Relay pode ser usado quando o processo statsd não está disponível para configuração. No entanto, talvez seja necessário reconfigurar a aplicação para o endpoint statsd_exporter.

Repeater

Na figura a seguir, o caso de uso do Repeater é mostrado, em que o recurso de Repeater do statsd é usado para “encaminhar” as métricas para outros servidores statsd. No entanto, para essa solução, as métricas são encaminhadas para statsd_exporter. O statsd_exporter também exporá um endpoint de métricas que um servidor Prometheus pode coletar. A aplicação não precisa ser alterada.

Figure 3 Repeater use case with statsd and statsd_exporter

A figura a seguir mostra o caso de uso do Repeater com statsd e statsd_exporter usando Amazon EC2, Amazon Managed Service for Prometheus e Amazon Managed Grafana.

Figure 4 Illustrative deployment of Repeater use case on AWS

O processo statsd é configurado com um back-end do Repeater para encaminhar métricas do processo statsd para statsd_exporter que podem ser copiadas por um servidor Prometheus. Para esta postagem, o servidor Prometheus será implantado na mesma instância do Amazon EC2 em que a aplicação está sendo executado.

O servidor Prometheus será configurado com um arquivo YAML para gravar remotamente em um workspace do Amazon Managed Service for Prometheus. Além disso, a instância do Amazon EC2 será configurada com uma função do AWS Identity and Access Management (IAM) que tem a política AmazonPrometheusRemoteWriteAccess. Um arquivo YAML com as regras de gravação do Prometheus é carregado no workspace do Amazon Managed Service for Prometheus para gerar os valores médios das métricas.

O workspace do Amazon Managed Grafana está configurado para usar o workspace do Amazon Managed Service for Prometheus como fonte de dados. O workspace no Amazon Managed Grafana terá painéis para exibir as métricas.

Relay

Na figura a seguir, o caso de uso do Relay é mostrado, em que statsd_exporter é configurado para encaminhar métricas para o processo statsd. O statsd_exporter também exporá um endpoint de métricas que um servidor Prometheus pode coletar. Talvez seja necessário reconfigurar a aplicação para enviar as métricas para statsd_exporter em vez do processo statsd.

Figure 5 Relay use case with statsd and statsd_exporter

A figura a seguir mostra uma ilustração de um caso de uso do Relay com statsd e statsd_exporter usando Amazon EC2, Amazon Managed Service for Prometheus e Amazon Managed Grafana.

Figure 6 Illustrative deployment of Relay use case on AWS

O statsd_exporter é configurado como um Relay para o processo statsd. O statsd_exporter pode ser copiado por um servidor Prometheus. Para esta postagem, o servidor Prometheus será implantado na mesma instância do Amazon EC2 em que a aplicação está sendo executado.

O servidor Prometheus será configurado com um arquivo YAML para gravar remotamente em um workspace do Amazon Managed Service for Prometheus. Além disso, a instância do Amazon EC2 será configurada com uma função do IAM que tem a política AmazonPrometheusRemoteWriteAccess [DS1]. Um arquivo YAML com as regras de gravação do Prometheus é carregado no workspace do Amazon Managed Service for Prometheus para gerar os valores médios das métricas em um período de 5 minutos.

O workspace do Amazon Managed Grafana está configurado para usar o workspace do Amazon Managed Service for Prometheus como fonte de dados. O workspace no Amazon Managed Grafana terá painéis para exibir as métricas.

Passo a passo

O passo a passo da solução é categorizado da seguinte forma:

  1. Instruções gerais com etapas comuns aos casos de uso de Repeateres e Relays.
  2. Instruções para o caso de uso do Repeater.
  3. Instruções para o caso de uso do Relay

Depois que as instruções gerais estiverem concluídas, qualquer uma das instruções para Repeater e Relay pode ser usada.

Pré-requisitos

Para esse passo a passo, os seguintes pré-requisitos devem ser atendidos:

  • Uma conta da AWS
  • Uma instância do Amazon EC2 baseada em Linux em execução em uma sub-rede pública. Este post usa o Ubuntu como sistema operacional.
  • Instale o hey para simular solicitações HTTP em sua estação de trabalho ou na própria instância do Amazon EC2.

Instruções gerais

As instruções a seguir se aplicam aos casos de uso do Repeater e do Relay.

  1. Instalar statsd
  2. Instalar statsd_exporter
  3. Configurar mapeamento para statsd_exporter
  4. Crie o workspace Amazon Managed Service for Prometheus.
  5. Instale o servidor Prometheus.
  6. Configure o servidor Prometheus para gravar na instância Amazon Managed Service for Prometheus.
  7. Desenvolva um aplicativo NodeJS instrumentado com o cliente statsd.
  8. Adicione as regras de gravação do Prometheus no Amazon Managed Service for Prometheus.
  9. Inicie a instância do Amazon Managed Grafana.
  10. Importe o JSON do painel para visualizar as métricas.

Instalar statsd

A instalação do statsd é a mesma de qualquer aplicativo NodeJS.

  1. Conecte-se à sua instância Linux usando o Session Manager.
  2. Execute os seguintes comandos para instalar o NodeJS, clonar o statsd e instalar os pacotes necessários.
sudo apt-get update
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
git clone https://github.com/statsd/statsd
cd statsd
npm i

Instalar statsd_exporter

Os comandos a seguir usam o binário statsd_exporter para o sistema Linux amd64.

  1. Abra uma nova janela do terminal.
  2. Conecte-se à sua instância Linux usando o Session Manager.
  3. Execute os seguintes comandos para baixar e descompactar o binário.
curl -sOL https://github.com/prometheus/statsd_exporter/releases/download/v0.22.4/statsd_exporter-0.22.4.linux-amd64.tar.gz
tar -xvf statsd_exporter-0.22.4.linux-amd64.tar.gz

Configurar statsd_exporter

statsd_exporter pode ser configurado para traduzir métricas statsd específicas separadas por pontos em métricas rotuladas do Prometheus por meio de uma linguagem de mapeamento simples. Esse mapeamento é salvo em um arquivo YAML e usado para iniciar o statsd_exporter.

  1. Abra um novo arquivo chamado statsd-mapping-config.yaml na pasta statsd_exporter-0.22.4.linux-amd64.
  2. Copie e cole o seguinte em statsd-mapping-config.yaml
mappings:
- match: "api.*.*.*"
  name: "api_metrics"
  labels:
    path: "$1"
    method: "$2"
    status: "$3"

Esse arquivo de mapeamento pegará uma métrica chamada, por exemplo, api.hello.get.200 e a transformará no formato Prometheus como api_metrics{path=hello,method=GET,status=200}. A métrica api.hello.GET.200 será gerada pela aplicação NodeJS que tem um cliente statsd.

Lance o Amazon Managed Service para o workspace do Prometheus

  1. Crie o workspace do Amazon Managed Service for Prometheus, conforme descrito aqui.
  2. Copie o ID do workspace criado conforme descrito aqui. Esse ID do workspace será usado na seção para configurar o servidor Prometheus.
  3. Crie uma função do IAM com a política AmazonPrometheusRemoteWriteAccess e anexe essa função à instância do Amazon EC2.
  4. Adicione o seguinte ao arquivo YAML chamado statsd-prometheus.yaml e faça o upload para o workspace criado. Isso gerará um valor médio de invocações de API em 5 minutos com base no caminho e no código de status.
groups:
  - name: statsd
    rules:
    - record: metric:api_metrics
      expr: sum(rate(api_metrics[5m])) by (path, status)

Instale o servidor Prometheus

  1. Abra uma nova janela do terminal.
  2. Conecte-se à sua instância Linux usando o Session Manager.
  3. Execute os seguintes comandos para instalar o servidor Prometheus.
export PROMETHEUS_VERSION=2.34.0
curl -OL https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}-rc.0/prometheus-${PROMETHEUS_VERSION}-rc.0.linux-amd64.tar.gz
tar xvzf prometheus-${PROMETHEUS_VERSION}-rc.0.linux-amd64.tar.gz
export PATH=$PATH:$HOME/prometheus-${PROMETHEUS_VERSION}-rc.0.linux-amd64

Configurar o servidor Prometheus

  1. Crie um arquivo de configuração chamado prometheus.yaml usando o conteúdo a seguir. Altere regionID conforme aplicável. Altere o WorkspaceID pelo ID do workspace na seção sobre o lançamento do workspace do Amazon Managed Service for Prometheus.
global:
  scrape_interval: 15s
  external_labels:
    monitor: 'statsd_exporter'
scrape_configs:
  - job_name: 'statsd_exporter'
    static_configs:
      - targets: ['localhost:9102']
remote_write:
  -
    url: https://aps-workspaces.<regionId>.amazonaws.com/workspaces/<workspace Id>/api/v1/remote_write
    queue_config:
        max_samples_per_send: 1000
        max_shards: 200
        capacity: 2500
    sigv4:
        region: <regionId>

Inicie o servidor Prometheus

  1. Abra uma nova janela do terminal.
  2. Conecte-se à sua instância Linux usando o Session Manager.
  3. Inicie o servidor Prometheus com o arquivo de configuração prometheus.yaml criado anteriormente usando os seguintes comandos.
export PROMETHEUS_VERSION=2.34.0
export PATH=$PATH:$HOME/prometheus-${PROMETHEUS_VERSION}-rc.0.linux-amd64
prometheus --config.file=prometheus.yaml 

O console deve mostrar uma saída semelhante a esta para indicar que o Amazon Managed Service for Prometheus foi conectado com sucesso pelo servidor Prometheus:

ts=2022-03-04T01:12:25.394Z caller=dedupe.go:112 component=remote level=info remote_name=4b1ae2 url=https://aps-workspaces.regionId.amazonaws.com/workspaces/workspaceId/api/v1/remote_write msg="Starting WAL watcher" queue=4b1ae2
ts=2022-03-04T01:12:25.394Z caller=dedupe.go:112 component=remote level=info remote_name=4b1ae2 url=https://aps-workspaces.regionId.amazonaws.com/workspaces/workspaceId/api/v1/remote_write msg="Starting scraped metadata watcher"
ts=2022-03-04T01:12:25.394Z caller=dedupe.go:112 component=remote level=info remote_name=4b1ae2 url=https://aps-workspaces.regionId.amazonaws.com/workspaces/workspaceId/api/v1/remote_write msg="Replaying WAL" queue=4b1ae2

Inicie um aplicativo NodeJS instrumentado com o cliente statsd

  1. Abra uma nova janela do terminal
  2. Conecte-se à sua instância Linux usando o Session Manager.
  3. Execute os seguintes comandos para criar uma pasta e inicializar:
mkdir app
npm init -y
npm i express node-statsd --save
  1. Abra um novo arquivo chamado index.js e cole o seguinte:
const express = require('express')
const StatsD = require('node-statsd')
const statsdClient = new StatsD()
const app = express()
const port = 4000
let incrVar
app.get('/hello', (req, res) => {
  incrVar = `${req.path}.${req.method}.200`
  incrVar = `api.${incrVar.substring(1)}`
  statsdClient.increment(incrVar)
  res.status(200).send('Hello World!')
})
app.use('/', (req, res) => {
  incrVar = `${req.path}.${req.method}.404`
  incrVar = `api.${incrVar.substring(1)}`
  statsdClient.increment(incrVar)
  res.status(404).send('Not found.')
})
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

Este aplicativo NodeJS expõe um endpoint /hello baseado em ExpressJS na porta 4000 para o GET. Esse endpoint responde com um texto simples “Hello World!” com o código de status 200. Invocar qualquer outro endpoint resultará em uma resposta como “Não encontrado” com um código de status como 404.

Essa aplicação usa o pacote node-statsd para implementar o cliente statsd. A métrica emitida terá o nome de formato api. <requestPath>. <requestMethod>. <statusCode>onde, o requestPath é o endpoint invocado, o requestMethod é o método HTTP e o StatusCode é configurado na resposta. O valor dessa métrica é um contador monotonicamente crescente para rastrear o número de invocações. Por exemplo, quando /hello é invocado com GET, uma métrica será emitida como api.hello.get.200 com o valor incrementado em 1.

Inicie o workspace do Grafana

  1. Crie um workspace conforme descrito aqui.
  2. Defina o acesso do usuário conforme descrito aqui.

Adicionar fonte de dados Prometheus

  1. Adicione a fonte de dados do Amazon Managed Service for Prometheus conforme descrito aqui.

Criar painel

  1. Crie um novo painel com a opção Importar conforme descrito aqui.
  2. Faça o upload do seguinte documento JSON:
{"__inputs":[],"__requires":[{"type":"grafana","id":"grafana","name":"Grafana","version":"8.2.5"},{"type":"panel","id":"timeseries","name":"Time series","version":""}],"annotations":{"list":[{"builtIn":1,"datasource":"-- Grafana --","enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","target":{"limit":100,"matchAny":false,"tags":[],"type":"dashboard"},"type":"dashboard"}]},"editable":true,"fiscalYearStartMonth":0,"gnetId":null,"graphTooltip":0,"id":null,"links":[],"liveNow":true,"panels":[{"datasource":null,"fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":0,"gradientMode":"none","hideFrom":{"legend":false,"tooltip":false,"viz":false},"lineInterpolation":"smooth","lineWidth":1,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"red","value":80}]}},"overrides":[]},"gridPos":{"h":19,"w":24,"x":0,"y":0},"id":2,"options":{"legend":{"calcs":[],"displayMode":"list","placement":"bottom"},"tooltip":{"mode":"single"}},"targets":[{"exemplar":true,"expr":"metric:api_metrics","interval":"","legendFormat":"{{path}}-{{status}}","refId":"A"}],"title":"API metrics (rate)","type":"timeseries"}],"refresh":"","schemaVersion":32,"style":"dark","tags":[],"templating":{"list":[]},"time":{"from":"now-5m","to":"now"},"timepicker":{},"timezone":"browser","title":"statsd","uid":"5fn7dTY7z","version":9}

Instruções para o caso de uso do Repeater

Conforme discutido anteriormente, no caso de uso do Repeater,

  1. O processo statsd é configurado com o backend do Repeater.
  2. A aplicação não foi alterada.

As instruções a seguir configurarão o caso de uso do Repeater.

Configurar o processo statsd

O processo statsd deve ser reconfigurado com um back-end Repeater com os seguintes comandos:

  1. Vá para o terminal em que o statsd é lançado.
  2. Crie um arquivo chamado statsd-config.js e cole o seguinte.
{
 backends: [ "./backends/console", "./backends/repeater" ],
 repeater: [ { host: "localhost", port: 9125 } ]
}

O ./backends/console não é estritamente necessário. No entanto, o uso desse back-end mostrará as métricas no console. O Repeater aponta para o host e a porta do statsd_exporter em execução na mesma instância do Amazon EC2 com 9125 como número de porta padrão.

Iniciar o processo statsd

Inicie o processo statsd com o seguinte comando. Verifique se o caminho para  statsd-config.js foi fornecido corretamente.

node stats.js statsd-config.js

Inicie statsd_exporter

  1. Vá para o terminal em que o statsd_exporter foi instalado.
  2. Inicie-o com o seguinte comando. Verifique se o caminho para statsd-mapping-config.js foi fornecido corretamente.
./statsd_exporter --statsd.mapping-config=statsd-mapping-config.yaml

Simule solicitações HTTP

Execute os seguintes comandos em dois terminais diferentes para simular solicitações HTTP GET no endpoint /hello para gerar a métrica para o código de status 200 e o endpoint /bye para gerar a métrica para o código de status 404. Esses comandos serão executados por cinco minutos. A duração pode ser alterada definindo um valor diferente para o sinalizador -z.

  1. Obtenha o endereço IP público da instância do Amazon EC2 em execução.
  2. Habilite o tráfego TCP de entrada do seu endereço IP na porta 4000.
hey -z 5m http://ec2-public-ip:4000/hello
hey -z 5m http://ec2-public-ip:4000/bye

Exibir painel

  1. Inicie o painel a partir do console Amazon Managed Grafana conforme descrito aqui.
  2. O gráfico a seguir é visto. Observe a legenda no canto inferior esquerdo para ver as curvas correspondentes ao caminho e ao status da API.

Instruções para o caso de uso do Relay

Configurar aplicativo

  1. Vá até o terminal em que a aplicação está sendo executado.
  2. Pare a aplicação com Ctrl-C.
  3. Edite index.js alterando a declaração de StatsdClient conforme mostrado a seguir:
const statsdClient = new StatsD({
  host: "localhost",
  port: 9125
})

Iniciar o processo statsd

  1. Em geral, para usar o caso de uso do Relay, o processo statsd não exige uma alteração. No entanto, nesta postagem, a configuração foi alterada para adicionar um back-end Repeater que foi adicionado em uma seção anterior. É recomendável que o back-end do Repeater seja removido.

Vá até o terminal em que o processo statsd está sendo executado e edite statsd-config.js com o seguinte conteúdo:

{
 backends: [ "./backends/console" ]
}

Inicie statsd_exporter

  1. Vá para o terminal em que o statsd_exporter foi instalado.
  2. Inicie-o com o seguinte comando. Verifique se o caminho para statsd-mapping-config.js foi fornecido corretamente.
./statsd_exporter --statsd.mapping-config=statsd-mapping-config.yaml --statsd.relay.address=localhost:8125

Agora, o statsd_exporter está configurado para retransmitir estatísticas para o processo statsd.

Simule solicitações HTTP

Execute os seguintes comandos em dois terminais diferentes para simular solicitações HTTP GET no endpoint /hello para gerar a métrica para o código de status 200 e o endpoint /bye para gerar a métrica para o código de status 404. Esses comandos serão executados por cinco minutos. A duração pode ser alterada definindo um valor diferente para o sinalizador -z.

  1. Obtenha o endereço IP público da instância do Amazon EC2 em execução.
  2. Habilite o tráfego TCP de entrada do seu endereço IP na porta 4000.
hey -z 5m http://ec2-public-ip:4000/hello
hey -z 5m http://ec2-public-ip:4000/bye

Exibir painel

  1. Inicie o painel a partir do console do Amazon Managed Service for Grafana clicando na URL do workspace Grafana.
  2. O gráfico a seguir é visto. Observe a legenda no canto inferior esquerdo para ver as curvas correspondentes ao caminho e ao status da API.

Limpeza

Para evitar cobranças futuras, exclua os seguintes recursos:

  1. Exclua o workspace do Grafana conforme descrito aqui.
  2. Exclua o workspace do Prometheus conforme descrito aqui.
  3. Encerre a instância do Amazon EC2 conforme descrito aqui.
  4. Remova a política do IAM conforme descrito aqui.

Conclusão

Esta postagem descreve um meio de ingerir, consultar e visualizar métricas personalizadas de aplicativos coletados pelo processo statsd em execução em uma instância Linux do Amazon EC2 usando o Amazon Managed Service for Prometheus e o Amazon Managed Grafana. Dois cenários para usar stasd_exporter foram discutidos — Repeater e Relay — com base nas mudanças a serem feitas com o statsd ou com a aplicação. Dependendo dos requisitos, diferentes métricas personalizadas podem ser criadas, como latência HTTP ou outros valores do caminho da solicitação, parâmetros de consulta etc. Além disso, o Amazon Managed Service for Prometheus e o Amazon Managed Grafana podem ser configurados para gerar alertas conforme necessário.

 

Este artigo foi traduzido do Blog da AWS em Inglês.


Sobre o autor

Nagesh Subrahmanyam é arquiteto de soluções de gerenciamento de parceiros com mais de 20 anos de experiência. Ele é especialista em Kubernetes, tem amplo conhecimento em IoT, se interessou pelo Blockchain (Ethereum) e está explorando o 5g como uma meta tecnológica abrangente. Ele adora assistir filmes do Marvel Comics Universe com seu filho nas horas vagas. 

 

 

 

Tradutor

Eduardo Pereira é Arquiteto de Soluções. Atua ajudando clientes do setor Enterprise durante a sua jornada na nuvem da AWS. Tem grande interesse na área de Analytics, observabilidade e serverless.