← Назад к вопросам

Как узнать, что произошло в момент падения сервиса?

2.0 Middle🔥 151 комментариев
#DevOps и инфраструктура#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы диагностики падения сервиса

Когда сервис падает, первое, что нужно сделать — собрать информацию о том, что произошло. Есть несколько критических источников данных:

1. Логи приложения

Это первое место, куда нужно смотреть. Логи содержат информацию об ошибках, исключениях и потоке выполнения.

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler("app.log"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

try:
    result = risky_operation()
except Exception as e:
    logger.error(f"Operation failed: {e}", exc_info=True)

2. Системные логи

Смотри /var/log/syslog, /var/log/messages или журналы контейнеров (если используешь Docker):

# Linux системные логи
sudo tail -f /var/log/syslog

# Docker логи
docker logs -f container_name

# Kubernetes логи
kubectl logs pod-name

3. Метрики и мониторинг

Используй инструменты мониторинга для анализа состояния:

  • CPU, Memory, Disk: Проверь, не произошла ли нехватка ресурсов
  • Network: Проверь пропускную способность и соединения
  • Application metrics: Кастомные метрики через Prometheus, DataDog или New Relic
from prometheus_client import Counter, Histogram

request_count = Counter(
    "requests_total", "Total requests", ["method", "endpoint"]
)
request_duration = Histogram("request_duration_seconds", "Request duration")

@request_duration.time()
def handle_request():
    pass

4. Трассировка и стектрейсы

Добавь трассировку для отслеживания ошибок:

import traceback
import sys

try:
    process_data()
except Exception:
    traceback.print_exc(file=sys.stderr)
    logger.error(traceback.format_exc())

5. Health checks и мониторинг процесса

import subprocess
import psutil

def check_service_health():
    try:
        response = requests.get("http://localhost:8000/health", timeout=5)
        return response.status_code == 200
    except:
        return False

# Мониторим процесс
process = psutil.Process(pid)
print(f"Memory: {process.memory_info().rss / 1024 / 1024}MB")
print(f"CPU: {process.cpu_percent()}%")

6. База данных

Проверь:

  • Соединения: не исчерпаны ли лимиты подключений
  • Блокировки: есть ли deadlock'и
  • Диск: полон ли диск базы
  • Репликация: отстаёт ли реплика (если используется)
-- PostgreSQL
SELECT pid, usename, state FROM pg_stat_activity;
SELECT * FROM pg_locks;

Чеклист для быстрого анализа:

  1. Проверь свежие логи — первые признаки проблемы
  2. Посмотри метрики — оцени нагрузку
  3. Проверь ресурсы — CPU, Memory, Disk
  4. Оцени сетевые соединения — нет ли блокировок
  5. Посмотри внешние зависимости — упала ли БД, кэш, API
  6. Проанализируй последние изменения — что было задеплоено

Результат анализа должен ответить на вопрос: что произошло, когда и почему?