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 — это работа, которая повторяется регулярно, не требует принятия решений и может быть автоматизирована. Обычная инженерная работа требует анализа, планирования и создания долгосрочных решений.