📊 Система мониторинга сервера с уведомлениями в Telegram
-------------------------------------------------------------curl -s http://localhost:3001 | head -3
📋 Оглавление
- Обзор системы
- Архитектура
- Установка и настройка
- Компоненты системы
- Операционные процедуры
- Устранение неисправностей
- Расширение функционала
🎯 Обзор системы
Цель
Автоматический мониторинг ключевых метрик сервера (CPU, RAM) с мгновенными уведомлениями в Telegram при превышении пороговых значений.
Ключевые характеристики
- ✅ Мониторинг CPU (порог: >80%)
- ✅ Мониторинг RAM (порог: >90%)
- ✅ Проверка работоспособности Glances
- ✅ Мгновенные уведомления в Telegram
- ✅ Детальное логирование
- ✅ Альтернативные методы сбора метрик
🏗 Архитектура
text
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Glances │───▶│ System Monitor │───▶│ Telegram Bot │
│ (метрики) │ │ (скрипт) │ │ (уведомления) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Альтернативные │ │ Файл логов │ │ Пользователь │
│ источники │ │ glances_alert.log│ │ Telegram │
│ (top, free, пр.)│ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
📥 Установка и настройка
Предварительные требования
bash
# 1. Установите зависимости
sudo apt-get update
sudo apt-get install -y python3 python3-pip bc
# 2. Установите Glances
pip3 install glances
# 3. Установите Python библиотеки
pip3 install requests
Шаг 1: Создание Telegram бота
- Откройте Telegram, найдите @BotFather
- Создайте нового бота: /newbot
- Сохраните полученный токен
- Получите свой Chat ID:
- Отправьте сообщение боту
- Перейдите по ссылке: https://api.telegram.org/bot<ВАШ_ТОКЕН>/getUpdates
- Найдите chat.id в ответе
Шаг 2: Настройка скриптов
2.1 Скрипт отправки в Telegram (glances_alert.py)
bash
cat > ~/glances_alert.py << 'EOF'
#!/usr/bin/env python3
import sys
import requests
import json
from datetime import datetime
# КОНФИГУРАЦИЯ
BOT_TOKEN = "ВАШ_BOT_TOKEN" # Замените на реальный токен
CHAT_ID = "ВАШ_CHAT_ID" # Замените на реальный Chat ID
def send_telegram(message):
"""Отправка сообщения в Telegram"""
url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
# Форматируем сообщение
formatted_message = f"⚠️ Glances Alert\n{message}"
payload = {
"chat_id": CHAT_ID,
"text": formatted_message,
"parse_mode": "HTML"
}
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"{timestamp} INFO: Triggered with message: {message}")
try:
response = requests.post(url, json=payload, timeout=10)
response_data = response.json()
if response.status_code == 200 and response_data.get("ok"):
print(f"{timestamp} INFO: Sent: {message} | Response: {response.status_code} {json.dumps(response_data)}")
print(f"{timestamp} INFO: ✅ Telegram notification sent successfully")
return True
else:
print(f"{timestamp} ERROR: Failed to send: {response.status_code} - {response.text}")
return False
except Exception as e:
print(f"{timestamp} ERROR: Exception: {e}")
return False
if __name__ == "__main__":
if len(sys.argv) > 1:
send_telegram(sys.argv[1])
else:
print("Usage: ./glances_alert.py 'message'")
EOF
chmod +x ~/glances_alert.py
2.2 Основной скрипт мониторинга (system_monitor.sh)
bash
cat > ~/system_monitor.sh << 'EOF'
#!/bin/bash
# ============================================================================
# СИСТЕМНЫЙ МОНИТОР ДЛЯ УВЕДОМЛЕНИЙ В TELEGRAM
# Автор: [Ваше имя]
# Версия: 2.0
# ============================================================================
# КОНФИГУРАЦИЯ
LOG_FILE="/home/$(whoami)/glances_alert.log"
ALERT_SCRIPT="/home/$(whoami)/glances_alert.py"
GLANCES_PATH="/home/$(whoami)/.local/bin/glances"
# ПОРОГИ ОПОВЕЩЕНИЙ (настройте под свои нужды)
CPU_THRESHOLD=80 # Процент использования CPU
RAM_THRESHOLD=90 # Процент использования RAM
DISK_THRESHOLD=90 # Процент использования диска (опционально)
# ФУНКЦИИ
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
get_glances_metric() {
local metric=$1
timeout 3s "$GLANCES_PATH" --stdout "$metric" --time 1 2>/dev/null | \
grep "$metric:" | \
tail -1 | \
awk -F': ' '{print $2}' | \
tr -cd '0-9.' || echo ""
}
# ============================================================================
# НАЧАЛО РАБОТЫ
# ============================================================================
log_message "=== SYSTEM MONITOR STARTED ==="
# 1. ПОЛУЧЕНИЕ МЕТРИК CPU
CPU=$(get_glances_metric "cpu.total")
if [[ -z "$CPU" ]] || [[ ! "$CPU" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
CPU=$(top -bn1 | grep "Cpu(s)" | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}')
log_message "INFO: Using alternative CPU measurement: $CPU%"
fi
# 2. ПОЛУЧЕНИЕ МЕТРИК RAM
RAM=$(get_glances_metric "mem.percent")
if [[ -z "$RAM" ]] || [[ ! "$RAM" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
RAM=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100}')
log_message "INFO: Using alternative RAM measurement: $RAM%"
fi
# 3. ВАЛИДАЦИЯ ДАННЫХ
[[ ! "$CPU" =~ ^[0-9]+(\.[0-9]+)?$ ]] && CPU="0"
[[ ! "$RAM" =~ ^[0-9]+(\.[0-9]+)?$ ]] && RAM="0"
log_message "METRICS - CPU: ${CPU}%, RAM: ${RAM}%"
# ============================================================================
# ПРОВЕРКА ПОРОГОВ И ОТПРАВКА УВЕДОМЛЕНИЙ
# ============================================================================
# А. ПРОВЕРКА CPU
if (( $(echo "$CPU > $CPU_THRESHOLD" | bc -l 2>/dev/null) )); then
MESSAGE="🚨 HIGH CPU USAGE: $(printf "%.1f" $CPU)% (Threshold: ${CPU_THRESHOLD}%)"
log_message "ALERT: $MESSAGE"
if [ -x "$ALERT_SCRIPT" ]; then
"$ALERT_SCRIPT" "$MESSAGE" && \
log_message "SUCCESS: CPU alert sent to Telegram"
fi
fi
# Б. ПРОВЕРКА RAM
if (( $(echo "$RAM > $RAM_THRESHOLD" | bc -l 2>/dev/null) )); then
MESSAGE="🚨 HIGH RAM USAGE: $(printf "%.1f" $RAM)% (Threshold: ${RAM_THRESHOLD}%)"
log_message "ALERT: $MESSAGE"
if [ -x "$ALERT_SCRIPT" ]; then
"$ALERT_SCRIPT" "$MESSAGE" && \
log_message "SUCCESS: RAM alert sent to Telegram"
fi
fi
# В. ПРОВЕРКА РАБОТОСПОСОБНОСТИ GLANCES (ОПЦИОНАЛЬНО)
if ! pgrep -f "glances -w" > /dev/null 2>&1; then
log_message "WARNING: Glances web server is not running"
# Раскомментируйте для отправки уведомлений:
# "$ALERT_SCRIPT" "⚠️ GLANCES WEB SERVER IS DOWN!"
fi
# ============================================================================
# ЗАВЕРШЕНИЕ РАБОТЫ
# ============================================================================
log_message "=== SYSTEM MONITOR FINISHED ==="
EOF
chmod +x ~/system_monitor.sh
2.3 Настройка автоматического запуска (cron)
bash
# Откройте редактор crontab
crontab -e
# Добавьте строки:
# Мониторинг каждые 5 минут
*/5 * * * * /home/$(whoami)/system_monitor.sh
# Или каждую минуту (для более чувствительных систем)
# * * * * * /home/$(whoami)/system_monitor.sh
# Проверьте добавленные задания
crontab -l
🔧 Компоненты системы
1. Основной скрипт мониторинга (system_monitor.sh)
- Назначение: Сбор метрик и принятие решений об отправке уведомлений
- Расположение: ~/system_monitor.sh
- Параметры конфигурации (измените в скрипте):
- CPU_THRESHOLD: Порог CPU (по умолчанию: 80%)
- RAM_THRESHOLD: Порог RAM (по умолчанию: 90%)
- LOG_FILE: Путь к файлу логов
- ALERT_SCRIPT: Путь к скрипту Telegram
2. Скрипт отправки в Telegram (glances_alert.py)
- Назначение: Отправка сообщений в Telegram
- Расположение: ~/glances_alert.py
- Обязательная настройка:
- BOT_TOKEN: Токен вашего Telegram бота
- CHAT_ID: ID чата для уведомлений
3. Файл логов (glances_alert.log)
- Назначение: Хранение истории работы системы
- Расположение: ~/glances_alert.log
- Формат: ГГГГ-ММ-ДД ЧЧ:ММ:СС - сообщение
🚀 Операционные процедуры
Запуск вручную
bash
# 1. Тестовая отправка в Telegram
~/glances_alert.py "🔧 Тестирование системы мониторинга"
# 2. Запуск мониторинга
~/system_monitor.sh
# 3. Просмотр логов в реальном времени
tail -f ~/glances_alert.log
Проверка состояния
bash
# 1. Проверка запущенных процессов
pgrep -af "system_monitor"
# 2. Проверка логов (последние 20 записей)
tail -20 ~/glances_alert.log
# 3. Проверка метрик вручную
~/system_monitor.sh 2>&1 | grep "METRICS"
Остановка системы
bash
# 1. Остановка всех процессов мониторинга
pkill -f "system_monitor.sh"
# 2. Удаление задач из cron
crontab -l | grep -v "system_monitor" | crontab -
# 3. Архивирование логов (опционально)
cp ~/glances_alert.log ~/glances_alert_$(date +%Y%m%d).log
🔍 Устранение неисправностей
Проблема: Не приходят уведомления в Telegram
bash
# 1. Проверьте токен и Chat ID
grep -n "BOT_TOKEN\|CHAT_ID" ~/glances_alert.py
# 2. Протестируйте отправку вручную
~/glances_alert.py "🔍 Тест связи"
# 3. Проверьте доступность Telegram API
curl -s https://api.telegram.org
# 4. Проверьте логи
tail -10 ~/glances_alert.log
Проблема: Не получаются метрики от Glances
bash
# 1. Проверьте установку Glances
which glances || pip3 show glances
# 2. Проверьте работу Glances вручную
~/.local/bin/glances --stdout "cpu.total" --time 1 | head -3
# 3. Используйте альтернативные методы
echo "CPU через top: $(top -bn1 | grep 'Cpu' | awk '{print 100 - $8}')%"
echo "RAM через free: $(free | grep Mem | awk '{printf "%.1f", $3/$2*100}')%"
Проблема: Скрипт не запускается из cron
bash
# 1. Проверьте путь к интерпретатору
head -1 ~/system_monitor.sh
# 2. Проверьте права доступа
ls -la ~/system_monitor.sh ~/glances_alert.py
# 3. Добавьте переменные окружения в cron
# В crontab добавьте в начало:
# PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Диагностический скрипт
bash
cat > ~/monitor_diagnostic.sh << 'EOF'
#!/bin/bash
echo "=== ДИАГНОСТИКА СИСТЕМЫ МОНИТОРИНГА ==="
echo "Время: $(date)"
echo ""
echo "1. ПРОВЕРКА СКРИПТОВ:"
ls -la ~/system_monitor.sh ~/glances_alert.py ~/glances_alert.log 2>/dev/null
echo ""
echo "2. ПРОВЕРКА GLANCES:"
timeout 2s ~/.local/bin/glances --stdout "cpu.total" --time 1 2>&1 | head -2
echo ""
echo "3. ТЕКУЩИЕ МЕТРИКИ:"
echo "CPU: $(top -bn1 | grep 'Cpu' | awk '{printf "%.1f", 100 - $8}')%"
echo "RAM: $(free | grep Mem | awk '{printf "%.1f", $3/$2*100}')%"
echo ""
echo "4. ПРОВЕРКА TELEGRAM:"
if [ -x ~/glances_alert.py ]; then
~/glances_alert.py "🩺 Диагностика системы мониторинга"
echo "Тестовое сообщение отправлено"
else
echo "ОШИБКА: Скрипт Telegram не найден"
fi
echo ""
echo "5. ПРОВЕРКА CRON:"
crontab -l | grep -i monitor
echo ""
echo "6. ПОСЛЕДНИЕ ЛОГИ:"
tail -5 ~/glances_alert.log 2>/dev/null || echo "Логи не найдены"
echo ""
echo "=== ДИАГНОСТИКА ЗАВЕРШЕНА ==="
EOF
chmod +x ~/monitor_diagnostic.sh
📈 Расширение функционала
Добавление мониторинга диска
bash
# Добавьте в system_monitor.sh после проверки RAM:
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if (( $(echo "$DISK_USAGE > $DISK_THRESHOLD" | bc -l) )); then
MESSAGE="🚨 HIGH DISK USAGE: ${DISK_USAGE}%"
"$ALERT_SCRIPT" "$MESSAGE"
fi
Добавление мониторинга температуры
bash
# Добавьте в system_monitor.sh:
if [ -f "/sys/class/thermal/thermal_zone0/temp" ]; then
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}')
if (( $(echo "$TEMP > 80" | bc -l) )); then
"$ALERT_SCRIPT" "🌡️ HIGH TEMPERATURE: ${TEMP}°C"
fi
fi
Добавление мониторинга сетевых интерфейсов
bash
# Добавьте проверку сетевого интерфейса:
INTERFACE="eth0"
if ! ip link show $INTERFACE | grep -q "state UP"; then
"$ALERT_SCRIPT" "📡 NETWORK INTERFACE DOWN: $INTERFACE"
fi
Настройка разных порогов для дня/ночи
bash
# Добавьте в начало system_monitor.sh:
HOUR=$(date +%H)
if [ $HOUR -ge 8 ] && [ $HOUR -lt 20 ]; then
# Дневные пороги
CPU_THRESHOLD=80
RAM_THRESHOLD=90
else
# Ночные пороги (можно сделать строже)
CPU_THRESHOLD=70
RAM_THRESHOLD=85
fi
Ротация логов
bash
# Добавьте в crontab (ежедневная ротация):
0 0 * * * cp ~/glances_alert.log ~/glances_alert_$(date +\%Y\%m\%d).log && echo "" > ~/glances_alert.log
📊 Шаблон документации инцидентов
Формат записи в лог
text
[ГГГГ-ММ-ДД ЧЧ:ММ:СС] - [ТИП] - [СЕРВИС] - [СТАТУС] - [ДЕТАЛИ]
Примеры:
text
2024-01-09 14:30:15 - ALERT - CPU - THRESHOLD_EXCEEDED - CPU usage: 95% (threshold: 80%)
2024-01-09 14:30:16 - SUCCESS - TELEGRAM - NOTIFICATION_SENT - Message delivered
2024-01-09 14:35:00 - INFO - SYSTEM - MONITOR_COMPLETE - Metrics collected
🎯 Контрольный список развертывания
- Установлены зависимости (Glances, Python, bc)
- Создан Telegram бот и получен токен
- Получен Chat ID для уведомлений
- Настроен скрипт glances_alert.py с правильными токеном и Chat ID
- Настроен скрипт system_monitor.sh с нужными порогами
- Протестирована отправка уведомлений вручную
- Добавлена задача в cron для автоматического запуска
- Проведено тестирование под высокой нагрузкой
- Документированы процедуры мониторинга и устранения неисправностей
📞 Контакты и поддержка
Ответственный за систему: [Ваше имя/отдел]
Telegram бот для уведомлений: @GlancesAlertBot
Частота проверок: Каждые 5 минут
Время реакции на инциденты: 15 минут
Документ обновлен: $(date)
Версия системы: 2.0
Состояние: Работоспособно