В первую очередь, необходимо определить точное место возникновения ошибки в коде и сопутствующие детали.
- Временной интервал: Определить точное время возникновения ошибки в логах, чтобы сузить область поиска.
- Контекст запроса: Если возможно, извлечь информацию о запросе, который вызвал ошибку: URL, параметры запроса, HTTP-метод, пользователь (если аутентифицирован). Это поможет воспроизвести сценарий.
- Полный стек-трейс: Изучить полный стек-трейс, связанный с сообщением "запись не найдена". Он укажет на конкретный класс и метод, где произошла ошибка.
- Код, вызывающий ошибку: В коде найти место, соответствующее последнему вызову в стек-трейсе. Вероятно, это обращение к базе данных, внешнему сервису или кешу.
- Запрос к данным: Если ошибка связана с доступом к данным (БД, кеш), проанализировать сам запрос (SQL-запрос, вызов метода репозитория, ключ кеширования).
- Проверить правильность формирования запроса.
- Проверить существование данных с заданными критериями напрямую в источнике (например, выполнить SQL-запрос в БД).
- Проверить наличие данных в кеше, если он используется.
- Логи зависимых сервисов: Если сервис зависит от внешних систем (микросервисы, сторонние API), проверить логи этих систем в соответствующий временной интервал, чтобы искать ошибки на их стороне.
- Состояние системы: Проверить состояние сервиса и зависимостей: загрузка CPU/RAM, доступность БД, сетевое соединение с внешними сервисами.
Типичные причины:
- Неправильный идентификатор или критерий для поиска.
- Удаление записи после того, как на нее поступил запрос.
- Проблема с видимостью данных (например, из-за транзакций или изоляции).
- Ошибка во внешнем сервисе или БД, к которой обращается основной сервис.
- Неправильная логика кеширования (устаревшие данные, проблемы с инвалидацией кеша).
- Конкурентный доступ, при котором одна операция удаляет запись, а другая пытается ее прочитать.
Дальнейшие шаги:
- Если проблема воспроизводится, дебажить код, чтобы пошагово отследить выполнение и значения переменных.
- Написать юнит-тесты или интеграционные тесты для воспроизведения ошибки в контролируемой среде.
- Добавить дополнительное логирование в проблемном участке кода для получения более детальной информации в будущем.