Ответ
На одном из моих первых коммерческих проектов мы допустили критическую ошибку — отсутствие централизованной обработки исключений и логирования в распределённой микросервисной архитектуре. Когда один из сервисов начал отказывать из-за утечки памяти, мы не получили алертов, а логи были разбросаны по разным машинам без структуры. Это привело к нескольким часам простоя, пока мы вручную собирали данные для диагностики.
Что мы сделали неправильно:
- Не использовали единый формат логов (например, JSON для парсинга).
- Не настроили мониторинг и алертинг (типа Prometheus + Alertmanager).
- Обрабатывали ошибки молча или только на уровне сервиса.
Как исправили:
# Пример исправления: централизованный логгер и обработчик ошибок
import logging
import json_log_formatter
from elasticsearch import Elasticsearch
# Настройка структурированного логгера
formatter = json_log_formatter.JSONFormatter()
json_handler = logging.FileHandler('/var/log/service.json')
json_handler.setFormatter(formatter)
logger = logging.getLogger('app')
logger.addHandler(json_handler)
logger.setLevel(logging.INFO)
# Декоратор для сквозной обработки ошибок
def error_handler(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except BusinessException as e:
logger.warning('Business error handled', extra={'error': str(e), 'context': kwargs})
raise
except Exception as e:
logger.error('Unexpected error', exc_info=True, extra={'endpoint': func.__name__})
# Отправка метрики для алертинга
metrics.counter('errors.unexpected').inc()
raise ServiceUnavailableError()
return wrapper
Мы внедрили ELK-стек (Elasticsearch, Logstash, Kibana) для агрегации логов, добавили сквозные request_id для трассировки и настроили дашборды в Grafana. Это не только ускорило диагностику, но и позволило proactively находить аномалии.