Как отслеживать ваши сервисы: полное руководство по мониторингу для 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: