Мой босс сказал, что журналы в текущем состоянии неприемлемы для клиента. В случае сбоя дюжина различных модулей устройства сообщает о своих ошибках, и все они попадают в журналы. Первоначальная причина сбоя может быть скрыта где-то в середине списка, может не отображаться в списке (учитывая, что данный модуль слишком поврежден, чтобы сообщать об этом), или появиться слишком поздно, когда все остальное закончило сообщать о проблемах, возникших в результате исходного сбоя. В любом случае, кроме разработчиков системы мало кто может правильно интерпретировать логи и понять, что же произошло на самом деле.
Моей текущей задачей является написание модуля, который делает удобные для клиента отчеты об ошибках. То есть соберите все события, о которых сообщалось за последние ~ 3 секунды (что соответствует максимальному интервалу между возникновением ошибки и последними последствиями), выполните некоторую волшебную обработку этих данных и придумайте одна четкая, дружелюбная линия, что сломано и нуждается в исправлении.
Проблема заключается в волшебной части: как, учитывая количество отчетов о неисправностях, найти первоначальный источник неисправности. Не существует простого списка причинно-следственных связей. Есть просто часто встречающиеся цепочки событий, отображающие определенные закономерности.
Примеры:
- обнаружено короткое замыкание, что приводит к ограниченному режиму работы, ограниченная работа не устраняет неисправность, поэтому аварийное состояние обостряется, общая выходная мощность отключена.
- страховочная линия зацепилась. Ни один модуль не сообщил о его включении в течение 3 с с момента его включения, поэтому причиной остановки системы считается «неизвестный источник или вмешательство».
- большинство выходных модулей сообщают об отсутствии выходного напряжения. Примерно через 1 с модуль мониторинга источника питания сообщает об отключении питания, что и является исходной причиной.
- выходной модуль сообщает об отсутствии выходного напряжения на всех своих выходных линиях. Нет сообщения от модуля питания. Причина в отсоединенной от модуля линии питания.
- выходной модуль сообщает об отсутствии выходного напряжения на одной из своих выходных линий. О других неисправностях не сообщается. Причина - сгоревший предохранитель.
- модуль вывода не сообщил о применении полученного состояния. Вскоре после этого модуль управления сообщает о недопустимом состоянии или выходных линиях (в результате того, что модуль вывода действительно не своевременно обновляет состояние). Причиной является модуль вывода (который вызвал ошибку), а не модуль управления (который остановил системы из-за обнаруженной неисправности).
- неисправность входного модуля переводит устройство в резервно-отказоустойчивый режим. Неиспользованный до сих пор модуль вывода, который был неисправным, включается в этот режим, и режим неисправности повышается до критического. Исходной причиной является не вход, которому разрешено сообщать о ложных срабатываниях относительно ошибок, а неисправный резервный выход, который прервал операцию.
- отсутствует какая-либо активность модуля вывода в течение последних 2 секунд. Это означает, что он неисправен и необходимо войти в режим отказа.
Не существует исчерпывающего списка правил относительно того, что вызывает что. Правила будут добавляться по мере появления новых типов ошибок «в дикой природе», их диагностики и исправления. Некоторые из них являются эвристическими - если эта ошибка сопровождается этими ошибками, то неисправность, скорее всего, в этом. Некоторые ошибки не будут устранены - будет достаточно пресного списка отчетов модулей. Некоторые ответы будут неоднозначными, один набор симптомов может свидетельствовать о двух разных неисправностях. Это скорее «максимальное усилие», чем «гарантированное решение».
Теперь к (слишком общему и расплывчатому) вопросу: как это решить? Существуют ли конкретные алгоритмы, методы или обобщенные решения такого рода проблем? Как написать обобщенные наборы правил и сопоставить их? Как сделать софт-матчинг? (скажем, модуль ввода сломался прямо посреди аварийной остановки, это совершенно не связанное с этим событие, которое нужно игнорировать.) Помогите пожалуйста?