Мониторинг системы

Комплексный мониторинг состояния системы и сервисов

Цели мониторинга

Мониторинг системы позволяет:

  • Обнаруживать проблемы до их критического воздействия
  • Анализировать тенденции использования ресурсов
  • Планировать масштабирование инфраструктуры
  • Обеспечивать соответствие SLA

Базовый мониторинг

Системные ресурсы

# Использование CPU
top -bn1 | grep "Cpu(s)" | awk '{print $2+$4"%"}'

# Использование памяти
free -m | awk 'NR==2{printf "Память: %s/%s MB (%.2f%%)\n", $3,$2,$3*100/$2 }'

# Использование диска
df -h | awk '$NF=="/"{printf "Диск: %d/%d GB (%s)\n", $3,$2,$5}'

# Загрузка системы
uptime | awk -F'[a-z]:' '{ print $2}' | awk '{print "Load Average: " $1 $2 $3}'

Мониторинг сервисов

# Статус всех сервисов
systemctl list-units --type=service --state=running

# Проверка конкретного сервиса
systemctl is-active nginx
systemctl is-enabled nginx

# Мониторинг портов
ss -tuln | grep :80
ss -tuln | grep :443
ss -tuln | grep :8000

Продвинутый мониторинг

Скрипт комплексной проверки

#!/bin/bash
# system_health_check.sh

echo "=== СИСТЕМНАЯ ПРОВЕРКА $(date) ==="

# CPU и память
echo " РЕСУРСЫ:"
echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2+$4"%"}')"
echo "RAM: $(free -m | awk 'NR==2{printf "%.1f%%", $3*100/$2 }')"
echo "Диск: $(df -h / | awk 'NR==2{print $5}')"
echo ""

# Критические сервисы
echo " СЕРВИСЫ:"
services=("nginx" "postgresql" "redis-server" "ssh")
for service in "${services[@]}"; do
    if systemctl is-active --quiet $service; then
        echo " $service: запущен"
    else
        echo " $service: остановлен"
    fi
done
echo ""

# Сетевые подключения
echo "🌐 СЕТЬ:"
echo "Активные соединения: $(ss -tu | wc -l)"
echo "Слушающие порты: $(ss -tln | grep LISTEN | wc -l)"
echo ""

# Логи с ошибками
echo " ОШИБКИ В ЛОГАХ (последний час):"
journalctl --since "1 hour ago" --priority=err --no-pager -q | wc -l

Автоматический мониторинг с алертами

#!/bin/bash
# alert_monitor.sh

# Пороговые значения
CPU_THRESHOLD=80
MEMORY_THRESHOLD=90
DISK_THRESHOLD=85

# Email для уведомлений
ADMIN_EMAIL="admin@company.com"

# Функция отправки алерта
send_alert() {
    local message="$1"
    echo "$message" | mail -s " Системный алерт $(hostname)" $ADMIN_EMAIL
    logger "ALERT: $message"
}

# Проверка CPU
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2+$4}' | cut -d'%' -f1)
if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc -l) )); then
    send_alert "Высокая загрузка CPU: ${cpu_usage}%"
fi

# Проверка памяти
memory_usage=$(free | grep Mem | awk '{printf("%.1f"), $3/$2 * 100.0}')
if (( $(echo "$memory_usage > $MEMORY_THRESHOLD" | bc -l) )); then
    send_alert "Высокое использование памяти: ${memory_usage}%"
fi

# Проверка диска
disk_usage=$(df / | awk 'END{print $(NF-1)}' | sed 's/%//')
if [ "$disk_usage" -gt "$DISK_THRESHOLD" ]; then
    send_alert "Мало места на диске: ${disk_usage}%"
fi

Мониторинг приложений

Wiki Iridium - специфический мониторинг

#!/bin/bash
# wiki_monitor.sh

echo "=== МОНИТОРИНГ WIKI IRIDIUM ==="

# Проверка Hugo
if systemctl is-active --quiet iridium-hugo.service; then
    echo " Hugo: работает"
    echo "  Порт 1313: $(ss -tln | grep :1313 | wc -l) слушателей"
else
    echo " Hugo: не работает"
fi

# Проверка Go API
if curl -s http://localhost:8000/health > /dev/null; then
    echo " Go API: работает"
    echo "  Порт 8000: доступен"
else
    echo " Go API: недоступен"
fi

# Проверка PostgreSQL
if systemctl is-active --quiet postgresql; then
    echo " PostgreSQL: работает"
    
    # Проверка подключений к БД
    connections=$(sudo -u postgres psql -c "SELECT count(*) FROM pg_stat_activity;" -t | xargs)
    echo "  Активных подключений: $connections"
    
    # Размер БД
    db_size=$(sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('wiki_db'));" -t | xargs)
    echo "  Размер БД: $db_size"
else
    echo " PostgreSQL: не работает"
fi

# Проверка логов на ошибки
error_count=$(journalctl -u iridium-hugo.service --since "1 hour ago" --priority=err -q | wc -l)
if [ "$error_count" -gt 0 ]; then
    echo "⚠️  Ошибок в логах Hugo: $error_count"
fi

Долгосрочный мониторинг

Сбор метрик

#!/bin/bash
# collect_metrics.sh

METRICS_DIR="/var/log/metrics"
mkdir -p $METRICS_DIR

DATE=$(date +%Y%m%d_%H%M%S)

# Системные метрики
{
    echo "timestamp,cpu_percent,memory_percent,disk_percent,load_avg"
    printf "%s," "$DATE"
    top -bn1 | grep "Cpu(s)" | awk '{printf "%.1f,", $2+$4}'
    free | grep Mem | awk '{printf "%.1f,", $3/$2 * 100.0}'
    df / | awk 'END{printf "%s,", $(NF-1)}' | sed 's/%,/,/'
    uptime | awk '{print $(NF-2)}' | sed 's/,//'
} >> $METRICS_DIR/system_metrics.csv

# Сетевые метрики
{
    echo "timestamp,active_connections,listening_ports,network_errors"
    printf "%s," "$DATE"
    ss -tu | tail -n +2 | wc -l | tr -d '\n'; echo -n ","
    ss -tln | grep LISTEN | wc -l | tr -d '\n'; echo -n ","
    netstat -i | awk 'NR>2 {sum+=$4+$8} END {print sum}'
} >> $METRICS_DIR/network_metrics.csv

Анализ трендов

#!/bin/bash
# analyze_trends.sh

METRICS_DIR="/var/log/metrics"

echo "=== АНАЛИЗ ТРЕНДОВ ЗА ПОСЛЕДНИЕ 24 ЧАСА ==="

# Среднее использование CPU
if [ -f "$METRICS_DIR/system_metrics.csv" ]; then
    avg_cpu=$(tail -n 1440 $METRICS_DIR/system_metrics.csv | awk -F',' '{sum+=$2; count++} END {printf "%.1f%%", sum/count}')
    max_cpu=$(tail -n 1440 $METRICS_DIR/system_metrics.csv | awk -F',' 'BEGIN{max=0} {if($2>max) max=$2} END {printf "%.1f%%", max}')
    
    echo "CPU - Среднее: $avg_cpu, Максимум: $max_cpu"
    
    # Среднее использование памяти
    avg_mem=$(tail -n 1440 $METRICS_DIR/system_metrics.csv | awk -F',' '{sum+=$3; count++} END {printf "%.1f%%", sum/count}')
    max_mem=$(tail -n 1440 $METRICS_DIR/system_metrics.csv | awk -F',' 'BEGIN{max=0} {if($3>max) max=$3} END {printf "%.1f%%", max}')
    
    echo "Память - Среднее: $avg_mem, Максимум: $max_mem"
fi

🔔 Настройка уведомлений

Cron для автоматического мониторинга

# Добавить в crontab (crontab -e)

# Каждые 5 минут - базовая проверка
*/5 * * * * /opt/scripts/alert_monitor.sh

# Каждый час - сбор метрик
0 * * * * /opt/scripts/collect_metrics.sh

# Каждый день в 9:00 - отчет о трендах
0 9 * * * /opt/scripts/analyze_trends.sh | mail -s "Ежедневный отчет $(hostname)" admin@company.com

# Каждый час - проверка Wiki
0 * * * * /opt/scripts/wiki_monitor.sh >> /var/log/wiki_monitoring.log

Настройка Logrotate для метрик

# /etc/logrotate.d/metrics
/var/log/metrics/*.csv {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    sharedscripts
}

/var/log/wiki_monitoring.log {
    weekly
    missingok
    rotate 12
    compress
    delaycompress
    notifempty
}

Дашборды

Простой веб-дашборд (HTML + JavaScript)

<!DOCTYPE html>
<html>
<head>
    <title>System Monitor</title>
    <meta http-equiv="refresh" content="30">
</head>
<body>
    <h1> Системный мониторинг</h1>
    <div id="metrics">
        <script>
            // Получение метрик через API
            fetch('/api/metrics')
                .then(response => response.json())
                .then(data => {
                    document.getElementById('metrics').innerHTML = `
                        <p>CPU: ${data.cpu}%</p>
                        <p>Память: ${data.memory}%</p>
                        <p>Диск: ${data.disk}%</p>
                        <p>Время работы: ${data.uptime}</p>
                    `;
                });
        </script>
    </div>
</body>
</html>

⚠️ Важные метрики для отслеживания

Критические показатели

  • CPU > 80% в течение 10+ минут
  • Память > 90% в течение 5+ минут
  • Диск > 85% свободного места
  • Load Average > количество CPU ядер

Сетевые показатели

  • Количество активных соединений
  • Скорость сетевого трафика
  • Ошибки сетевых интерфейсов
  • Доступность внешних сервисов

Приложения

  • Время отклика веб-сервера
  • Количество ошибок в логах
  • Размер и рост базы данных
  • Статус всех сервисов

Инструменты мониторинга

Рекомендуемые решения

  • Prometheus + Grafana - для продакшн сред
  • Zabbix - комплексное решение
  • htop, iotop, nethogs - интерактивный мониторинг
  • Custom scripts - для специфических задач