AIAI University/ Stadika Смотреть курсы
AI University / Промпты / Программисту
Программисту

Промпт: найти причину ошибки по стектрейсу и логам

Вероятная причина плавающей ошибки, гипотезы с проверками, исправление и защита от повторения. Готовый промт на русском: скопируйте, подставьте свои данные и вставьте в GigaChat, YandexGPT, ChatGPT, Claude или Gemini.

Проверено на: GigaChatChatGPTClaudeGemini · Обновлено 01.10.2026

Текст промпта

Ты senior-разработчик и опытный отладчик. Помоги найти причину ошибки. Стек и окружение: {stack}. Что происходит: {symptoms}. Стектрейс и фрагмент логов: {logs} Связанный код: {code} Дай: 1. Наиболее вероятную причину в 2-3 предложениях и какие строки лога на неё указывают. 2. Другие гипотезы по убыванию вероятности и как быстро проверить каждую (команда, SQL-запрос, лог, точка останова). 3. Исправление с кодом и объяснением. 4. Как не допустить повторения: тест, метрика, алерт. Если информации не хватает для уверенного вывода, так и скажи и перечисли, что ещё прислать. Не выдумывай API библиотек: если не уверен в сигнатуре, отметь это.

Что подставить в промт

ПолеПример
{stack}Python 3.12, Django 5, PostgreSQL 16, Celery 5 и Redis, Docker
{symptoms}раз в несколько часов задача отправки чеков в ОФД падает, повторный запуск проходит; началось после увеличения числа воркеров Celery с 2 до 8
{logs}[2026-10-05 14:02:11,402: ERROR/ForkPoolWorker-6] Task billing.tasks.send_receipt[8f1c2a] raised unexpected: OperationalError('SSL SYSCALL error: EOF detected')
Traceback (most recent call last):
File "/app/billing/tasks.py", line 41, in send_receipt
order = Order.objects.select_for_update().get(pk=order_id)
django.db.utils.OperationalError: SSL SYSCALL error: EOF detected
[2026-10-05 14:02:11,950: WARNING/MainProcess] postgres: FATAL: terminating connection due to idle-in-transaction timeout
{code}@shared_task(bind=True, max_retries=3)
def send_receipt(self, order_id):
with transaction.atomic():
order = Order.objects.select_for_update().get(pk=order_id)
resp = requests.post(OFD_URL, json=build_receipt(order), timeout=60)
order.receipt_status = resp.json()["status"]
order.save()

Ответы нейросетей на этот промпт

Один и тот же промпт с примером выше, ответы без правок: выберите нейросеть, которой пользуетесь, и посмотрите, что она выдаёт.

GigaChat 2 Max06.10.2026
Анализ проблемы

Наиболее вероятно, ошибка вызвана увеличением количества одновременных транзакций в БД PostgreSQL, что привело к превышению лимита ожидания соединений («idle-in-transaction timeout»). Когда один воркер удерживает соединение долго (например, ожидает ответа внешнего сервиса OFD через requests), другие воркеры ожидают освобождения соединения и время от времени получают исключение, когда сервер закрывает неактивное подключение по таймауту (EOF detected). Это видно по сообщениям в стектрейсе:

> Log Indicators
> — OperationalError('SSL SYSCALL error: EOF detected'): Подключение закрыто базой данных вследствие таймаута неактивности.
> — FATAL: terminating connection due to idle-in-transaction timeout: Прямо указывает на превышение максимального времени нахождения транзакции в ожидании.


Дополнительные гипотезы (по убыванию вероятности)
Гипотеза №1: Проблема с таймаутом подключения к внешней службе OFD

Может оказаться, что сервис OFD стал медленнее отвечать или вовсе зависает периодически, вызывая блокировку транзакций.

Проверка: Временно увеличить таймаут запроса в вызове requests.post() до значения заведомо большего, чем время выполнения типичной задачи, чтобы убедиться, проблема именно во внешних задержках.

resp = requests.post(OFD_URL, json=build_receipt(order), timeout=120)

Затем мониторьте приложение и проверьте, исчезнет ли ошибка.

Гипотеза №2: Некорректная конфигурация пула соединений Postgresql

Увеличение воркеров могло привести к исчерпанию ресурсов соединений между приложением и базой данных.

Проверка:
Проверьте состояние пулов соединений в приложении (например, используя встроенные инструменты мониторинга производительности PostgreSQL):

SELECT * FROM pg_stat_activity WHERE state='idle in transaction';

Также убедитесь, что параметр конфигурации max_connections в настройках PostgreSQL соответствует количеству одновременно ожидающих соединений. Например, установить:

echo "max_connections = 100" >> /etc/postgresql/16/main/postgresql.conf && systemctl restart postgresql
Гипотеза №3: Перегрузка сервера Redis

Redis используется Celery как брокер сообщений. Если нагрузка возросла резко, возможно, некоторые очереди начинают накапливать большое количество невыполненных задач.

Проверка: Мониторинг нагрузки Redis:

redis-cli info | grep used_memory_human

Либо посмотреть длину очередей в redis:

redis-cli llen celery

И сравнить значение с количеством активных задач в вашем окружении.


Коррекция кода

Для предотвращения ситуации, связанной с долгим ожиданием внешних сервисов, рекомендуется использовать асинхронность и обрабатывать запросы таким образом, чтобы транзакция не была заблокирована продолжительное время.

Пример исправления:

import asyncio
from aiohttp import ClientSession

async def async_send_receipt(session, url, data):
    try:
        async with session.post(url, json=data, timeout=60) as response:
            return await response.json()
    except Exception as e:
        print(f'Async request failed: {str(e)}')
        raise

@shared_task(bind=True, max_retries=3)
def send_receipt(self, order_id):
    loop = asyncio.get_event_loop()
    session = ClientSession()
    
    # Получаем объект заказа внутри транзакции
    with transaction.atomic():
        order = Order.objects.select_for_update().get(pk=order_id)
        
        # Выполняем внешний запрос асинхронно вне транзакции
        result = loop.run_until_complete(async_send_receipt(session, OFD_URL, build_receipt(order)))
        if isinstance(result, dict) and 'status' in result:
            order.receipt_status = result['status']
            order.save()
        else:
            self.retry(countdown=60*5)  # Повтор через 5 минут
            
    session.close()

Здесь мы используем модуль asyncio, который позволяет отделять выполнение запросов от базы данных и обработки заказов. Таким образом, база данных освобождается быстрее, уменьшая вероятность получения исключений связанных с временем ожидания.


Профилактика повторного появления ошибки
  1. Тестирование: Написание интеграционного теста с нагрузкой, имитирующей многопоточность выполнения запросов, проверяя устойчивость приложения при увеличенном количестве воркеров и задержке работы внешних служб.

``python
@pytest.mark.django_db(transaction=True)
def test_celery_tasks_under_load(client, settings):
for _ in range(10): # Запуск нескольких параллельных задач
send_receipt.delay(randint(1, 10))
time.sleep(60) # Ждём завершения всех задач
assert not Order.objects.filter(receipt_status=None).exists(), "Не все чеки отправлены"
``

  1. Метрики: Добавляем мониторинг продолжительности транзакций и отслеживание состояния Redis и PostgreSQL с помощью инструментов вроде Prometheus + Grafana.
  1. Алерты: Настроить оповещения при достижении критического уровня занятости подключений к PostgreSQL и длин очередей Redis.

Используя эти меры, можно существенно снизить риск возникновения аналогичных проблем в будущем.

Советы

Как пользоваться
  1. Скопируйте промпт кнопкой выше.
  2. Замените поля в фигурных скобках своими данными.
  3. Отправьте в нейросеть и сравните ответ с примером на этой странице.

Подробнее о структуре хорошего запроса: гид AI University.

Похожие промпты

ПрограммистуБесплатно Ускорить медленный SQL-запрос по EXPLAINРазбор плана выполнения, индексы и переписанный запрос, безопасное создание индекса на проде. 4 ответаОткрытьПрограммистуБесплатно Ревью pull request по diffРевью изменений с приоритетами: блокирующие ошибки, безопасность, тесты, готовые комментарии. 4 ответаОткрытьПрограммистуС доступом Миграция базы данных без простояПлан изменения схемы по шагам expand и contract, миграции, перенос данных батчами и откат. 4 ответаСмотреть ответы

Все 435 промптов и 6 наборов

172 промптов открыты бесплатно. Остальные и наборы-цепочки открывает доступ к библиотеке за 1 490 ₽. Полный доступ за 4 900 ₽: все курсы AI University на русском и библиотека промптов. Разовый платёж, новые промпты входят.