← All posts tagged лог

Долепил потихоньку систему агрегации логирования до состояния, когда вроде уже не стыдно черкнуть о ней пару слов.
Суть: приложения осуществляют логирование, в том числе ошибок (назовём это "событиями"), нужно 1) узнавать о важных событиях 2) удобно с ними работать — просматривать, разгребать и т.п.
Из пункта №1 следует нотификация на мыло, а из №2 — центральная уеб-морда с фильтрами, кнопочками и котиками.

В качестве морды я сначала попробовал sentry. Ну, как обычно, казалось бы, за столько лет индус-трийки могли ведь решить эту задачу? Но, как обычно, нет, оно сходу не завелось, причем с неясными симптомами. В тот момент у меня ещё не остыл пердак от какой-то предыдущей неработающей поделки для другой задачи, поэтому sentry быстро отправилась к собачьм хуям, а морду я, короче, навелосипедил.

Но морда это полдела. Любое событие-ошибка ценно, и я не считаю, что допустимо терять часть событий при отказе апстримов (типа "если ошибка произошла но не сохранилась, то ничего, произойдёт ещё раз"), поэтому порицаю популярные методы типа "сунуть событие в udp-сокет, перекреститься и пойти в кабак". Нужно обеспечить достаточно надёжную доставку и сохранение событий (и уведомления).
Поэтому сделал так: приложение сразу локально сохраняет событие на диск в очередь. С очередями в этой индус-трийке отдельная песня, но нашёл пригодный для начала beanstalk. Рядом (на том же хосте) — приложение, которое берёт событие из очереди и пытается слать в апстрим (морду), пока тот не ответит "ок". Морда принимает событие и кладёт уже наконец в постгрес.

Система будет вскоре использоваться и для js-ошибок (а потом, возможно, и для мобилок), там уже локальных очередей нет, и нужно будет, как минимум, удостовериться, что латенси ответа морды не создаёт помех. И контроль частоты, чтоб нас не заспамил какой-нибудь мамкин хеккер.

События могут сыпаться пачками, поэтому сразу отправлять мыло нельзя — каждые n минут отдельное приложение проверяет, накопилось ли событий, и тогда уже шлёт. Тоже через очередь — celery #2777525 — она была засетаплена для "клиентского" мыла и всякого "cron"-процессинга.

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

Некоторые группы событий (всякое info, например) не требуют реакции от людей, для них есть кнопочка "ignore". Ещё есть кнопочка "resolve" для пометки групп, в отношении которых приняты меры. И фильтры для статусов и источников.

В данный момент в базе овер 2 миллиона событий, и пока ничё не тормозит (да и нечему, но всё же ^_^).

Накорябал своё первое в стиме миниревью для Block N Load, за пару дней оно вышло на первое место на странице игры. УСПЕХ.
26 of 32 people (81%) found this review helpful
Судя по
2 people found this review funnyпри отсутствии намеренных шуток в тексте, рунглиш мой неуклюж. Сам я этого увидеть не могу, хоть и знаю что пишу слабо, с артиклями вот плаваю, например, со структурой тоже.

P.S. радуюсь весне