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-коллектор закроет собственные задачи без написания отдельного сервиса, а алерты стоит включать только после того, как вы посмотрели на реальные графики.