Мониторинг системы
Комплексный мониторинг состояния системы и сервисов
Цели мониторинга
Мониторинг системы позволяет:
- Обнаруживать проблемы до их критического воздействия
- Анализировать тенденции использования ресурсов
- Планировать масштабирование инфраструктуры
- Обеспечивать соответствие 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 - для специфических задач