Несколько лет назад, заканчивая очередную программу для сенсорных столов, наша команда столкнулась с проблемой поддержки нескольких устройств, размещенных в разных местах. Необходимо было отслеживать возникающие ошибки в программе и оперативно их исправлять. Но все это усложнялось большим количество устройств, проверять каждый из них было не рационально.
Тогда мы написали небольшой веб-сервис, который мог принимать и сохранять информацию об ошибке в приложении. Достаточно длительное время этот сервис работал только в рамках компании и за это время применялся практически в каждом проекте.
Пару месяцев назад появилась идея доработать сервис до приемлемого вида и позволить им пользоваться каждому разработчику.
В общем
В итоге получился максимально простой проект TraceMyCode.net. Сейчас он может предложить следующие функции:
- Прием и сохранение информации об ошибке через REST веб-сервис;
- Просмотр произошедших ошибок;
- Уведомления по email и push (push – для пользователей iOS);
- Неограниченное количество ваших проектов и пользователей в каждом.
Вариантов его использования много. Существует всего одно требование: у программы должен быть доступ в интернет, чтобы отправить сообщение об ошибке. Например, наша компания сейчас использует для следующих типов приложений:
- Сайты на ASP.NET и ASP.NET MVC;
- Desktop-приложения;
- Мобильные приложения для iOS и Windows Phone.
Как подключить к приложению
Для начала, необходимо зарегистрироваться и создать первый проект. На странице проекта указан уникальный идентификатор для приложения (Client ID).
Для отправки информации об ошибке, вашему приложению необходимо выполнить всего лишь один HTTP запрос:
POST tracemycode.net/api/errors
Веб-сервис поддерживает прием данных как в XML, так и в JSON формате. Чтобы указать, в каком формате вы отправляете данные, необходимо установить следующие значения для заголовков “Content-Type” и “Accept”:
- Для XML: “text/xml” или “application/xml”;
- Для JSON: “text/json” или “application/json”.
Сами XML или JSON данные необходимо отправить в теле запроса в кодировке UTF-8. Не буду приводить полное описание каждого из параметров, документация доступна здесь. Лучше приведу примеры.
Пример для XML:
<ErrorData>
<Project>b4be7117-52cd-4086-89b9-6f6b21c2ca55</Project>
<Version>1.0</Version>
<Device>iPhone</Device>
<OS>iOS 6.0</OS>
<Message>Sample divide by zero exception</Message>
<Exceptions>
<Exception>
<Message>Invalid operation executed.</Message>
<Type>System.InvalidOperationException</Type>
<StackTrace>at MySampleProject.Main() in c:DeveloperMySampleProjectMain.cs:line 31</StackTrace>
</Exception>
<Exception>
<Message>Attempted to divide by zero.</Message>
<Type>System.DivideByZeroException</Type>
</Exception>
</Exceptions>
</ErrorData>
Пример для JSON:
{
"project": "8c86e8bd-b5d7-447e-b5dc-09ee1743b82a",
"version": "1.0",
"device": "iPhone",
"os": "iOS 6.0",
"message": "Sample divide by zero exception",
"exceptions": [
{
"message": "Invalid operation executed.",
"type": "System.InvalidOperationException",
"stackTrace": "at MySampleProject.Main() in c:DeveloperMySampleProjectMain.cs:line 31"
},
{
"message": "Attempted to divide by zero.",
"type": "System.DivideByZeroException"
}
]
}
Код HTTP ответа означает:
- 201 – ошибка успешно зарегистрирована;
- 400 – ошибка в распознавании данных запроса.
Если вы получили код 400, то тело ответа содержит XML или JSON (в зависимости от параметра “Accept”) с подробной информацией, что не так в запросе.
Пример для XML:
<Error>
<InvalidKeyName1>Error message 1</InvalidKeyName1>
<InvalidKeyName2>Error message 2</InvalidKeyName2>
</Error>
Пример для JSON:
{
"invalidKeyName1": "Error message 1",
"invalidKeyName2": "Error message 2"
}
Может быть можно проще?
Для .NET Framework и PHP мы уже создали готовые библиотеки, которые позволяют значительно упростить процесс отправки информации об ошибке.
.NET Framework
Скачайте библиотеку и подключите ее к вашему проекту. Сама библиотека очень маленькая, для нее требуется только .NET Framework 4.0. При возникновении ошибки необходимо просто вызвать статическую функцию:
try
{
// TODO: логика приложения
}
catch (Exception ex)
{
TraceMyCode.ErrorProxy.Submit(new Guid("projectId"), ex);
// projectId – уникальный идентификатор для приложения (Client ID), полученный на сайте
}
В большинстве случаев информацию об ошибке нужно отправлять в глобальном обработчике для приложения, когда на более ранних этапах не получилось ее обработать. На странице документации есть описание, как это сделать для нескольких типов приложений: консольное, ASP.NET, WinForms, WPF.
PHP
Для PHP 5 мы тоже написали готовые функции. Скачайте файл и подключите его к проекту:
require_once("Includes/traceMyCode.php5.php");
По аналогии с предыдущей библиотекой, для отправки информации об ошибке, вам необходимо вызвать 1 функцию:
try {
// TODO: echo inverse(0) . "n";
} catch (Exception $exception) {
TmcErrorProxy::SubmitByException('projectId', $exception);
// projectId – уникальный идентификатор для приложения (Client ID), полученный на сайте
}
Подробнее можно прочитать на странице документации для PHP.
Опубликовано по просьбе пользователя Zorro (недостаточно кармы для публикации в блоге «Я пиарюсь»).
Автор: ido