Enhance monitoring configuration by adding status update interval and alert delays for CPU, RAM, and disk metrics. Update Makefile to include dependency checks for testing, and modify requirements to include requests library. Refactor message sender and metrics collector for improved logging and alert handling.

This commit is contained in:
2025-09-04 00:45:06 +03:00
parent 18d6f3d441
commit 567e5b3aa3
14 changed files with 1337 additions and 184 deletions

View File

@@ -160,57 +160,72 @@ class TestMetricsCollector:
assert isinstance(uptime, str)
assert 'м' in uptime or 'ч' in uptime or 'д' in uptime
@patch('metrics_collector.psutil')
def test_get_system_info_success(self, mock_psutil, metrics_collector):
def test_get_system_info_success(self, metrics_collector):
"""Тест получения системной информации"""
# Настраиваем моки
mock_psutil.cpu_percent.return_value = 25.5
mock_psutil.getloadavg.return_value = (1.2, 1.1, 1.0)
mock_psutil.cpu_count.return_value = 8
mock_memory = Mock()
mock_memory.used = 8 * (1024**3)
mock_memory.total = 16 * (1024**3)
mock_psutil.virtual_memory.return_value = mock_memory
mock_swap = Mock()
mock_swap.used = 1 * (1024**3)
mock_swap.total = 2 * (1024**3)
mock_swap.percent = 50.0
mock_psutil.swap_memory.return_value = mock_swap
mock_disk = Mock()
mock_disk.used = 100 * (1024**3)
mock_disk.total = 500 * (1024**3)
mock_disk.free = 400 * (1024**3)
mock_psutil.disk_usage.return_value = mock_disk
# Мокаем _get_disk_usage чтобы возвращал наш мок
with patch.object(metrics_collector, '_get_disk_usage', return_value=mock_disk):
mock_disk_io = Mock()
mock_disk_io.read_count = 1000
mock_disk_io.write_count = 500
mock_disk_io.read_bytes = 1024 * (1024**2)
mock_disk_io.write_bytes = 512 * (1024**2)
mock_psutil.disk_io_counters.return_value = mock_disk_io
# Мокаем все необходимые функции psutil
with patch('metrics_collector.psutil.cpu_percent', return_value=25.5) as mock_cpu, \
patch('metrics_collector.psutil.getloadavg', return_value=(1.2, 1.1, 1.0)) as mock_load, \
patch('metrics_collector.psutil.cpu_count', return_value=8) as mock_cpu_count, \
patch('metrics_collector.psutil.cpu_times_percent') as mock_cpu_times, \
patch('metrics_collector.psutil.virtual_memory') as mock_virtual_memory, \
patch('metrics_collector.psutil.swap_memory') as mock_swap_memory, \
patch('metrics_collector.psutil.disk_usage') as mock_disk_usage, \
patch('metrics_collector.psutil.disk_io_counters') as mock_disk_io, \
patch('metrics_collector.psutil.boot_time', return_value=time.time() - 86400) as mock_boot_time, \
patch('os.uname') as mock_uname:
mock_psutil.boot_time.return_value = time.time() - 86400
# Настраиваем моки для CPU
mock_cpu_times_obj = Mock()
mock_cpu_times_obj.iowait = 2.5
mock_cpu_times.return_value = mock_cpu_times_obj
with patch('os.uname') as mock_uname:
mock_uname.return_value.nodename = "test-host"
# Настраиваем моки для памяти
mock_memory = Mock()
mock_memory.used = 8 * (1024**3)
mock_memory.total = 16 * (1024**3)
mock_virtual_memory.return_value = mock_memory
# Настраиваем моки для swap
mock_swap = Mock()
mock_swap.used = 1 * (1024**3)
mock_swap.total = 2 * (1024**3)
mock_swap.percent = 50.0
mock_swap_memory.return_value = mock_swap
# Настраиваем моки для диска
mock_disk = Mock()
mock_disk.used = 100 * (1024**3)
mock_disk.total = 500 * (1024**3)
mock_disk.free = 400 * (1024**3)
mock_disk_usage.return_value = mock_disk
# Настраиваем моки для disk I/O
mock_disk_io_obj = Mock()
mock_disk_io_obj.read_count = 1000
mock_disk_io_obj.write_count = 500
mock_disk_io_obj.read_bytes = 1024 * (1024**2)
mock_disk_io_obj.write_bytes = 512 * (1024**2)
mock_disk_io.return_value = mock_disk_io_obj
# Настраиваем мок для hostname
mock_uname.return_value.nodename = "test-host"
# Мокаем _get_disk_usage чтобы возвращал наш мок
with patch.object(metrics_collector, '_get_disk_usage', return_value=mock_disk):
system_info = metrics_collector.get_system_info()
assert isinstance(system_info, dict)
assert 'cpu_percent' in system_info
assert 'ram_percent' in system_info
assert 'disk_percent' in system_info
assert 'io_wait_percent' in system_info
assert 'server_hostname' in system_info
# Проверяем расчеты
assert system_info['cpu_percent'] == 25.5
assert system_info['ram_percent'] == 50.0 # 8/16 * 100
assert system_info['disk_percent'] == 20.0 # 100/500 * 100
assert system_info['io_wait_percent'] == 2.5
assert system_info['server_hostname'] == "test-host"
def test_get_system_info_error(self, metrics_collector):
@@ -332,6 +347,13 @@ class TestMetricsCollector:
def test_check_alerts(self, metrics_collector):
"""Тест проверки алертов"""
# Сбрасываем состояния алертов для чистого теста
metrics_collector.alert_states = {'cpu': False, 'ram': False, 'disk': False}
metrics_collector.alert_start_times = {'cpu': None, 'ram': None, 'disk': None}
# Устанавливаем минимальные задержки для тестов
metrics_collector.alert_delays = {'cpu': 0, 'ram': 0, 'disk': 0}
# Тестируем превышение порога CPU
system_info = {
'cpu_percent': 85.0, # Выше порога 80.0
@@ -402,7 +424,8 @@ class TestMetricsCollectorEdgeCases:
"""Тест работы при отсутствии информации о диске"""
collector = MetricsCollector()
with patch.object(collector, '_get_disk_usage', return_value=None):
with patch.object(collector, '_get_disk_usage', return_value=None), \
patch('metrics_collector.psutil.cpu_percent', side_effect=Exception("Test error")):
system_info = collector.get_system_info()
assert system_info == {}