Что такое Netdata и зачем он нужен
Netdata — это агент мониторинга с открытым исходным кодом, который собирает тысячи метрик с серверов, контейнеров и приложений в реальном времени. В отличие от классических решений вроде Zabbix или Nagios, Netdata не требует длительной настройки — достаточно одной команды для установки, и через минуту вы видите красивый дашборд с сотнями графиков.
Ключевые преимущества Netdata:
- Гранулярность 1 секунда — метрики собираются посекундно, что позволяет видеть кратковременные пики нагрузки
- Минимальное потребление ресурсов — агент занимает менее 1% CPU и около 100 МБ RAM
- Автообнаружение — автоматически определяет запущенные сервисы (nginx, MySQL, PostgreSQL, Docker) и начинает собирать метрики
- Более 800 коллекторов — поддержка практически любого сервиса из коробки
- Встроенные алерты — сотни предонастроенных порогов для типичных проблем
Netdata идеально подходит для малых и средних инфраструктур — от одного VPS до десятков серверов. Для крупных инсталляций доступна Netdata Cloud — бесплатная SaaS-платформа для агрегации данных с множества нод.
Архитектура Netdata
Netdata работает по модели «агент на каждом хосте». Агент (netdata daemon) запускается на каждом сервере и собирает метрики локально. Данные хранятся в собственной базе данных — DBENGINE, которая использует кастомный формат хранения с автоматическим сжатием. По умолчанию хранится около 2 дней метрик с секундной гранулярностью и до нескольких недель с агрегацией.
Веб-интерфейс встроен в агент — каждый узел предоставляет дашборд на порту 19999. Для централизованного просмотра можно использовать Netdata Cloud или настроить стриминг метрик на выделенный parent-узел:
# Схема стриминга:
# child-node-1 --stream--> parent-node (хранит все метрики)
# child-node-2 --stream-->
# child-node-3 --stream-->
Установка Netdata на Linux
Netdata поддерживает практически все дистрибутивы Linux. Самый быстрый способ — официальный скрипт-установщик, который автоматически определит вашу ОС и установит все зависимости.
Установка через kickstart-скрипт
Выполните одну команду для установки последней стабильной версии:
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh && \
sh /tmp/netdata-kickstart.sh --stable-channel
Скрипт автоматически выполнит следующее:
- Определит дистрибутив и версию ОС
- Установит необходимые зависимости (gcc, make, zlib, openssl)
- Скомпилирует Netdata из исходников или установит нативный пакет
- Создаст systemd-юнит и запустит сервис
Для установки без подключения к Netdata Cloud (полностью автономный режим):
sh /tmp/netdata-kickstart.sh --stable-channel --dont-start-it
# Отключаем cloud в конфиге
sudo sed -i 's/# enabled = yes/enabled = no/' /etc/netdata/cloud.d/cloud.conf
# Запускаем
sudo systemctl start netdata
sudo systemctl enable netdata
После установки дашборд доступен по адресу http://YOUR_IP:19999. Проверьте статус:
sudo systemctl status netdata
curl -s http://localhost:19999/api/v1/info | jq '.version'
Установка через Docker
Для контейнеризованных окружений удобнее запустить Netdata в Docker:
docker run -d --name=netdata \
--pid=host \
--network=host \
-v netdataconfig:/etc/netdata \
-v netdatalib:/var/lib/netdata \
-v netdatacache:/var/cache/netdata \
-v /etc/passwd:/host/etc/passwd:ro \
-v /etc/group:/host/etc/group:ro \
-v /etc/localtime:/etc/localtime:ro \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /etc/os-release:/host/etc/os-release:ro \
-v /var/log:/host/var/log:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--restart unless-stopped \
--cap-add SYS_PTRACE \
--cap-add SYS_ADMIN \
--security-opt apparmor=unconfined \
netdata/netdata
Флаг --pid=host необходим для мониторинга процессов хостовой ОС. Монтирование /var/run/docker.sock позволяет видеть метрики контейнеров. Аналогичная конфигурация для docker-compose:
version: '3'
services:
netdata:
image: netdata/netdata
container_name: netdata
pid: host
network_mode: host
restart: unless-stopped
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- netdataconfig:/etc/netdata
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
netdataconfig:
netdatalib:
netdatacache:
Настройка сбора метрик и коллекторов
Netdata автоматически обнаруживает и мониторит большинство сервисов, но для некоторых требуется ручная настройка. Конфигурация коллекторов находится в каталоге /etc/netdata/. Основной конфигурационный файл — netdata.conf, а коллекторы настраиваются в go.d/ и python.d/.
Мониторинг Nginx
Для мониторинга Nginx необходимо включить модуль stub_status. Добавьте в конфигурацию Nginx:
server {
listen 127.0.0.1:8080;
server_name _;
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
Затем настройте коллектор Netdata:
sudo nano /etc/netdata/go.d/nginx.conf
jobs:
- name: local
url: http://127.0.0.1:8080/nginx_status
Перезапустите Netdata:
sudo systemctl restart netdata
Теперь на дашборде появится раздел Nginx с графиками активных соединений, запросов в секунду и состояний воркеров.
Мониторинг PostgreSQL
Для PostgreSQL создайте выделенного пользователя с правом чтения статистик:
sudo -u postgres psql -c "
CREATE USER netdata WITH PASSWORD 'monitoring_pass';
GRANT pg_monitor TO netdata;
"
Настройте коллектор:
sudo nano /etc/netdata/go.d/postgres.conf
jobs:
- name: local
dsn: 'postgresql://netdata:monitoring_pass@127.0.0.1:5432/postgres'
Netdata будет собирать метрики транзакций, блокировок, кэша буферов, WAL, репликации и десятки других параметров PostgreSQL.
Мониторинг Docker-контейнеров
Если Docker-сокет примонтирован, Netdata автоматически мониторит все контейнеры. Для каждого контейнера отображаются: потребление CPU и RAM, сетевой I/O, дисковый I/O. Дополнительно можно включить cgroups-мониторинг:
# /etc/netdata/netdata.conf
[plugin:cgroups]
enable cpuacct stat = yes
enable cpuacct usage = yes
enable memory = yes
enable blkio throttle = yes
Для мониторинга health-чеков контейнеров используйте встроенный коллектор Docker Engine:
# /etc/netdata/go.d/docker_engine.conf
jobs:
- name: local
url: http://127.0.0.1:9323/metrics
Не забудьте включить экспорт метрик в Docker daemon:
# /etc/docker/daemon.json
{
"metrics-addr": "127.0.0.1:9323",
"experimental": true
}
Настройка алертов и уведомлений
Netdata поставляется с сотнями преднастроенных алертов, которые покрывают типичные сценарии: высокая нагрузка CPU, нехватка RAM, заполненный диск, упавшие сервисы. Все алерты описаны в каталоге /etc/netdata/health.d/ и используют DSL на основе YAML.
Создание кастомного алерта
Создадим алерт на высокую нагрузку диска:
sudo nano /etc/netdata/health.d/disk_custom.conf
alarm: disk_space_critical
on: disk.space
lookup: min -1m unaligned of avail
units: GiB
every: 30s
warn: $this < 10
crit: $this < 5
delay: down 15m multiplier 1.5 max 1h
info: available disk space is critically low
to: sysadmin
Разберём синтаксис:
on: disk.space — метрика, на которую навешивается алертlookup: min -1m unaligned of avail — берём минимальное значение доступного места за последнюю минутуwarn/crit — пороги для уровней WARNING и CRITICALdelay — задержка перед снятием алерта (для предотвращения flapping)to: sysadmin — группа получателей
Проверьте конфигурацию:
sudo netdatacli reload-health
sudo netdatacli health list | grep disk_space
Интеграция с Telegram
Настроим отправку уведомлений в Telegram. Отредактируйте файл уведомлений:
sudo nano /etc/netdata/health_alarm_notify.conf
# Telegram настройки
SEND_TELEGRAM="YES"
TELEGRAM_BOT_TOKEN="1234567890:AAHfGxHfk_example_token"
DEFAULT_RECIPIENT_TELEGRAM="-100123456789"
Здесь -100123456789 — ID группы или чата в Telegram. Для получения ID бота используйте @BotFather, для ID чата — @userinfobot.
Можно настроить разные получатели для разных уровней:
# Отправляем WARNING только в канал мониторинга
# CRITICAL — в личку дежурного
role_recipients_telegram[sysadmin]="-100123456789|dba_chat_id"
role_recipients_telegram[webmaster]="-100987654321"
Протестируйте отправку:
sudo /usr/libexec/netdata/plugins.d/alarm-notify.sh test
Стриминг метрик и централизация
При наличии нескольких серверов удобно агрегировать метрики на выделенном parent-узле. Это позволяет просматривать все серверы через единый дашборд и хранить исторические данные в одном месте.
Настройка parent-узла
На центральном сервере отредактируйте конфигурацию стриминга:
sudo nano /etc/netdata/stream.conf
[STREAM_API_KEY_HERE]
enabled = yes
default history = 86400
default memory mode = dbengine
health enabled by default = auto
allow from = 10.0.0.* 192.168.1.*
Замените STREAM_API_KEY_HERE на UUID, сгенерированный командой uuidgen. Параметр allow from ограничивает подключения по IP.
Увеличьте хранение метрик на parent-узле:
# /etc/netdata/netdata.conf
[db]
mode = dbengine
storage tiers = 3
dbengine multihost disk space MB = 4096
dbengine tier 1 multihost disk space MB = 1024
dbengine tier 2 multihost disk space MB = 512
Настройка child-узлов
На каждом мониторируемом сервере настройте стриминг:
sudo nano /etc/netdata/stream.conf
[stream]
enabled = yes
destination = parent-server-ip:19999
api key = STREAM_API_KEY_HERE
timeout seconds = 60
buffer size bytes = 1048576
reconnect delay seconds = 5
initial clock resync iterations = 60
Если child-узел не должен хранить метрики локально (экономия ресурсов):
# /etc/netdata/netdata.conf
[db]
mode = ram
retention = 300
Перезапустите Netdata на child-узле и проверьте подключение:
sudo systemctl restart netdata
sudo grep -i stream /var/log/netdata/error.log
На parent-узле в дашборде появится новая нода. Можно переключаться между серверами через выпадающий список в верхней части интерфейса.
Экспорт метрик в Prometheus и Grafana
Netdata может выступать как exporter для Prometheus. Это полезно, если у вас уже есть стек Prometheus + Grafana и вы хотите использовать Netdata как агент сбора.
Настройка Prometheus endpoint
Prometheus endpoint включён по умолчанию. Добавьте Netdata как target в Prometheus:
# prometheus.yml
scrape_configs:
- job_name: 'netdata'
metrics_path: '/api/v1/allmetrics'
params:
format: [prometheus]
honor_labels: true
scrape_interval: 5s
static_configs:
- targets:
- 'server1:19999'
- 'server2:19999'
- 'server3:19999'
Для фильтрации метрик (чтобы не перегружать Prometheus) используйте параметры:
params:
format: [prometheus]
# Только метрики CPU и памяти
charts: [system.cpu, system.ram]
# Или по префиксу
prefix: [netdata_system]
Дашборд Grafana для Netdata
Импортируйте готовый дашборд из Grafana Marketplace. Популярные варианты:
- Dashboard ID 7107 — общий обзор сервера
- Dashboard ID 14399 — детальный мониторинг с Netdata
Для импорта: Grafana → Dashboards → Import → введите ID. Или создайте свой с примерами запросов:
# CPU usage по всем ядрам
rate(netdata_cpu_cpu_percentage_average{dimension!="idle"}[1m])
# Свободная RAM в процентах
netdata_system_ram_MiB_average{dimension="free"} /
(netdata_system_ram_MiB_average{dimension="free"} + netdata_system_ram_MiB_average{dimension="used"}) * 100
# Disk I/O
rate(netdata_disk_io_KiB_persec_average[5m])
Безопасность и ограничение доступа
По умолчанию Netdata слушает на всех интерфейсах порт 19999 без аутентификации. Для продакшен-окружений это необходимо исправить.
Ограничение через nginx reverse proxy
Закройте прямой доступ к Netdata и поставьте перед ним nginx с basic auth:
# /etc/netdata/netdata.conf
[web]
bind to = 127.0.0.1
# /etc/nginx/sites-available/netdata
upstream netdata {
server 127.0.0.1:19999;
keepalive 64;
}
server {
listen 443 ssl http2;
server_name monitoring.example.com;
ssl_certificate /etc/letsencrypt/live/monitoring.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monitoring.example.com/privkey.pem;
auth_basic "Netdata Monitoring";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://netdata;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
Создайте файл паролей:
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin
Firewall-правила
Если reverse proxy не подходит, ограничьте доступ через firewall:
# UFW
sudo ufw deny 19999
sudo ufw allow from 10.0.0.0/24 to any port 19999
# nftables
nft add rule inet filter input tcp dport 19999 ip saddr 10.0.0.0/24 accept
nft add rule inet filter input tcp dport 19999 drop
# iptables
iptables -A INPUT -p tcp --dport 19999 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 19999 -j DROP
Также отключите неиспользуемые коллекторы для уменьшения поверхности атаки:
# /etc/netdata/netdata.conf
[plugins]
apps = no # Если не нужен мониторинг процессов
freeipmi = no # Если нет IPMI
perf = no # Если не нужны hardware counters
Полезные советы по эксплуатации
Несколько рекомендаций, которые пригодятся при повседневной работе с Netdata.
Снижение потребления ресурсов. На серверах с ограниченной памятью уменьшите количество хранимых данных и частоту обновления:
# /etc/netdata/netdata.conf
[global]
update every = 2 # Обновление каждые 2 секунды вместо 1
[db]
mode = dbengine
dbengine multihost disk space MB = 256
API для скриптов. Netdata предоставляет REST API для интеграции с внешними системами:
# Текущая загрузка CPU
curl -s 'http://localhost:19999/api/v1/data?chart=system.cpu&after=-1&format=json' | jq
# Список всех чартов
curl -s 'http://localhost:19999/api/v1/charts' | jq '.charts | keys[]'
# Проверка алертов
curl -s 'http://localhost:19999/api/v1/alarms?active' | jq '.alarms | to_entries[] | .value.status'
Обновление Netdata:
# Если установлен через kickstart
sudo /usr/libexec/netdata/netdata-updater.sh
# Или для автообновления (по умолчанию включено)
cat /etc/netdata/.environment | grep AUTO_UPDATE
Оставить комментарий