Toil (Рутина)
Toil — это повторяющиеся, ручные, автоматизируемые и тактические задачи, которые не имеют долгосрочной ценности. В SRE команды стремятся минимизировать Toil, чтобы высвобождать время для инженерных задач, которые повышают надежность и масштабируемость систем.
Характеристики Toil
- Ручная работа — требует человеческого вмешательства
- Повторяющаяся — одни и те же действия снова и снова
- Автоматизируемая — может быть заменена скриптами или системами
- Тактическая — не создает долгосрочную ценность
- Масштабируется линейно — больше нагрузки = больше Toil
Примеры Toil
- Ручной перезапуск сервисов
- Ротация логов вручную
- Ручное масштабирование ресурсов
- Копирование файлов между серверами
- Ручная проверка статуса сервисов
- Создание пользователей в базе данных вручную
Автоматизация Toil
1# Пример автоматизации ручной задачи
2import os
3import subprocess
4import logging
5from datetime import datetime
6
7class ToilAutomation:
8 def __init__(self):
9 self.logger = logging.getLogger(__name__)
10
11 def automated_log_rotation(self, log_dir="/var/log/app", max_size_mb=100):
12 """Автоматическая ротация логов вместо ручной"""
13 for log_file in os.listdir(log_dir):
14 file_path = os.path.join(log_dir, log_file)
15 if os.path.isfile(file_path):
16 size_mb = os.path.getsize(file_path) / (1024 * 1024)
17
18 if size_mb > max_size_mb:
19 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
20 archived_name = f"{log_file}.{timestamp}"
21 os.rename(file_path, os.path.join(log_dir, archived_name))
22
23 # Сжатие старого лога
24 subprocess.run(['gzip', os.path.join(log_dir, archived_name)])
25 self.logger.info(f"Rotated log: {log_file}")
26
27 def automated_service_restart(self, service_name, health_check_url):
28 """Автоматический перезапуск сервиса при проблемах"""
29 try:
30 import requests
31 response = requests.get(health_check_url, timeout=5)
32
33 if response.status_code != 200:
34 self.logger.warning(f"Service {service_name} unhealthy, restarting...")
35 subprocess.run(['systemctl', 'restart', service_name])
36 self.logger.info(f"Service {service_name} restarted")
37
38 except requests.RequestException:
39 self.logger.error(f"Health check failed for {service_name}")
40 subprocess.run(['systemctl', 'restart', service_name])
41
42# Установка автоматизации через pip
43pip install requests psutil schedule
44
45# Установка через poetry
46poetry add requests psutil schedule
Измерение Toil
SRE команды должны отслеживать количество времени, потраченного на Toil:
- Менее 30% — здоровый уровень Toil
- 30-50% — нужно планировать автоматизацию
- Более 50% — критический уровень, требует немедленных действий
FAQ
Почему важно сокращать Toil?
Сокращение Toil высвобождает время инженеров для работы над улучшением надежности, производительности и создания новых функций, что приносит долгосрочную ценность.
Как отличить Toil от обычной работы?
Toil — это работа, которая повторяется регулярно, не требует принятия решений и может быть автоматизирована. Обычная инженерная работа требует анализа, планирования и создания долгосрочных решений.