DEV Community

Odorizzi1
Odorizzi1

Posted on • Edited on

6 3 4 3 3

Observabilidade com Prometheus e node.js

O acompanhamento e monitoramento de aplicações e servidores são aspectos cruciais para os desenvolvedores de software. Isso envolve uma variedade de análises, desde a detecção contínua de possíveis erros até a avaliação do uso de recursos como CPU, memória e armazenamento do servidor. Além disso, é fundamental configurar alertas para situações específicas, como receber uma notificação quando a CPU ou a memória atingir um limite crítico. É ainda mais importante receber alertas quando a aplicação apresentar falhas, permitindo uma resposta rápida por parte do desenvolvedor.

O que é o prometheus?

O Prometheus é uma plataforma de monitoramento projetada para serviços e aplicativos. Ele reúne métricas dos alvos definidos em intervalos específicos, analisa expressões de regras, exibe os resultados e pode até mesmo disparar alertas caso alguma condição seja detectada como verdadeira.

O principal diferencial do Prometheus é a sua abordagem de notificação. Enquanto muitas ferramentas utilizam um método de pull notification, em que a aplicação envia dados ao Prometheus por meio de uma solicitação HTTP, o Prometheus utiliza uma abordagem de push notification, em que os dados são enviados ativamente para o Prometheus.

Esse artigo seguirá com a abordagem de pull notification e num artigo 2 desse mesmo assunto farei a abordagem de push notification.

Para iniciar instale o Prometheus na sua máquina conforme a documentação e seu sistema operacional
https://prometheus.io/download/

Importante, após a instalação rodar o comando prometheus

Na sua aplicação vai ser necessário instalar a lib "prom-client"
Utilize npm install prom-client ou yarn add prom-client

É necessário que crie um arquivo yml com as configurações iniciais do prometheus aqui útilizaremos a seguinte configuração

scrape_configs:
  - job_name: 'myapp'
    static_configs:
      - targets: ['localhost:3000']

Enter fullscreen mode Exit fullscreen mode

No seu arquivo app onde executaremos nossos scripts do servidor

import { register, collectDefaultMetrics, Counter } from "prom-client";
collectDefaultMetrics();

const requestCounter = new Counter({
  name: "myapp_requests_total",
  help: "Número total de requisições ao aplicativo.",
});

Enter fullscreen mode Exit fullscreen mode

Nesse contexto o requestCounter será uma nova instância de quantas vezes nossa url foi acessada da seguinte forma:

app.get("/metrics", async (req, res) => {
  try {
    res.set("Content-Type", register.contentType);
    const metrics = await register.metrics();
    res.end(metrics);
  } catch (error) {
    console.error("Erro ao obter métricas:", error);
    res.status(500).send("Erro ao obter métricas");
  }
});
Enter fullscreen mode Exit fullscreen mode

Facilidade de configuração: Ao usar a rota /metrics, você pode configurar para coletar métricas de várias fontes, simplesmente configurando para fazer um scrap da rota /metrics de cada serviço ou aplicativo que deseja monitorar.

Agora ao chamar o nosso counter, ela sera logada no Prometheus, sendo assim executando a regra proposta

app.get("/teacher", (req, res) => {

  requestCounter.inc();
//Lógicas referentes a rota teacher
});
Enter fullscreen mode Exit fullscreen mode

Dessa forma agora ao acessar a url que irá efetuar a contagem de quantas vezes a url teacher foi executada, em /metrics você deverá obter um resultado dessa forma

# HELP myapp_requests_total Número total de requisições ao aplicativo.
# TYPE myapp_requests_total counter
myapp_requests_total 4
Enter fullscreen mode Exit fullscreen mode

Aqui obtemos o resultado de que nossa url /teachers foi acessada 4 vezes

Você pode conferir no repositório em que estou fazendo todo esse projeto

https://github.com/Odorizzi1/Educa-web

Imagine monitoring actually built for developers

Billboard image

Join Vercel, CrowdStrike, and thousands of other teams that trust Checkly to streamline monitor creation and configuration with Monitoring as Code.

Start Monitoring

Top comments (2)

Collapse
 
anderson_douradocunha_8d profile image
Anderson Dourado Cunha

muito bom! Esperando a parte 2!

Collapse
 
lincolixavier profile image
Lincoli Xavier

Brabissimo! Parabens maninho!

Heroku

This site is powered by Heroku

Heroku was created by developers, for developers. Get started today and find out why Heroku has been the platform of choice for brands like DEV for over a decade.

Sign Up

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay