PDA

Просмотр полной версии : [Include] dc_crashreport - отправка отчётов об ошибках



Daniel_Cortez
28.02.2019, 19:19
Всем привет.

Вам наверняка знакома проблема, что при поиске ошибок в моде/фильтрскриптах на "рабочем" сервере (т.е. на хостинге, с игроками) нужно время от времени вручную вытаскивать логи с хостинга и проверять их на присутствие сообщений об ошибках, которые выдаёт CrashDetect. Данный инклуд призван решить эту проблему: он перехватывает выдаваемые CrashDetect'ом сообщения и отправляет их в Telegram и/или на E-Mail (если будет спрос, в будущем возможна поддержка и других платформ, таких как Discord, VK и пр.) - в таком виде сообщения можно просматривать даже когда нет доступа к основному ПК и быстрее реагировать на них.
http://ihost.pro-pawn.ru/image.php?di=EMBA
http://ihost.pro-pawn.ru/image.php?di=USO9

Внимание: Данная разработка не была тщательно протестирована на серверах с 100500 конфигураций и носит исключительно экспериментальный характер. Даже идея инклуда сама по себе чисто экспериментальная.

Плюсы реализации:
Сообщает как об ошибках времени выполнения, так и о падениях сервера.
Предоставляет исчерпывающую информацию об ошибках:
Трассировка стека;
Причина ошибки;
Зависящая от причины доп. информация (например, при выходе за пределы массива - размер массива и индекс, по которому пытались получить доступ).
Расширяемость (возможность добавления в будущем новых протоколов для отправки отчётов).


Минусы:
Осуществляет перехват всех выводимых в лог сообщений.
Впрочем, особой роли это играть не должно, ибо при использовании CrashDetect производительность скриптов и без того отходит на второй план.
Сбор информации об ошибках пришлось реализовать именно через перехват логируемых сообщений, поскольку при падении сервера CrashDetect не вызывает OnRuntimeError() (к тому же часть информации он только выводит в логи, не предоставляя функций для её получения в скриптах на Pawn).
"Велосипед" с собственной реализацией отправки сообщений на E-Mail.
Есть давно всем известный mailer.inc, но он требует более 4Кб свободного места в стеке, и нет никакой гарантии, что оно будет в наличии на момент ошибки. (Это + отсутствие лицензии внутри mailer.inc, из-за чего с юридической точки зрения его использование незаконно без явного разрешения автора).


Требования:
Требует наличие плагина CrashDetect, чтобы логировать ошибки.
Также зависит от YSF или fixes2 - требуется один из этих плагинов, чтобы перехватывать логируемые сообщения.
Кроме того, для отправки сообщений через Telegram нужен плагин pawn-requests (https://github.com/Southclaws/pawn-requests/releases/latest) (для Telegram требуется обращение по HTTPS, в то время как SA-MP умеет только в голый HTTP).



Использование:
Закинуть dc_crashreport.inc в папку с инклудами.
Если вы хотите получать отчёты об ошибках через Telegram, см. данный мануал (https://pro-pawn.ru/showthread.php?17419-dc_crashreport-Как-создать-и-настроить-Telegram-бота).
Если нужна отправка сообщений на E-Mail:
В использующем скрипте подключить инклуд dc_crashreport.inc и указать настройки эл. почты (см. ниже).
Залить файл dc_crashreport_mailer.php на хостинг.

Пример отправки на E-Mail:

// Включаем отправку на эл. почту
#define DC_CRASHREPORT_EMAIL

// URL скрипта, по которому находится скрипт dc_crashreport_mailer.php
// (без префикса "http://" в начале URL).
#define DC_CRASHREPORT_MAILER_URL "example.com/dc_crashreport_mailer.php"

// Укажем адрес, на который будут отправляться отчёты
#define DC_CRASHREPORT_EMAIL_ADDRESS "[email protected]"

// Также укажем адрес отправителя (необязательно)
#define DC_CRASHREPORT_EMAIL_SENDER "[email protected]"

// И, наконец, само подключение инклуда.
#include <dc_crashreport.inc>




Скачать: https://www.dropbox.com/s/oxwkmzfuvokr13g/dc_crashreport.zip?dl=1
Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)



Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

Seviel
28.02.2019, 21:45
Быть может ещё время когда произошла ошибка сообщать, вроде на почту они с опозданием приходят.

Привет.

Nexius_Tailer
01.03.2019, 16:03
Идея интересная, но насчёт этого:

(Это + отсутствие лицензии внутри mailer.inc, из-за чего с юридической точки зрения его использование незаконно без явного разрешения автора)
Это какая-то странная паранойя. Никто не будет идти в суд за использование скрипта, который сам же был выложен автором в паблик (что уже с точки зрения логики подразумевает то, что по факту его может использовать кто угодно).

DeimoS
01.03.2019, 16:10
Идея интересная, но насчёт этого:

Это какая-то странная паранойя. Никто не будет идти в суд за использование скрипта, который сам же был выложен автором в паблик (что уже с точки зрения логики подразумевает то, что по факту его может использовать кто угодно).

Так никто и не утверждает, что кто-то пойдёт в суд. Оговаривается именно то, какие последствия ВОЗМОЖНЫ с юридической точки зрения. А уж насколько они реальны - это совсем другой разговор.
Ну и придерживаться юридических норм или нет - это выбор каждого. Для кого-то и воровство кошельков у прохожих - норма.

Nexius_Tailer
01.03.2019, 16:17
Так никто и не утверждает, что кто-то пойдёт в суд. Оговаривается именно то, какие последствия ВОЗМОЖНЫ с юридической точки зрения. А уж насколько они реальны - это совсем другой разговор.
Ну и пусть будут возможны, а какое до этого дело тем, кто объективно видит реальную практику? Речь же идёт о том, что какие-то "велосипеды" делаются в том числе из-за мнимых проблем.


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



UPD: В связи с очисткой всего прочего оффтопа далее, вкратце изложу ответ, который был на следующую часть поста ниже (чтобы не создавалось ложного ощущения, что следующий бред действительно остался без внимания):

Сейчас твои посты выглядят как: "Ууу, глупые!!! Придерживаетесь каких-то там, правил, которых никто, вроде как, не придерживается больше!!!". Если ты желал сообщить всем, что тебе нет дела до подобного - у тебя получилось. В противном случае твоя мотивация совершенно непонятна (опять же, возвращаемся к "неуместному" сравнению и пытаемся понять, что у каждого своя правда, и что если ты делаешь по своему, то это не обязательно правильно с точки зрения морали/закона/etc... Поэтому не стоит навязывать свою правду там, где тебя об этом не просят)
Человек как обычно решил додумать за собеседника его слова и заодно показать, как хорошо он умеет переводить стрелки с темы куда-то в свои небылицы, на что ему было указано... к слову, в итоге пришлось это сделать неоднократно и более детально (уже в который случай) разжевать, почему его пример неуместен, а практически вся суть поста сводится к обычной попытке привязаться и перевернуть с ног на голову слова из изначального коммента.

DeimoS
01.03.2019, 17:28
Ну и пусть будут возможны, а какое до этого дело тем, кто объективно видит реальную практику? Речь же идёт о том, что какие-то "велосипеды" делаются в том числе из-за мнимых проблем.


Возможно. Но сравнение, однако, абсолютно неуместное.

Я не зря привёл "неуместное" сравнение. Автор инклуда посчитал нужным учесть юридические несостыковки и поступить по совести. То, что ты считаешь нормальным не учитывать те самые несостыковки - это твоё право, но это не означает, что так делать правильно или что так должны поступать все. И конкретно тебя никто не призывает поступать так же и не заставляет самостоятельно что-то реализовывать. Всё уже сделано за тебя. К тому же, помимо отсутствия лицензии, названа проблема в технической реализации того инклуда, которая так же не даёт возможности интегрировать его. К чему эти претензии?

Сейчас твои посты выглядят как: "Ууу, глупые!!! Придерживаетесь каких-то там, правил, которых никто, вроде как, не придерживается больше!!!". Если ты желал сообщить всем, что тебе нет дела до подобного - у тебя получилось. В противном случае твоя мотивация совершенно непонятна (опять же, возвращаемся к "неуместному" сравнению и пытаемся понять, что у каждого своя правда, и что если ты делаешь по своему, то это не обязательно правильно с точки зрения морали/закона/etc... Поэтому не стоит навязывать свою правду там, где тебя об этом не просят)

Daniel_Cortez
01.03.2019, 17:58
Быть может ещё время когда произошла ошибка сообщать, вроде на почту они с опозданием приходят.
Изначально я так и хотел сделать, но когда проверял работу инклуда - сообщения доходили буквально за несколько секунд, и строка со временем была больше похожа на повторяющуюся информацию, потому я её удалил перед релизом.



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

x86
01.03.2019, 22:02
ИМХО, лучше написать плагин, который просто закинул в папку и запустил, чем писать для этого инклюд, имеющий гору зависимостей.

Daniel_Cortez
02.03.2019, 21:19
Удалил последние несколько постов, дабы не засорять тему очередным бесполезным спором, который ни к чему не приведёт. DeimoS, можешь переместить посты в отдельную тему, если считаешь нужным.

По теме: поддержку какого протокола следует добавить в следующем релизе?

whale
02.03.2019, 21:59
Daniel_Cortez, в идеале, конечно, было бы добавить два вышеупомянутых тобою протокола (vk, telegram). Но, если недостаточно времени - хватит и одного, на данный момент (в таком случае, рентабельнее всего будет реализовать поддержку протокола VK первым, ибо, как ни как, у большей части аудитории 100% есть аккаунт ВКонтакте).

DeimoS
02.03.2019, 23:23
Да и, с учётом действий Роскомнадзора, оповещения в Телеграм могут работать не очень хорошо. ВК - хороший вариант для первой интеграции

Fallen A.
08.03.2019, 18:36
Удалил последние несколько постов, дабы не засорять тему очередным бесполезным спором, который ни к чему не приведёт. DeimoS, можешь переместить посты в отдельную тему, если считаешь нужным.

По теме: поддержку какого протокола следует добавить в следующем релизе?



Сообщения, приходящие от сервера на мою почту, к примеру на яндекс, могут идти как от одной секунды, так и до часа по времени.
Все зависит от загруженности почтового сервера.
Но есть еще и вопросы к тому, от имени какой почты отправляется письмо с логами. Если это ноунейм, то может как вообще не прийти, так и попасть в папку спам, так и идти дольше "известных" почтовых серверов. К примеру, ранее, в мобильном клиенте яндекс почты, количество писем в папке спам не отображалось, как и не выводилось во всплывающем уведомлении.

Лучше всего будет реализовать нормальный плагин с возможностью выбора: отправлять по почте или же смс сообщением.

Daniel_Cortez
09.03.2019, 13:21
Сообщения, приходящие от сервера на мою почту, к примеру на яндекс, могут идти как от одной секунды, так и до часа по времени.
Все зависит от загруженности почтового сервера.
Это проблемы либо почтового сервера, либо хостинга веб-сайта, на котором расположен PHP-скрипт для отправки сообщений (и возможно, вебмастера, не предпринимающего мер по снижению нагрузки от сайта). В любом случае, едва ли это относится к самому инклуду.
Если же это к тому, что теряется точное время ошибки, то в следующей версии инклуда я добавлю вывод времени в самом начале текста сообщения.



Но есть еще и вопросы к тому, от имени какой почты отправляется письмо с логами. Если это ноунейм, то может как вообще не прийти, так и попасть в папку спам, так и идти дольше "известных" почтовых серверов. К примеру, ранее, в мобильном клиенте яндекс почты, количество писем в папке спам не отображалось, как и не выводилось во всплывающем уведомлении.
Проверял на mail.ru - если в параметре "DC_CRASHREPORT_EMAIL_SENDER" ввести валидный адрес отправителя, письмо не попадало в спам. Впрочем, в первой версии инклуда я сделал параметр опциональным (при его отсутствии в графе "отправитель" указывается "CrashReport" и в этом случае письма могут улететь в спам) - в следующей версии сделаю его обязательным, чтобы не сбивать пользователей с толку.



ИМХО, лучше написать плагин, который просто закинул в папку и запустил, чем писать для этого инклюд, имеющий гору зависимостей.

Лучше всего будет реализовать нормальный плагин ...
Ок, здесь возможны 2 варианта:
Плагин без "горы" (на самом деле всего 2) зависимостей, повторяющий в себе функционал из CrashDetect (http://lurkmore.to/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B5%D1%82%D0%B0%D1%82%D1%8C_%D0%B2%D0%B5%D0%BB%D0%BE%D1%81%D0%B8%D0%BF%D0%B5%D0%B4) (и одновременно с CrashDetect его не поюзаешь).
Никаких велосипедов; делаем так, чтобы плагин взаимодействовал с CrashDetect и YSF. Но тогда код взаимодействия придётся делать (сюрприз-сюрприз!) всё в том же инклуде, а в плагине останется только код отправки сообщений.

Ну и стоит ли оно того?



... с возможностью выбора: отправлять по почте или же смс сообщением.
В одну SMS-ку текст ошибки не уместишь, не говоря уже о том, что отправка может стоить денег.

Fallen A.
09.03.2019, 13:32
Про смс скажу, что достаточно лишь оповещения, что есть ошибка и информация о ней отправлена на почту. Платить или не платить - удел владельца. Не так ли?


Про плагин: все зависит от фантазии автора, т.е. только тебя. Кортез, ты спросил про советы, я их даю. Принимать или нет, остается за тобой.

ziggi
12.03.2019, 00:57
Немного не по теме, но чтобы не пропустить сообщения крашдетекта помогает установка crashdetect_log в server.cfg.
Пример

crashdetect_log crashlog.txt
Тогда все сообщения крашдетекта будут помещаться в отдельный файл.

Daniel_Cortez
14.08.2019, 20:36
Обновление 1.1.0.

Добавлена возможность вывода трассировки стека для диагностических сообщений от sscanf2 (DC_CRASHREPORT_EXTRA_SSCANF2), что должно помочь в поиске мест возникновения ошибок от упомянутого плагина (см. пример ниже).
Добавлен вывод сообщений в консоль (DC_CRASHREPORT_CONSOLE) для дополнительных видов обнаруживаемых ошибок.
Исправлены неправильные заголовки функций в перехватах IsOnServerMessageEnabled() и OnServerMessage().


Пример поиска ошибок от sscanf2:

#include <a_samp>
#include "../include/sscanf2.inc"

#pragma option -d2 // Включим отладочную информацию, чтобы выводить номера строк в файлах
#define DC_CRASHREPORT_CONSOLE // Вывод отчётов об ошибках в консоль
#define DC_CRASHREPORT_EXTRA_SSCANF2 // Включить перехват сообщений об ошибках от sscanf2
#include <dc_crashreport>

TestFunc()
{
static const params[] = "12 abc";
new x, buffer[4];
// Здесь должна быть ошибка, т.к. для спецификатора "s" не указана длина
sscanf(params, "is", x, buffer);
}

main()
{
TestFunc();
}

Вывод:


sscanf warning: Strings without a length are deprecated, please add a destination size.
#3 00006a68 in TestFunc () at example.pwn:14
#4 00006a9c in main () at example.pwn:19


Скачать: https://www.dropbox.com/s/oxwkmzfuvokr13g/dc_crashreport.zip?dl=0

Daniel_Cortez
04.12.2022, 15:17
Обновление 1.2.0 (04.12.2022):

Добавлена поддержка мессенджера Telegram.
Инструкции по созданию и настройке Telegram-бота можно найти здесь:

https://pro-pawn.ru/showthread.php?16642-dc_crashreport-отправка-отчётов-об-ошибках

Скачать: https://www.dropbox.com/s/oxwkmzfuvokr13g/dc_crashreport.zip?dl=0

$continue$
09.12.2022, 14:28
Посмотрел код. Иногда сервер может падать с такой ошибкой: "Server crashed due to an unknown error"

Например: https://github.com/Zeex/samp-plugin-crashdetect/issues/49

Daniel_Cortez
18.12.2022, 21:17
Посмотрел код. Иногда сервер может падать с такой ошибкой: "Server crashed due to an unknown error"

Например: https://github.com/Zeex/samp-plugin-crashdetect/issues/49
Да, действительно. Добавлю отлов таких сообщений в следующей версии, но по мне так отлов сообщений о падениях сервера (речь именно о проблемах, возникающих в нативном коде, не в скриптах) изначально был сомнительной затеей: любой краш может означать нестабильное состояние сервера, и в таких случаях не факт, что отправка сообщения об ошибке увенчается успехом.