анализ цепочки событий и рассуждения

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

Моей текущей задачей является написание модуля, который делает удобные для клиента отчеты об ошибках. То есть соберите все события, о которых сообщалось за последние ~ 3 секунды (что соответствует максимальному интервалу между возникновением ошибки и последними последствиями), выполните некоторую волшебную обработку этих данных и придумайте одна четкая, дружелюбная линия, что сломано и нуждается в исправлении.

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

Примеры:

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

Не существует исчерпывающего списка правил относительно того, что вызывает что. Правила будут добавляться по мере появления новых типов ошибок «в дикой природе», их диагностики и исправления. Некоторые из них являются эвристическими - если эта ошибка сопровождается этими ошибками, то неисправность, скорее всего, в этом. Некоторые ошибки не будут устранены - будет достаточно пресного списка отчетов модулей. Некоторые ответы будут неоднозначными, один набор симптомов может свидетельствовать о двух разных неисправностях. Это скорее «максимальное усилие», чем «гарантированное решение».

Теперь к (слишком общему и расплывчатому) вопросу: как это решить? Существуют ли конкретные алгоритмы, методы или обобщенные решения такого рода проблем? Как написать обобщенные наборы правил и сопоставить их? Как сделать софт-матчинг? (скажем, модуль ввода сломался прямо посреди аварийной остановки, это совершенно не связанное с этим событие, которое нужно игнорировать.) Помогите пожалуйста?




Ответы (1)


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

Если вы настаиваете, я бы подошел к этому, заставив каждую ошибку отбрасывать какой-то символ/токен для каждого кода ошибки - вы сделаете это намного сложнее, если попытаетесь выполнить несколько сопоставлений слов/ключевых слов. Затем вы вводите полученные токены в какой-то классификатор.

В глубине души вам нужен какой-то механизм правил — будь то нечеткие или точные. Первое, что приходит на ум, — это построенная вручную байесовская сеть. Это позволит выполнить нечеткое сопоставление, поскольку вы будете вычислять наиболее вероятный «отчет» в зависимости от полученных вами токенов. Это также позволяет вам установить порог для групп токенов, которые на самом деле ни на что не указывают, указав минимальную вероятность возврата ответа.

Вы также можете обучить байесовскую сеть или классификатор другого типа, но вам понадобится довольно много данных, которые вы пометили вручную (токен1, токен2, токен3->faultxyz), и может быть более точным сделать это самостоятельно.

person dfb    schedule 20.07.2011