Instalação e configuração do Node Exporter em servidores Linux

Configure seu servidor Linux para exportar as métricas de CPU, Memória, Discos entre outras com o Node Exporter

Instalação e configuração do Node Exporter em servidores Linux

Fala pessoal tudo beleza?

Se você caiu nesse artigo pela primeira vez, fique sabendo que essa é uma série de artigos onde descrevo como montar uma stack de monitoramento usando o Grafana e Prometheus com o docker e docker-compose.

Artigos da série

  1. Monitorando seus servidores com Grafana e Prometheus
  2. Instalação e configuração do Node Exporter em servidores Linux (Você está aqui!)
  3. Criando alertas com Prometheus e Alertmanager
  4. Configure e gerencie alertas no Grafana: Maximize a eficiência do monitoramento

Neste artigo, parte 2, irei configurar um servidor Linux para exportar as métricas para que o Prometheus possa ler e armazenar em seu banco de dados, sendo possível a análise em tempo real através de dashboards do Grafana.

Para isso é necessário instalar e configurar o node exporter, que é um arquivo binário que irá obter várias métricas de seu servidor Linux e expor em um endpoint HTTP. Para saber mais sobre o node exporter acesse a documentação.

Pré requisitos

Instalando Node Exporter

Para a instalação do node exporter você pode acessar o github do projeto e verificar qual a última versão disponível para download. No momento desse artigo, a última versão estável é a 1.5.0.

Acesse seu servidor via SSH e vamos começar com a instalação do exporter. Crie uma variável de ambiente apenas para facilitar no processo de instalação que irá conter o valor da versão do node exporter:

export VERSION=1.5.0

Os comandos listados abaixo, irão realizar o download do arquivo, descompactar e mover o arquivo binário do node exporter para o diretório /usr/local/bin.

curl -LO https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz

tar -xvf node_exporter-${VERSION}.linux-amd64.tar.gz

sudo mv node_exporter-${VERSION}.linux-amd64/node_exporter /usr/local/bin/

Configurando Node Exporter

Até agora apenas baixamos e copiamos o binário para seu diretório, mas ainda é necessário configurar o serviço.

Crie um usuário no Linux para que possamos usar ele para executar o node exporter. Esse usuário só irá executar o binário, não sendo possível acessar via SSH com ele:

sudo useradd -rs /bin/false node_exporter

Crie um arquivo de inicialização no systemd para o binário:

sudo vim /etc/systemd/system/node_exporter.service

Cole o seguinte conteúdo dentro do arquivo node_exporter.service:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Reinicie o deamon e inicie o serviço node_exporter que acabamos de criar:

# Reinicia o deamon e inicia o serviço 
sudo systemctl daemon-reload

sudo systemctl start node_exporter

Para gerenciar o serviço do node_exporter, você poderá usar os comandos:

# Os comandos start / restart / status / stop estarão disponíveis para o serviço
sudo systemctl status node_exporter

Após o start do serviço, se tudo ocorrer bem, o resultado deve ser o seguinte:

aristides@my-server:~$ sudo systemctl status node_exporter 
● node_exporter.service - Node Exporter
   Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-10-17 00:25:38 -03; 20s ago
 Main PID: 25276 (node_exporter)
    Tasks: 5 (limit: 4915)
   CGroup: /system.slice/node_exporter.service
           └─25276 /usr/local/bin/node_exporter

Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - sockstat" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - stat" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - textfile" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - time" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - timex" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - uname" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - vmstat" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - xfs" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg=" - zfs" source="node_exporter.go:104"
Oct 17 00:25:38 my-server node_exporter[25276]: time="2022-10-17T00:25:38-03:00" level=info msg="Listening on :9100" source="node_exporter.go:170"

Como pode ser visto no log, o serviço está escutando na porta 9100. Se você acessar o endereço IP da sua instância http://IP-SERVIDOR:9100/metrics, terá um resultado semelhante a esse:

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.9151e-05
go_gc_duration_seconds{quantile="0.25"} 5.6041e-05
go_gc_duration_seconds{quantile="0.5"} 9.2601e-05
go_gc_duration_seconds{quantile="0.75"} 0.000134661
go_gc_duration_seconds{quantile="1"} 0.000524014
go_gc_duration_seconds_sum 0.250765764
go_gc_duration_seconds_count 1720
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 8
# HELP go_info Information about the Go environment.
# TYPE go_info gauge
go_info{version="go1.19.1"} 1
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
# TYPE go_memstats_alloc_bytes gauge
go_memstats_alloc_bytes 2.153176e+06
...

Pronto, você já está expondo as métricas do seu servidor Linux para que uma instância do Prometheus possa ler e armazenar em seu banco de dados.

Ative o serviço do node exporter para que sempre que o servidor reiniciar, o serviço seja iniciado automaticamente:

sudo systemctl enable node_exporter

Agora para seguir a diante, iremos usar a stack que criamos na parte 1 dessa séria, se você ainda não viu, recomendo dar uma olhada aqui nesse link para que você possa acompanhar sem grandes dúvidas as alterações necessárias no arquivo de configuração do Prometheus.

Configurando o Prometheus para "raspar" as métricas

Já estamos com o nosso servidor expondo as métricas na porta 9100, o que precisamos agora é configurar o Prometheus para que ele raspe esse servidor e colete suas métricas.

Para isso, abra o arquivo prometheus/prometheus.yaml. O arquivo contém esse conteúdo atualmente:

global:
  scrape_interval: 15s  # Por padrão, o alvo será 'raspado' a cada 15 segundos

scrape_configs:

  - job_name: 'prometheus'

    # Esse valor irá sobreescrever o valor padrão global para esse alvo
    scrape_interval: 5s

    metrics_path: /metrics # Endpoint padrão para a raspagem das métricas
    static_configs:
      - targets: ['localhost:9090']

Adicione a seguinte entrada:

global:
  scrape_interval: 15s  # Por padrão, o alvo será 'raspado' a cada 15 segundos

scrape_configs:

  - job_name: 'prometheus'

    # Esse valor irá sobreescrever o valor padrão global para esse alvo
    scrape_interval: 5s

    metrics_path: /metrics # Endpoint padrão para a raspagem das métricas
    static_configs:
      - targets: ['localhost:9090']

  # Nova entrada adicionada
  - job_name: 'node_exporter'
    scrape_interval: 5s
      - targets: ['IP-SEU-SERVIDOR:9100'] # <-- Insira o IP público do servidor
        labels:
          alias: webserver

Como visto acima, foi adicionado um novo JOB chamado de node_exporter, esse nome é sugestivo ao exporter, mas pode ser qualquer coisa.

Após adicionar a entrada de um novo target, reinicie o container docker caso ele esteja em execução ou inicie todos os containers:

docker-compose restart prometheus
# ou
docker-compose up -d

A partir desse momento, sua instância do Prometheus já deve estar recebendo os dados da sua instância Linux, dados esses de CPU, memória RAM, uso de disco, rede entre várias outras métricas.

Dashboard Node Exporter Full

Para visualizar métricas do node exporter, podemos utilizar um dashboard que está disponível no site do Grafana, você pode visualizar acessando esse link https://grafana.com/grafana/dashboards/1860-node-exporter-full.

Para usar esse dashboard, copie esse ID 1860 e no painel do Grafana, acesse o menu Dashboard e Importar. Insira esse ID na caixa de texto e clique em Carregar.

Após a importação, você terá esse belo Dashboard, com métricas de vários recursos da sua máquina. Show de bola!

Dashboard Node Exporter Full - Imagem 1
Dashboard Node Exporter Full - Imagem 1
Dashboard Node Exporter Full - Imagem 2
Dashboard Node Exporter Full - Imagem 2

Download código

Todo o código dessa stack você pode baixar pelo link do Github.

Conclusão

Nesse artigo fizemos a instalação e configuração do binário do node exporter, que irá expor métricas de CPU, memória RAM, uso de diso, de rede e tantas outras métricas.

Para seu conhecimento, caso você queira usar o node exporter através de uma imagem docker também é possível. Ao invés de baixar, instalar e configurar seu binário, é possível usar o docker para executar o exporter e expor a métricas da sua máquina Linux. Veja mais nesse link.

Ao usar o docker, se atente ao arquivo de configuração prometheus.yaml, pois deverá ajustar o target para que acesse o endpoint do container docker.

Espero que tenha ajudado até aqui.

Se você encontrar algum erro, sugestões de melhorias ou se tiver alguma dúvida, deixe seu comentário abaixo.

Até a próxima.