Начинаем серию про LGTM-стек (Loki, Grafana, Tempo, Mimir + Prometheus/Alloy) — с самого низа, откуда берутся метрики хоста. node_exporter — демон, который читает /proc и /sys и отдаёт их в формате Prometheus на :9100/metrics. Сам по себе не хранит историю и ничего не агрегирует — просто снимок текущего состояния по HTTP.

Запуск бинарником — минимум:

node_exporter --web.listen-address=":9100"

По умолчанию включена только часть коллекторов (cpu, diskstats, filesystem, loadavg, meminfo, netdev и т.п.) — тяжёлые или специфичные включаются явно. Два самых полезных для практики:

Юниты systemd — не включён по умолчанию:

node_exporter --collector.systemd

Даёт node_systemd_unit_state{name="postgresql.service", state="active"} — можно алертить на state != "active" для конкретных юнитов, не городя отдельный чек в Zabbix/Nagios.

Кастомные метрики без своего экспортера — textfile collector:

node_exporter --collector.textfile.directory=/var/lib/node_exporter/textfile_collector

В указанную директорию кладутся файлы *.prom — обычный текст в формате Prometheus exposition, ничего специального:

# HELP backup_age_seconds Время с последнего успешного бэкапа, секунды
# TYPE backup_age_seconds gauge
backup_age_seconds 3600

HELP/TYPE — опциональные строки-комментарии, обязательна только последняя: имя метрики и число через пробел. Файл с таким содержимым можно положить откуда угодно — cron, systemd timer, любой скрипт — node_exporter просто читает директорию при каждом скрейпе. Важно только писать не напрямую в *.prom, а во временный файл и переименовывать (mv) поверх — иначе Prometheus может прочитать файл в момент записи, наполовину пустым.

Отключить ненужное — так же явно, --no-collector.<имя>:

node_exporter --no-collector.wifi --no-collector.hwmon

Запуск как unit systemd:

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

[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter \
  --collector.systemd \
  --collector.textfile.directory=/var/lib/node_exporter/textfile_collector
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true

[Install]
WantedBy=multi-user.target

ProtectSystem=strict/ProtectHome=true — экспортер только читает /proc, /sys и свою textfile-директорию, писать ему больше некуда не нужно.

#prometheus #monitoring #lgtm