Node Exporter — небольшой агент, который отдаёт метрики ядра, процессора, памяти, дисков, сети и systemd в формате, понятном Prometheus. Он не хранит данные и не строит графики: его задача — по запросу /metrics вернуть актуальные счётчики. В 2026 году это по-прежнему стандартный способ собрать метрики с Linux-хоста, если не нужен полноценный агент вроде Zabbix или Netdata.

Что и как отдаёт агент

По умолчанию Node Exporter слушает порт 9100 и публикует сотни метрик с префиксом node_. Счётчики накапливаются, поэтому в запросах их приводят к скорости через rate(). Состояния и размеры — это gauge, их можно сравнивать напрямую. Агент не требует root для большинства коллекторов, но некоторые данные зависят от прав и настроек ядра.

curl -fsS http://127.0.0.1:9100/metrics | head
curl -fsS http://127.0.0.1:9100/metrics | grep '^node_' | wc -l
curl -fsS http://127.0.0.1:9100/metrics | grep node_exporter_build_info
ss -lntp | grep 9100

Установка и отдельный пользователь

Возьмите официальный архив с GitHub Releases, сверьте контрольную сумму и распакуйте. Не запускайте агент от root без необходимости: для чтения /proc и /sys достаточно обычного пользователя. Если вы используете пакет из репозитория дистрибутива, проверьте, какой юнит и какие аргументы он создаёт.

VER=$(curl -fsSL https://api.github.com/repos/prometheus/node_exporter/releases/latest | sed -n 's/.*"tag_name": "v\([^"]*\)".*/\1/p')
curl -LO "https://github.com/prometheus/node_exporter/releases/download/v${VER}/node_exporter-${VER}.linux-amd64.tar.gz"
curl -LO "https://github.com/prometheus/node_exporter/releases/download/v${VER}/sha256sums.txt"
sha256sum -c --ignore-missing sha256sums.txt
tar xzf "node_exporter-${VER}.linux-amd64.tar.gz"
sudo install -m 0755 "node_exporter-${VER}.linux-amd64/node_exporter" /usr/local/bin/

Создайте системного пользователя и каталог для textfile-метрик. Права должны позволять агенту читать файлы, но не давать возможности писать туда посторонним.

sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin node_exporter
sudo install -d -o root -g root -m 0755 /var/lib/node_exporter/textfile
id node_exporter
/usr/local/bin/node_exporter --version

Юнит systemd с ограничениями

Сохраните юнит в /etc/systemd/system/node_exporter.service. Агент должен перезапускаться при сбое и иметь доступ только к тому, что ему нужно. ProtectSystem=strict делает файловую систему только для чтения, ProtectHome скрывает домашние каталоги, а NoNewPrivileges запрещает повышение прав через setuid.

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

[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter \
  --web.listen-address=127.0.0.1:9100 \
  --collector.textfile.directory=/var/lib/node_exporter/textfile
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
CapabilityBoundingSet=
SystemCallArchitectures=native
SystemCallFilter=@system-service

[Install]
WantedBy=multi-user.target

Если нужен коллектор systemd, добавьте --collector.systemd и убедитесь, что пользователь может обращаться к systemd. На некоторых системах для этого требуются дополнительные права или запуск от root; проверяйте по логам, а не по предположениям. Коллектор процессов --collector.processes полезен, но на машине с тысячами процессов заметно увеличивает размер выдачи.

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
systemctl status node_exporter --no-pager
journalctl -u node_exporter -n 30 --no-pager

Подключение к Prometheus

Добавьте job в prometheus.yml. Если Prometheus работает на другом хосте, привязка к 127.0.0.1 не подойдёт: агент нужно слушать на приватном адресе и закрывать доступ файрволом. Не выставляйте 9100 в интернет — метрики раскрывают версии ядра, диски и сетевую конфигурацию.

scrape_configs:
  - job_name: node
    scrape_interval: 15s
    static_configs:
      - targets: ['10.0.0.10:9100']

После правки проверьте конфигурацию утилитой promtool и перезагрузите Prometheus. В интерфейсе Status → Targets цель должна быть в состоянии UP; если up == 0, смотрите ошибку scrape и сетевую доступность.

promtool check config /etc/prometheus/prometheus.yml
curl -fsS http://10.0.0.10:9100/metrics | head
systemctl reload prometheus
curl -fsS http://127.0.0.1:9090/-/ready

Защита эндпоинта

Даже во внутренней сети лучше включить TLS и basic auth. Node Exporter использует exporter-toolkit: хеши паролей и сертификаты задаются в отдельном YAML-файле, путь к которому передаётся через --web.config.file. Хеш удобно получить через htpasswd из пакета apache2-utils.

htpasswd -nBC 12 prometheus
# результат вставьте в web.yml
tls_server_config:
  cert_file: /etc/node_exporter/server.crt
  key_file: /etc/node_exporter/server.key
basic_auth_users:
  prometheus: $2y$12$...

Берите часть после двоеточия: имя пользователя уже указано в YAML отдельно. В Prometheus для такой цели нужны scheme: https, basic_auth и, если сертификат выпущен внутренним CA, tls_config.ca_file. Для самоподписанного сертификата не отключайте проверку без крайней необходимости.

Полезные метрики и запросы

Начните с четырёх сигналов: загрузка CPU, доступная память, заполнение корня и ошибки сети. Этих запросов достаточно для базового дашборда и алертов.

100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
(1 - node_filesystem_avail_bytes{mountpoint="/",fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{mountpoint="/",fstype!~"tmpfs|overlay"}) * 100
rate(node_network_receive_errs_total[5m])

Для прогноза заполнения диска используйте predict_linear(). Для проверки systemd — node_systemd_unit_state{state="failed"} == 1, если коллектор включён. Не стройте алерты на сырых счётчиках: они всегда растут и дадут ложные срабатывания.

predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 4*24*3600) < 0
node_filesystem_readonly == 1
node_timex_offset_seconds > 1
node_load1 / count by(instance, job) (node_cpu_seconds_total{mode="idle"})

Textfile-коллектор для своих задач

Если нужно отдать результат бэкапа, температуру или статус самописного скрипта, не пишите свой exporter. Положите файл с расширением .prom в каталог textfile. Агент читает его при каждом scrape. Записывайте во временный файл и переименовывайте атомарно, чтобы не отдать половину строки.

printf 'backup_last_success_timestamp_seconds %s\n' "$(date +%s)" > /var/lib/node_exporter/textfile/backup.prom.tmp
mv /var/lib/node_exporter/textfile/backup.prom.tmp /var/lib/node_exporter/textfile/backup.prom
curl -fsS http://127.0.0.1:9100/metrics | grep backup_last_success
sudo -u node_exporter test -r /var/lib/node_exporter/textfile/backup.prom

Следите за форматом: имя метрики, значение и необязательные метки в фигурных скобках. Файлы с другим расширением игнорируются, поэтому .tmp безопасен. Ошибки парсинга видны в логах агента и в метрике node_textfile_scrape_error.

Алерты и диагностика

Минимальный набор правил — недоступность цели, переполнение диска, read-only файловая система и падение службы. Правило недоступности должно иметь задержку, иначе кратковременный network blip поднимет тревогу.

- alert: NodeDown
  expr: up{job="node"} == 0
  for: 2m
- alert: NodeFilesystemAlmostFull
  expr: node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} < 0.10
  for: 15m

Если цель не поднимается, проверьте три вещи: слушает ли агент нужный адрес, открыт ли порт в файрволе и совпадает ли время на хостах. Ошибка context deadline exceeded чаще всего означает сеть или TLS, а permission denied — неверные права на сертификат или textfile-каталог.

  • Держите агент на отдельном пользователе и не давайте лишних capabilities.
  • Не публикуйте порт 9100 в интернет, даже с basic auth.
  • Проверяйте node_textfile_scrape_error после изменения скриптов.
  • Обновляйте exporter вместе с Prometheus и сверяйте метрики после обновления.

Итог

Node Exporter остаётся простым и предсказуемым источником метрик Linux. Поставьте его отдельным пользователем, закройте эндпоинт, подключите к Prometheus и начните с четырёх базовых сигналов. Textfile-коллектор закроет собственные задачи без написания отдельного сервиса, а алерты стоит включать только после того, как вы посмотрели на реальные графики.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте