...

Configurar corretamente o Node Exporter: Guia prático para a monitorização de servidores Linux com o Prometheus

Configurar corretamente o Node Exporter significa: configuro o serviço de forma a que o Prometheus recolha métricas fiáveis dos servidores Linux, com portas bem definidas, definições específicas do Collector e uma segurança adequada. Neste guia prático, mostro a instalação, a configuração do systemd, o ajuste do Collector, a segurança, a integração com o Prometheus, dicas de desempenho e verificações úteis para o dia a dia.

Pontos centrais

  • Instalação e arranque do serviço com a sua própria unidade systemd
  • Colecionador escolher de forma seletiva, reduzir a carga métrica
  • Segurança através da abertura de portas e do proxy
  • Prometeu Scrapes, alertas e arquivo
  • Desempenho através de intervalos, sharding e limpeza

O que é o Node Exporter?

Eu coloquei o Instale o Exporter em qualquer servidor Linux para disponibilizar métricas do sistema no formato Prometheus. O daemon fornece dados sobre a carga da CPU, a carga do sistema, a memória, o espaço de troca, os sistemas de ficheiros, a rede e, opcionalmente, dados do systemd e dos processos. Acedo ao ponto final através de HTTP /métricas e vejo séries temporais legíveis que o Prometheus recolhe ciclicamente. Esta abordagem adapta-se a frotas de servidores heterogéneas e mantém-se transparente graças ao modelo «pull». Beneficio de uma separação clara: o exportador recolhe, o Prometheus armazena e analisa.

Visão geral da arquitetura: como o Node Exporter e o Prometheus interagem

Inicio o Exporter na porta 9100, controlo o Collector e faço com que o Prometheus faça o scraping periodicamente. O princípio «pull» facilita a gestão das firewalls, porque só abro o acesso do Prometheus ao anfitrião. O Grafana ou soluções de visualização semelhantes baseiam-se, em seguida, no Prometheus e apresentam os valores de forma clara. Em ambientes de produção, utilizo vários servidores Prometheus para responsabilidades distintas. Desta forma, mantenho os percursos curtos, as funções claras e a gestão transparente.

Instalação no Linux: simples e repetível

Estou a descarregar o ficheiro binário adequado para linux-amd64 ou a arquitetura de destino e defina-a conforme /usr/local/bin/. Em seguida, configuro um utilizador do sistema sem nome de utilizador, por exemplo node_exporter, e defino os direitos de propriedade do ficheiro binário. Para o arranque automático, crio uma unidade systemd no diretório /etc/systemd/system/ com um simples ExecStart e uma política de reinício. De acordo com systemctl daemon-reload Ativo e inicio o serviço, verifico o estado e acedo a curl http://localhost:9100/metrics . Assim, consigo verificar imediatamente se as métricas estão corretamente disponíveis e se o serviço está a funcionar conforme previsto.

O Node Exporter como serviço do systemd: os parâmetros essenciais

Defino na unidade Utilizador e «Group» como conta dedicada, defina Tipo=simples e um ExecStart definido. Uma estratégia de reinício como Reiniciar=em caso de falha ajuda a evitar falhas de última hora. Para as atualizações, edito a unidade ou crio um ficheiro «drop-in», para que as alterações permaneçam rastreáveis. Após cada ajuste, executo um daemon-reload e reinicia o serviço. Procuro manter a unidade compacta, documentada e reutilizável para todas as classes de servidor.

Porta e endereço de lista: consistentes e seguros

Por predefinição, estou a ouvir na porta 9100, mas altere a porta consoante o projeto, caso haja conflitos. A opção --web.listen-address permite ajustar o host e a porta, por exemplo 127.0.0.1:9200 no caso de descarregamento local do proxy. Um esquema de portas uniformizado reduz a confusão em equipas de grande dimensão. Registo as alterações nas portas de forma centralizada, para que as firewalls e as listas de segurança estejam corretas. A porta permanece restrita aos servidores Prometheus e não tem acesso livre à Internet.

Configurar o Collector de forma específica: apenas o que realmente importa

Eu escolho o Colecionador de forma consciente, para controlar o volume de dados e o tempo de processamento. Os módulos padrão para a CPU, a memória, os sistemas de ficheiros e a rede permanecem, na maioria das vezes, ativos. Se necessário, ativo módulos específicos, tais como --collector.systemd ou --collector.processes, para monitorizar os serviços e os processos com maior precisão. Desativo os módulos indesejados com --no-collector.X, para que o Prometheus tenha de processar menos séries temporais. Registo a seleção efetuada por função do servidor, para que a equipa mantenha a coerência.

Textfile Collector: introduzir métricas próprias de forma organizada

Utilizo o Textfile Collector para individual Indicadores que os módulos padrão não fornecem. Um diretório como /var/lib/node_exporter/textfile_collector reúne .promFicheiros no formato Prometheus. Os scripts escrevem de forma atómica, criando ficheiros temporários e substituindo-os no final, para que não apareçam valores incompletos. É assim que introduzo estatísticas de negócio, o estado dos lotes ou os comprimentos das filas diretamente no Prometheus. Respeito as convenções de nomenclatura para tornar as análises e os painéis de controlo legíveis.

Segurança em ambiente de produção: acesso reservado apenas a pessoas autorizadas

Limito o acesso às portas através de Firewall de forma consistente nas fontes de scraping. Um proxy reverso a montante trata, se necessário, do TLS ou mTLS e encarrega-se da autenticação. Deixo o serviço a funcionar sem direitos de root e atribuo direitos mínimos aos ficheiros para os percursos dos ficheiros de registo e de texto. Em redes separadas, aplico medidas de segurança adicionais através de VPN ou sub-redes privadas. Desta forma, as informações detalhadas do sistema permanecem protegidas e visíveis apenas para a infraestrutura de monitorização.

Integração no Prometheus: scrapes, rótulos, alertas

Coloco na prometheus.yml um emprego como nome_da_função: node , insira um valor adequado scrape_interval (geralmente 15 s) e introduzo alvos ou a descoberta de serviços. Etiquetas padronizadas (por exemplo, ambiente, função, localização) facilitam a filtragem e a criação de painéis. Para análises frequentes, defino regras de registo, aliviando assim a carga das consultas ad hoc. Os alertas baseiam-se em métricas agregadas, como a carga da CPU, a RAM, o swap, a ocupação do disco e os erros de rede. Para uma introdução à utilização e aos picos de carga, remeto para o meu guia conciso Análise da CPU e da carga, que explica os indicadores típicos de forma prática.

Monitorização do próprio Node Exporter: confiar é bom, mas controlar é melhor

Estou a observar o Estado do trabalho no Prometheus e configuro alertas para serem acionados caso um host não seja monitorizado durante um período prolongado. Verifico regularmente as versões dos exportadores para poder utilizar atempadamente as correções de erros e os novos módulos. Além disso, medo o número de séries temporais por anfitrião, para detetar atempadamente se uma alteração no coletor está a aumentar a carga. Os painéis de controlo recebem notificações sobre a última recolha bem-sucedida. Desta forma, deteto rapidamente as falhas e reajo sem demora.

Otimização do desempenho e escalabilidade: manter a carga sob controlo

Eu controlo o Intervalos de acordo com a dimensão e a finalidade do ambiente: 15 s para sistemas centrais, 30–60 s para servidores menos críticos. Através da seleção seletiva de coletores, reduzo as métricas e os tempos de consulta. Mantenho as minhas próprias métricas em ficheiros de texto simplificadas, elimino as antigas e atribuo nomes de forma consistente. Se a frota crescer significativamente, distribuo a carga por várias instâncias do Prometheus e separo as responsabilidades. A tabela seguinte apresenta parâmetros comprovados e o seu impacto na operação.

Tópico Definição Efeito Nota
Intervalo de scraping 15 s / 30 s / 60 s Menos arranhões reduzem Carga Ter em conta o nível de criticidade por classe de anfitrião
Seleção Collector apenas os módulos necessários Reduz as séries temporais Documentar a lista por função
Recolhedor de ficheiros de texto ficheiros .prom compactos Menos custos de análise sintática Escrever de forma concisa, nomear com clareza
Cardinalidade das etiquetas Verificar as etiquetas Impede Explosão das séries Evitar IDs e valores altamente variáveis
Fragmentação Dividir o Prometeu Escalar scrapes e consultas Separar as responsabilidades

No que diz respeito aos sistemas de armazenamento, presto especial atenção aos valores de E/S e às latências por dispositivo, bem como ao sistema de ficheiros. O meu guia constitui um bom ponto de partida Monitorizar as latências do disco, que resume as cadeias de sintomas e métricas típicas. Associo estes valores ao tempo de espera e à carga da CPU para identificar com precisão os pontos de estrangulamento. Encapsulo as consultas em «Regras de Gravação» para que os painéis de controlo carreguem rapidamente. Desta forma, a análise e a operação mantêm-se ágeis e claras.

Visualização com o Grafana: ver com clareza, agir rapidamente

Utilizo painéis de controlo pré-definidos para CPU, RAM, disco, rede e systemd, mas adapto-os às minhas etiquetas. Um painel de visão geral apresenta o estado, a carga e os hosts que se destacam, enquanto as páginas de detalhes aprofundam a análise. Descrevo brevemente os painéis para que todos compreendam o significado dos indicadores. Os seletores de variáveis aceleram a alternância entre hosts ou funções. Quem pretender obter uma visão geral completa, encontrará em Pilha de monitorização com o Grafana Orientações para a montagem de uma pilha de alto desempenho.

Organização clara dos pacotes e gestão de versões: manter a reprodutibilidade

Asseguro a reprodutibilidade das instalações fixando explicitamente as versões e verificando as somas de verificação. Para configurações Fleet, empacoto o Node Exporter como um pacote interno (por exemplo, DEB/RPM) com uma estrutura de caminhos fixa e um utilizador do sistema. Implemento as atualizações de forma escalonada e documento a versão utilizada em cada ambiente. Sempre que possível, guardo os parâmetros de arranque num ficheiro EnvironmentFile, para que as alterações não sejam feitas diretamente no ficheiro da unidade e continuem a ser devidamente controladas em termos de versões. Só testo as novas versões no ambiente de teste antes de as distribuir generalizadamente.

Configuração de exemplo: unidade systemd e reforço de segurança

Utilizo uma unidade simples, mas fiável, e, se necessário, complemento com definições de endurecimento:

[Unit]
Description=Prometheus Node Exporter
After=network-online.target
Wants=network-online.target

[Service]
Utilizador=node_exporter
Grupo=node_exporter
ExecStart=/usr/local/bin/node_exporter \
  --web.listen-address=0.0.0.0:9100 \
  --collector.systemd \
  --collector.processes \
  --collector.filesystem.fs-types-exclude='^(tmpfs|devtmpfs|overlay|squashfs)$' \
  --collector.filesystem.mount-points-exclude='^/(sys|proc|dev|run)($|/)'
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

No caso de hosts produtivos, reforço ainda mais a segurança do serviço, sem alterar os seus direitos de leitura para /proc e /sys partir. Vou definir isto como um «drop-in» (/etc/systemd/system/node_exporter.service.d/hardening.conf) para:

[Service]
NoNewPrivileges=true
PrivateTmp=true
PrivateDevices=true
ProtectSystem=strict
ProtectHome=true
ProtectControlGroups=true
ProtectKernelTunables=true
ProtectKernelModules=true
LockPersonality=true
MemoryDenyWriteExecute=true
CapabilityBoundingSet=
AmbientCapabilities=
RestrictNamespaces=true
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
SystemCallFilter=@system-service

Após cada alteração: systemctl daemon-reload e um reinício limpo. Para fins de depuração, ativo temporariamente um nível de registo mais elevado através de --log.level=debug, para ver os detalhes do coletor e do analisador.

Aperfeiçoamento do Collector para ambientes clínicos

Equilibro a visibilidade e a carga com filtros específicos:

  • Sistemas de ficheiros: Excluo os pseudo-sistemas de ficheiros e as montagens temporárias (--collector.filesystem.fs-types-exclude e --collector.filesystem.mount-points-exclude), para evitar séries sem sentido.
  • Processos: --collector.processes fornece somas úteis, mas gera séries adicionais. Só o ativo em hosts onde o número de processos fornece um sinal (por exemplo, nós de lote ou de trabalho).
  • Rede: O netstat- O Collector pode gerar muitas etiquetas, dependendo do kernel e das ligações. Verifico a cardinalidade no Staging e, caso contrário, desativo-o de forma seletiva.
  • Pressão/PSI: Os kernels modernos fornecem métricas de pressão (--pressão do coletor, frequentemente ativo por predefinição). Utilizo-o para detetar atempadamente pontos de estrangulamento na CPU, nas E/S e na memória.
  • NVMe/RAID: Coletores específicos (por exemplo,. nvme) Só ativo essa funcionalidade nos locais onde o hardware está disponível – assim, os painéis de controlo continuam a ser relevantes.

Testo os coletores de forma seletiva através do parâmetro de consulta collect[], sem alterar os parâmetros de arranque. Um exemplo: curl 'http://localhost:9100/metrics?collect[]=systemd&collect[]=processes'. Assim, vejo imediatamente qual é a influência de cada Collector.

Textfile Collector: Melhores práticas da operação

Escrevo métricas de forma atómica: os scripts são criados primeiro .tmp-ficheiros e substituí-los no final por mv. Cada ficheiro contém apenas um grupo lógico e tem, no máximo, alguns kilobytes. Deixo a gestão dos carimbos de data e hora a cargo do Prometheus; os próprios ficheiros não precisam de carimbos de data e hora. Se eu eliminar um .prom-ficheiro, as séries associadas desaparecem após a próxima recolha de dados. Documento os espaços de nomes (por exemplo,. business_*) e mantenho os valores dos rótulos estáveis para controlar a cardinalidade. Nos casos em que os valores oscilam muito, suavizo-os já nos scripts (por exemplo, calculando a média), para que os painéis funcionem de forma mais estável.

Segurança: variantes de firewall e proxy

A minha prioridade é a segmentação da rede: o exportador só está à escuta internamente e a firewall só permite o acesso aos IPs do Prometheus. Um exemplo com nftables num servidor:

table inet filter {
  chain input {
    type filter hook input priority 0;
    ct state established,related accept
    iif lo accept
    tcp dport 9100 ip saddr { 10.0.0.10, 10.0.0.11 } accept
    tcp dport 9100 drop
  }
}

Sempre que for necessária encriptação, coloco um proxy reverso local à frente, que gere o TLS ou o mTLS e apenas para 127.0.0.1:9100 reencaminha. Em alternativa, utilizo — desde que a versão o suporte — a configuração Web nativa do exportador através de um --ficheiro.config.web, para que a autenticação e os certificados continuem a ser geridos de forma centralizada. Por princípio, o serviço é executado sem privilégios, com direitos mínimos sobre o seu diretório e apenas com permissão de escrita onde for realmente necessário (por exemplo, no caminho do ficheiro de texto).

Integração com o Prometheus em pormenor: reclassificação, limites, alertas

Mantenho as tarefas simples e uniformes. Uma tarefa prática, com limites e atualização de etiquetas, tem o seguinte aspeto:

scrape_configs:
- job_name: node
  scrape_interval: 30s
  scrape_timeout: 10s
  sample_limit: 10000
  static_configs:
  - targets: ['host1:9100','host2:9100']
    labels:
 env: prod
 role: web
  relabel_configs:
  - source_labels: [__address__]
    target_label: instance
    regex: '([^:]+)(?::\d+)?'
    substituição: '$1'
  configurações_de_re-etiquetagem_métrica:
  - etiquetas_de_origem: [device]
    expressão regular: '^(ram|loop|zram|dm-).*'
    ação: eliminar

Com metric_relabel_configs Atenuo a cardinalidade descartando dispositivos com pouca relevância. Para os alarmes, utilizo regras simples, mas robustas:

grupos:
- nome: node_basic
  regras:
  - alerta: NodeDown
    expressão: up{job="node"} == 0
    intervalo: 5m
    rótulos: {gravidade: crítico}
  - alerta: HighCPU
    expressão: 1 - média por (instância) (taxa(node_cpu_seconds_total{modo="inativo"}[5m])) > 0,9
    durante: 10m
    rótulos: {gravidade: aviso}

Para monitorizar a carga, utilizo scrape_duration_seconds e amostras_raspadas_raspadas por alvo. É assim que consigo perceber se um coletor adicional ativado aumenta de forma desproporcionada o tempo de recolha ou o número de série.

Funcionamento em contentores e Kubernetes

Configurei o Node Exporter em contentores próximos do anfitrião, para que /proc e /sys permanecerem visíveis a partir do anfitrião. Para tal, monto esses caminhos em modo de leitura no contentor e utilizo hostNetwork para portas consistentes. No Kubernetes, executo o exportador como um DaemonSet por nó e mantenho os contextos de segurança restritivos (sem privilégios desnecessários). Tenho em conta os ambientes Cgroup-v2 na escolha do coletor; coletores importantes como meminfo, pressão, sistema de ficheiros e CPU continuam a ser a base. Verifico após as implementações com um enrolar verificar no Pod se os percursos de métricas do anfitrião esperados estão realmente a ser lidos.

Resolução de problemas e garantia de qualidade

  • Conectividade: Estou a verificar curl -s http://localhost:9100/metrics | head no servidor de destino e, do ponto de vista do Prometheus, a acessibilidade através da porta aberta.
  • Teste de colecionadores: Sobre collect[] testei cada coletor individualmente, sem alterar a configuração global.
  • Registos: Vou aumentar temporariamente o nível de registo (--log.level=debug), para resolver erros de análise sintática ou problemas de direitos de acesso em /proc//sys visível.
  • Controlo de versões: Com node_exporter_build_info Comparo versões e planeio atualizações de forma específica.
  • Séries em destaque: A métrica scrape_samples_scraped{job="node"} Utilizo-o como uma estimativa do número de séries por anfitrião. Um aumento repentino indica novos coletores ou uma explosão de etiquetas.
  • Intervalos: Eu acho que scrape_timeout abaixo de scrape_interval e observo scrape_timeout_seconds, para detetar atolamentos atempadamente.

Capacidade e arrumação: planear em vez de ser apanhado de surpresa

Configurei a retenção de dados no Prometheus de acordo com o caso de utilização: intervalos curtos para sistemas essenciais e retenção mais longa para tendências. À medida que a frota cresce, escalo horizontalmente através do sharding (por exemplo, por localização ou equipa) e separo a carga de consultas da carga de ingestão. Se necessário, gravo métricas adicionalmente num componente de longo prazo através de «Remote-Write». Acompanho ativamente a cardinalidade e elimino de forma consistente métricas ou etiquetas não utilizadas — especialmente no caso de métricas em ficheiros de texto, que podem crescer rapidamente.

Dicas práticas para frotas heterogéneas

  • Hosts exclusivamente IPv6: Estou a ouvir [::]:9100 e certifica-te de que as regras da firewall estão corretas.
  • Hardware específico: Só ativo os coletores específicos de hardware nos casos em que fazem sentido e documento as diferenças nos perfis de funções.
  • Atualizações progressivas: estou a atualizar em lotes e, ao mesmo tempo, vou acompanhando para cima, scrape_duration_seconds e amostras_raspadas_raspadas, para detetar imediatamente as regressões.
  • Documentação: Registo os parâmetros de arranque efetivos para cada função. Isto evita discussões e facilita a análise de erros.

Em resumo: o meu horário das consultas

Vou instalar o Exporto como um serviço systemd independente, defino a porta e o endereço de escuta e controlo rigorosamente o acesso. Escolho deliberadamente o coletor, preencho os valores necessários através do coletor de ficheiros de texto e mantenho o número de métricas reduzido. No Prometheus, defino intervalos adequados, mantenho as etiquetas, defino regras de registo e alarmes para a CPU, a RAM, os discos e a rede. Eu próprio supervisiono o exportador, planeio atualizações e verifico regularmente o número de séries por anfitrião. Com uma visualização clara, reajo mais rapidamente, identifico tendências precocemente e mantenho o meu monitorização de servidores Linux robusta no dia a dia.

Artigos actuais