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.
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.
A figura a seguir mostra um deploy de uma solução de monitoramento de aplicação com statsd, no Amazon EC2.
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.
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.
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.
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.
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:
- Instruções gerais com etapas comuns aos casos de uso de Repeateres e Relays.
- Instruções para o caso de uso do Repeater.
- 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.
- Instalar statsd
- Instalar statsd_exporter
- Configurar mapeamento para statsd_exporter
- Crie o workspace Amazon Managed Service for Prometheus.
- Instale o servidor Prometheus.
- Configure o servidor Prometheus para gravar na instância Amazon Managed Service for Prometheus.
- Desenvolva um aplicativo NodeJS instrumentado com o cliente statsd.
- Adicione as regras de gravação do Prometheus no Amazon Managed Service for Prometheus.
- Inicie a instância do Amazon Managed Grafana.
- Importe o JSON do painel para visualizar as métricas.
Instalar statsd
A instalação do statsd é a mesma de qualquer aplicativo NodeJS.
- Conecte-se à sua instância Linux usando o Session Manager.
- Execute os seguintes comandos para instalar o NodeJS, clonar o statsd e instalar os pacotes necessários.
Instalar statsd_exporter
Os comandos a seguir usam o binário statsd_exporter para o sistema Linux amd64.
- Abra uma nova janela do terminal.
- Conecte-se à sua instância Linux usando o Session Manager.
- Execute os seguintes comandos para baixar e descompactar o binário.
Configurar statsd_exporter
O 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.
- Abra um novo arquivo chamado statsd-mapping-config.yaml na pasta
statsd_exporter-0.22.4.linux-amd64
.
- Copie e cole o seguinte em
statsd-mapping-config.yam
l
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
- Crie o workspace do Amazon Managed Service for Prometheus, conforme descrito aqui.
- Copie o ID do workspace criado conforme descrito aqui. Esse ID do workspace será usado na seção para configurar o servidor Prometheus.
- Crie uma função do IAM com a política AmazonPrometheusRemoteWriteAccess e anexe essa função à instância do Amazon EC2.
- 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.
Instale o servidor Prometheus
- Abra uma nova janela do terminal.
- Conecte-se à sua instância Linux usando o Session Manager.
- Execute os seguintes comandos para instalar o servidor Prometheus.
Configurar o servidor Prometheus
- 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.
Inicie o servidor Prometheus
- Abra uma nova janela do terminal.
- Conecte-se à sua instância Linux usando o Session Manager.
- Inicie o servidor Prometheus com o arquivo de configuração prometheus.yaml criado anteriormente usando os seguintes comandos.
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:
Inicie um aplicativo NodeJS instrumentado com o cliente statsd
- Abra uma nova janela do terminal
- Conecte-se à sua instância Linux usando o Session Manager.
- Execute os seguintes comandos para criar uma pasta e inicializar:
- Abra um novo arquivo chamado index.js e cole o seguinte:
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
- Crie um workspace conforme descrito aqui.
- Defina o acesso do usuário conforme descrito aqui.
Adicionar fonte de dados Prometheus
- Adicione a fonte de dados do Amazon Managed Service for Prometheus conforme descrito aqui.
Criar painel
- Crie um novo painel com a opção Importar conforme descrito aqui.
- 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,
- O processo statsd é configurado com o backend do Repeater.
- 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:
- Vá para o terminal em que o statsd é lançado.
- Crie um arquivo chamado statsd-config.js e cole o seguinte.
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.
Inicie statsd_exporter
- Vá para o terminal em que o statsd_exporter foi instalado.
- Inicie-o com o seguinte comando. Verifique se o caminho para statsd-mapping-config.js foi fornecido corretamente.
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.
- Obtenha o endereço IP público da instância do Amazon EC2 em execução.
- Habilite o tráfego TCP de entrada do seu endereço IP na porta 4000.
Exibir painel
- Inicie o painel a partir do console Amazon Managed Grafana conforme descrito aqui.
- 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
- Vá até o terminal em que a aplicação está sendo executado.
- Pare a aplicação com Ctrl-C.
- Edite index.js alterando a declaração de StatsdClient conforme mostrado a seguir:
Iniciar o processo statsd
- 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:
Inicie statsd_exporter
- Vá para o terminal em que o statsd_exporter foi instalado.
- Inicie-o com o seguinte comando. Verifique se o caminho para statsd-mapping-config.js foi fornecido corretamente.
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.
- Obtenha o endereço IP público da instância do Amazon EC2 em execução.
- Habilite o tráfego TCP de entrada do seu endereço IP na porta 4000.
Exibir painel
- Inicie o painel a partir do console do Amazon Managed Service for Grafana clicando na URL do workspace Grafana.
- 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:
- Exclua o workspace do Grafana conforme descrito aqui.
- Exclua o workspace do Prometheus conforme descrito aqui.
- Encerre a instância do Amazon EC2 conforme descrito aqui.
- 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