Как отслеживать ваши сервисы: полное руководство по мониторингу для homelab
Изучите лучшие инструменты и методы мониторинга для вашего homelab. От базового отслеживания системных метрик до продвинутых техник наблюдения за сервисами. Полное руководство для самостоятельных хостеров.
Введение и обзор инструментов
Мониторинг — это фундаментальная часть управления любой IT-инфраструктурой, включая homelab. Он позволяет отслеживать состояние систем, выявлять проблемы до их влияния на пользователей и принимать обоснованные решения по оптимизации. Homelab имеет свои особенности: ориентирован на личные проекты, может включать физические и виртуальные машины, часто ограничен по ресурсам.
Настройка базового мониторинга систем
Для сбора системных метрик используем node_exporter из экосистемы Prometheus. Он собирает широкий range метрик ОС и предоставляет их в формате, понятном Prometheus.
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz
sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin
sudo useradd -rs /bin/false node_exporterНастройка сервиса node_exporter
Создадим systemd сервис для node_exporter, чтобы он запускался автоматически при загрузке системы.
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.targetМониторинг Docker-контейнеров
Для мониторинга Docker-контейнеров используем cadvisor, который автоматически соберет метрики по всем запущенным контейнерам.
docker run -d \
--name cadvisor \
-p 8080:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
gcr.io/cadvisor/cadvisor:latestПроверка доступности сервисов
Для проверки доступности сервисов используем blackbox_exporter, который позволяет проверять доступность по HTTP, TCP, ICMP и другим протоколам.
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
method: GET
headers:
Host: "example.com"
no_follow_redirects: false
fail_if_ssl: false
fail_if_not_ssl: false
preferred_ip_protocol: "ip4"
tcp_connect:
prober: tcp
timeout: 5s
icmp:
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: "ip4"Настройка сбора логов с Loki и Promtail
Loki — это система агрегации логов, вдохновенная Prometheus. Она хранит метаданные и метки, а сами логи — как объекты в объектном хранилище. Promtail — агент для сбора логов, который отправляет их в Loki.
docker run -d \
--name loki \
-p 3100:3100 \
-v /var/loki:/loki \
grafana/loki:latest \
--config.file=/etc/loki/local-config.yaml
docker run -d \
--name promtail \
-p 9080:9080 \
-v /var/log:/var/log \
-v /etc/promtail:/etc/promtail \
grafana/promtail:latest \
-config.file=/etc/promtail/docker-config.ymlНастройка оповещений в Prometheus
Определение SLI/SLO (Service Level Indicator/Objective) — метрик, отражающих качество сервиса, и настройка алертинга на их основе.
groups:
- name: example
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate on {{ $labels.instance }}"
description: "{{ $value }} errors per 5s"
- alert: HighLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "High latency on {{ $labels.instance }}"
description: "95th percentile latency is {{ $value }}s"Визуализация данных в Grafana
Установка и настройка Grafana для визуализации собранных метрик и логов. Создание дашбордов для типичных сервисов.
docker run -d \
--name grafana \
-p 3000:3000 \
-v /var/grafana:/var/lib/grafana \
grafana/grafana:latestПримеры запросов для дашбордов
Примеры PromQL запросов для создания дашбордов в Grafana для веб-серверов и баз данных.
# Дашборд для веб-сервера:
# 1. Количество запросов в секунду:
rate(http_requests_total[5m])
# 2. Время ответа:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# 3. Коды ответов:
sum by (status) (rate(http_requests_total[5m]))
# 4. Использование CPU:
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Дашборд для базы данных:
# 1. Активные подключения:
pg_stat_database_numbackends
# 2. Время выполнения запросов:
pg_stat_database_total_time / pg_stat_database_calls
# 3. Размер свободного места:
pg_database_size / pg_database_total_sizeПродвинутые техники мониторинга
Прогнозирование и capacity planning, распределенное трассирование, синтетический мониторинг и A/B тестирование для более комплексного подхода к мониторингу.
# Пример запроса для прогнозирования использования диска:
predict_linear(node_filesystem_avail{job="node"}[24h], 3600 * 24 * 7) < 0Полная конфигурация для типичного homelab
Пример полной конфигурации для мониторинга типичного homelab с использованием Docker Compose.
version: '3.7'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=200h'
- '--web.enable-lifecycle'
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
loki:
image: grafana/loki
container_name: loki
ports:
- "3100:3100"
volumes:
- ./loki.yml:/etc/loki/local-config.yaml
- loki_data:/loki
promtail:
image: grafana/promtail
container_name: promtail
volumes:
- /var/log:/var/log
- ./promtail.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
alertmanager:
image: prom/alertmanager
container_name: alertmanager
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager_data:/alertmanager
volumes:
prometheus_data:
grafana_data:
loki_data:
alertmanager_data: