Проверить экспортёр на самой машине
active, строка LISTEN и значение node_load1 — экспортёр в
порядке. Дальше смотри, собирает ли его Prometheus:
prometheus.
Экспортёр Prometheus для самой машины: отдаёт по HTTP на :9100 метрики процессора, памяти, дисков, сети и служб.
sudo systemctl enable --now prometheus-node-exporter
включить
systemctl status prometheus-node-exporter
жива ли служба
ss -tlnp | grep 9100
где слушает
curl -s localhost:9100/metrics | less
всё, что отдаёт
curl -s localhost:9100/metrics | grep -c '^node_'
число значений
curl -s localhost:9100/metrics | grep MemAvailable
одна метрика
curl -s localhost:9100/metrics | promtool check metrics
формат
sudo systemctl restart prometheus-node-exporter
после правки ARGS
node_exporter — экспортёр Prometheus для самой машины.
Он читает /proc, /sys и состояние systemd и отдаёт по HTTP на
порту 9100, путь /metrics, текущие значения: процессор, память,
диски, файловые системы, сеть, нагрузку, состояние служб. Сам он
ничего не хранит и никуда не отправляет: Prometheus приходит за
метриками по расписанию (prometheus).
В Ubuntu это пакет prometheus-node-exporter: служба с тем же
именем, программа /usr/bin/prometheus-node-exporter, пользователь
prometheus. На учебной машине пакет стоит, служба выключена:
Экспортёр готов отвечать через секунду-две после запуска.
Ответ /metrics — текст. У каждой метрики две строки-комментария и
строки значений:
Первая строка в выводе одна, здесь она перенесена.
| Строка | Что в ней |
|---|---|
# HELP имя текст |
что измеряет метрика |
# TYPE имя тип |
counter, gauge, histogram, summary или untyped |
имя{метки} значение |
одно значение: ряд со своим набором меток |
Значение — число с плавающей точкой, часто в экспоненциальной записи:
2.95616512e+08 — 295 616 512 байт, около 282 МиБ. У метрик с
метками строк значений несколько:
Имя говорит о единицах: _bytes, _seconds; _total — счётчик
(promql). Префикс node_ — метрики машины, go_
и process_ — самого экспортёра. На учебной машине ответ — около
1900 строк: примерно 270 метрик и 1300 значений node_*.
| Метрика | Что значит |
|---|---|
node_cpu_seconds_total |
секунды процессора с загрузки по ядрам (cpu) и режимам (mode: idle, user, system, iowait…) |
node_load1, node_load5, node_load15 |
средняя нагрузка за 1, 5 и 15 минут |
node_memory_MemAvailable_bytes |
память, которую можно занять без вытеснения; рядом MemTotal, MemFree и другие поля /proc/meminfo |
node_filesystem_avail_bytes |
свободно на файловой системе для обычных пользователей, как столбец Avail у df |
node_filesystem_size_bytes |
размер файловой системы |
node_disk_read_bytes_total, node_disk_written_bytes_total |
прочитано и записано на диск (device) |
node_network_receive_bytes_total, node_network_transmit_bytes_total |
принято и отправлено через интерфейс (device) |
node_systemd_unit_state |
1 у текущего состояния юнита (name, state), 0 у остальных |
node_boot_time_seconds |
время загрузки в unix-секундах |
node_uname_info |
версия ядра и имя машины в метках, значение 1 |
Сколько памяти можно занять — MemAvailable. MemFree — память, не
занятая ничем; кэш файлов в неё не входит, хотя ядро отдаёт его по
первому требованию. На учебной машине MemFree — около 13 МиБ,
MemAvailable — около 280. Про нагрузку и память
подробнее — load-average и memory-swap.
Коллектор — часть экспортёра, которая читает один источник:
meminfo — /proc/meminfo, filesystem — смонтированные файловые
системы, netdev — интерфейсы, systemd — юниты, textfile —
файлы со своими метриками. На учебной машине включено больше
сорока. Какие и удался ли последний сбор — метрика
node_scrape_collector_success:
0 у коллектора значит, что источник прочитать не удалось; причина —
в журнале службы. Включить или выключить коллектор — ключи
--collector.<имя> и --no-collector.<имя> (см. «Конфигурация»).
Коллектор filesystem отдаёт node_filesystem_* не для всех точек
монтирования. Пропускает он то, что подходит под
--collector.filesystem.mount-points-exclude, на учебной машине по
умолчанию:
Выражение здесь перенесено. Том, смонтированный в /mnt/… или
/media/…, в метрики не попадает вовсе: рядов для него нет, и правило
с его mountpoint пусто (node-exporter). Типы
файловых систем отсекает --collector.filesystem.fs-types-exclude
(tmpfs в списке нет, proc, sysfs, overlay, squashfs есть).
Свой список — ключом в ARGS, он заменяет значение по умолчанию.
Коллектор textfile читает файлы *.prom из
/var/lib/prometheus/node-exporter при каждом запросе к /metrics и
отдаёт их строки вместе со своими. Так скрипт без своего HTTP-сервера
сообщает Prometheus, например, время последней удачной резервной
копии:
Строки # HELP и # TYPE в файле необязательны: без них экспортёр
пишет свои, тип — untyped. Каталог принадлежит root, писать в него
нужно через sudo.
Настроек в файле у экспортёра нет — только ключи командной строки.
Служба берёт их из переменной ARGS в
/etc/default/prometheus-node-exporter; в пакете она пустая
(ARGS=""), то есть всё по умолчанию:
После правки — sudo systemctl restart prometheus-node-exporter.
reload здесь не годится: см. node-exporter. Все
ключи с описаниями — prometheus-node-exporter --help.
По умолчанию экспортёр слушает порт 9100 на всех адресах машины:
Адрес и порт задаёт ключ --web.listen-address. Его ставят в ARGS
файла /etc/default/prometheus-node-exporter или в дополнении службы
(sudo systemctl edit prometheus-node-exporter → файл
/etc/systemd/system/prometheus-node-exporter.service.d/override.conf,
где строка ExecStart= заменяет команду запуска). Где ключ задан на
самом деле:
systemctl cat prometheus-node-exporter — юнит вместе с
дополнениями, у каждого файла — строка # /путь;systemctl status prometheus-node-exporter — в строке CGroup под
номером процесса видна вся команда с ключами;ss -tlnp | grep prometheus-node — какой порт слушает сейчас.Пароля и шифрования нет: кто достучался до порта, тот видит метрики.
--web.listen-address=127.0.0.1:9100 оставляет доступ только с самой
машины — тогда Prometheus с другой машины получит connection
refused. Если Prometheus живёт на другой машине, экспортёр слушает
её внешний адрес, а порт в firewall открыт только для адреса
Prometheus.
Метрики — только по пути /metrics. На любой другой путь экспортёр
отвечает HTML-страницей с кодом 200, и Prometheus с неверным
metrics_path пишет в lastError expected a valid start token, got
"<" (prometheus).
| Директива | Что делает | Пример |
|---|---|---|
--web.listen-address ARGS |
Адрес и порт, на которых экспортёр ждёт Prometheus; без адреса — все адреса машины. | --web.listen-address=127.0.0.1:9100 |
--web.telemetry-path ARGS |
Путь, по которому отдаются метрики. | --web.telemetry-path=/metrics |
--collector.<имя> ARGS |
Включить коллектор, выключенный по умолчанию. | --collector.processes |
--no-collector.<имя> ARGS |
Выключить коллектор, включённый по умолчанию. | --no-collector.zfs |
--collector.disable-defaults ARGS |
Выключить все коллекторы по умолчанию; нужные включают ключами --collector.<имя>. | --collector.disable-defaults --collector.meminfo |
--collector.textfile.directory ARGS |
Каталог с файлами *.prom, которые экспортёр отдаёт вместе со своими метриками. | --collector.textfile.directory=/var/lib/prometheus/node-exporter |
--collector.netdev.device-exclude ARGS |
Регулярное выражение сетевых интерфейсов, которых нет в node_network_*. | --collector.netdev.device-exclude=^(lo|veth.*)$ |
--collector.filesystem.mount-points-exclude ARGS |
Регулярное выражение точек монтирования, для которых нет node_filesystem_*; /mnt и /media в нём по умолчанию. | --collector.filesystem.mount-points-exclude=^/(dev|proc|run|sys)($|/) |
--collector.systemd.unit-include ARGS |
Регулярное выражение юнитов, состояние которых попадает в node_systemd_unit_state. | --collector.systemd.unit-include=(nginx|ssh)\.service |
Ничего не найдено. Попробуй запрос короче.
active, строка LISTEN и значение node_load1 — экспортёр в
порядке. Дальше смотри, собирает ли его Prometheus:
prometheus.
На node2 включи экспортёр и проверь, что он слушает не только
127.0.0.1. На node1 добавь цель в задание node и перечитай
конфиг:
Через интервал сбора up{instance="node2:9100"} должен стать 1.
Если 0 — lastError цели называет причину (prometheus).
Пиши во временный файл в том же каталоге и переименовывай: mv
подменяет файл целиком, и экспортёр не прочитает его наполовину
записанным.
Скрипт работает от root: каталог принадлежит ему. Файлы без
расширения .prom экспортёр пропускает. Правило «копии нет больше
суток» — time() - backup_last_success_timestamp_seconds > 86400
(promql).
Каждая строка вывода здесь перенесена. Служба не работает —
node_systemd_unit_state{name="nginx.service",state="active"} == 0.
curl localhost:9100/metrics отвечает Failed to connect, а цель в
Prometheus — down с ошибкой:
Порт никто не слушает. Проверь systemctl status
prometheus-node-exporter, потом ss -tlnp | grep prometheus-node:
экспортёр может слушать другой порт или только 127.0.0.1, а
Prometheus идёт на внешний адрес.
Prometheus не дождался ответа за scrape_timeout (10 секунд по
умолчанию). Обычно пакеты молча отбрасывает файрвол на машине с
экспортёром: connection refused пришёл бы сразу. Проверь правила
firewall для порта 9100.
В журнале — Deactivated successfully. Перечитывать экспортёру
нечего: сигнал, который шлёт reload, его завершает. Ключи из
ARGS применяет restart, остановленный экспортёр поднимает
start.
curl -s localhost:9100/metrics | grep node_network_receive пуст, а
rate(node_network_receive_bytes_total[1m]) ничего не возвращает. У
машины с одной ВМ только интерфейс lo, а экспортёр его пропускает:
--collector.netdev.device-exclude по умолчанию ^lo$. На машине с
сетевым интерфейсом ряды есть, по одному на device.
node_filesystem_avail_bytes{mountpoint="/mnt/data"} пуст, хотя df
том видит. Точка подходит под --collector.filesystem.mount-points-exclude
— по умолчанию это /mnt, /media, /run и другие
(node-exporter). Задай в ARGS своё выражение, например
--collector.filesystem.mount-points-exclude=^/(dev|proc|run|sys)($|/),
и перезапусти экспортёр. Какие точки он видит —
curl -s localhost:9100/metrics | grep '^node_filesystem_size_bytes'.
Файл в каталоге textfile не разобран. Какой и почему — в журнале:
Строка значения — это имя, пробел и число: имя 42 или
имя{метка="x"} 42. Остальные файлы каталога экспортёр отдаёт как
обычно.
Метрики рассказывают о машине много: версию ядра, точки монтирования,
список служб, сетевые интерфейсы. Экспортёр на *:9100 без файрвола
на машине с публичным адресом отдаёт это любому. Ограничь доступ
адресом прослушивания или правилом firewall.
top, free,
iostat.enable --now, restart, status.node_load1 и соседи./metrics из терминала.Есть неточность? Сообщить об ошибке в статье